pax_global_header00006660000000000000000000000064117152637370014526gustar00rootroot0000000000000052 comment=356c033b93b8f24580b9c29ec9826baecd11c74f FreeRDP-Remmina-356c033/000077500000000000000000000000001171526373700146135ustar00rootroot00000000000000FreeRDP-Remmina-356c033/.gitignore000066400000000000000000000011521171526373700166020ustar00rootroot00000000000000*.a *.o *.lo *.la *.so *.mo *.gmo *.swp *.tar.gz *~ *.pc .deps .libs autom4te.cache Makefile Makefile.in aclocal.m4 _configs.sed config.h config.log config.status config.guess config.sub configure depcomp install-sh libtool .intltool-merge-cache missing stamp-h1 ltmain.sh */po/Makefile.in.in */po/POTFILES */po/stamp-it .project .cproject .settings CMakeFiles CMakeCache.txt cmake_install.cmake install_manifest.txt remmina/remmina rfbint.h remmina/src/remmina remmina/desktop/remmina.desktop remmina-plugins/libvncserver/rfb/rfbconfig.h remmina-plugins/telepathy/org.freedesktop.Telepathy.Client.Remmina.service FreeRDP-Remmina-356c033/CMakeLists.txt000066400000000000000000000064771171526373700173710ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. cmake_minimum_required(VERSION 2.6) set(CMAKE_COLOR_MAKEFILE ON) project(Remmina C) include(CheckIncludeFiles) include(CheckLibraryExists) include(FindPkgConfig) include(CheckCCompilerFlag) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/) include(FindOptionalPackage) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") endif() if(NOT DEFINED CMAKE_INSTALL_LIBDIR) set(CMAKE_INSTALL_LIBDIR "lib") endif() if(NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR "bin") endif() if(NOT BUILD_SHARED_LIBS) set(BUILD_SHARED_LIBS ON) endif() if(CMAKE_COMPILER_IS_GNUCC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") CHECK_C_COMPILER_FLAG(-Wno-unused-result Wno-unused-result) if(Wno-unused-result) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result") endif() CHECK_C_COMPILER_FLAG(-Wno-unused-but-set-variable Wno-unused-but-set-variable) if(Wno-unused-but-set-variable) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-but-set-variable") endif() CHECK_C_COMPILER_FLAG(-Wno-unused-function Wno-unused-function) if(Wno-unused-function) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-function") endif() endif() check_include_files(sys/param.h HAVE_SYS_PARAM_H) check_include_files(sys/socket.h HAVE_SYS_SOCKET_H) check_include_files(arpa/inet.h HAVE_ARPA_INET_H) check_include_files(netinet/in.h HAVE_NETINET_IN_H) check_include_files(termios.h HAVE_TERMIOS_H) check_include_files(netdb.h HAVE_NETDB_H) check_include_files(fcntl.h HAVE_FCNTL_H) check_include_files(unistd.h HAVE_UNISTD_H) check_include_files(sys/un.h HAVE_SYS_UN_H) check_include_files(errno.h HAVE_ERRNO_H) include_directories(.) include_directories(remmina/include) set(REMMINA_VERSION "0.9.99.1") set(REMMINA_DATADIR "${CMAKE_INSTALL_PREFIX}/share/remmina") set(REMMINA_LOCALEDIR "${CMAKE_INSTALL_PREFIX}/share/locale") set(REMMINA_PLUGINDIR "${CMAKE_INSTALL_PREFIX}/lib/remmina/plugins") find_suggested_package(PTHREAD) if(PTHREAD_FOUND) add_definitions(-DHAVE_PTHREAD) endif() find_suggested_package(GCRYPT) if(GCRYPT_FOUND) add_definitions(-DHAVE_LIBGCRYPT) endif() find_required_package(GTK) if(GTK_FOUND) add_subdirectory(remmina) add_subdirectory(remmina-plugins) add_subdirectory(remmina-plugins-gnome) endif() find_suggested_package(AVAHI) if(AVAHI_FOUND) add_definitions(-DHAVE_LIBAVAHI_UI) add_definitions(-DHAVE_LIBAVAHI_CLIENT) endif() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/config.h) install(DIRECTORY include/remmina DESTINATION include/remmina FILES_MATCHING PATTERN "*.h") FreeRDP-Remmina-356c033/README000066400000000000000000000027211171526373700154750ustar00rootroot00000000000000Remmina: The GTK+ Remote Desktop Client ======================================= Remmina is a remote desktop client written in GTK+, aiming to be useful for system administrators and travellers, who need to work with lots of remote computers in front of either large monitors or tiny netbooks. Remmina supports multiple network protocols in an integrated and consistant user interface. Currently RDP, VNC, NX, XDMCP and SSH are supported. Remmina is released in separated source packages: * "remmina", the main GTK+ application * "remmina-plugins", a set of plugins Remmina is free and open-source software, released under GNU GPL license. Resources --------- Website: http://remmina.sourceforge.net Wiki: http://sourceforge.net/apps/mediawiki/remmina/ Forums: http://sourceforge.net/apps/phpbb/remmina/ Mailing List: https://lists.sourceforge.net/mailman/listinfo/remmina-common Prerequisites ------------- On Ubuntu 11.10 (Oneiric), install the following packages before compiling: sudo add-apt-repository ppa:chihchun/freerdp # for freerdp v1 sudo apt-get update sudo apt-get install cmake intltool \ libgtk-3-dev libssh-dev libavahi-ui-gtk3-dev libvte-2.90-dev libxkbfile-dev \ libtelepathy-glib-dev libgnome-keyring-dev \ libappindicator3-dev libgcrypt11-dev libgnutls-dev \ libfreerdp-dev libjpeg-dev Compilation ----------- To compile and install, perform the following for all of the three main packages: mkdir build cmake --build=build . make sudo make install FreeRDP-Remmina-356c033/cmake/000077500000000000000000000000001171526373700156735ustar00rootroot00000000000000FreeRDP-Remmina-356c033/cmake/FindAPPINDICATOR.cmake000066400000000000000000000026341171526373700213600ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. pkg_check_modules(PC_APPINDICATOR appindicator3-0.1) find_path(APPINDICATOR_INCLUDE_DIR NAMES libappindicator/app-indicator.h HINTS ${PC_APPINDICATOR_INCLUDEDIR} ${PC_APPINDICATOR_INCLUDE_DIRS} PATH_SUFFIXES libappindicator-0.1) find_library(APPINDICATOR_LIBRARY NAMES appindicator3) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(APPINDICATOR DEFAULT_MSG APPINDICATOR_LIBRARY APPINDICATOR_INCLUDE_DIR) if(APPINDICATOR_FOUND) set(APPINDICATOR_LIBRARIES ${APPINDICATOR_LIBRARY}) set(APPINDICATOR_INCLUDE_DIRS ${APPINDICATOR_INCLUDE_DIR}) endif() mark_as_advanced(APPINDICATOR_INCLUDE_DIR APPINDICATOR_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindAVAHI.cmake000066400000000000000000000030241171526373700203250ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. if(GTK3_FOUND) set(_AVAHI_LIB_NAME avahi-ui-gtk3) set(_AVAHI_PKG_NAME avahi-ui-gtk3>=0.6.30 avahi-client>=0.6.30) else() set(_AVAHI_LIB_NAME avahi-ui) set(_AVAHI_PKG_NAME avahi-ui>=0.6.30 avahi-client>=0.6.30) endif() find_package(PkgConfig) pkg_check_modules(PC_AVAHI ${_AVAHI_PKG_NAME}) find_path(AVAHI_INCLUDE_DIR avahi-ui/avahi-ui.h HINTS ${PC_AVAHI_INCLUDEDIR} ${PC_AVAHI_INCLUDE_DIRS}) find_library(AVAHI_LIBRARY NAMES ${_AVAHI_LIB_NAME} HINTS ${PC_AVAHI_LIBDIR} ${PC_AVAHI_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(AVAHI DEFAULT_MSG AVAHI_LIBRARY AVAHI_INCLUDE_DIR) set(AVAHI_LIBRARIES ${AVAHI_LIBRARY}) set(AVAHI_INCLUDE_DIRS ${AVAHI_INCLUDE_DIR}) mark_as_advanced(AVAHI_INCLUDE_DIR AVAHI_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindFREERDP.cmake000066400000000000000000000040501171526373700205640ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_package(PkgConfig) pkg_check_modules(PC_FREERDP freerdp>=1.0) set(FREERDP_DEFINITIONS ${PC_FREERDP_CFLAGS_OTHER}) find_path(FREERDP_INCLUDE_DIR NAMES freerdp/freerdp.h HINTS ${PC_FREERDP_INCLUDEDIR} ${PC_FREERDP_INCLUDE_DIRS}) find_library(FREERDP_LIBRARY NAMES freerdp-core HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) find_library(FREERDP_GDI_LIBRARY NAMES freerdp-gdi HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) find_library(FREERDP_KBD_LIBRARY NAMES freerdp-kbd HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) find_library(FREERDP_RAIL_LIBRARY NAMES freerdp-rail HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) find_library(FREERDP_CODEC_LIBRARY NAMES freerdp-codec HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) find_library(FREERDP_CHANNELS_LIBRARY NAMES freerdp-channels HINTS ${PC_FREERDP_LIBDIR} ${PC_FREERDP_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(FREERDP DEFAULT_MSG FREERDP_LIBRARY FREERDP_INCLUDE_DIR) set(FREERDP_LIBRARIES ${FREERDP_LIBRARY} ${FREERDP_GDI_LIBRARY} ${FREERDP_KBD_LIBRARY} ${FREERDP_RAIL_LIBRARY} ${FREERDP_CODEC_LIBRARY} ${FREERDP_CHANNELS_LIBRARY}) set(FREERDP_INCLUDE_DIRS ${FREERDP_INCLUDE_DIR}) mark_as_advanced(FREERDP_INCLUDE_DIR FREERDP_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindGCRYPT.cmake000066400000000000000000000021751171526373700205130ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_path(GCRYPT_INCLUDE_DIR NAMES gcrypt.h) find_library(GCRYPT_LIBRARY NAMES gcrypt) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GCRYPT DEFAULT_MSG GCRYPT_LIBRARY GCRYPT_INCLUDE_DIR) set(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY}) set(GCRYPT_INCLUDE_DIRS ${GCRYPT_INCLUDE_DIR}) mark_as_advanced(GCRYPT_INCLUDE_DIR GCRYPT_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindGNOMEKEYRING.cmake000066400000000000000000000024151171526373700213760ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_path(GNOMEKEYRING_INCLUDE_DIR NAMES gnome-keyring.h PATH_SUFFIXES gnome-keyring-1) find_library(GNOMEKEYRING_LIBRARY NAMES gnome-keyring) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GNOMEKEYRING DEFAULT_MSG GNOMEKEYRING_LIBRARY GNOMEKEYRING_INCLUDE_DIR) if(GNOMEKEYRING_FOUND) set(GNOMEKEYRING_LIBRARIES ${GNOMEKEYRING_LIBRARY}) set(GNOMEKEYRING_INCLUDE_DIRS ${GNOMEKEYRING_INCLUDE_DIR}) endif() mark_as_advanced(GNOMEKEYRING_INCLUDE_DIR GNOMEKEYRING_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindGTK.cmake000066400000000000000000000032721171526373700201270ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2012 Daniel M. Weeks # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. if(GTK_VERSION) find_required_package(GTK${GTK_VERSION}) if(GTK${GTK_VERSION}_FOUND) set(GTK_FOUND true) else() set(GTK_FOUND false) endif() else() # Prefer GTK+ 3 over GTK+ 2 find_package(GTK3 QUIET) if(GTK3_FOUND) set(GTK_VERSION 3) set(GTK_FOUND true) else() find_package(GTK2 QUIET) if(GTK2_FOUND) set(GTK_VERSION 2) set(GTK_FOUND true) elseif() set(GTK_FOUND false) endif() endif() endif() if(GTK_VERSION) set(_GTK_ERR_MESSAGE "GTK ${GTK_VERSION} not found.") else() set(_GTK_ERR_MESSAGE "No GTK not found.") endif() if (GTK_FOUND) set(GTK_LIBRARIES ${GTK${GTK_VERSION}_LIBRARIES}) unset(GTK${GTK_VERSION}_LIBRARIES) set(GTK_INCLUDE_DIRS ${GTK${GTK_VERSION}_INCLUDE_DIRS}) unset(GTK${GTK_VERSION}_INCLUDE_DIRS) else() if(GTK_FIND_REQUIRED) message(FATAL_ERROR ${_GTK_ERR_MESSAGE}) else() if(NOT VTK_FIND_QUIETLY) message(STATUS ${_GTK_ERR_MESSAGE}) endif() endif() endif() FreeRDP-Remmina-356c033/cmake/FindGTK2.cmake000066400000000000000000000072541171526373700202150ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2012 Daniel M. Weeks # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(_GTK2_found_all true) # Gtk pkg_check_modules(PC_GTK2 gtk+-2.0) if(NOT PC_GTK2_FOUND) set(_GTK2_found_all false) endif() find_path(GTK2_INCLUDE_DIR NAMES gtk/gtk.h PATH_SUFFIXES gtk-2.0) find_library(GTK2_LIBRARY NAMES gtk-x11-2.0) # Gdk pkg_check_modules(PC_GDK2 gdk-x11-2.0) if(NOT PC_GDK2_FOUND) set(_GTK2_found_all false) endif() find_library(GDK2_LIBRARY NAMES gdk-x11-2.0) find_path(GDK2_INCLUDE_DIR gdkconfig.h HINTS ${PC_GDK2_INCLUDEDIR} ${PC_GDK2_INCLUDE_DIRS} PATH_SUFFIXES gtk-2.0/include) # Gdk-Pixbuf pkg_check_modules(PC_GDKPIXBUF gdk-pixbuf-2.0) if(NOT PC_GDKPIXBUF_FOUND) set(_GTK2_found_all false) endif() find_path(GDKPIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h HINTS ${PC_GDKPIXBUF_INCLUDEDIR} ${PC_GDKPIXBUF_INCLUDE_DIRS} PATH_SUFFIXES gdk-pixbuf-2.0) find_library(GDKPIXBUF_LIBRARY NAMES gdk_pixbuf-2.0 HINTS ${PC_GDKPIXBUF_LIBDIR} ${PC_GDKPIXBUF_LIBRARY_DIRS}) # Glib pkg_check_modules(PC_GLIB2 glib-2.0) if(NOT PC_GLIB2_FOUND) set(_GTK2_found_all false) endif() find_path(GLIB2_INCLUDE_DIR_PART1 NAMES glib.h HINTS ${PC_GLIB2_INCLUDEDIR} ${PC_GLIB2_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0) find_path(GLIB2_INCLUDE_DIR_PART2 NAMES glibconfig.h HINTS ${PC_GLIB2_INCLUDEDIR} ${PC_GLIB2_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/include) set(GLIB2_INCLUDE_DIR ${GLIB2_INCLUDE_DIR_PART1} ${GLIB2_INCLUDE_DIR_PART2}) find_library(GLIB2_LIBRARY NAMES glib-2.0) # Pango pkg_check_modules(PC_PANGO pango) if(NOT PC_PANGO_FOUND) set(_GTK2_found_all false) endif() find_path(PANGO_INCLUDE_DIR pango/pango.h HINTS ${PC_PANGO_INCLUDEDIR} ${PC_PANGO_INCLUDE_DIRS} PATH_SUFFIXES pango-1.0) find_library(PANGO_LIBRARY NAMES pango-1.0 HINTS ${PC_PANGO_LIBDIR} ${PC_PANGO_LIBRARY_DIRS}) # Cairo set(CAIRO_DEFINITIONS ${PC_CAIRO_CXXFLAGS_OTHER}) find_path(CAIRO_INCLUDE_DIR cairo.h HINTS ${PC_CAIRO_INCLUDEDIR} ${PC_CAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo) find_library(CAIRO_LIBRARY NAMES cairo HINTS ${PC_CAIRO_LIBDIR} ${PC_CAIRO_LIBRARY_DIRS}) # Atk pkg_check_modules(PC_ATK atk) if(NOT PC_ATK_FOUND) set(_GTK2_found_all false) endif() find_path(ATK_INCLUDE_DIR atk/atk.h HINTS ${PC_ATK_INCLUDEDIR} ${PC_ATK_INCLUDE_DIRS} PATH_SUFFIXES atk-1.0) find_library(ATK_LIBRARY NAMES atk-1.0 HINTS ${PC_ATK_LIBDIR} ${PC_ATK_LIBRARY_DIRS}) # Finalize if(_GTK2_found_all) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GTK2 DEFAULT_MSG GTK2_LIBRARY GTK2_INCLUDE_DIR) set(GTK2_LIBRARIES ${GTK2_LIBRARY} ${GDK2_LIBRARY} ${GLIB2_LIBRARY} ${PANGO_LIBRARY} ${CAIRO_LIBRARY} ${GDKPIXBUF_LIBRARY} ${ATK_LIBRARY}) set(GTK2_INCLUDE_DIRS ${GTK2_INCLUDE_DIR} ${GDK2_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR} ${PANGO_INCLUDE_DIR} ${CAIRO_INCLUDE_DIR} ${GDKPIXBUF_INCLUDE_DIR} ${ATK_INCLUDE_DIR}) mark_as_advanced(GTK2_INCLUDE_DIR GTK2_LIBRARY) set(GTK2_FOUND true) else() unset(GTK2_LIBRARY) unset(GTK2_INCLUDE_DIR) unset(GDK2_LIBRARY) unset(GDK2_INCLUDE_DIR) set(GTK2_FOUND false) endif() FreeRDP-Remmina-356c033/cmake/FindGTK3.cmake000066400000000000000000000065661171526373700202230ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(_GTK3_found_all true) # Gtk pkg_check_modules(PC_GTK3 gtk+-3.0) if(NOT PC_GTK3_FOUND) set(_GTK3_found_all false) endif() find_path(GTK3_INCLUDE_DIR NAMES gtk/gtk.h PATH_SUFFIXES gtk-3.0) find_library(GTK3_LIBRARY NAMES gtk-3) # Gdk find_library(GDK3_LIBRARY NAMES gdk-3) # Gdk-Pixbuf pkg_check_modules(PC_GDKPIXBUF gdk-pixbuf-2.0) if(NOT PC_GDKPIXBUF_FOUND) set(_GTK3_found_all false) endif() find_path(GDKPIXBUF_INCLUDE_DIR gdk-pixbuf/gdk-pixbuf.h HINTS ${PC_GDKPIXBUF_INCLUDEDIR} ${PC_GDKPIXBUF_INCLUDE_DIRS} PATH_SUFFIXES gdk-pixbuf-2.0) find_library(GDKPIXBUF_LIBRARY NAMES gdk-3 HINTS ${PC_GDKPIXBUF_LIBDIR} ${PC_GDKPIXBUF_LIBRARY_DIRS}) # Glib pkg_check_modules(PC_GLIB2 glib-2.0) if(NOT PC_GLIB2_FOUND) set(_GTK3_found_all false) endif() find_path(GLIB2_INCLUDE_DIR_PART1 NAMES glib.h HINTS ${PC_GLIB2_INCLUDEDIR} ${PC_GLIB2_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0) find_path(GLIB2_INCLUDE_DIR_PART2 NAMES glibconfig.h HINTS ${PC_GLIB2_INCLUDEDIR} ${PC_GLIB2_INCLUDE_DIRS} PATH_SUFFIXES glib-2.0/include) set(GLIB2_INCLUDE_DIR ${GLIB2_INCLUDE_DIR_PART1} ${GLIB2_INCLUDE_DIR_PART2}) find_library(GLIB2_LIBRARY NAMES glib-2.0) # Pango pkg_check_modules(PC_PANGO pango) if(NOT PC_PANGO_FOUND) set(_GTK3_found_all false) endif() find_path(PANGO_INCLUDE_DIR pango/pango.h HINTS ${PC_PANGO_INCLUDEDIR} ${PC_PANGO_INCLUDE_DIRS} PATH_SUFFIXES pango-1.0) find_library(PANGO_LIBRARY NAMES pango-1.0 HINTS ${PC_PANGO_LIBDIR} ${PC_PANGO_LIBRARY_DIRS}) # Cairo set(CAIRO_DEFINITIONS ${PC_CAIRO_CXXFLAGS_OTHER}) find_path(CAIRO_INCLUDE_DIR cairo.h HINTS ${PC_CAIRO_INCLUDEDIR} ${PC_CAIRO_INCLUDE_DIRS} PATH_SUFFIXES cairo) find_library(CAIRO_LIBRARY NAMES cairo HINTS ${PC_CAIRO_LIBDIR} ${PC_CAIRO_LIBRARY_DIRS}) # Atk pkg_check_modules(PC_ATK atk) if(NOT PC_ATK_FOUND) set(_GTK3_found_all false) endif() find_path(ATK_INCLUDE_DIR atk/atk.h HINTS ${PC_ATK_INCLUDEDIR} ${PC_ATK_INCLUDE_DIRS} PATH_SUFFIXES atk-1.0) find_library(ATK_LIBRARY NAMES atk-1.0 HINTS ${PC_ATK_LIBDIR} ${PC_ATK_LIBRARY_DIRS}) # Finalize if(_GTK3_found_all) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GTK3 DEFAULT_MSG GTK3_LIBRARY GTK3_INCLUDE_DIR) set(GTK3_LIBRARIES ${GTK3_LIBRARY} ${GDK3_LIBRARY} ${GLIB2_LIBRARY} ${PANGO_LIBRARY} ${CAIRO_LIBRARY} ${GDKPIXBUF_LIBRARY} ${ATK_LIBRARY}) set(GTK3_INCLUDE_DIRS ${GTK3_INCLUDE_DIR} ${GLIB2_INCLUDE_DIR} ${PANGO_INCLUDE_DIR} ${CAIRO_INCLUDE_DIR} ${GDKPIXBUF_INCLUDE_DIR} ${ATK_INCLUDE_DIR}) mark_as_advanced(GTK3_INCLUDE_DIR GTK3_LIBRARY) set(GTK3_FOUND true) else() unset(GTK3_LIBRARY) unset(GDK3_INCLUDE_DIR) set(GTK3_FOUND false) endif() FreeRDP-Remmina-356c033/cmake/FindLIBSSH.cmake000066400000000000000000000025431171526373700204660ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_package(PkgConfig) pkg_check_modules(PC_LIBSSH libssh>=0.4) set(LIBSSH_DEFINITIONS ${PC_LIBSSH_CFLAGS_OTHER}) find_path(LIBSSH_INCLUDE_DIR NAMES libssh/libssh.h HINTS ${PC_LIBSSH_INCLUDEDIR} ${PC_LIBSSH_INCLUDE_DIRS}) find_library(LIBSSH_LIBRARY NAMES ssh HINTS ${PC_LIBSSH_LIBDIR} ${PC_LIBSSH_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(LIBSSH DEFAULT_MSG LIBSSH_LIBRARY LIBSSH_INCLUDE_DIR) set(LIBSSH_LIBRARIES ${LIBSSH_LIBRARY}) set(LIBSSH_INCLUDE_DIRS ${LIBSSH_INCLUDE_DIR}) mark_as_advanced(LIBSSH_INCLUDE_DIR LIBSSH_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindOptionalPackage.cmake000066400000000000000000000042431171526373700225420ustar00rootroot00000000000000# - FindOptionalPackage # Enable or disable optional packages. Also force optional packages. # # This module defines the following macros: # find_required_package : find a required package, can not be disabled # find_suggested_package : find a suggested package - required but can be disabled # find_optional_package : find an optional package - required only if enabled # #============================================================================= # Copyright 2011 Nils Andresen # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. #============================================================================= macro(find_required_package _normal_package) find_package(${_normal_package} REQUIRED) endmacro(find_required_package) macro(find_suggested_package _normal_package) string(TOUPPER ${_normal_package} _upper_package) option(WITH_${_upper_package} "Add dependency to ${_normal_package} - recommended" ON) if(WITH_${_upper_package}) message(STATUS "Finding suggested package ${_normal_package}.") message(STATUS " Disable this using \"-DWITH_${_upper_package}=OFF\".") find_package(${_normal_package} REQUIRED) endif(WITH_${_upper_package}) endmacro(find_suggested_package) macro(find_optional_package _normal_package) string(TOUPPER ${_normal_package} _upper_package) option(WITH_${_upper_package} "Add dependency to ${_normal_package}" OFF) if(WITH_${_upper_package}) find_package(${_normal_package} REQUIRED) else(WITH_${_upper_package}) message(STATUS "Skipping optional package ${_normal_package}.") message(STATUS " Enable this using \"-DWITH_${_upper_package}=ON\".") endif(WITH_${_upper_package}) endmacro(find_optional_package) FreeRDP-Remmina-356c033/cmake/FindPTHREAD.cmake000066400000000000000000000025571171526373700205760ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_package(PkgConfig) pkg_check_modules(PC_PTHREAD pthread) set(PTHREAD_DEFINITIONS ${PC_PTHREAD_CFLAGS_OTHER}) find_path(PTHREAD_INCLUDE_DIR NAMES pthread.h HINTS ${PC_PTHREAD_INCLUDEDIR} ${PC_PTHREAD_INCLUDE_DIRS}) find_library(PTHREAD_LIBRARY NAMES pthread HINTS ${PC_PTHREAD_LIBDIR} ${PC_PTHREAD_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(PTHREAD DEFAULT_MSG PTHREAD_LIBRARY PTHREAD_INCLUDE_DIR) set(PTHREAD_LIBRARIES ${PTHREAD_LIBRARY}) set(PTHREAD_INCLUDE_DIRS ${PTHREAD_INCLUDE_DIR}) mark_as_advanced(PTHREAD_INCLUDE_DIR PTHREAD_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindTELEPATHY.cmake000066400000000000000000000026311171526373700210370ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_package(PkgConfig) pkg_check_modules(PC_TELEPATHY telepathy-glib) set(TELEPATHY_DEFINITIONS ${PC_TELEPATHY_CFLAGS_OTHER}) find_path(TELEPATHY_INCLUDE_DIR NAMES telepathy-glib/telepathy-glib.h HINTS ${PC_TELEPATHY_INCLUDEDIR} ${PC_TELEPATHY_INCLUDE_DIRS} PATH_SUFFIXES telepathy-1.0) find_library(TELEPATHY_LIBRARY NAMES telepathy-glib) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TELEPATHY DEFAULT_MSG TELEPATHY_LIBRARY TELEPATHY_INCLUDE_DIR) set(TELEPATHY_LIBRARIES ${TELEPATHY_LIBRARY}) set(TELEPATHY_INCLUDE_DIRS ${TELEPATHY_INCLUDE_DIR}) mark_as_advanced(TELEPATHY_INCLUDE_DIR TELEPATHY_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindVTE.cmake000066400000000000000000000027061171526373700201410ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. if(NOT _VTE_VERSION_NUM) set(_VTE_LIB_NAME vte) set(_VTE_VERSION vte) else() set(_VTE_LIB_NAME vte${_VTE_VERSION_NUM}) set(_VTE_VERSION vte-${_VTE_VERSION_NUM}) endif() string(REPLACE . _ _VTE_LIB_NAME ${_VTE_LIB_NAME}) pkg_check_modules(PC_VTE ${_VTE_VERSION}) find_path(VTE_INCLUDE_DIR NAMES vte/vte.h HINTS ${PC_VTE_INCLUDEDIR} ${PC_VTE_INCLUDE_DIRS} PATH_SUFFIXES ${_VTE_VERSION}) find_library(VTE_LIBRARY NAMES ${_VTE_LIB_NAME}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(VTE DEFAULT_MSG VTE_LIBRARY VTE_INCLUDE_DIR) set(VTE_LIBRARIES ${VTE_LIBRARY}) set(VTE_INCLUDE_DIRS ${VTE_INCLUDE_DIR}) mark_as_advanced(VTE_INCLUDE_DIR VTE_LIBRARY) FreeRDP-Remmina-356c033/cmake/FindXKBFILE.cmake000066400000000000000000000025311171526373700205630ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_package(PkgConfig) pkg_check_modules(PC_XKBFILE xkbfile) find_path(XKBFILE_INCLUDE_DIR NAMES XKBfile.h HINTS ${PC_XKBFILE_INCLUDEDIR} ${PC_XKBFILE_INCLUDE_DIRS} PATH_SUFFIXES X11/extensions) find_library(XKBFILE_LIBRARY NAMES xkbfile HINTS ${PC_XKBFILE_LIBDIR} ${PC_XKBFILE_LIBRARY_DIRS}) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(XKBFILE DEFAULT_MSG XKBFILE_LIBRARY XKBFILE_INCLUDE_DIR) set(XKBFILE_LIBRARIES ${XKBFILE_LIBRARY}) set(XKBFILE_INCLUDE_DIRS ${XKBFILE_INCLUDE_DIR}) mark_as_advanced(XKBFILE_INCLUDE_DIR XKBFILE_LIBRARY) FreeRDP-Remmina-356c033/cmake/GETTEXT.cmake000066400000000000000000000026621171526373700200270ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. find_suggested_package(Gettext) function(gettext po_dir package_name) set(mo_files) file(GLOB po_files ${po_dir}/*.po) foreach(po_file ${po_files}) get_filename_component(lang ${po_file} NAME_WE) set(mo_file ${CMAKE_CURRENT_BINARY_DIR}/${lang}.mo) add_custom_command(OUTPUT ${mo_file} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${mo_file} ${po_file} DEPENDS ${po_file}) install(FILES ${mo_file} DESTINATION share/locale/${lang}/LC_MESSAGES RENAME ${package_name}.mo) set(mo_files ${mo_files} ${mo_file}) endforeach() set(translations-target "${package_name}-translations") add_custom_target(${translations-target} ALL DEPENDS ${mo_files}) endfunction() FreeRDP-Remmina-356c033/config.h.in000066400000000000000000000011501171526373700166330ustar00rootroot00000000000000#ifndef __CONFIG_H #define __CONFIG_H #cmakedefine HAVE_SYS_PARAM_H #cmakedefine HAVE_SYS_SOCKET_H #cmakedefine HAVE_ARPA_INET_H #cmakedefine HAVE_NETINET_IN_H #cmakedefine HAVE_TERMIOS_H #cmakedefine HAVE_NETDB_H #cmakedefine HAVE_FCNTL_H #cmakedefine HAVE_UNISTD_H #cmakedefine HAVE_SYS_UN_H #cmakedefine HAVE_ERRNO_H #cmakedefine GTK_VERSION ${GTK_VERSION} #define remmina "remmina" #define VERSION "${REMMINA_VERSION}" #define GETTEXT_PACKAGE remmina #define REMMINA_DATADIR "${REMMINA_DATADIR}" #define REMMINA_LOCALEDIR "${REMMINA_LOCALEDIR}" #define REMMINA_PLUGINDIR "${REMMINA_PLUGINDIR}" #endif FreeRDP-Remmina-356c033/remmina-plugins-gnome/000077500000000000000000000000001171526373700210255ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins-gnome/AUTHORS000066400000000000000000000002161171526373700220740ustar00rootroot00000000000000Please check the application About dialog or the official web site for a full list of authors. http://remmina.sourceforge.net/contact.shtml FreeRDP-Remmina-356c033/remmina-plugins-gnome/CMakeLists.txt000066400000000000000000000025251171526373700235710ustar00rootroot00000000000000# remmina-plugins-gnome - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(REMMINA_PLUGINS_GNOME_SRCS src/gkeyring_plugin.c ) add_library(remmina-plugins-gnome ${REMMINA_PLUGINS_GNOME_SRCS}) set_target_properties(remmina-plugins-gnome PROPERTIES PREFIX "") include_directories(${GTK_INCLUDE_DIRS}) target_link_libraries(remmina-plugins-gnome ${GTK_LIBRARY_DIRS}) find_required_package(GNOMEKEYRING) if(GNOMEKEYRING_FOUND) include_directories(${GNOMEKEYRING_INCLUDE_DIRS}) target_link_libraries(remmina-plugins-gnome ${GNOMEKEYRING_LIBRARIES}) endif() install(TARGETS remmina-plugins-gnome DESTINATION ${REMMINA_PLUGINDIR}) FreeRDP-Remmina-356c033/remmina-plugins-gnome/COPYING000066400000000000000000000431101171526373700220570ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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 How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. FreeRDP-Remmina-356c033/remmina-plugins-gnome/ChangeLog000066400000000000000000000000001171526373700225650ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins-gnome/INSTALL000066400000000000000000000224501171526373700220610ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 6. Often, you can also type `make uninstall' to remove the installed files again. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. FreeRDP-Remmina-356c033/remmina-plugins-gnome/NEWS000066400000000000000000000000001171526373700215120ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins-gnome/README000066400000000000000000000001451171526373700217050ustar00rootroot00000000000000Please visit the Remmina official web site for general information: http://remmina.sourceforge.net FreeRDP-Remmina-356c033/remmina-plugins-gnome/src/000077500000000000000000000000001171526373700216145ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins-gnome/src/gkeyring_plugin.c000066400000000000000000000072451171526373700251650ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include static RemminaPluginService *remmina_plugin_service = NULL; static GnomeKeyringPasswordSchema remmina_file_secret_schema = { GNOME_KEYRING_ITEM_GENERIC_SECRET, { { "filename", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING }, { "key", GNOME_KEYRING_ATTRIBUTE_TYPE_STRING }, { NULL, 0 } } }; void remmina_plugin_gkeyring_store_password(RemminaFile *remminafile, const gchar *key, const gchar *password) { GnomeKeyringResult r; const gchar *path; gchar *s; path = remmina_plugin_service->file_get_path(remminafile); s = g_strdup_printf("Remmina: %s - %s", remmina_plugin_service->file_get_string(remminafile, "name"), key); r = gnome_keyring_store_password_sync(&remmina_file_secret_schema, GNOME_KEYRING_DEFAULT, s, password, "filename", path, "key", key, NULL); g_free(s); if (r == GNOME_KEYRING_RESULT_OK) { remmina_plugin_service->log_printf("[GKEYRING] password saved for file %s\n", path); } else { remmina_plugin_service->log_printf("[GKEYRING] password cannot be saved for file %s: %s\n", path, gnome_keyring_result_to_message(r)); } } gchar* remmina_plugin_gkeyring_get_password(RemminaFile *remminafile, const gchar *key) { GnomeKeyringResult r; const gchar *path; gchar *password; gchar *p; path = remmina_plugin_service->file_get_path(remminafile); r = gnome_keyring_find_password_sync(&remmina_file_secret_schema, &password, "filename", path, "key", key, NULL); if (r == GNOME_KEYRING_RESULT_OK) { remmina_plugin_service->log_printf("[GKEYRING] found password for file %s\n", path); p = g_strdup(password); gnome_keyring_free_password(password); return p; } else { remmina_plugin_service->log_printf("[GKEYRING] password cannot be found for file %s: %s\n", path, gnome_keyring_result_to_message(r)); return NULL; } } void remmina_plugin_gkeyring_delete_password(RemminaFile *remminafile, const gchar *key) { GnomeKeyringResult r; const gchar *path; path = remmina_plugin_service->file_get_path(remminafile); r = gnome_keyring_delete_password_sync(&remmina_file_secret_schema, "filename", path, "key", key, NULL); if (r == GNOME_KEYRING_RESULT_OK) { remmina_plugin_service->log_printf("[GKEYRING] password deleted for file %s\n", path); } else { remmina_plugin_service->log_printf("[GKEYRING] password cannot be deleted for file %s: %s\n", path, gnome_keyring_result_to_message(r)); } } static RemminaSecretPlugin remmina_plugin_gkeyring = { REMMINA_PLUGIN_TYPE_SECRET, "GKEYRING", "GNOME Keyring", NULL, VERSION, TRUE, remmina_plugin_gkeyring_store_password, remmina_plugin_gkeyring_get_password, remmina_plugin_gkeyring_delete_password }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) { remmina_plugin_service = service; if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_gkeyring)) { return FALSE; } return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/000077500000000000000000000000001171526373700177225ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/AUTHORS000066400000000000000000000002161171526373700207710ustar00rootroot00000000000000Please check the application About dialog or the official web site for a full list of authors. http://remmina.sourceforge.net/contact.shtml FreeRDP-Remmina-356c033/remmina-plugins/CMakeLists.txt000066400000000000000000000032621171526373700224650ustar00rootroot00000000000000# Remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. include_directories(${CMAKE_SOURCE_DIR}/remmina-plugins) set(APPICON16_EMBLEMS_DIR "${REMMINA_DATADIR}/icons/hicolor/16x16/emblems") set(APPICON22_EMBLEMS_DIR "${REMMINA_DATADIR}/icons/hicolor/22x22/emblems") set(REMMINA_COMMON_INCLUDE_DIRS ${GTK_INCLUDE_DIRS}) set(REMMINA_COMMON_LIBRARIES ${GTK_LIBRARIES}) find_suggested_package(LIBSSH) if(LIBSSH_FOUND) add_definitions(-DHAVE_LIBSSH) include_directories(${SSH_INCLUDE_DIRS}) target_link_libraries(remmina ${SSH_LIBRARIES}) endif() find_required_package(XKBFILE) if(LIBSSH_FOUND AND XKBFILE_FOUND) add_subdirectory(nx) endif() add_subdirectory(xdmcp) find_suggested_package(FREERDP) if(FREERDP_FOUND) add_subdirectory(rdp) endif() find_suggested_package(TELEPATHY) if(TELEPATHY_FOUND) add_subdirectory(telepathy) endif() find_suggested_package(ZLIB) if(ZLIB_FOUND) add_subdirectory(vnc/libvncserver) add_subdirectory(vnc) endif() add_subdirectory(po) FreeRDP-Remmina-356c033/remmina-plugins/COPYING000066400000000000000000000431101171526373700207540ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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 How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. FreeRDP-Remmina-356c033/remmina-plugins/ChangeLog000066400000000000000000000000001171526373700214620ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/INSTALL000066400000000000000000000224501171526373700207560ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 6. Often, you can also type `make uninstall' to remove the installed files again. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. FreeRDP-Remmina-356c033/remmina-plugins/NEWS000066400000000000000000000000001171526373700204070ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/README000066400000000000000000000000001171526373700205700ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/README.LibVNCServer000066400000000000000000000012231171526373700230430ustar00rootroot00000000000000LibVNCServer Project web: http://sourceforge.net/projects/libvncserver Authors: Johannes Schindelin, Karl J. Runge License: GPL Remmina redistributes libvncclient related codes originally from LibVNCServer project. All sources under libvncserver/* should follow these rules: o Remmina only maintains Makefile.am. All other files remain untouched o Remmina can synchronize it with LibVNCServer project any time o All fixes and new features should be accepted by LibVNCServer project first Reasons why Remmina redistributes it: o Remmina only requires small portion of the codes o Although LibVNCServer is maintained, it does not have any release schedules FreeRDP-Remmina-356c033/remmina-plugins/common/000077500000000000000000000000001171526373700212125ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/common/remmina_plugin.h000066400000000000000000000052451171526373700243770ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPLUGINCOMMON_H__ #define __REMMINAPLUGINCOMMON_H__ #include "config.h" #include #include #include #include #include #include #include #include #ifdef HAVE_PTHREAD #include #endif #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif typedef void (*PThreadCleanupFunc)(void*); /* Wrapper macros to make the compiler happy on both signle/multi-threaded mode */ #ifdef HAVE_PTHREAD #define IDLE_ADD gdk_threads_add_idle #define TIMEOUT_ADD gdk_threads_add_timeout #define CANCEL_ASYNC pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_testcancel(); #define CANCEL_DEFER pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL); #define THREADS_ENTER gdk_threads_enter();pthread_cleanup_push((PThreadCleanupFunc)gdk_threads_leave,NULL); #define THREADS_LEAVE pthread_cleanup_pop(TRUE); #else #define IDLE_ADD g_idle_add #define TIMEOUT_ADD g_timeout_add #define CANCEL_ASYNC #define CANCEL_DEFER #define THREADS_ENTER #define THREADS_LEAVE #endif #define MAX_X_DISPLAY_NUMBER 99 #define X_UNIX_SOCKET "/tmp/.X11-unix/X%d" #define INCLUDE_GET_AVAILABLE_XDISPLAY static gint \ remmina_get_available_xdisplay (void) \ { \ gint i; \ gint display = 0; \ gchar fn[200]; \ for (i = 1; i < MAX_X_DISPLAY_NUMBER; i++) \ { \ g_snprintf (fn, sizeof (fn), X_UNIX_SOCKET, i); \ if (!g_file_test (fn, G_FILE_TEST_EXISTS)) \ { \ display = i; \ break; \ } \ } \ return display; \ } #endif /* __REMMINAPLUGINCOMMON_H__ */ FreeRDP-Remmina-356c033/remmina-plugins/nx/000077500000000000000000000000001171526373700203475ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/nx/16x16/000077500000000000000000000000001171526373700211345ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/nx/16x16/emblems/000077500000000000000000000000001171526373700225605ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/nx/16x16/emblems/remmina-nx.png000066400000000000000000000010301171526373700253330ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<•IDAT8Å“ÁJQ†¿sïMÆL™( £!-•vå‹Ô…/m³*¸5R_Aã²éVÒW(}·ÝÔ$èF&ŽÍŒ™{OJ!TpáÙøá|‡ÿçQU^RæEÓ€ Œù ôƒjóÙ[Er ×ñþ» ¬Í>õzÍxcã) ŠzªÂ½EU…0QÄßш_ÇÇ×ï›Ny·Ûü99çx×í2<=¥ººBœC½Ç>Ï©²Œzšòñà€ 8€PU\ŸQ[]EC€ˆÚm¤VCg3üÍ ³(ÊñxqˆE˜8À­¬POSÒ¢õuÜò2ïww1²´´ðdÚ" u`œ#ÙÚÂ& b U–¡ÞP^^âó€0¢eù€o»ÝÿbyqL@•r4ª:ž¨ò»ß>ìíQŽÇ˜zT)ÎÏ ··Â]_d@¬½» jµ@±–ÚÚZUˆµ467f30f²½¿Ÿ4Z­Ç2œ«épÈÏ££¼B"?Œù¢ª‡âç¦"òµãý7yõoüœ‘°äX­bšIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/nx/22x22/000077500000000000000000000000001171526373700211265ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/nx/22x22/emblems/000077500000000000000000000000001171526373700225525ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/nx/22x22/emblems/remmina-nx.png000066400000000000000000000016071171526373700253370ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8•Íj[GÇgft%Kv£T­ZCÓâ²È² BJ1$dånhv…>@ o’‚óM» „.³p@êdaBnš€õÑØÒÕý˜9]Ük!Y©›úÀá0pæ÷?sæ0#ª ÀcªœÑî©Î×¢ªüjÌ÷Vd7XûÙYÁÆû¿ò~¼§ú ÀX‘GßÝ¿¿ÙÜÚ:+—ƒýý/þØÝ}|à‹ÔÜÚZ»¹µÅ›'Oõû´¶·iïì0ØÛc²¿Î!• Æ9DU%dd>Mi\¼È§7o’‡ðõ±[TõzP©pøâí&/_bêul½Ž‰"$Šæ`Í2B’ qLüúõÊ –Àbí`j5Üú:¶Ñ(j5Ä94Ïñ³a:EŒ!_Ï—W¬EŒ™ a-¦R¡uívcƒ¨Õ®¯óq·[à\‘wZńޣÞ1Ïñi "øÃCÂd‚z!M!ËÐ|µæ%°zOlšà§SPÅ–BÙpˆªB(àñÓ)a:=ܼr…Q¿OãÒ%òwïiJˆã<¼UP% ðlv:xóÎ>¿}{Þãl<ÆT«øJ€d0@ËÓ¤Ã!!Ž Ir:øíÓ§ öö8ßí²yëþèt„¸"-;8 $ hä£~2Y‰©õzhž3î÷Ñ@`~™>Iæ=‘"æyÿ þäÆ l£AëúuÄš—/ƒÍN€V·‹X˹NqŽf§ƒ‰"Î_½º–_@œµo¶ #include #include "common/remmina_plugin.h" #if GTK_VERSION == 3 # include #endif #include #include #include #include #include #include "nx_plugin.h" #include "nx_session_manager.h" RemminaPluginService *remmina_plugin_nx_service = NULL; static gchar *remmina_kbtype = "pc102/us"; /* When more than one NX sessions is connecting in progress, we need this mutex and array * to prevent them from stealing the same window id. */ static pthread_mutex_t remmina_nx_init_mutex; static GArray *remmina_nx_window_id_array; static gboolean remmina_plugin_nx_try_window_id(Window window_id) { gint i; gboolean found = FALSE; pthread_mutex_lock(&remmina_nx_init_mutex); for (i = 0; i < remmina_nx_window_id_array->len; i++) { if (g_array_index(remmina_nx_window_id_array, Window, i) == window_id) { found = TRUE; break; } } if (!found) { g_array_append_val(remmina_nx_window_id_array, window_id); } pthread_mutex_unlock(&remmina_nx_init_mutex); return (!found); } static void remmina_plugin_nx_remove_window_id(Window window_id) { gint i; gboolean found = FALSE; pthread_mutex_lock(&remmina_nx_init_mutex); for (i = 0; i < remmina_nx_window_id_array->len; i++) { if (g_array_index(remmina_nx_window_id_array, Window, i) == window_id) { found = TRUE; break; } } if (found) { g_array_remove_index_fast(remmina_nx_window_id_array, i); } pthread_mutex_unlock(&remmina_nx_init_mutex); } static void remmina_plugin_nx_on_plug_added(GtkSocket *socket, RemminaProtocolWidget *gp) { remmina_plugin_nx_service->protocol_plugin_emit_signal(gp, "connect"); } static void remmina_plugin_nx_on_plug_removed(GtkSocket *socket, RemminaProtocolWidget *gp) { remmina_plugin_nx_service->protocol_plugin_close_connection(gp); } gboolean remmina_plugin_nx_ssh_auth_callback(gchar **passphrase, gpointer userdata) { RemminaProtocolWidget *gp = (RemminaProtocolWidget*) userdata; gint ret; THREADS_ENTER ret = remmina_plugin_nx_service->protocol_plugin_init_authpwd(gp, REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY); THREADS_LEAVE if (ret != GTK_RESPONSE_OK) return FALSE; *passphrase = remmina_plugin_nx_service->protocol_plugin_init_get_password(gp); return TRUE; } static void remmina_plugin_nx_on_proxy_exit(GPid pid, gint status, gpointer data) { RemminaProtocolWidget *gp = (RemminaProtocolWidget*) data; remmina_plugin_nx_service->protocol_plugin_close_connection(gp); } static int remmina_plugin_nx_dummy_handler(Display *dsp, XErrorEvent *err) { return 0; } static gboolean remmina_plugin_nx_start_create_notify(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->display = XOpenDisplay(gdk_display_get_name(gdk_display_get_default())); if (gpdata->display == NULL) return FALSE; gpdata->orig_handler = XSetErrorHandler(remmina_plugin_nx_dummy_handler); XSelectInput(gpdata->display, XDefaultRootWindow(gpdata->display), SubstructureNotifyMask); return TRUE; } static gboolean remmina_plugin_nx_monitor_create_notify(RemminaProtocolWidget *gp, const gchar *cmd) { RemminaPluginNxData *gpdata; Atom atom; XEvent xev; Window w; Atom type; int format; unsigned long nitems, rest; unsigned char *data = NULL; struct timespec ts; CANCEL_DEFER gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); atom = XInternAtom(gpdata->display, "WM_COMMAND", True); if (atom == None) return FALSE; ts.tv_sec = 0; ts.tv_nsec = 200000000; while (1) { pthread_testcancel(); while (!XPending(gpdata->display)) { nanosleep(&ts, NULL); continue; } XNextEvent(gpdata->display, &xev); if (xev.type != CreateNotify) continue; w = xev.xcreatewindow.window; if (XGetWindowProperty(gpdata->display, w, atom, 0, 255, False, AnyPropertyType, &type, &format, &nitems, &rest, &data) != Success) continue; if (data && strstr((char *) data, cmd) && remmina_plugin_nx_try_window_id(w)) { gpdata->window_id = w; XFree(data); break; } if (data) XFree(data); } XSetErrorHandler(gpdata->orig_handler); XCloseDisplay(gpdata->display); gpdata->display = NULL; CANCEL_ASYNC return TRUE; } static gint remmina_plugin_nx_wait_signal(RemminaPluginNxData *gpdata) { fd_set set; guchar dummy = 0; FD_ZERO(&set); FD_SET(gpdata->event_pipe[0], &set); select(gpdata->event_pipe[0] + 1, &set, NULL, NULL, NULL); if (read(gpdata->event_pipe[0], &dummy, 1)) { } return (gint) dummy; } static gboolean remmina_plugin_nx_start_session(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; RemminaFile *remminafile; RemminaNXSession *nx; const gchar *type, *app; gchar *s1, *s2; gint port; gint ret; gboolean is_empty_list; gint event_type = 0; const gchar *cs; gint i; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_nx_service->protocol_plugin_get_file(gp); nx = gpdata->nx; /* Connect */ remmina_nx_session_set_encryption(nx, remmina_plugin_nx_service->file_get_int(remminafile, "disableencryption", FALSE) ? 0 : 1); remmina_nx_session_set_localport(nx, remmina_plugin_nx_service->pref_get_sshtunnel_port()); remmina_nx_session_set_log_callback(nx, remmina_plugin_nx_service->log_printf); s2 = remmina_plugin_nx_service->protocol_plugin_start_direct_tunnel(gp, 22, FALSE); if (s2 == NULL) { return FALSE; } remmina_plugin_nx_service->get_server_port(s2, 22, &s1, &port); g_free(s2); if (!remmina_nx_session_open(nx, s1, port, remmina_plugin_nx_service->file_get_string(remminafile, "nx_privatekey"), remmina_plugin_nx_ssh_auth_callback, gp)) { g_free(s1); return FALSE; } g_free(s1); /* Login */ s1 = g_strdup(remmina_plugin_nx_service->file_get_string(remminafile, "username")); THREADS_ENTER s2 = remmina_plugin_nx_service->file_get_secret(remminafile, "password"); THREADS_LEAVE if (s1 && s2) { ret = remmina_nx_session_login(nx, s1, s2); } else { g_free(s1); g_free(s2); THREADS_ENTER ret = remmina_plugin_nx_service->protocol_plugin_init_authuserpwd(gp, FALSE); THREADS_LEAVE if (ret != GTK_RESPONSE_OK) return FALSE; s1 = remmina_plugin_nx_service->protocol_plugin_init_get_username(gp); s2 = remmina_plugin_nx_service->protocol_plugin_init_get_password(gp); ret = remmina_nx_session_login(nx, s1, s2); } g_free(s1); g_free(s2); if (!ret) return FALSE; THREADS_ENTER remmina_plugin_nx_service->protocol_plugin_init_save_cred(gp); THREADS_LEAVE /* Prepare the session type and application */ cs = remmina_plugin_nx_service->file_get_string(remminafile, "exec"); if (!cs || g_strcmp0(cs, "GNOME") == 0) { type = "unix-gnome"; app = NULL; } else if (g_strcmp0(cs, "KDE") == 0) { type = "unix-kde"; app = NULL; } else if (g_strcmp0(cs, "Xfce") == 0) { /* NX does not know Xfce. So we simply launch the Xfce startup program. */ type = "unix-application"; app = "startxfce4"; } else if (g_strcmp0(cs, "Shadow") == 0) { type = "shadow"; app = NULL; } else { type = "unix-application"; app = cs; } /* List sessions */ gpdata->attach_session = (g_strcmp0(type, "shadow") == 0); while (1) { remmina_nx_session_add_parameter(nx, "type", type); if (!gpdata->attach_session) { remmina_nx_session_add_parameter(nx, "user", remmina_plugin_nx_service->file_get_string(remminafile, "username")); remmina_nx_session_add_parameter(nx, "status", "suspended,running"); } if (!remmina_nx_session_list(nx)) { return FALSE; } is_empty_list = !remmina_nx_session_iter_first(nx, &gpdata->iter); if (is_empty_list && !gpdata->manager_started && !gpdata->attach_session) { event_type = REMMINA_NX_EVENT_START; } else { remmina_nx_session_manager_start(gp); event_type = remmina_plugin_nx_wait_signal(gpdata); if (event_type == REMMINA_NX_EVENT_CANCEL) { return FALSE; } if (event_type == REMMINA_NX_EVENT_TERMINATE) { if (!is_empty_list) { s1 = remmina_nx_session_iter_get(nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID); remmina_nx_session_add_parameter(nx, "sessionid", s1); g_free(s1); if (!remmina_nx_session_terminate(nx)) { remmina_nx_session_manager_start(gp); remmina_plugin_nx_wait_signal(gpdata); } } continue; } } break; } /* Start, Restore or Attach, based on the setting and existing session */ remmina_nx_session_add_parameter(nx, "type", type); i = remmina_plugin_nx_service->file_get_int(remminafile, "quality", 0); remmina_nx_session_add_parameter(nx, "link", i > 2 ? "lan" : i == 2 ? "adsl" : i == 1 ? "isdn" : "modem"); remmina_nx_session_add_parameter(nx, "geometry", "%ix%i", remmina_plugin_nx_service->file_get_int(remminafile, "resolution_width", 0), remmina_plugin_nx_service->file_get_int(remminafile, "resolution_height", 0)); remmina_nx_session_add_parameter(nx, "keyboard", remmina_kbtype); remmina_nx_session_add_parameter(nx, "client", "linux"); remmina_nx_session_add_parameter(nx, "media", "0"); remmina_nx_session_add_parameter(nx, "clipboard", remmina_plugin_nx_service->file_get_int(remminafile, "disableclipboard", FALSE) ? "none" : "both"); switch (event_type) { case REMMINA_NX_EVENT_START: if (app) remmina_nx_session_add_parameter(nx, "application", app); remmina_nx_session_add_parameter(nx, "session", remmina_plugin_nx_service->file_get_string(remminafile, "name")); remmina_nx_session_add_parameter(nx, "screeninfo", "%ix%ix24+render", remmina_plugin_nx_service->file_get_int(remminafile, "resolution_width", 0), remmina_plugin_nx_service->file_get_int(remminafile, "resolution_height", 0)); if (!remmina_nx_session_start(nx)) return FALSE; break; case REMMINA_NX_EVENT_ATTACH: s1 = remmina_nx_session_iter_get(nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID); remmina_nx_session_add_parameter(nx, "id", s1); g_free(s1); s1 = remmina_nx_session_iter_get(nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_DISPLAY); remmina_nx_session_add_parameter(nx, "display", s1); g_free(s1); if (!remmina_nx_session_attach(nx)) return FALSE; break; case REMMINA_NX_EVENT_RESTORE: s1 = remmina_nx_session_iter_get(nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_ID); remmina_nx_session_add_parameter(nx, "id", s1); g_free(s1); remmina_nx_session_add_parameter(nx, "session", remmina_plugin_nx_service->file_get_string(remminafile, "name")); if (!remmina_nx_session_restore(nx)) return FALSE; break; default: return FALSE; } if (!remmina_nx_session_tunnel_open(nx)) return FALSE; if (!remmina_plugin_nx_start_create_notify(gp)) return FALSE; /* nxproxy */ if (!remmina_nx_session_invoke_proxy(nx, -1, remmina_plugin_nx_on_proxy_exit, gp)) return FALSE; /* get the window id of the remote nxagent */ if (!remmina_plugin_nx_monitor_create_notify(gp, "nxagent")) return FALSE; /* embed it */ THREADS_ENTER gtk_socket_add_id(GTK_SOCKET(gpdata->socket), gpdata->window_id); THREADS_LEAVE return TRUE; } static gboolean remmina_plugin_nx_main(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gboolean ret; const gchar *err; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->nx = remmina_nx_session_new(); ret = remmina_plugin_nx_start_session(gp); if (!ret) { err = remmina_nx_session_get_error(gpdata->nx); if (err) { remmina_plugin_nx_service->protocol_plugin_set_error(gp, "%s", err); } } gpdata->thread = 0; return ret; } static gpointer remmina_plugin_nx_main_thread(gpointer data) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC if (!remmina_plugin_nx_main((RemminaProtocolWidget*) data)) { IDLE_ADD((GSourceFunc) remmina_plugin_nx_service->protocol_plugin_close_connection, data); } return NULL; } static void remmina_plugin_nx_init(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gint flags; gpdata = g_new0(RemminaPluginNxData, 1); g_object_set_data_full(G_OBJECT(gp), "plugin-data", gpdata, g_free); gpdata->socket = gtk_socket_new(); remmina_plugin_nx_service->protocol_plugin_register_hostkey(gp, gpdata->socket); gtk_widget_show(gpdata->socket); g_signal_connect(G_OBJECT(gpdata->socket), "plug-added", G_CALLBACK(remmina_plugin_nx_on_plug_added), gp); g_signal_connect(G_OBJECT(gpdata->socket), "plug-removed", G_CALLBACK(remmina_plugin_nx_on_plug_removed), gp); gtk_container_add(GTK_CONTAINER(gp), gpdata->socket); if (pipe(gpdata->event_pipe)) { g_print("Error creating pipes.\n"); gpdata->event_pipe[0] = -1; gpdata->event_pipe[1] = -1; } else { flags = fcntl(gpdata->event_pipe[0], F_GETFL, 0); fcntl(gpdata->event_pipe[0], F_SETFL, flags | O_NONBLOCK); } } static gboolean remmina_plugin_nx_open_connection(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; RemminaFile *remminafile; const gchar *resolution; gint width, height; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_nx_service->protocol_plugin_get_file(gp); resolution = remmina_plugin_nx_service->file_get_string(remminafile, "resolution"); if (!resolution || !strchr(resolution, 'x')) { remmina_plugin_nx_service->protocol_plugin_set_expand(gp, TRUE); gtk_widget_set_size_request(GTK_WIDGET(gp), 640, 480); } else { width = remmina_plugin_nx_service->file_get_int(remminafile, "resolution_width", 640); height = remmina_plugin_nx_service->file_get_int(remminafile, "resolution_height", 480); remmina_plugin_nx_service->protocol_plugin_set_width(gp, width); remmina_plugin_nx_service->protocol_plugin_set_height(gp, height); gtk_widget_set_size_request(GTK_WIDGET(gp), width, height); } gpdata->socket_id = gtk_socket_get_id(GTK_SOCKET(gpdata->socket)); if (pthread_create(&gpdata->thread, NULL, remmina_plugin_nx_main_thread, gp)) { remmina_plugin_nx_service->protocol_plugin_set_error(gp, "Failed to initialize pthread. Falling back to non-thread mode..."); gpdata->thread = 0; return FALSE; } else { return TRUE; } } static gboolean remmina_plugin_nx_close_connection(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (gpdata->thread) { pthread_cancel(gpdata->thread); if (gpdata->thread) pthread_join(gpdata->thread, NULL); } if (gpdata->session_manager_start_handler) { g_source_remove(gpdata->session_manager_start_handler); gpdata->session_manager_start_handler = 0; } if (gpdata->window_id) { remmina_plugin_nx_remove_window_id(gpdata->window_id); } if (gpdata->nx) { remmina_nx_session_free(gpdata->nx); gpdata->nx = NULL; } if (gpdata->display) { XSetErrorHandler(gpdata->orig_handler); XCloseDisplay(gpdata->display); gpdata->display = NULL; } close(gpdata->event_pipe[0]); close(gpdata->event_pipe[1]); remmina_plugin_nx_service->protocol_plugin_emit_signal(gp, "disconnect"); return FALSE; } static gboolean remmina_plugin_nx_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { return FALSE; } static void remmina_plugin_nx_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { } static gpointer quality_list[] = { "0", N_("Poor (fastest)"), "1", N_("Medium"), "2", N_("Good"), "9", N_("Best (slowest)"), NULL }; static const RemminaProtocolSetting remmina_plugin_nx_basic_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_FILE, "nx_privatekey", N_("Identity file"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("User name"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, NULL, NULL, FALSE, GINT_TO_POINTER(1), NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_COMBO, "exec", N_("Startup program"), FALSE, "GNOME,KDE,Xfce,Shadow", NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolSetting remmina_plugin_nx_advanced_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Disable clipboard sync"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableencryption", N_("Disable encryption"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Use local cursor"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static RemminaProtocolPlugin remmina_plugin_nx = { REMMINA_PLUGIN_TYPE_PROTOCOL, "NX", N_("NX - NX Technology"), GETTEXT_PACKAGE, VERSION, "remmina-nx", "remmina-nx", remmina_plugin_nx_basic_settings, remmina_plugin_nx_advanced_settings, REMMINA_PROTOCOL_SSH_SETTING_TUNNEL, NULL, remmina_plugin_nx_init, remmina_plugin_nx_open_connection, remmina_plugin_nx_close_connection, remmina_plugin_nx_query_feature, remmina_plugin_nx_call_feature }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) { Display *dpy; XkbRF_VarDefsRec vd; gchar *s; remmina_plugin_nx_service = service; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); if ((dpy = XkbOpenDisplay(NULL, NULL, NULL, NULL, NULL, NULL)) != NULL) { if (XkbRF_GetNamesProp(dpy, NULL, &vd)) { remmina_kbtype = g_strdup_printf("%s/%s", vd.model, vd.layout); if (vd.layout) XFree(vd.layout); if (vd.model) XFree(vd.model); if (vd.variant) XFree(vd.variant); if (vd.options) XFree(vd.options); s = strchr(remmina_kbtype, ','); if (s) *s = '\0'; g_print("NX: detected keyboard type %s\n", remmina_kbtype); } XCloseDisplay(dpy); } if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_nx)) { return FALSE; } ssh_init(); pthread_mutex_init(&remmina_nx_init_mutex, NULL); remmina_nx_window_id_array = g_array_new(FALSE, TRUE, sizeof(Window)); return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/nx/nx_plugin.h000066400000000000000000000032021171526373700225200ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPLUGINNX_H__ #define __REMMINAPLUGINNX_H__ G_BEGIN_DECLS #include "nx_session.h" typedef enum { REMMINA_NX_EVENT_CANCEL, REMMINA_NX_EVENT_START, REMMINA_NX_EVENT_RESTORE, REMMINA_NX_EVENT_ATTACH, REMMINA_NX_EVENT_TERMINATE } RemminaNXEventType; typedef struct _RemminaPluginNxData { GtkWidget *socket; gint socket_id; pthread_t thread; RemminaNXSession *nx; Display *display; Window window_id; int (*orig_handler)(Display *, XErrorEvent *); /* Session Manager data */ gboolean manager_started; GtkWidget *manager_dialog; gboolean manager_selected; /* Communication between the NX thread and the session manager */ gint event_pipe[2]; guint session_manager_start_handler; gboolean attach_session; GtkTreeIter iter; } RemminaPluginNxData; extern RemminaPluginService *remmina_plugin_nx_service; G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/nx/nx_session.c000066400000000000000000000610351171526373700227100ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "common/remmina_plugin.h" #include #include #include "nx_session.h" /* Some missing stuff in libssh */ #define REMMINA_SSH_TYPE_DSS 1 #define REMMINA_SSH_TYPE_RSA 2 static gboolean remmina_get_keytype(const gchar *private_key_file, gint *keytype, gboolean *encrypted) { FILE *fp; gchar buf1[100], buf2[100]; if ((fp = g_fopen(private_key_file, "r")) == NULL) { return FALSE; } if (!fgets(buf1, sizeof(buf1), fp) || !fgets(buf2, sizeof(buf2), fp)) { fclose(fp); return FALSE; } fclose(fp); if (strstr(buf1, "BEGIN RSA")) *keytype = REMMINA_SSH_TYPE_RSA; else if (strstr(buf1, "BEGIN DSA")) *keytype = REMMINA_SSH_TYPE_DSS; else return FALSE; *encrypted = (strstr(buf2, "ENCRYPTED") ? TRUE : FALSE); return TRUE; } /*****/ static const gchar nx_default_private_key[] = "-----BEGIN DSA PRIVATE KEY-----\n" "MIIBuwIBAAKBgQCXv9AzQXjxvXWC1qu3CdEqskX9YomTfyG865gb4D02ZwWuRU/9\n" "C3I9/bEWLdaWgJYXIcFJsMCIkmWjjeSZyTmeoypI1iLifTHUxn3b7WNWi8AzKcVF\n" "aBsBGiljsop9NiD1mEpA0G+nHHrhvTXz7pUvYrsrXcdMyM6rxqn77nbbnwIVALCi\n" "xFdHZADw5KAVZI7r6QatEkqLAoGBAI4L1TQGFkq5xQ/nIIciW8setAAIyrcWdK/z\n" "5/ZPeELdq70KDJxoLf81NL/8uIc4PoNyTRJjtT3R4f8Az1TsZWeh2+ReCEJxDWgG\n" "fbk2YhRqoQTtXPFsI4qvzBWct42WonWqyyb1bPBHk+JmXFscJu5yFQ+JUVNsENpY\n" "+Gkz3HqTAoGANlgcCuA4wrC+3Cic9CFkqiwO/Rn1vk8dvGuEQqFJ6f6LVfPfRTfa\n" "QU7TGVLk2CzY4dasrwxJ1f6FsT8DHTNGnxELPKRuLstGrFY/PR7KeafeFZDf+fJ3\n" "mbX5nxrld3wi5titTnX+8s4IKv29HJguPvOK/SI7cjzA+SqNfD7qEo8CFDIm1xRf\n" "8xAPsSKs6yZ6j1FNklfu\n" "-----END DSA PRIVATE KEY-----\n"; static const gchar nx_hello_server_msg[] = "hello nxserver - version "; struct _RemminaNXSession { /* Common SSH members */ ssh_session session; ssh_channel channel; gchar *server; gchar *error; RemminaNXLogCallback log_callback; /* Tunnel related members */ pthread_t thread; gboolean running; gint server_sock; /* NX related members */ GHashTable *session_parameters; GString *response; gint response_pos; gint status; gint encryption; gint localport; gchar *version; gchar *session_id; gint session_display; gchar *proxy_cookie; gboolean allow_start; GtkListStore *session_list; gint session_list_state; GPid proxy_pid; guint proxy_watch_source; }; RemminaNXSession* remmina_nx_session_new(void) { RemminaNXSession *nx; nx = g_new0(RemminaNXSession, 1); nx->session_parameters = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); nx->response = g_string_new(NULL); nx->status = -1; nx->encryption = 1; nx->server_sock = -1; return nx; } void remmina_nx_session_free(RemminaNXSession *nx) { pthread_t thread; if (nx->proxy_watch_source) { g_source_remove(nx->proxy_watch_source); nx->proxy_watch_source = 0; } if (nx->proxy_pid) { kill(nx->proxy_pid, SIGTERM); g_spawn_close_pid(nx->proxy_pid); nx->proxy_pid = 0; } thread = nx->thread; if (thread) { nx->running = FALSE; pthread_cancel(thread); pthread_join(thread, NULL); nx->thread = 0; } if (nx->channel) { channel_close(nx->channel); channel_free(nx->channel); } if (nx->server_sock >= 0) { close(nx->server_sock); nx->server_sock = -1; } g_free(nx->server); g_free(nx->error); g_hash_table_destroy(nx->session_parameters); g_string_free(nx->response, TRUE); g_free(nx->version); g_free(nx->session_id); g_free(nx->proxy_cookie); if (nx->session_list) { g_object_unref(nx->session_list); nx->session_list = NULL; } if (nx->session) { ssh_free(nx->session); nx->session = NULL; } g_free(nx); } static void remmina_nx_session_set_error(RemminaNXSession *nx, const gchar *fmt) { const gchar *err; if (nx->error) g_free(nx->error); err = ssh_get_error(nx->session); nx->error = g_strdup_printf(fmt, err); } static void remmina_nx_session_set_application_error(RemminaNXSession *nx, const gchar *fmt, ...) { va_list args; if (nx->error) g_free(nx->error); va_start (args, fmt); nx->error = g_strdup_vprintf (fmt, args); va_end (args); } gboolean remmina_nx_session_has_error(RemminaNXSession *nx) { return (nx->error != NULL); } const gchar* remmina_nx_session_get_error(RemminaNXSession *nx) { return nx->error; } void remmina_nx_session_clear_error(RemminaNXSession *nx) { if (nx->error) { g_free(nx->error); nx->error = NULL; } } void remmina_nx_session_set_encryption(RemminaNXSession *nx, gint encryption) { nx->encryption = encryption; } void remmina_nx_session_set_localport(RemminaNXSession *nx, gint localport) { nx->localport = localport; } void remmina_nx_session_set_log_callback(RemminaNXSession *nx, RemminaNXLogCallback log_callback) { nx->log_callback = log_callback; } static gboolean remmina_nx_session_get_response(RemminaNXSession *nx) { struct timeval timeout; ssh_channel ch[2]; ssh_buffer buffer; gint len; gint is_stderr; timeout.tv_sec = 60; timeout.tv_usec = 0; ch[0] = nx->channel; ch[1] = NULL; channel_select(ch, NULL, NULL, &timeout); is_stderr = 0; while (is_stderr <= 1) { len = channel_poll(nx->channel, is_stderr); if (len == SSH_ERROR) { remmina_nx_session_set_error(nx, "Error reading channel: %s"); return FALSE; } if (len > 0) break; is_stderr++; } if (is_stderr > 1) return FALSE; buffer = buffer_new(); len = channel_read_buffer(nx->channel, buffer, len, is_stderr); if (len <= 0) { remmina_nx_session_set_application_error(nx, "Channel closed."); return FALSE; } if (len > 0) { g_string_append_len(nx->response, (const gchar*) buffer_get(buffer), len); } buffer_free(buffer); return TRUE; } static void remmina_nx_session_parse_session_list_line(RemminaNXSession *nx, const gchar *line) { gchar *p1, *p2; gchar *val; gint i; GtkTreeIter iter; p1 = (char*) line; while (*p1 == ' ') p1++; if (*p1 == '\0') return; gtk_list_store_append(nx->session_list, &iter); p1 = (char*) line; for (i = 0; i < 7; i++) { p2 = strchr(p1, ' '); if (!p2) return; val = g_strndup(p1, (gint)(p2 - p1)); switch (i) { case 0: gtk_list_store_set(nx->session_list, &iter, REMMINA_NX_SESSION_COLUMN_DISPLAY, val, -1); break; case 1: gtk_list_store_set(nx->session_list, &iter, REMMINA_NX_SESSION_COLUMN_TYPE, val, -1); break; case 2: gtk_list_store_set(nx->session_list, &iter, REMMINA_NX_SESSION_COLUMN_ID, val, -1); break; case 6: gtk_list_store_set(nx->session_list, &iter, REMMINA_NX_SESSION_COLUMN_STATUS, val, -1); break; default: break; } g_free(val); while (*p2 == ' ') p2++; p1 = p2; } /* The last name column might contains space so it's not in the above loop. We simply rtrim it here. */ i = strlen(p1); if (i < 1) return; p2 = p1 + i - 1; while (*p2 == ' ' && p2 > p1) p2--; val = g_strndup(p1, (gint)(p2 - p1 + 1)); gtk_list_store_set(nx->session_list, &iter, REMMINA_NX_SESSION_COLUMN_NAME, val, -1); g_free(val); } static gint remmina_nx_session_parse_line(RemminaNXSession *nx, const gchar *line, gchar **valueptr) { gchar *s; gchar *ptr; gint status; *valueptr = NULL; /* Get the server version from the initial line */ if (!nx->version) { s = g_ascii_strdown(line, -1); ptr = strstr(s, nx_hello_server_msg); if (!ptr) { /* Try to use a default version */ nx->version = g_strdup("3.3.0"); } else { nx->version = g_strdup(ptr + strlen(nx_hello_server_msg)); ptr = strchr(nx->version, ' '); if (ptr) *ptr = '\0'; /* NoMachine NX append a dash+subversion. Need to be removed. */ ptr = strchr(nx->version, '-'); if (ptr) *ptr = '\0'; } g_free(s); return nx->status; } if (sscanf(line, "NX> %i ", &status) < 1) { if (nx->session_list_state && nx->session_list) { if (nx->session_list_state == 1 && strncmp(line, "----", 4) == 0) { nx->session_list_state = 2; } else if (nx->session_list_state == 2) { remmina_nx_session_parse_session_list_line(nx, line); } return -1; } return nx->status; } nx->session_list_state = 0; nx->status = status; ptr = strchr(line, ':'); if (!ptr) return status; *valueptr = ptr + 2; return status; } static gchar* remmina_nx_session_get_line(RemminaNXSession *nx) { gchar *line; gchar *pos, *ptr; gint len; gint l; if (nx->response_pos >= nx->response->len) return NULL; pos = nx->response->str + nx->response_pos; if ((ptr = strchr(pos, '\n')) == NULL) return NULL; len = ((gint)(ptr - pos)) + 1; line = g_strndup(pos, len - 1); l = strlen(line); if (l > 0 && line[l - 1] == '\r') { line[l - 1] = '\0'; } nx->response_pos += len; return line; } static gint remmina_nx_session_parse_response(RemminaNXSession *nx) { gchar *line; gchar *pos, *p; gint status = -1; if (nx->response_pos >= nx->response->len) return -1; while ((line = remmina_nx_session_get_line(nx)) != NULL) { if (nx->log_callback) nx->log_callback("[NX] %s\n", line); status = remmina_nx_session_parse_line(nx, line, &p); if (status == 500) { /* 500: Last operation failed. Should be ignored. */ } else if (status >= 400 && status <= 599) { remmina_nx_session_set_application_error(nx, "%s", line); } else { switch (status) { case 127: /* Session list */ nx->session_list_state = 1; break; case 148: /* Server capacity not reached for user xxx */ nx->session_list_state = 0; nx->allow_start = TRUE; break; case 700: nx->session_id = g_strdup(p); break; case 705: nx->session_display = atoi(p); break; case 701: nx->proxy_cookie = g_strdup(p); break; } } g_free(line); nx->status = status; } pos = nx->response->str + nx->response_pos; if (sscanf(pos, "NX> %i ", &status) < 1) { status = nx->status; } else { if (nx->log_callback) nx->log_callback("[NX] %s\n", pos); nx->response_pos += 8; } nx->status = -1; return status; } static gint remmina_nx_session_expect_status2(RemminaNXSession *nx, gint status, gint status2) { gint response; while ((response = remmina_nx_session_parse_response(nx)) != status && response != status2) { if (response == 999) break; if (!remmina_nx_session_get_response(nx)) return -1; } nx->session_list_state = 0; if (remmina_nx_session_has_error(nx)) return -1; return response; } static gboolean remmina_nx_session_expect_status(RemminaNXSession *nx, gint status) { return (remmina_nx_session_expect_status2(nx, status, 0) == status); } static void remmina_nx_session_send_command(RemminaNXSession *nx, const gchar *cmdfmt, ...) { va_list args; gchar *cmd; va_start (args, cmdfmt); cmd = g_strdup_vprintf (cmdfmt, args); channel_write (nx->channel, cmd, strlen (cmd)); g_free(cmd); ssh_set_fd_towrite (nx->session); channel_write (nx->channel, "\n", 1); } gboolean remmina_nx_session_open(RemminaNXSession *nx, const gchar *server, guint port, const gchar *private_key_file, RemminaNXPassphraseCallback passphrase_func, gpointer userdata) { gint ret; ssh_private_key privkey; ssh_public_key pubkey; ssh_string pubkeystr; gint keytype; gboolean encrypted; gchar *passphrase = NULL; gchar tmpfile[L_tmpnam + 1]; nx ->session = ssh_new(); ssh_options_set(nx->session, SSH_OPTIONS_HOST, server); ssh_options_set(nx->session, SSH_OPTIONS_PORT, &port); ssh_options_set(nx->session, SSH_OPTIONS_USER, "nx"); if (private_key_file && private_key_file[0]) { if (!remmina_get_keytype(private_key_file, &keytype, &encrypted)) { remmina_nx_session_set_application_error(nx, "Invalid private key file."); return FALSE; } if (encrypted && !passphrase_func(&passphrase, userdata)) { return FALSE; } privkey = privatekey_from_file(nx->session, private_key_file, keytype, (passphrase ? passphrase : "")); g_free(passphrase); } else { /* Use NoMachine's default nx private key */ if ((tmpnam(tmpfile)) == NULL || !g_file_set_contents(tmpfile, nx_default_private_key, -1, NULL)) { remmina_nx_session_set_application_error(nx, "Failed to create temporary private key file."); return FALSE; } privkey = privatekey_from_file(nx->session, tmpfile, REMMINA_SSH_TYPE_DSS, ""); g_unlink(tmpfile); } if (privkey == NULL) { remmina_nx_session_set_error(nx, "Invalid private key file: %s"); return FALSE; } pubkey = publickey_from_privatekey(privkey); pubkeystr = publickey_to_string(pubkey); publickey_free(pubkey); if (ssh_connect(nx->session)) { string_free(pubkeystr); privatekey_free(privkey); remmina_nx_session_set_error(nx, "Failed to startup SSH session: %s"); return FALSE; } ret = ssh_userauth_pubkey(nx->session, NULL, pubkeystr, privkey); string_free(pubkeystr); privatekey_free(privkey); if (ret != SSH_AUTH_SUCCESS) { remmina_nx_session_set_error(nx, "NX SSH authentication failed: %s"); return FALSE; } if ((nx->channel = channel_new(nx->session)) == NULL || channel_open_session(nx->channel)) { return FALSE; } if (channel_request_shell(nx->channel)) { return FALSE; } /* NX server starts the session with an initial 105 status */ if (!remmina_nx_session_expect_status(nx, 105)) return FALSE; /* Say hello to the NX server */ remmina_nx_session_send_command(nx, "HELLO NXCLIENT - Version %s", nx->version); if (!remmina_nx_session_expect_status(nx, 105)) return FALSE; /* Set the NX session environment */ remmina_nx_session_send_command(nx, "SET SHELL_MODE SHELL"); if (!remmina_nx_session_expect_status(nx, 105)) return FALSE; remmina_nx_session_send_command(nx, "SET AUTH_MODE PASSWORD"); if (!remmina_nx_session_expect_status(nx, 105)) return FALSE; nx->server = g_strdup(server); return TRUE; } gboolean remmina_nx_session_login(RemminaNXSession *nx, const gchar *username, const gchar *password) { gint response; /* Login to the NX server */ remmina_nx_session_send_command(nx, "login"); if (!remmina_nx_session_expect_status(nx, 101)) return FALSE; remmina_nx_session_send_command(nx, username); /* NoMachine Testdrive does not prompt for password, in which case 105 response is received without 102 */ response = remmina_nx_session_expect_status2(nx, 102, 105); if (response == 102) { remmina_nx_session_send_command(nx, password); if (!remmina_nx_session_expect_status(nx, 105)) return FALSE; } else if (response != 105) { return FALSE; } return TRUE; } void remmina_nx_session_add_parameter(RemminaNXSession *nx, const gchar *name, const gchar *valuefmt, ...) { va_list args; gchar *value; va_start (args, valuefmt); value = g_strdup_vprintf (valuefmt, args); g_hash_table_insert(nx->session_parameters, g_strdup (name), value); } static gboolean remmina_nx_session_send_session_command(RemminaNXSession *nx, const gchar *cmd_type, gint response) { GString *cmd; GHashTableIter iter; gchar *key, *value; cmd = g_string_new(cmd_type); g_hash_table_iter_init(&iter, nx->session_parameters); while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value)) { g_string_append_printf(cmd, " --%s=\"%s\"", key, value); } remmina_nx_session_send_command(nx, cmd->str); g_string_free(cmd, TRUE); g_hash_table_remove_all(nx->session_parameters); return remmina_nx_session_expect_status(nx, response); } gboolean remmina_nx_session_list(RemminaNXSession *nx) { gboolean ret; if (nx->session_list == NULL) { nx->session_list = gtk_list_store_new(REMMINA_NX_SESSION_N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } else { gtk_list_store_clear(nx->session_list); } ret = remmina_nx_session_send_session_command(nx, "listsession", 105); return ret; } void remmina_nx_session_set_tree_view(RemminaNXSession *nx, GtkTreeView *tree) { gtk_tree_view_set_model(tree, GTK_TREE_MODEL(nx->session_list)); } gboolean remmina_nx_session_iter_first(RemminaNXSession *nx, GtkTreeIter *iter) { if (!nx->session_list) return FALSE; return gtk_tree_model_get_iter_first(GTK_TREE_MODEL(nx->session_list), iter); } gboolean remmina_nx_session_iter_next(RemminaNXSession *nx, GtkTreeIter *iter) { if (!nx->session_list) return FALSE; return gtk_tree_model_iter_next(GTK_TREE_MODEL(nx->session_list), iter); } gchar* remmina_nx_session_iter_get(RemminaNXSession *nx, GtkTreeIter *iter, gint column) { gchar *val; gtk_tree_model_get(GTK_TREE_MODEL(nx->session_list), iter, column, &val, -1); return val; } void remmina_nx_session_iter_set(RemminaNXSession *nx, GtkTreeIter *iter, gint column, const gchar *data) { gtk_list_store_set(nx->session_list, iter, column, data, -1); } gboolean remmina_nx_session_allow_start(RemminaNXSession *nx) { return nx->allow_start; } static void remmina_nx_session_add_common_parameters(RemminaNXSession *nx) { gchar *value; /* Add fixed session parameters for startsession */ remmina_nx_session_add_parameter(nx, "cache", "16M"); remmina_nx_session_add_parameter(nx, "images", "64M"); remmina_nx_session_add_parameter(nx, "render", "1"); remmina_nx_session_add_parameter(nx, "backingstore", "1"); remmina_nx_session_add_parameter(nx, "agent_server", ""); remmina_nx_session_add_parameter(nx, "agent_user", ""); remmina_nx_session_add_parameter(nx, "agent_password", ""); value = g_strdup_printf("%i", nx->encryption); remmina_nx_session_add_parameter(nx, "encryption", value); g_free(value); } gboolean remmina_nx_session_start(RemminaNXSession *nx) { remmina_nx_session_add_common_parameters(nx); return remmina_nx_session_send_session_command(nx, "startsession", 105); } gboolean remmina_nx_session_attach(RemminaNXSession *nx) { remmina_nx_session_add_common_parameters(nx); return remmina_nx_session_send_session_command(nx, "attachsession", 105); } gboolean remmina_nx_session_restore(RemminaNXSession *nx) { remmina_nx_session_add_common_parameters(nx); return remmina_nx_session_send_session_command(nx, "restoresession", 105); } gboolean remmina_nx_session_terminate(RemminaNXSession *nx) { return remmina_nx_session_send_session_command(nx, "terminate", 105); } static gpointer remmina_nx_session_tunnel_main_thread(gpointer data) { RemminaNXSession *nx = (RemminaNXSession*) data; gchar *ptr; ssize_t len = 0, lenw = 0; fd_set set; struct timeval timeout; ssh_channel channels[2]; ssh_channel channels_out[2]; gint sock; gint ret; gchar buffer[10240]; gchar socketbuffer[10240]; gchar *socketbuffer_ptr = NULL; gint socketbuffer_len = 0; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); /* Accept a local connection */ sock = accept(nx->server_sock, NULL, NULL); if (sock < 0) { remmina_nx_session_set_application_error(nx, "Failed to accept local socket"); nx->thread = 0; return NULL; } close(nx->server_sock); nx->server_sock = -1; channels[0] = nx->channel; channels[1] = NULL; /* Start the tunnel data transmittion */ while (nx->running) { timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO(&set); FD_SET(sock, &set); ret = ssh_select(channels, channels_out, sock + 1, &set, &timeout); if (!nx->running) break; if (ret == SSH_EINTR) continue; if (ret == -1) break; if (FD_ISSET(sock, &set)) { len = read(sock, buffer, sizeof(buffer)); if (len == 0) nx->running = FALSE; else if (len > 0) { for (ptr = buffer, lenw = 0; len > 0; len -= lenw, ptr += lenw) { ssh_set_fd_towrite(nx->session); lenw = channel_write(channels[0], (char*) ptr, len); if (lenw <= 0) { nx->running = FALSE; break; } } } } if (!nx->running) break; if (channels_out[0] && socketbuffer_len <= 0) { len = channel_read_nonblocking(channels_out[0], socketbuffer, sizeof(socketbuffer), 0); if (len == SSH_ERROR || len == SSH_EOF) { nx->running = FALSE; break; } else if (len > 0) { socketbuffer_ptr = socketbuffer; socketbuffer_len = len; } else { /* Clean up the stderr buffer in case FreeNX send something there */ len = channel_read_nonblocking(channels_out[0], buffer, sizeof(buffer), 1); } } if (nx->running && socketbuffer_len > 0) { for (lenw = 0; socketbuffer_len > 0; socketbuffer_len -= lenw, socketbuffer_ptr += lenw) { lenw = write(sock, socketbuffer_ptr, socketbuffer_len); if (lenw == -1 && errno == EAGAIN && nx->running) { /* Sometimes we cannot write to a socket (always EAGAIN), probably because it's internal * buffer is full. We need read the pending bytes from the socket first. so here we simply * break, leave the buffer there, and continue with other data */ break; } if (lenw <= 0) { nx->running = FALSE; break; } } } } nx->thread = 0; return NULL; } gboolean remmina_nx_session_tunnel_open(RemminaNXSession *nx) { gint port; gint sock; gint sockopt = 1; struct sockaddr_in sin; if (!nx->encryption) return TRUE; remmina_nx_session_send_command(nx, "bye"); if (!remmina_nx_session_expect_status(nx, 999)) { /* Shoud not happen, just in case */ remmina_nx_session_set_application_error(nx, "Server won't say bye to us?"); return FALSE; } port = (nx->localport ? nx->localport : nx->session_display) + 4000; /* Create the server socket that listens on the local port */ sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { remmina_nx_session_set_application_error(nx, "Failed to create socket."); return FALSE; } setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt)); sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr.s_addr = inet_addr("127.0.0.1"); if (bind(sock, (struct sockaddr *) &sin, sizeof(sin))) { remmina_nx_session_set_application_error(nx, "Failed to bind on local port."); close(sock); return FALSE; } if (listen(sock, 1)) { remmina_nx_session_set_application_error(nx, "Failed to listen on local port."); close(sock); return FALSE; } nx->server_sock = sock; nx->running = TRUE; if (pthread_create(&nx->thread, NULL, remmina_nx_session_tunnel_main_thread, nx)) { remmina_nx_session_set_application_error(nx, "Failed to initialize pthread."); nx->thread = 0; return FALSE; } return TRUE; } static gchar* remmina_nx_session_get_proxy_option(RemminaNXSession *nx) { if (nx->encryption) { return g_strdup_printf("nx,session=%s,cookie=%s,id=%s,shmem=1,shpix=1,connect=127.0.0.1:%i", (gchar*) g_hash_table_lookup(nx->session_parameters, "session"), nx->proxy_cookie, nx->session_id, (nx->localport ? nx->localport : nx->session_display)); } else { return g_strdup_printf("nx,session=%s,cookie=%s,id=%s,shmem=1,shpix=1,connect=%s:%i", (gchar*) g_hash_table_lookup(nx->session_parameters, "session"), nx->proxy_cookie, nx->session_id, nx->server, nx->session_display); } } gboolean remmina_nx_session_invoke_proxy(RemminaNXSession *nx, gint display, GChildWatchFunc exit_func, gpointer user_data) { gchar *argv[50]; gint argc; GError *error = NULL; gboolean ret; gchar **envp; gchar *s; gint i; /* Copy all current environment variable, but change DISPLAY. Assume we should always have DISPLAY... */ if (display >= 0) { envp = g_listenv(); for (i = 0; envp[i]; i++) { if (g_strcmp0(envp[i], "DISPLAY") == 0) { s = g_strdup_printf("DISPLAY=:%i", display); } else { s = g_strdup_printf("%s=%s", envp[i], g_getenv(envp[i])); } g_free(envp[i]); envp[i] = s; } } else { envp = NULL; } argc = 0; argv[argc++] = g_strdup("nxproxy"); argv[argc++] = g_strdup("-S"); argv[argc++] = remmina_nx_session_get_proxy_option(nx); argv[argc++] = NULL; ret = g_spawn_async(NULL, argv, envp, G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &nx->proxy_pid, &error); g_strfreev(envp); for (i = 0; i < argc; i++) g_free(argv[i]); if (!ret) { remmina_nx_session_set_application_error(nx, "%s", error->message); return FALSE; } if (exit_func) { nx->proxy_watch_source = g_child_watch_add(nx->proxy_pid, exit_func, user_data); } return TRUE; } void remmina_nx_session_bye(RemminaNXSession *nx) { remmina_nx_session_send_command(nx, "bye"); remmina_nx_session_get_response(nx); } FreeRDP-Remmina-356c033/remmina-plugins/nx/nx_session.h000066400000000000000000000064111171526373700227120ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINANXSESSION_H__ #define __REMMINANXSESSION_H__ G_BEGIN_DECLS enum { REMMINA_NX_SESSION_COLUMN_DISPLAY, REMMINA_NX_SESSION_COLUMN_TYPE, REMMINA_NX_SESSION_COLUMN_ID, REMMINA_NX_SESSION_COLUMN_STATUS, REMMINA_NX_SESSION_COLUMN_NAME, REMMINA_NX_SESSION_N_COLUMNS }; typedef struct _RemminaNXSession RemminaNXSession; typedef gboolean (*RemminaNXPassphraseCallback)(gchar **passphrase, gpointer userdata); typedef void (*RemminaNXLogCallback)(const gchar *fmt, ...); RemminaNXSession* remmina_nx_session_new(void); void remmina_nx_session_free(RemminaNXSession *nx); gboolean remmina_nx_session_has_error(RemminaNXSession *nx); const gchar* remmina_nx_session_get_error(RemminaNXSession *nx); void remmina_nx_session_clear_error(RemminaNXSession *nx); void remmina_nx_session_set_encryption(RemminaNXSession *nx, gint encryption); void remmina_nx_session_set_localport(RemminaNXSession *nx, gint localport); void remmina_nx_session_set_log_callback(RemminaNXSession *nx, RemminaNXLogCallback log_callback); gboolean remmina_nx_session_open(RemminaNXSession *nx, const gchar *server, guint port, const gchar *private_key_file, RemminaNXPassphraseCallback passphrase_func, gpointer userdata); gboolean remmina_nx_session_login(RemminaNXSession *nx, const gchar *username, const gchar *password); void remmina_nx_session_add_parameter(RemminaNXSession *nx, const gchar *name, const gchar *valuefmt, ...); gboolean remmina_nx_session_list(RemminaNXSession *nx); void remmina_nx_session_set_tree_view(RemminaNXSession *nx, GtkTreeView *tree); gboolean remmina_nx_session_iter_first(RemminaNXSession *nx, GtkTreeIter *iter); gboolean remmina_nx_session_iter_next(RemminaNXSession *nx, GtkTreeIter *iter); gchar* remmina_nx_session_iter_get(RemminaNXSession *nx, GtkTreeIter *iter, gint column); void remmina_nx_session_iter_set(RemminaNXSession *nx, GtkTreeIter *iter, gint column, const gchar *data); gboolean remmina_nx_session_allow_start(RemminaNXSession *nx); gboolean remmina_nx_session_start(RemminaNXSession *nx); gboolean remmina_nx_session_attach(RemminaNXSession *nx); gboolean remmina_nx_session_restore(RemminaNXSession *nx); gboolean remmina_nx_session_terminate(RemminaNXSession *nx); gboolean remmina_nx_session_tunnel_open(RemminaNXSession *nx); gboolean remmina_nx_session_invoke_proxy(RemminaNXSession *nx, gint display, GChildWatchFunc exit_func, gpointer user_data); void remmina_nx_session_bye(RemminaNXSession *nx); G_END_DECLS #endif /* __REMMINANXSESSION_H__ */ FreeRDP-Remmina-356c033/remmina-plugins/nx/nx_session_manager.c000066400000000000000000000205531171526373700244020ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #include #include "nx_plugin.h" #include "nx_session_manager.h" static void remmina_nx_session_manager_set_sensitive(RemminaProtocolWidget *gp, gboolean sensitive) { RemminaPluginNxData *gpdata; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (gpdata->attach_session) { gtk_dialog_set_response_sensitive(GTK_DIALOG(gpdata->manager_dialog), REMMINA_NX_EVENT_TERMINATE, sensitive); gtk_dialog_set_response_sensitive(GTK_DIALOG(gpdata->manager_dialog), REMMINA_NX_EVENT_ATTACH, sensitive); } else { gtk_dialog_set_response_sensitive(GTK_DIALOG(gpdata->manager_dialog), REMMINA_NX_EVENT_TERMINATE, sensitive); gtk_dialog_set_response_sensitive(GTK_DIALOG(gpdata->manager_dialog), REMMINA_NX_EVENT_RESTORE, sensitive); } } static gboolean remmina_nx_session_manager_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data) { RemminaProtocolWidget *gp; RemminaPluginNxData *gpdata; gp = (RemminaProtocolWidget*) user_data; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->manager_selected = FALSE; if (path_currently_selected) { remmina_nx_session_manager_set_sensitive(gp, FALSE); return TRUE; } if (!gtk_tree_model_get_iter(model, &gpdata->iter, path)) return TRUE; gpdata->manager_selected = TRUE; remmina_nx_session_manager_set_sensitive(gp, TRUE); return TRUE; } static void remmina_nx_session_manager_send_signal(RemminaPluginNxData *gpdata, gint event_type) { guchar dummy = (guchar) event_type; /* Signal the NX thread to resume execution */ if (write(gpdata->event_pipe[1], &dummy, 1)) { } } static void remmina_nx_session_manager_on_response(GtkWidget *dialog, gint response_id, RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gint event_type; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remmina_nx_session_manager_set_sensitive(gp, FALSE); if (response_id <= 0) { event_type = REMMINA_NX_EVENT_CANCEL; } else { event_type = response_id; } if (response_id == REMMINA_NX_EVENT_TERMINATE && gpdata->manager_selected) { remmina_nx_session_iter_set(gpdata->nx, &gpdata->iter, REMMINA_NX_SESSION_COLUMN_STATUS, _("Terminating")); } if (response_id != REMMINA_NX_EVENT_TERMINATE) { gtk_widget_destroy(dialog); gpdata->manager_dialog = NULL; } if (response_id != REMMINA_NX_EVENT_TERMINATE && response_id != REMMINA_NX_EVENT_CANCEL) { remmina_plugin_nx_service->protocol_plugin_init_show(gp); } remmina_nx_session_manager_send_signal(gpdata, event_type); } static gboolean remmina_nx_session_manager_main(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; RemminaFile *remminafile; GtkWidget *dialog; GtkWidget *widget; gchar *s; GtkWidget *scrolledwindow; GtkWidget *tree; GtkCellRenderer *renderer; GtkTreeViewColumn *column; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_nx_service->protocol_plugin_get_file(gp); if (!gpdata->manager_started) { remmina_plugin_nx_service->protocol_plugin_init_hide(gp); dialog = gtk_dialog_new(); s = g_strdup_printf(_("NX Sessions on %s"), remmina_plugin_nx_service->file_get_string(remminafile, "server")); gtk_window_set_title(GTK_WINDOW(dialog), s); g_free(s); if (gpdata->attach_session) { gtk_dialog_add_button(GTK_DIALOG(dialog), _("Attach"), REMMINA_NX_EVENT_ATTACH); } else { gtk_dialog_add_button(GTK_DIALOG(dialog), _("Restore"), REMMINA_NX_EVENT_RESTORE); gtk_dialog_add_button(GTK_DIALOG(dialog), _("Start"), REMMINA_NX_EVENT_START); } gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, REMMINA_NX_EVENT_CANCEL); widget = gtk_dialog_add_button(GTK_DIALOG(dialog), _("Terminate"), REMMINA_NX_EVENT_TERMINATE); gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dialog))), widget, TRUE); gtk_window_set_default_size(GTK_WINDOW(dialog), 640, 300); gpdata->manager_dialog = dialog; scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0); tree = gtk_tree_view_new(); gtk_container_add(GTK_CONTAINER(scrolledwindow), tree); gtk_widget_show(tree); remmina_nx_session_set_tree_view(gpdata->nx, GTK_TREE_VIEW(tree)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes("#", renderer, "text", REMMINA_NX_SESSION_COLUMN_ID, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_NX_SESSION_COLUMN_ID); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Type"), renderer, "text", REMMINA_NX_SESSION_COLUMN_TYPE, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_NX_SESSION_COLUMN_TYPE); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Display"), renderer, "text", REMMINA_NX_SESSION_COLUMN_DISPLAY, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_NX_SESSION_COLUMN_DISPLAY); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Status"), renderer, "text", REMMINA_NX_SESSION_COLUMN_STATUS, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_NX_SESSION_COLUMN_STATUS); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "text", REMMINA_NX_SESSION_COLUMN_NAME, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_NX_SESSION_COLUMN_NAME); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), remmina_nx_session_manager_selection_func, gp, NULL); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_nx_session_manager_on_response), gp); gpdata->manager_started = TRUE; } gpdata->manager_selected = FALSE; if (gpdata->manager_dialog) { remmina_nx_session_manager_set_sensitive(gp, FALSE); gtk_widget_show(gpdata->manager_dialog); } if (remmina_nx_session_has_error(gpdata->nx)) { dialog = gtk_message_dialog_new((gpdata->manager_dialog ? GTK_WINDOW(gpdata->manager_dialog) : NULL), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "%s", remmina_nx_session_get_error (gpdata->nx)); remmina_nx_session_clear_error (gpdata->nx); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); remmina_nx_session_manager_send_signal (gpdata, 0); } gpdata->session_manager_start_handler = 0; return FALSE; } void remmina_nx_session_manager_start(RemminaProtocolWidget *gp) { RemminaPluginNxData *gpdata; gpdata = (RemminaPluginNxData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (gpdata->session_manager_start_handler == 0) { gpdata->session_manager_start_handler = IDLE_ADD((GSourceFunc) remmina_nx_session_manager_main, gp); } } FreeRDP-Remmina-356c033/remmina-plugins/nx/nx_session_manager.h000066400000000000000000000017271171526373700244110ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINANXSESSIONMANAGER_H__ #define __REMMINANXSESSIONMANAGER_H__ G_BEGIN_DECLS void remmina_nx_session_manager_start(RemminaProtocolWidget *gp); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/po/000077500000000000000000000000001171526373700203405ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/po/CMakeLists.txt000066400000000000000000000015521171526373700231030ustar00rootroot00000000000000# po/remmina-plugins - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. include(GETTEXT) gettext(${CMAKE_CURRENT_SOURCE_DIR} "remmina-plugins") FreeRDP-Remmina-356c033/remmina-plugins/po/ChangeLog000066400000000000000000000000001171526373700221000ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/po/POTFILES.in000066400000000000000000000004271171526373700221200ustar00rootroot00000000000000nx/remminapluginnx.c nx/remminanxsession.c nx/remminanxsessionmanager.c rdp/remminapluginrdp.c rdp/remminapluginrdp_settings.c telepathy/remminaplugintelepathy.c telepathy/remminatphandler.c telepathy/remminatpchannelhandler.c vnc/remminapluginvnc.c xdmcp/remminapluginxdmcp.c FreeRDP-Remmina-356c033/remmina-plugins/po/POTFILES.skip000066400000000000000000000000441171526373700224530ustar00rootroot00000000000000libvncserver/libvncclient/minilzo.c FreeRDP-Remmina-356c033/remmina-plugins/po/bg.po000066400000000000000000000240161171526373700212730ustar00rootroot00000000000000# Bulgarian translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:53+0000\n" "Last-Translator: Svetoslav Stefanov \n" "Language-Team: Svetoslav Stefanov \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: BULGARIA\n" "Language: \n" "X-Poedit-Language: Bulgarian\n" "X-Poedit-SourceCharset: utf-8\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Лошо (най-бързо)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Средно" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Добро" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Ðай-добро (най-бавно)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Файл за идентичноÑÑ‚" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "ПотребителÑко име" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "КачеÑтво" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Стартиране на програма при Ñвързване" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Изключване на Ñинхронизиране на буфера за обмен" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Изключване на шифриране" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Използване на Ð»Ð¾ÐºÐ°Ð»Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð»ÐµÑ†" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX технологиÑ" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Спиране" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX ÑеÑии на %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Прикачване" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "ВъзÑтановÑване" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Ðачало" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "ПрекратÑване" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Тип" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Екран" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "СъÑтоÑние" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Име" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "ÐевъзможноÑÑ‚ за Ñвързване Ñ RDP Ñървъра %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 цвÑта" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "ВиÑок цвÑÑ‚ (15 бита)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "ВиÑок цвÑÑ‚ (16 бита)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "ИÑтинÑки цвÑÑ‚ (24 бита)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Изключен" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Локален" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Отдалечен" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Домейн" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Дълбочина на цвета" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "СподелÑне на папка" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Звук" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Име на клиент" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Път за Ñтартиране" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "СподелÑне на локалните принтери" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Презареждане" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Терминална уÑлуга на Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - Файлова поддръжка на RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - ÐаÑтройки" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "ИзнаÑÑне на връзката във Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚ на Windows .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<Ðвтоматично заÑичане>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Клавиатурна подредба" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "ÐаÑтройка на качеÑтвото" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Тапет" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "МеÑтене на прозореца" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð° менюто" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Тема" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "СÑнка на показалеца" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Мигащ курÑор" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Заглаждане на шрифта" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "СъÑтавÑне" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - СподелÑне на работното мÑÑто" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s желае да Ñи Ñподели работното мÑÑто.\n" "Приемате ли поканата?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Покана за Ñподелено работно мÑÑто" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Ðе може да Ñе оÑъщеÑтви връзка към VNC Ñървъра" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "'%s' не може да Ñе превърна в Ð°Ð´Ñ€ÐµÑ Ð½Ð° хоÑÑ‚" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC връзката е неуÑпешна: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Вашето Ñвързване беше отхвърлено." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Показване на Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð»ÐµÑ†" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Само преглед" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Изключване въвеждането на Ñървъра" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Слушане на порт" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "ОтварÑне на чат..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - ВходÑща връзка" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Стандартно" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Степени на Ñивото" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "ПрекъÑване Ñлед една ÑеÑиÑ" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Отдалечена ÑеÑÐ¸Ñ Ð½Ð° X" FreeRDP-Remmina-356c033/remmina-plugins/po/cs.po000066400000000000000000000225171171526373700213140ustar00rootroot00000000000000# Czech translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-27 19:53+0000\n" "Last-Translator: Kabi \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-28 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: cs\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Nejhorší (rychlejší)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "StÅ™ední" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Dobré" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Nejlepší (nejpomalejší)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identita souboru" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Uživatelské jméno" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kvalita" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "SpouÅ¡tÄ›ný program" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Zakázat synchronizaci schránky" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Zakázat Å¡ifrování" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Použít místní kurzor" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX Technologie" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "UkonÄování" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX Sezení na %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "PÅ™iložit" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Obnovit" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Start" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "UkonÄit" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Typ" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Zobrazit" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Jméno" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Nelze pÅ™ipojit k RDP serveru %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 barev" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 bitů)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 bitů)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 bitů)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Vypnout" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Místní" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Vzdálený" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Doména" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Barevná hloubka" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Sdílená složka" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Zvuk" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Název klienta" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "SpouÅ¡tÄ›ná cesta" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Sdílení lokálních tiskáren" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "Zakázat TLS spojení" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "PÅ™idat do konzole (Windows 2003 / 2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Obnovit" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP File Handler" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Nastavení" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exportovat pÅ™ipojení do souboru *.rdp (Windows)" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Rozložení klávesnice" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "Pro klávesnici použít klientovo rozložení" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Nastavení kvality" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Obrázek na pozadí" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Shodit okno" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animace menu" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Motiv" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Obrys kurzoru" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Blikání kurzoru" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Vyhlazování písma" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Složení" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Sdílení plochy" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s s vámi chce sdílet svou plochu.\n" "Chcete pÅ™ijmout žádost?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Pozvat ke sdílení pracovní plochy" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Nelze pÅ™ipojit k VNC serveru" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Nemohu zmÄ›nit '%s' na host adresu" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Spojení pomocí VNC selhalo: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "VaÅ¡e spojení bylo odmítnuto." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "OpakovaÄ" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Zobrazit vzdálený kurzor" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Pouze náhled" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Zakázat vstup serveru" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Naslouchání na portu" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Otevřít chat..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Příchozí spojení" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Výchozí" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Odstíny Å¡edi" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Odpojit po jednom sezení" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Remote Session" #~ msgid "" #~ msgstr "" #~ msgid "Poor (Fastest)" #~ msgstr "Nejhorší (Rychlejší)" #~ msgid "Keyboard Layout" #~ msgstr "Rozložení klávesnice" #~ msgid "Font Smoothing" #~ msgstr "Vyhlazování písma" #~ msgid "Cursor Blinking" #~ msgstr "Blikání kurzoru" #~ msgid "Cursor Shadow" #~ msgstr "Obrys kurzoru" #~ msgid "Window Drag" #~ msgstr "Shodit okno" #~ msgid "Menu Animation" #~ msgstr "Animace menu" #~ msgid "Best (Slowest)" #~ msgstr "Nejlepší (Nejpomalejší)" #~ msgid "Quality Option" #~ msgstr "Nastavení kvality" FreeRDP-Remmina-356c033/remmina-plugins/po/da.po000066400000000000000000000210341171526373700212640ustar00rootroot00000000000000# Danish translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:52+0000\n" "Last-Translator: Vic \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: da\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Ringe (hurtigst)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Middel" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "God" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Best (langsomste)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identitets fil" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Brugernavn" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kvalitet" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Opstartsprogram" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Deaktiver udklipsholder sync" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Deaktiver kryptering" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Brug lokal markør" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX Technology" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Afslutter" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX Sessioner pÃ¥ %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Vedhæft" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Gendan" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Start" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Afslut" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Type" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Fremvis" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Navn" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Kan ikke tilslutte RDP server %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 farver" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Mange farver (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Mange farver (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Ægte farver (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Fra" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokal" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Fjern" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domæne" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Farvedybde" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Dele mappe" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Lyd" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Klientnavn" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Opstartssti" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Del lokale printere" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Opdatér" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP Fil HÃ¥ndterer" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Indstillinger" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exporter forbindelse i Windows .rdp filformat" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Tastaturlayout" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Kvalitets indstilling" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Baggrundsbillede" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Vindue træk" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Menu animation" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Markør skygge" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Blinkende markør" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Skrifttype udjævning" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Komposition" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Skrivebordsdeling" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s vil dele hans/hendes skrivebord.\n" "Vil du acceptere invitationen?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Invitation til deling af skrivebord" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Kan ikke forbinde til VNC server" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Kunne ikke konvertere '%s' til host adresse" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC forbindelse fejlede: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Din forbindelse blev afvist." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Vis serverens markør" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Kun visning" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Deaktiver server input" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Lyt pÃ¥ port" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Ã…ben Chat..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - IndgÃ¥ende Forbindelse" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Standard" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "GrÃ¥toner" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Afbryd Efter En Session" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Remote Session" FreeRDP-Remmina-356c033/remmina-plugins/po/de.po000066400000000000000000000205441171526373700212750ustar00rootroot00000000000000# German translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:49+0000\n" "Last-Translator: cmdrhenner \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: de\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Niedrig (schnell)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Mittel" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Gut" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Beste (langsam)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identitäts-datei" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Benutzername" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Qualität" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Start-programm" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Zwischenablagensychronisation deaktivieren" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Verschlüsselung deaktivieren" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Lokalen zeiger verwenden" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Beende" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX Sessions auf %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Verbinden" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Wiederherstellen" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Start" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Beende" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Typ" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Anzeige" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Name" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Kann nicht mit RDP-Server %s verbinden" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 farben (8 bit)" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Hohe farbtiefe (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Hohe farbtiefe (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Echtfarben (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Aus" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokal" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Entfernt" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domäne" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Farbtiefe" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Verzeichnis teilen" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Klang" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Client-name" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Start-pfad" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Lokale drucker freigeben" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows Terminal Dienst" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Tastaturbelegung" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Qualitäts-option" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Hintergrundbild" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Cursor schatten" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Blinkender cursor" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Zusammensetzung" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Verbindung zu VNC-Server fehlgeschlagen" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "»%s« konnte nicht in eine Host-Adresse umgewandelt werden" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC-Verbindung fehlgeschlagen: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Die Verbindung wurde abgelehnt." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Entfernten cursor anzeigen" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Nur anzeigen" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Server-eingaben deaktivieren" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Auf port hören" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Chat öffnen..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Eingehende Verbindung" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Vorgabe" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Graustufen" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Die Verbindung nach einer Sitzung trennen" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "" FreeRDP-Remmina-356c033/remmina-plugins/po/el.po000066400000000000000000000210271171526373700213020ustar00rootroot00000000000000# 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: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:48+0000\n" "Last-Translator: Edward Karavakis \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: \n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Χαμηλό (ΓÏήγοÏο)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "ΜέτÏιο" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Καλό" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Βέλτιστη (ΑÏγό)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "ΑÏχείο Identity" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Όνομα ΧÏήστη" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Ποιότητα" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "ΠÏόγÏαμμα Εκκίνησης" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "ΕπαναφοÏά" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "ΈναÏξη" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "ΠÏοβολή" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Όνομα" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 ΧÏώματα" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Τοπικό" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "ΑπομακÏυσμένο" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Τομέας" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Ποιότητα ΧÏώματος" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "ΜοίÏασμα Φακέλου" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Όνομα Πελάτη" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "ΔιαδÏομή Εκκίνησης" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Διάταξη ΠληκτÏολογίου" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "ΔÏομέας αναβοσβήνει" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "ΠÏόσκληση διαμοιÏÎ±ÏƒÎ¼Î¿Ï ÎµÏ€Î¹Ï†Î¬Î½ÎµÎ¹Î±Ï‚ εÏγασίας" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "ΑδÏνατη η σÏνδεση στον VNC εξυπηÏετητή" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "ΑδÏνατη η μετατÏοπή του '%s' στην διεÏθυνση του host" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Η VNC σÏνδεση απέτυχε: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Η σÏνδεσή σας αποÏÏίφθηκε" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Μόνο ΠÏοβολή" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "ΑπενεÏγοποίηση Εισόδων ΕξυπηÏετητή" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "ΡÏθμιση στην ΠόÏτα" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Άνοιγμα Ανταλλαγής Μυνημάτων" #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - ΕισεÏχόμενη ΣÏνδεση" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "ΠÏοεπιλογή" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "" FreeRDP-Remmina-356c033/remmina-plugins/po/es.po000066400000000000000000000226151171526373700213150ustar00rootroot00000000000000# Spanish translation of remmina # Copyright (C) 2008 - 2009 The remmina'S COPYRIGHT HOLDER # This file is distributed under the same license as the remmina package. # # Julio Napurí Carlos , 2008-2009 # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2011-01-12 22:39+0000\n" "Last-Translator: Alex Puente \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-01-13 05:06+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: es\n" "X-Poedit-Language: Spanish\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Pobre (más rápido)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Medio" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Bueno" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Mejor (más lento)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Archivo de identidad" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Usuario" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Calidad" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Programa de inicio" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Desactivar sincronización entre portapapeles" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Desactivar cifrado" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Usar cursor local" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "Tecnología NX - NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Terminando" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX Sesiones activas %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Adjuntar" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Restaurar" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Iniciar" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Terminar" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Tipo" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Mostrar" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Estado" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Nombre" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Desabilitada la conexión al servidor RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 colores" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Alta densidad (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Alta densidad (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Color verdadero (24 bits)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Off" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Local" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Remoto" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Dominio" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Profundidad de color" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Carpeta compartida" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Sonido" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nombre del cliente" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Ruta de inicio" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Impresoras locales compartidas" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Actualizar" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Protocolo de Escritorio Remoto de Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "Tratar archivos RDP - RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Preferencias" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exportar conexión a windows en formato de archivo .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Distribución de teclado" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Opciones de calidad" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Fondo de Pantalla" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Copiar ventana" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animación de menú" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Sombra del cursor" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Parpadeo del cursor" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Alisando fuente" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Composición" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Distribución de Escritorio" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s quieres compartir tu escritorio.\n" "Aceptas la invitación?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Invitación para compartir el escritorio" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "No se pudo conectar al servidor VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "No se pudo convertir '%s' en una dirección de servidor" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "La conexión VNC ha fallado: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "La conexión ha sido rechazada." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Mostrar cursor remoto" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Ver solamente" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Deshabilitar entrada del servidor" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Escuchar en el puerto" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Abrir chat..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Conexión entrante" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Por omisión" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Escala de grises" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Desconectarse después de una sesión" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Protocolo de Control de Administrador de la Pantalla X" #~ msgid "" #~ msgstr "" #~ msgid "Best (Slowest)" #~ msgstr "Mejor (más lento)" #~ msgid "Poor (Fastest)" #~ msgstr "Pobre (más rápido)" #~ msgid "Cursor Shadow" #~ msgstr "Sombra del cursor" #~ msgid "Keyboard Layout" #~ msgstr "Distribución de teclado" #~ msgid "Window Drag" #~ msgstr "Copiar ventana" #~ msgid "Quality Option" #~ msgstr "Opciones de calidad" #~ msgid "Font Smoothing" #~ msgstr "Alisando fuente" #~ msgid "Cursor Blinking" #~ msgstr "Parpadeo del cursor" #~ msgid "Menu Animation" #~ msgstr "Animación de menú" FreeRDP-Remmina-356c033/remmina-plugins/po/eu.po000066400000000000000000000202561171526373700213160ustar00rootroot00000000000000# translation of eu.po to Basque # Basque translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # # FIRST AUTHOR , 2010. # Iñaki Larrañaga Murgoitio , 2010. msgid "" msgstr "" "Project-Id-Version: eu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:47+0000\n" "Last-Translator: Vic \n" "Language-Team: Basque \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: eu\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Baxua (azkarra)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Tartekoa" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Ona" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Onena (motelena)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identitate-fitxategia" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Erabiltzaile-izena" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kalitatea" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Abioko programa" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Erabili kurtsore lokala" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 kolore" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Kolore altua (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Kolore altua (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Benetako kolorea (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Inaktibo" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokala" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Urrunekoa" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domeinua" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Kolore-sakonera" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Partekatu karpeta" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Soinua" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Bezeroaren izena" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Abioko bide-izena" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Partekatu inprimagailu lokalak" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows-eko terminal zerbitzua" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Ezin da VNC zerbitzariarekin konektatu" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Ezin izan da '%s' bihurtu ostalariaren helbidera" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC konexioak huts egin du: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Konexioa ukatu egin da." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Ikusi soilik" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Desgaitu zerbitzariaren sarrera" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Entzun ataka" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Ireki berriketa..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Sare Birtualeko Konputazioa" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Sarrerako konexioa" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Lehenetsia" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Gris-eskala" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Deskonektatu saio baten ostean" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X urruneko saioa" FreeRDP-Remmina-356c033/remmina-plugins/po/fr.po000066400000000000000000000211541171526373700213120ustar00rootroot00000000000000# French translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:46+0000\n" "Last-Translator: Davy Defaud \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: fr\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Mauvais (le plus rapide)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Moyen" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Bon" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Excellent (le plus lent)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Fichier d’identité" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Nom d’utilisateur" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Qualité" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Programme de démarrage" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Désactiver la synchro du presse-papiers" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Désactiver le chiffrement" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Utiliser le curseur local" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "Technologie NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Déconnexion" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "Sessions NX sur %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Attacher" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Restaurer" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Connecter" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Terminer" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Type" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Affichage" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Statut" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Nom" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Connexion au serveur RDP %s impossible" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 couleurs" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "32768 couleurs (15 bits)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "65536 couleurs (16 bits)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Couleurs vraies (24bits)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Désactivé" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Local" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Distant" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domaine" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Profondeur de couleur" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Dossier partagé" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Son" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nom du client" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Chemin de démarrage" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Partager les imprimantes locales" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Actualiser" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - gestionnaire de fichiers RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exporter les connexions au format Windows .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Partage de bureau" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s désire partager son bureau.\n" "Acceptez-vous son invitation ?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Invitation à partager le bureau" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Impossible de se connecter au serveur VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Impossible de convertir « %s » en adresse d’hôte" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "La connexion VNC a échoué : %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "La connexion a été rejetée." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Afficher le curseur distant" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Vue seulement" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Désactiver les entrées du serveur" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Écouter sur le port" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Ouvrir la discussion..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Connexion entrante" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Par défaut" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Niveaux de gris" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Se déconnecter à fin de la session" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Session X11 distante" FreeRDP-Remmina-356c033/remmina-plugins/po/hu.po000066400000000000000000000215031171526373700213150ustar00rootroot00000000000000# Hungarian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:44+0000\n" "Last-Translator: kilo aka Gabor Kmetyko \n" "Language-Team: Hungarian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: hu\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Szegény (leggyorsabb)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Közepes" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Jó" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Legjobb (leglassabb)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Azonosító fájl" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Felhasználónév" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "MinÅ‘ség" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Induló program" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Vágólap szinkronizálás tiltása" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Titkosítás tiltása" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Helyi kurzor használata" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX technológia" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Befejezés." #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX kapcsolat %s-n" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Kapcsolódás" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Helyreállítás" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Indítás" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Bezárás" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Típus" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Megjelenítés" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Ãllapot" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Név" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Nem sikerült %s RDP kiszolgálóhoz kapcsolódni" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 szín" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "15 bites színmélység" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "16 bites színmélység" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "24 bites színmélység" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Kikapcsolva" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Helyi" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Távoli" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Tartomány" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Színmélység" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Könyvtár megosztása" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Hang" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Kliensnév" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Induló útvonal" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Helyi nyomtatók megosztása" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Frissít" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows Terminál Szolgáltatás" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP Fájlleíró" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Beállítások" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Kapcsolat exportálása Windows .rdp fájlformátumban" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Billentyűzet kiosztás" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "MinÅ‘ség beállítása" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Háttér" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Ablak mozgatása" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Menü animáció" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Téma" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Kurzor árnyék" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Kurzor villogás" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Betűtípus simítása" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Kompozit" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Asztal megosztás" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s meg akarja osztani az asztalát.\n" "Elfogadod a meghívót?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Asztal-megosztás meghívó" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Nem lehet csatlakozni a VNC kiszolgálóhoz" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Nem sikerült kiszolgálócímmé alakítani '%s'-t" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC kapcsolódási hiba: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "A kapcsolódás elutasításra került" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Távoli kurzor megjelenítése" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Csak megtekintés" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Kiszolgáló üzenet letiltása" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Port figyelése" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Beszélgetés megnyitása..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - BejövÅ‘ kapcsolat" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Alapértelmezett" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Szürke színárnyalatos" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Lekapcsolódás egy munkamenet után" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Távoli Kapcsolat" FreeRDP-Remmina-356c033/remmina-plugins/po/id.po000066400000000000000000000167721171526373700213110ustar00rootroot00000000000000# Indonesian translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-05-28 18:09+0000\n" "Last-Translator: tri m s \n" "Language-Team: Indonesian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: id\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "" #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Incoming Connection" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Remote Session" FreeRDP-Remmina-356c033/remmina-plugins/po/it.po000066400000000000000000000216571171526373700213270ustar00rootroot00000000000000# Italian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2011-01-17 23:31+0000\n" "Last-Translator: mrktt77 \n" "Language-Team: Italian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-01-18 05:16+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: it\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Bassa (più veloce)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Medio" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Buono" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Migliore (più lenta)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Certificato di identità" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Nome utente" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Qualità" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Programma di avvio" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Disabilita sincronizzazione appunti" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Disabilita crittografia" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Usare il cursore locale" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX Technology" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Terminando" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "Sessioni NX su %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Allega" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Ripristina" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Inizia" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Termina" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Digita" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Mostra" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Stato" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Nome" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Impossibile connetersi al server RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 colori" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Inattivo" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Locale" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Remoto" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Dominio" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Profondità colore" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Condivisione cartella" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Audio" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nome client" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Percorso di avvio" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Condividere le stampanti locali" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "Disabilita la negoziazione TLS" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "Connessione alla console (Windows 2003 / 2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Aggiorna" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP File Handler" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Preferenze" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Esporta la connessione nel formato Windows .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Layout di tastiera" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "Usa il layout di tastiera del client" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Opzioni qualità" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Sfondo" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Trascinamento finestra" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animazione menù" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Ombra del cursore" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Lampeggiamento del cursore" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Arrotondamento dei caratteri" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Composizione" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Condivisione del desktop" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s vuole condividere il suo desktop.\n" "Accetti l'invio?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Invito per la condivisione del desktop" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Impossibile connettersi al server VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Impossibile risolvere '%s' ad un nome host" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Connessione VPN fallite: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Connessione rifiutata." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "Ripetitore" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Visualizza Cursore Remoto" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Solo visualizzazione" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Disabilita l'input del server" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Ascoltare sulla porta" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Aprire la chat" #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Connessione in ingresso" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Predefinita" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Scala di grigi" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Disconnettersi al termine di una sessione" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Remote Session" #~ msgid "Menu Animation" #~ msgstr "Animazione Menù" #~ msgid "Best (Slowest)" #~ msgstr "Migliore (più lenta)" FreeRDP-Remmina-356c033/remmina-plugins/po/kk.po000066400000000000000000000255401171526373700213130ustar00rootroot00000000000000# Kazakh translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2011-01-08 11:46+0000\n" "Last-Translator: jmb_kz \n" "Language-Team: Kazakh \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-01-09 05:07+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: kk\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Ðашар (ең жылдам)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Орташа" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "ЖақÑÑ‹" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Ең жақÑÑ‹ (ең баÑу)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Кілт файлы" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Пайдаланушы аты" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "СапаÑÑ‹" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Ðшылатын бағдарлама" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "ÐлмаÑтыру буферінің уйлеÑтіруін (Ñинхронизировать) Ñ–Ñтен ажырату" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Шифрлеуді Ñ–Ñтен ажырату" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Жергілікті тышқан курÑорын қолдану" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX технологиÑÑÑ‹" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Доғарылуда" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "%s-дегі NX ÑеанÑтары" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Тиеу" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Бұрыңғы қалпына қайтару" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "БаÑтау" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Доғару" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Түрі" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "ДиÑплей" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Күйі" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Ðты" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "%s RDP Ñерверіне қоÑылу мүмкін емеÑ" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 түÑ" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 бит)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 бит)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 бит)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "ІÑтен ажыратылған" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Жергілікті" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Кашықтаған" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Домен" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Ð¢Ò¯Ñ Ñ‚ÐµÑ€ÐµÒ£Ð´Ñ–Ð³Ñ–" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Буманы жалпы жетімдігіне жариÑлау" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "ДыбыÑ" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Клиент аты" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Ðшылудың орнаÑқан жері" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Жергілікті принтерлерді жалпы жетімділікке жариÑлау" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "TLS келіÑтіруін Ñ–Ñтен ажырату" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "КонÑольға тиеу (Windows 2003 / 2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Жаңарту" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows терминалдар қызметі" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP файлдық қолдау" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - баптаулар" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "ҚоÑылыÑтарды Windows .rdp файлдардың форматына ÑкÑпорттау" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<Ðвтоматты анықтау>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Пернетақта тілі" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "Пайдаланушының пернетақта тілін қолдану" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Сапа баптауы" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Терезелерді жылжыту" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Мәзір анимациÑÑÑ‹" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Ó˜Ñемдеу тақырыбы" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "КурÑордың көлеңкеÑÑ–" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "КурÑордың жыпылықтауы" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Қаріптердің тегіÑтеу" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Ð–Ò±Ð¼Ñ‹Ñ Ò¯Ñтел композициÑ" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелге қоÑылу" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s өз Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелін баÑқаруды Ñізге Ò±Ñынуда.\n" "Шақыруды қабылдау қажет пе?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Ð–Ò±Ð¼Ñ‹Ñ Ò¯Ñтел жалпы жетімдігіне шақыру" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "VNC Ñерверіне қоÑылу мүмкін емеÑ" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "\"%s\" хоÑÑ‚ адреÑіне келтіру мүмкін емеÑ" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC қоÑылыÑÑ‹ ÑәтÑіз аÑқталды: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Сіздің қоÑÑ‹Ð»Ñ‹Ñ ÑұраныÑыңыз қабылданылмады." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "Қайталауыш (повторитель)" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Қашықтаған тышқан курÑорын көрÑету" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Тек қана қарау" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Серверде енгізуді болдырмау" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "ОÑÑ‹ портты тыңдау" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Чатты ашу..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - виртуалды желілік еÑептеу" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - ÐºÑ–Ñ€Ñ–Ñ Ò›Ð¾ÑылыÑ" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Қалыпты" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Сұр реңкті" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Бір ÑеанÑтан кейін байланыÑты үзу" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X-Ñерверіне қашықтаған қоÑылыÑ" #~ msgid "Keyboard Layout" #~ msgstr "Пернетақта тілі" #~ msgid "Font Smoothing" #~ msgstr "Қаріптердің тегіÑтеу" #~ msgid "Cursor Shadow" #~ msgstr "КурÑордың көлеңкеÑÑ–" #~ msgid "Cursor Blinking" #~ msgstr "КурÑордың жыпылықтауы" #~ msgid "Window Drag" #~ msgstr "Терезелерді жылжыту" #~ msgid "Best (Slowest)" #~ msgstr "Ең жақÑÑ‹ (ең баÑу)" #~ msgid "Quality Option" #~ msgstr "Сапа баптауы" #~ msgid "" #~ msgstr "<Ðвтоматты анықтау>" #~ msgid "Poor (Fastest)" #~ msgstr "Ðашар (ең жылдам)" #~ msgid "Menu Animation" #~ msgstr "Мәзір анимациÑÑÑ‹" FreeRDP-Remmina-356c033/remmina-plugins/po/lt.po000066400000000000000000000221331171526373700213200ustar00rootroot00000000000000# Lithuanian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2011-01-17 10:52+0000\n" "Last-Translator: Aurimas FiÅ¡eras \n" "Language-Team: Lithuanian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2011-01-18 05:16+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: lt\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Prasta (greiÄiausia)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "VidutinÄ—" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Gera" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Geriausia (lÄ—Äiausia)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Tapatumo failas" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Naudotojo vardas" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "KokybÄ—" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Paleidimo programa" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "IÅ¡jungti iÅ¡karpinÄ—s sinchronizavimÄ…" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "IÅ¡jungti Å¡ifravimÄ…" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Naudoti vietinį žymeklį" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX technologija" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Nutraukiama" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX seansai serveryje %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Prijungti" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Atkurti" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "PradÄ—ti" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Nutraukti" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Tipas" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Rodymas" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "BÅ«sena" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Vardas" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Nepavyko prisijungti prie RDP serverio %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 spalvos" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "AukÅ¡tos raiÅ¡kos (15 bitų)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "AukÅ¡tos raiÅ¡kos (16 bitų)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "AukÅ¡Äiausios raiÅ¡kos (24 bitų)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "IÅ¡jungtas" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Vietinis" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "NutolÄ™s" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Sritis" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Spalvų skaiÄius" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Dalintis aplanku" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Garsas" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Kliento vardas" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Paleidimo kelias" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Dalintis vietiniais spausdintuvais" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "IÅ¡jungti TLS derybas" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "Prisijungti prie pulto (Windows 2003 / 2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Atnaujinti" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows terminalų paslauga" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP failų doroklÄ—" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - nuostatos" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Eksportuoti prisijungimÄ… Windows .rdp failo formatu" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "KlaviatÅ«ros iÅ¡dÄ—stymas" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "Naudoti kliento klaviatÅ«ros atvaizdį" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "KokybÄ—" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Darbalaukio fonas" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Lango tempimas" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Meniu animacija" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Žymeklio Å¡ešėlis" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Žymeklio mirksÄ—jimas" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Å riftų glodinimas" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Kompozicija" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - darbalaukio dalinimasis" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s nori dalintis savo darbalaukiu.\n" "Ar priimsite kvietimÄ…?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Darbalaukio dalinimosi kvietimas" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Nepavyko prisijungti prie VNC serverio" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Nepavyko konvertuoti „%s“ į kompiuterio adresÄ…" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC ryÅ¡ys nepavyko: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "JÅ«sų prisijungimas buvo atmestas." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "Kartotuvas" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Rodyti nuotolinį žymeklį" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Tik peržiÅ«ra" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "IÅ¡jungti serverio įvedimÄ…" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Klausytis prievado" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Atverti pokalbį..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - virtualiojo tinklo naudojimas" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - gaunamas prisijungimas" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Numatytasis" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Pilkumo atspalviai" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Atsijungti po vienos sesijos" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X nutolÄ™s seansas" #~ msgid "RDP - Global Settings" #~ msgstr "RDP - globalÅ«s nustatymai" #~ msgid "" #~ msgstr "" #~ msgid "Keyboard Layout" #~ msgstr "KlaviatÅ«ros iÅ¡dÄ—stymas" FreeRDP-Remmina-356c033/remmina-plugins/po/nl.po000066400000000000000000000211431171526373700213120ustar00rootroot00000000000000# Dutch translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:37+0000\n" "Last-Translator: Vic \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: nl\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Laag (snelst)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Gemiddeld" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Goed" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Beste (traagst)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identiteitsbestand" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Gebruikersnaam" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kwaliteit" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Opstartprogramma" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Klembord synchronisatie uitschakelen" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Encryptie uitschakelen" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Gebruik lokale aanwijzer" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX Technologie" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Beëindigen" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX Sessies op %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Bijvoegen" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Herstellen" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Start" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Afbreken" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Soort" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Beeldscherm" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Naam" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Onmogelijk om een connectie te maken met RDP server %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 kleuren" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Hoge kleuren (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Hoge kleuren (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Ware kleuren (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Uit" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokaal" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Op afstand" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domein" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Kleurdiepte" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Map delen" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Geluid" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Client naam" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Opstartlocatie" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Deel lokale printers" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Vernieuwen" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP Bestandsoverdracht" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Voorkeuren" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exporteer de connectie naar Windows .rdp formaat" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Toetsenbordindeling" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Kwaliteitsopties" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Achtergrondafbeelding" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Menu slepen" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Menu animatie" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Thema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Cursor schaduw" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Cursor knipperen" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Lettertype verzachten" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Bureaublad Delen" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "%s wilt zijn / haar bureaublad delen." #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Uitnodiging bureaublad delen" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Kan geen verbinding maken met VNC-server" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Kon '%s' niet naar een netwerk-adres vertalen" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC-verbinding mislukt: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "De verbinding is geweigerd" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Toon cursor op afstand" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Alleen kijken" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Server-invoer uitschakelen" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Luister naar poort" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Open gesprek..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Inkomende verbinding" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Standaard" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Grijstinten" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Verbreek Connectie na één Sessie" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Externe Sessie" FreeRDP-Remmina-356c033/remmina-plugins/po/pl.po000066400000000000000000000216401171526373700213160ustar00rootroot00000000000000# Polish translation of remmina plugins # Copyright (C) 2008 The remmina'S COPYRIGHT HOLDER # This file is distributed under the same license as the remmina package. # # Jakub Tomczak , 2009 # Piotr Sokół , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina-plugins\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:37+0000\n" "Last-Translator: Vic \n" "Language-Team: Polish <>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: pl\n" "X-Poedit-Language: Polish\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Niska (najszybsza)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Åšrednia" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Wysoka" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Najwyższa (najwolniejsza)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Plik tożsamoÅ›ci" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Nazwa użytkownika" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Jakość" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Program startowy" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Wyłączenie synchronizacji schowka" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Wyłączenie szyfrowania" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Użycie lokalnego kursora" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - PrzesyÅ‚anie obrazu ze Å›rodowiska graficznego" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "KoÅ„czenie..." #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "Sesje NX na %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Załącz" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Przywróć" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "ZakoÅ„cz" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Typ" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Ekran" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Stan" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Nazwa" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Nie można połączyć z serwerem RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 kolorów" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High Color (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High Color (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True Color (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Wyłączony" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "PoÅ‚ożenie lokalne" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "PoÅ‚ożenie zdalne" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domena" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Głębia kolorów" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Współdzielenie katalogu" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "DźwiÄ™k" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nazwa klienta" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Åšcieżka startowa" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "UdostÄ™pnianie drukarek lokalnych" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "OdÅ›wież" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Terminal graficzny sytemu Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - ObsÅ‚uga plików RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Preferencje" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Wybór pliku" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "UkÅ‚ad klawiatury" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Jakość" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Tapeta pulpitu" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Przemieszczanie okien" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animacja menu" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Styl" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "CieÅ„ kursora" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Miganie kursora" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "WygÅ‚adzanie czcionek" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Kompozycja" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Współdzielenie pulpitu" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "Użytkownik %s chce współdzielić swój pulpit.\n" "Zaakceptować zaproszenie?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Zaproszenie do współdzielenia pulpitu" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Nie można połączyć z serwerem VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Nie udaÅ‚o siÄ™ przetÅ‚umaczyć ciÄ…gu „%s†na adres komputera." #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Nie udaÅ‚o siÄ™ połączyć za poÅ›rednictwem protokoÅ‚u VNC: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Połączenie zostaÅ‚o odrzucone." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "WyÅ›wietlanie zdalnego kursora" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Wyłączenie interakcji" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Wyłączenie wprowadzania danych" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Port" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Otwórz czat..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - PrzesyÅ‚anie obrazu ze Å›rodowiska graficznego" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Połączenie przychodzÄ…ce" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Ustaw jako domyÅ›lne" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Skala szaroÅ›ci" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Rozłączenie po jednej sesji" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Zdalna sesja X" FreeRDP-Remmina-356c033/remmina-plugins/po/pt_BR.po000066400000000000000000000215371171526373700217160ustar00rootroot00000000000000# Brazilian Portuguese translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-16 14:40+0000\n" "Last-Translator: André Gondim \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-17 06:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: pt_BR\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Baixa (mais rápido)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Média" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Boa" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Melhor (mais lento)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Arquivo de identidade" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Nome de usuário" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Qualidade" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Programa de inicialização" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Desabilitar sincronização da área de transferência" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Desabilitar criptografia" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Usar cursor local" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - Tecnologia NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Encerrando" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "Sessões NX em %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Anexar" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Restaurar" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Iniciar" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Terminar" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Tipo" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Display" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Nome" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Impossível conectar ao servidor RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 cores" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Alta qualidade (15 bits)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Alta qualidade (16 bits)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Desligado" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Local" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Remoto" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domínio" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Profundidade de cores" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Pasta compartilhada" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Som" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nome do cliente" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Caminho de inicialização" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Compartilhar impressoras locais" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Recarregar" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Terminal Service de Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - Manipulador de arquivo RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Preferências" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exportar conexão em formato .rpd de Windows" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Disposição de teclado" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Qualidade" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Papel de parede" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Arrastar janela" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animação de menu" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Sombra do cursor" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Cursor intermitente" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Suavização de fontes" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Composição" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - compartilhamento de área de trabalho" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s quer compartilhar sua área de trabalho\n" "Você aceita o convite?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Convite de compartilhamento de área de trabalho" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Não foi possível conectar ao servidor VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Não foi possível converter '%s' a um endereço de host" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Conexão VNC falhou: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Sua conexão foi recusada." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Mostrar cursor remoto" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Somente visualizar" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Servidor de entrada desativado" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Utilizar a porta" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Abrir bate-papo" #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Conexão de Entrada" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Definir como padrão" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Tons de cinza" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Desconectar ao Encerra uma Sessão" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Sessão remota do X" FreeRDP-Remmina-356c033/remmina-plugins/po/pt_PT.po000066400000000000000000000202061171526373700217260ustar00rootroot00000000000000# Portuguese (Portugal) translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2009-11-28 22:21+0000\n" "Last-Translator: Filipe Gomes \n" "Language-Team: Portuguese (Portugal) \n" "Language: \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-Launchpad-Export-Date: 2009-11-29 04:41+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Médio" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Bom" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Melhor (mais lento)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Ficheiro de identidade" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Nome do utilizador" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Qualidade" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Programa de arranque" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Utilizar cursor local" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 cores" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Milhares de cores (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Milhares de cores (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Milhões de cores (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Desligado" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Local" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Remoto" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domínio" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Profundidade de cor" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Pasta de partilha" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Som" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Nome do cliente" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Caminho de arranque" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Partilhar impressoras locais" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Serviço de Terminal Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Incapaz de ligar ao servidor VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Incapaz de converter '%s' para endereço da máquina" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Ligação VNC falhou: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "A sua ligação foi rejeitada." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Apenas visualizar" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Desactivar entrada do servidor" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Escutar na porta" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Abrir Conversa..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual Network Computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Por omissão" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Tons de cinzento" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Desligar Depois de Uma Sessão" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Sessão Remota X" FreeRDP-Remmina-356c033/remmina-plugins/po/ru.po000066400000000000000000000240211171526373700213250ustar00rootroot00000000000000# Russian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-16 17:04+0000\n" "Last-Translator: Andrey Olykainen \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-17 06:02+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: ru\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Плохое (Ñамое быÑтрое)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Среднее" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Хорошее" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Лучшее (Ñамое медленное)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Файл ключа" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "КачеÑтво" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "ЗапуÑк программы" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Отключить Ñинхронизацию буфера обмена" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Отключить шифрование" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "ИÑпользовать локальный курÑор" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX технологиÑ" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Завершение" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "СеÑÑÐ¸Ñ NX на %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "ПриÑоединить" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "ВоÑÑтановить" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "ЗапуÑтить" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Завершить" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Тип" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Показать" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "СтатуÑ" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Ðазвание" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 цветов" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 бит)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 бит)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 бит)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Выключен" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Локальный" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Удалённый" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Домен" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Глубина цвета" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Звук" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Путь запуÑка" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Опубликовать локальные принтеры" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "Отключить cоглаÑование TLS" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "Прикрепить к конÑоли (Windows 2003 / 2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Обновить" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Ñлужба терминалов Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - наÑтройки" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "ЭкÑпорт подключений в формат Windows .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<ÐвтоматичеÑкое определение>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "РаÑкладка клавиатуры" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "ИÑпользовать клиентÑкую раÑкладку клавиатуры" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "ÐаÑтройки качеÑтва" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Обои" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "ПеретаÑкивание окон" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "ÐÐ½Ð¸Ð¼Ð°Ñ†Ð¸Ñ Ð¼ÐµÐ½ÑŽ" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Тема" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Тень курÑора" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Мигание курÑора" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Сглаживание шрифтов" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "ÐšÐ¾Ð¼Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‡ÐµÐ³Ð¾ Ñтола" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - доÑтуп к рабочему Ñтолу" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s хочет дать доÑтуп к его/ее рабочему Ñтолу.\n" "Ð’Ñ‹ принимаете приглашение?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Приглашение к доÑтупу к рабочему Ñтолу" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Ðевозможно преобразовать '%s' в Ð°Ð´Ñ€ÐµÑ Ñ…Ð¾Ñта" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Подключение через VNC не удалоÑÑŒ: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Ваше подключение было отклонено." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "Повторитель" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Показать удалённый курÑор" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Только проÑмотр" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Отключить ввод на Ñервере" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "ПроÑлушивать порт" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Открыть чат..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - виртуальное Ñетевое вычиÑление" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - входÑщее подключение" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "По умолчанию" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Оттенки Ñерого" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "ОтключатьÑÑ Ð¿Ð¾Ñле одной ÑеÑÑии" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - удалённое подключение к X-Ñерверу" FreeRDP-Remmina-356c033/remmina-plugins/po/sk.po000066400000000000000000000206121171526373700213160ustar00rootroot00000000000000# Slovak translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:34+0000\n" "Last-Translator: Vic \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: sk\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identifikujte súbor" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Uživateľské meno" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kvalita" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "Program po spustení" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Vypnúť synchronizáciu schránky" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Vypnúť Å¡ifrovanie" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "PoužiÅ¥ lokálny kurzor" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "Technológia NX - NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "UkonÄovanie" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "NX sedenie na %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "ObnoviÅ¥" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "SpustiÅ¥" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "UkonÄiÅ¥" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Typ" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Stav" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Meno" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Nebolo možné sa pripojiÅ¥ na RDP server %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 farieb" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokálne" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Vzdialené" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Doména" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Hĺbka farieb" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Zdielanie zložky" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Zvuk" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Meno klienta" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "Cesta k programu po spustení" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Zdieľanie lokálnych tlaÄiarní" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "ZnovunaÄítanie" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Terminálová služba Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exportovanie spojenia do formátu súboru Windows .rpd" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Rozloženie klávesnice" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Voľba kvality" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Pozadie" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Animácia menu" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Téma" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Tieň kurzora" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Vyhladzovanie fontu" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Kompozícia" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s si želá zdielaÅ¥ plochu.\n" "Akceptujete pozvanie?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Pozvanie zdielania plochy" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Nebolo možné sa pripojiÅ¥ na VNC server" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Nebolo možné konvertovaÅ¥ '%s' na hosÅ¥ovskú adresu" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC spojenie zlyhalo: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "VaÅ¡e pripojenie bolo odmietnuté." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "ZobraÅ¥ vzdialený kursor" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Iba zobrazenie" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Vypnúť serverového vstupu" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "PoÄúvaÅ¥ na porte" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Otvorenie chatu..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Východzie" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Odtiene Å¡edej" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Odpojenie po prvom sedení" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "" FreeRDP-Remmina-356c033/remmina-plugins/po/sv.po000066400000000000000000000202351171526373700213320ustar00rootroot00000000000000# Swedish translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:34+0000\n" "Last-Translator: Vic \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: sv\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "LÃ¥g (snabbast)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Medel" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Bra" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Bäst (lÃ¥ngsammast)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Användarnamn" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kvalitet" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Stänger av" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Ã…terställ" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Börja" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Avsluta" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Status" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Namn" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "Kunde inte koppla upp mot RDP server %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 färger" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "\"High color\" (15 bitar)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "\"High color\" (16 bitar)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "\"True color\" (24 bitar)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Av" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Lokal" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Fjärr" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Domän" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Färgdjup" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Dela mapp" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Ljud" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Klientnamn" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Dela lokala skrivare" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Remote Desktop Protocol" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP filhanterare" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - Inställningar" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "Exportera uppkoppling som Windows .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Tangentbordslayout" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Bakgrund" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Markörskugga" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Markörblinkning" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - dela skrivbord" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s vill dela sitt skrivbord.\n" "Accepterar du inbjudan?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Inbjudan om skrivbordsdelning" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "Kunde inte ansluta till VNC server" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Kunde inte konvertera '%s' till värdadress" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Anslutning till VNC misslyckades: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Visa endast" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Öppna chat..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Virtual network computing" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - inkommande anslutning" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Standard" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "GrÃ¥skala" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "" FreeRDP-Remmina-356c033/remmina-plugins/po/th.po000066400000000000000000000245161171526373700213230ustar00rootroot00000000000000# Thai translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:33+0000\n" "Last-Translator: Kitt Tientanopajai \n" "Language-Team: Thai \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: th\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "à¹à¸¢à¹ˆ (เร็วมาà¸)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "à¸à¸¥à¸²à¸‡" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "ดี" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "ดีที่สุด (ช้า)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "ระบุà¹à¸Ÿà¹‰à¸¡" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "ชื่อผู้ใช้" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "คุณภาพ" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "โปรà¹à¸à¸£à¸¡à¹€à¸£à¸´à¹ˆà¸¡à¸•้น" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "เลิà¸à¹ƒà¸Šà¹‰à¸‡à¸²à¸™à¸à¸²à¸£à¸›à¸£à¸±à¸šà¸‚้อมูลคลิปบอร์ดให้ตรงà¸à¸±à¸™" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "ปิดà¸à¸²à¸£à¹€à¸‚้ารหัส" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "ใช้เคอร์เซอร์เครื่องà¸à¸±à¹ˆà¸‡à¸™à¸µà¹‰" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - เทคโนโลยี NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "à¸à¸³à¸¥à¸±à¸‡à¸•ัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "วาระ NX บน %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "เชื่อมติด" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "เรียà¸à¸„ืน" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "เริ่ม" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "ประเภท" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "à¹à¸ªà¸”ง" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "สถานะ" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "ชื่อ" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์ RDP %s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 สี" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "สีมาภ(15 บิต)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "สีมาภ(16 บิต)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "สีสมจริง (24 บิต)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "ปิด" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "โลคอล" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "รีโมท" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "โดเมน" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "ความละเอียดสี" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "โฟลเดอร์ใช้ร่วม" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "เสียง" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "ชื่อลูà¸à¸‚่าย" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "พาธเริ่มต้น" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "เครื่องพิมพ์ภายในใช้ร่วม" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "เรียà¸à¹ƒà¸«à¸¡à¹ˆ" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - บริà¸à¸²à¸£à¹€à¸—อร์มินัลของวินโดวส์" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - à¸à¸²à¸£à¸£à¸­à¸‡à¸£à¸±à¸šà¹à¸Ÿà¹‰à¸¡à¸‚อง RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - ปรับà¹à¸•่ง" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "ส่งออà¸à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อในวินโดวส์ รูปà¹à¸šà¸šà¹à¸Ÿà¹‰à¸¡ .rdp" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<ตรวจสอบอัตโนมัติ>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "ผังà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "ตัวเลือà¸à¸„ุณภาพ" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "ภาพพื้นหลัง" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "ลาà¸à¸«à¸™à¹‰à¸²à¸•่าง" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "เมนูà¹à¸­à¸™à¸´à¹€à¸¡à¸Šà¸±à¸™" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "ชุดตà¸à¹à¸•่ง" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "เงาของเคอร์เซอร์" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "à¸à¸²à¸£à¸à¸£à¸°à¸žà¸£à¸´à¸šà¸‚องเคอร์เซอร์" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "ปรับà¹à¸šà¸šà¸­à¸±à¸à¸©à¸£à¹ƒà¸«à¹‰à¹€à¸£à¸µà¸¢à¸š" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s ต้องà¸à¸²à¸£à¹à¸šà¹ˆà¸‡à¸›à¸±à¸™à¸žà¸·à¹‰à¸™à¹‚ต๊ะของเขา\n" "คุณต้องà¸à¸²à¸£à¸£à¸±à¸šà¹€à¸Šà¸´à¸à¸«à¸£à¸·à¸­à¹„ม่ ?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "เชิà¸à¹à¸šà¹ˆà¸‡à¸›à¸±à¸™à¸žà¸·à¹‰à¸™à¹‚ต๊ะ" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "ไม่สามารถเชื่อมต่อไปยังเซิร์ฟเวอร์ VNC" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "ไม่สามารถà¹à¸›à¸¥à¸‡ '%s' เป็นหมายเลขเครื่องได้" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ VNC ล้มเหลว: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อของคุณถูà¸à¸›à¸à¸´à¹€à¸ªà¸˜" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "à¹à¸ªà¸”งเคอร์เซอร์เครื่องทางไà¸à¸¥" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "ดูเท่านั้น" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "เà¸à¹‰à¸²à¸Ÿà¸±à¸‡à¸šà¸™à¸žà¸­à¸£à¹Œà¸•" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "เปิดà¸à¸²à¸£à¸ªà¸™à¸—นา..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อขาเข้า" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "ปริยาย" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "ขาว-ดำ" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "ปิดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อหลังจาà¸à¸«à¸™à¸¶à¹ˆà¸‡à¸§à¸²à¸£à¸°" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - วาระทางไà¸à¸¥ X" FreeRDP-Remmina-356c033/remmina-plugins/po/tr.po000066400000000000000000000214211171526373700213250ustar00rootroot00000000000000# Turkish translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:32+0000\n" "Last-Translator: Muhammed YÜRÜRDURMAZ \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: tr\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Kalitesiz (hızlı)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Normal (vasat)" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "İyi" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "En Kaliteli (yavaÅŸ)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Identity Dosyası" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "Kullanıcı adı" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "Kalite" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "BaÅŸlangıç programı" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Pano alıpvermeyi devredışı bırak" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Åžifrelemeyi devredışı bırak" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "Yerel imleci kullan" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX Teknoolojisi" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "Sonlandırılıyor" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "%s üzerindeki NX oturumları" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "İliÅŸtir" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Geri Yükle" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "BaÅŸlat" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Sonlandır" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Tip" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Ekran" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Durum" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "İsim" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "%s RDP sunucusuna baÄŸlanılamıyor" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 renk" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "Yüksek renk derinliÄŸi (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "Yüksek renk derinliÄŸi (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "Gerçek renkler (24 Bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Kapalı" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Yerel" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Uzak" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Alan adı" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Renk derinliÄŸi" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Klasör paylaÅŸ" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Ses" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "İstemci ismi" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "BaÅŸlangıç dizini" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Makinama baÄŸlı yazıcıları paylaÅŸ" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Yenile" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows Uzak Masaüstü" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP Dosya tutamacı" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP Seçenekleri" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "BaÄŸlantıyı Windows .rdp formatında dışarı aktar" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Klavye düzeni" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "Kalite seçimi" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Duvar kağıdı" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "Pencere sürükle" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "Menü animasyonu" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Tema" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "İmleç gölgesi" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "İmleç yanıp sönmesi" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Font düzeltme" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "Kompozisyon" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - Masaüstü Paylaşımı" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s kendi masaüstünü paylaÅŸmak istiyor\n" "Daveti kabul ediyormusunuz ?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Masaüstü paylaşım daveti" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "VNC sunucusuna baÄŸlanılamıyor" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "'%s' adrese dönüştürülemiyor" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC baÄŸlantısı saÄŸlanamadı: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "BaÄŸlantı isteÄŸiniz reddedildi." #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Uzaktaki imleci göster" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Sadece görüntüle" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Sunucu tarafından giriÅŸi engelle" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Portu bekle" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Sohbet Penceresi Aç..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Sanal Uzak Makina" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Gelen BaÄŸlantıları Kabul Et" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Öntanımlı" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Gri tonlama" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Tek Bir baÄŸlantıdan sonra kapat" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X Uzak Oturumu" FreeRDP-Remmina-356c033/remmina-plugins/po/uk.po000066400000000000000000000242601171526373700213230ustar00rootroot00000000000000# Ukrainian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-12 08:31+0000\n" "Last-Translator: Vasiliy Meshko \n" "Language-Team: Ukrainian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: uk\n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "Ðизька ÑкіÑть (найшвидше)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "Помірно" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "Добре" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "Ðайкраще (найповільніше)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "Ідентифікувати файл" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "КориÑтувач" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "ЯкіÑть" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "ЗапуÑкати програму" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "Ðе викориÑтовувати Ñинхронізацію буферів обміну" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "Ðе викориÑтовувати шифруваннÑ" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "ВикориÑтовувати курÑор Ñвого комп'ютера" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "Ð¢ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ñ–Ñ NX - NX" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "СкаÑовуєтьÑÑ" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "СеанÑи NX на %s" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "Приєднати" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "Відновити" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "Розпочати" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "Завершити" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "Тип" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "Екран" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "Стан" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "Ðазва" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "При з'єнанні з Windows RDP Ñервером %s виникла помилка" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256 кольорів" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "High color (15 bit)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "High color (16 bit)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "True color (24 bit)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "Вимкнено" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "Локальний" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "Віддалений" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "Домен" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "Глибина кольору" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "Спільний доÑтуп до теки" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "Звук" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "Ðазва клієнта" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "ÐдреÑа" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "Підключати локальні принтери" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "Оновити" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Служба терміналів Windows" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - Файли типу RDP" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - ÐалаштуваннÑ" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "" "ЕкÑпортувати ці Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð² файл .rdp (Ð´Ð»Ñ Ð²Ð¸ÐºÐ¾Ñ€Ð¸ÑÑ‚Ð°Ð½Ð½Ñ Ð² Windows)" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<Ð’Ñтановлювати автоматично>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "Розкладка клавіатури" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¯ÐºÐ¾Ñті" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "Тло" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "ПеретÑгнути Вікно" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ ÐœÐµÐ½ÑŽ" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "Тема" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "Тінь КурÑора" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "Ð‘Ð»Ð¸Ð¼Ð°Ð½Ð½Ñ ÐºÑƒÑ€Ñора" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "Ð—Ð³Ð»Ð°Ð´Ð¶ÑƒÐ²Ð°Ð½Ð½Ñ Ð¨Ñ€Ð¸Ñ„Ñ‚Ñƒ" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "КомпозиціÑ" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - ÐÐ°Ð´Ð°Ð½Ð½Ñ Ð´Ð¾Ñтупу до робочого Ñтолу комп'ютера" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s бажає надати Вам доÑтуп до робочого Ñтолу Ñвого комп'ютера.\n" "Бажаєте прийнÑти запрошеннÑ?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "Ð—Ð°Ð¿Ñ€Ð¾ÑˆÐµÐ½Ð½Ñ Ñпільного викориÑÑ‚Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‡Ð¾Ð³Ð¾ Ñтолу комп'ютера" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "При з'єднанні з Ñервером VNC виникла помилка" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "Ðеможливо визначити ІР адреÑу Ñервера '%s'" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "Помилка VNC з'єднаннÑ: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "Вам відмовлено у з'єднанні" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "Відображати курÑор робочого Ñтолу віддаленого комп'ютера" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "Лише переглÑд" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "Блокувати ÑƒÐ¿Ñ€Ð°Ð²Ð»Ñ–Ð½Ð½Ñ Ð½Ðµ віддаленому комп'ютері" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "Приймати з'Ñ”Ð½Ð°Ð½Ð½Ñ Ð½Ð° порт" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "Розпочати розмову (текÑÑ‚)..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - Віртуальне мережеве з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ (Virtual Network Computing)" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - Вхідне з'єднаннÑ" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "Типовий" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "Конвертувати в тони Ñірого кольору" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "Роз'єднати піÑÐ»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ з'єднаннÑ" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - Віддалений вхід у графічне Ñередовище" FreeRDP-Remmina-356c033/remmina-plugins/po/zh_CN.po000066400000000000000000000217571171526373700217150ustar00rootroot00000000000000# 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: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-10 22:17+0800\n" "PO-Revision-Date: 2010-12-23 06:03+0000\n" "Last-Translator: Vic \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-12-24 06:08+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: \n" #: ../nx/remminapluginnx.c:602 ../rdp/remminapluginrdp.c:476 #: ../rdp/remminapluginrdp_settings.c:177 ../vnc/remminapluginvnc.c:1896 msgid "Poor (fastest)" msgstr "å·®(最快)" #: ../nx/remminapluginnx.c:603 ../rdp/remminapluginrdp.c:477 #: ../rdp/remminapluginrdp_settings.c:179 ../vnc/remminapluginvnc.c:1897 msgid "Medium" msgstr "中等" #: ../nx/remminapluginnx.c:604 ../rdp/remminapluginrdp.c:478 #: ../rdp/remminapluginrdp_settings.c:181 ../vnc/remminapluginvnc.c:1898 msgid "Good" msgstr "良好" #: ../nx/remminapluginnx.c:605 ../rdp/remminapluginrdp.c:479 #: ../rdp/remminapluginrdp_settings.c:183 ../vnc/remminapluginvnc.c:1899 msgid "Best (slowest)" msgstr "最好(最慢)" #: ../nx/remminapluginnx.c:612 msgid "Identity file" msgstr "ç§é’¥æ–‡ä»¶" #: ../nx/remminapluginnx.c:613 ../rdp/remminapluginrdp.c:494 #: ../vnc/remminapluginvnc.c:1907 ../vnc/remminapluginvnc.c:1922 msgid "User name" msgstr "用户å" #: ../nx/remminapluginnx.c:616 ../rdp/remminapluginrdp.c:505 #: ../vnc/remminapluginvnc.c:1910 ../vnc/remminapluginvnc.c:1925 msgid "Quality" msgstr "画质" #: ../nx/remminapluginnx.c:617 ../rdp/remminapluginrdp.c:508 #: ../xdmcp/remminapluginxdmcp.c:352 msgid "Startup program" msgstr "å¯åŠ¨ç¨‹åº" #: ../nx/remminapluginnx.c:623 ../rdp/remminapluginrdp.c:511 #: ../vnc/remminapluginvnc.c:1913 ../vnc/remminapluginvnc.c:1928 msgid "Disable clipboard sync" msgstr "ç¦ç”¨å‰ªè´´æ¿åŒæ­¥" #: ../nx/remminapluginnx.c:624 ../vnc/remminapluginvnc.c:1914 #: ../vnc/remminapluginvnc.c:1929 msgid "Disable encryption" msgstr "ç¦ç”¨åР坆" #: ../nx/remminapluginnx.c:625 ../xdmcp/remminapluginxdmcp.c:353 msgid "Use local cursor" msgstr "使用本地游标" #: ../nx/remminapluginnx.c:633 msgid "NX - NX Technology" msgstr "NX - NX技术" #: ../nx/remminanxsessionmanager.c:97 msgid "Terminating" msgstr "正在终止" #: ../nx/remminanxsessionmanager.c:132 #, c-format msgid "NX Sessions on %s" msgstr "%s上的NX会è¯" #: ../nx/remminanxsessionmanager.c:137 msgid "Attach" msgstr "挂接" #: ../nx/remminanxsessionmanager.c:141 msgid "Restore" msgstr "æ¢å¤" #: ../nx/remminanxsessionmanager.c:142 msgid "Start" msgstr "å¯åЍ" #: ../nx/remminanxsessionmanager.c:146 msgid "Terminate" msgstr "终止" #: ../nx/remminanxsessionmanager.c:172 msgid "Type" msgstr "类型" #: ../nx/remminanxsessionmanager.c:179 msgid "Display" msgstr "显示" #: ../nx/remminanxsessionmanager.c:186 msgid "Status" msgstr "状æ€" #: ../nx/remminanxsessionmanager.c:193 msgid "Name" msgstr "åç§°" #: ../rdp/remminapluginrdp.c:306 #, c-format msgid "Unable to connect to RDP server %s" msgstr "无法连接到RDPæœåС噍%s" #: ../rdp/remminapluginrdp.c:467 ../vnc/remminapluginvnc.c:1887 #: ../xdmcp/remminapluginxdmcp.c:341 msgid "256 colors" msgstr "256色" #: ../rdp/remminapluginrdp.c:468 ../vnc/remminapluginvnc.c:1888 msgid "High color (15 bit)" msgstr "高彩(15ä½)" #: ../rdp/remminapluginrdp.c:469 ../vnc/remminapluginvnc.c:1889 #: ../xdmcp/remminapluginxdmcp.c:342 msgid "High color (16 bit)" msgstr "高彩(16ä½)" #: ../rdp/remminapluginrdp.c:470 ../vnc/remminapluginvnc.c:1890 #: ../xdmcp/remminapluginxdmcp.c:343 msgid "True color (24 bit)" msgstr "真彩(24ä½)" #: ../rdp/remminapluginrdp.c:485 msgid "Off" msgstr "å…³" #: ../rdp/remminapluginrdp.c:486 msgid "Local" msgstr "本地" #: ../rdp/remminapluginrdp.c:487 msgid "Remote" msgstr "远程" #: ../rdp/remminapluginrdp.c:496 msgid "Domain" msgstr "域" #: ../rdp/remminapluginrdp.c:498 ../vnc/remminapluginvnc.c:1909 #: ../vnc/remminapluginvnc.c:1924 ../xdmcp/remminapluginxdmcp.c:351 msgid "Color depth" msgstr "色彩" #: ../rdp/remminapluginrdp.c:499 msgid "Share folder" msgstr "共享目录" #: ../rdp/remminapluginrdp.c:506 msgid "Sound" msgstr "音效" #: ../rdp/remminapluginrdp.c:507 msgid "Client name" msgstr "客户机åç§°" #: ../rdp/remminapluginrdp.c:509 msgid "Startup path" msgstr "å¯åŠ¨è·¯å¾„" #: ../rdp/remminapluginrdp.c:510 msgid "Share local printers" msgstr "å…±äº«æœ¬åœ°æ‰“å°æœº" #: ../rdp/remminapluginrdp.c:512 msgid "Disable TLS negotiation" msgstr "ç¦ç”¨TLSå商" #: ../rdp/remminapluginrdp.c:513 msgid "Attach to console (Windows 2003 / 2003 R2)" msgstr "连接到控制å°(Windows 2003或2003 R2)" #: ../rdp/remminapluginrdp.c:519 ../vnc/remminapluginvnc.c:1949 msgid "Refresh" msgstr "刷新" #: ../rdp/remminapluginrdp.c:529 msgid "RDP - Remote Desktop Protocol" msgstr "RDP - Windows终端æœåŠ¡" #: ../rdp/remminapluginrdp.c:551 msgid "RDP - RDP File Handler" msgstr "RDP - RDP文件处ç†å™¨" #: ../rdp/remminapluginrdp.c:566 msgid "RDP - Preferences" msgstr "RDP - 首选项" #: ../rdp/remminapluginrdp.c:586 msgid "Export connection in Windows .rdp file format" msgstr "使用Windows .rdp文件格å¼å¯¼å‡ºè¿žæŽ¥" #: ../rdp/remminapluginrdp_settings.c:142 msgid "" msgstr "<自动检测>" #. Create the content #: ../rdp/remminapluginrdp_settings.c:261 msgid "Keyboard layout" msgstr "键盘布局" #: ../rdp/remminapluginrdp_settings.c:284 msgid "Use client keyboard mapping" msgstr "使用客户端键盘映射" #: ../rdp/remminapluginrdp_settings.c:294 msgid "Quality option" msgstr "画质选项" #: ../rdp/remminapluginrdp_settings.c:313 msgid "Wallpaper" msgstr "墙纸" #: ../rdp/remminapluginrdp_settings.c:320 msgid "Window drag" msgstr "çª—å£æ‹–放" #: ../rdp/remminapluginrdp_settings.c:327 msgid "Menu animation" msgstr "èœå•动画" #: ../rdp/remminapluginrdp_settings.c:334 msgid "Theme" msgstr "主题" #: ../rdp/remminapluginrdp_settings.c:341 msgid "Cursor shadow" msgstr "光标阴影" #: ../rdp/remminapluginrdp_settings.c:348 msgid "Cursor blinking" msgstr "光标闪çƒ" #: ../rdp/remminapluginrdp_settings.c:355 msgid "Font smoothing" msgstr "平滑字体" #: ../rdp/remminapluginrdp_settings.c:362 msgid "Composition" msgstr "åˆæˆ" #: ../telepathy/remminaplugintelepathy.c:41 msgid "Telepathy - Desktop Sharing" msgstr "Telepathy - 桌é¢å…±äº«" #: ../telepathy/remminatpchannelhandler.c:252 #, c-format msgid "" "%s wants to share his/her desktop.\n" "Do you accept the invitation?" msgstr "" "%s请求共享他/她的桌é¢ã€‚\n" "ä½ æ˜¯å¦æŽ¥å—邀请?" #: ../telepathy/remminatpchannelhandler.c:256 msgid "Desktop sharing invitation" msgstr "桌é¢å…±äº«é‚€è¯·" #: ../vnc/remminapluginvnc.c:970 msgid "Unable to connect to VNC server" msgstr "无法连接到VNCæœåС噍" #: ../vnc/remminapluginvnc.c:971 #, c-format msgid "Couldn't convert '%s' to host address" msgstr "无法解æžä¸»æœº%s的地å€" #: ../vnc/remminapluginvnc.c:972 #, c-format msgid "VNC connection failed: %s" msgstr "VNC连接失败: %s" #: ../vnc/remminapluginvnc.c:973 msgid "Your connection has been rejected." msgstr "连接被拒ç»" #: ../vnc/remminapluginvnc.c:1906 msgid "Repeater" msgstr "中继器" #: ../vnc/remminapluginvnc.c:1911 ../vnc/remminapluginvnc.c:1926 msgid "Show remote cursor" msgstr "显示远程游标" #: ../vnc/remminapluginvnc.c:1912 ../vnc/remminapluginvnc.c:1927 #: ../vnc/remminapluginvnc.c:1946 msgid "View only" msgstr "仅查看" #: ../vnc/remminapluginvnc.c:1915 ../vnc/remminapluginvnc.c:1930 #: ../vnc/remminapluginvnc.c:1948 msgid "Disable server input" msgstr "ç¦æ­¢æœåŠ¡å™¨ç«¯è¾“å…¥" #: ../vnc/remminapluginvnc.c:1921 msgid "Listen on port" msgstr "监å¬ç«¯å£" #: ../vnc/remminapluginvnc.c:1950 msgid "Open Chat..." msgstr "打开èŠå¤©..." #: ../vnc/remminapluginvnc.c:1960 msgid "VNC - Virtual Network Computing" msgstr "VNC - 虚拟网络计算" #: ../vnc/remminapluginvnc.c:1982 msgid "VNC - Incoming Connection" msgstr "VNC - 接入连接" #: ../xdmcp/remminapluginxdmcp.c:339 msgid "Default" msgstr "默认值" #: ../xdmcp/remminapluginxdmcp.c:340 msgid "Grayscale" msgstr "ç°åº¦" #: ../xdmcp/remminapluginxdmcp.c:354 msgid "Disconnect after one session" msgstr "一次会è¯ç»“æŸåŽæ–­å¼€è¿žæŽ¥" #: ../xdmcp/remminapluginxdmcp.c:362 msgid "XDMCP - X Remote Session" msgstr "XDMCP - X远程会è¯" #~ msgid "RDP - Global Settings" #~ msgstr "RDP - 公共设置" #~ msgid "" #~ msgstr "<自动检测>" #~ msgid "Keyboard Layout" #~ msgstr "键盘布局" #~ msgid "Window Drag" #~ msgstr "çª—å£æ‹–放" #~ msgid "Menu Animation" #~ msgstr "èœå•动画" #~ msgid "Best (Slowest)" #~ msgstr "最好(最慢)" #~ msgid "Poor (Fastest)" #~ msgstr "å·®(最快)" #~ msgid "Font Smoothing" #~ msgstr "平滑字体" #~ msgid "Cursor Blinking" #~ msgstr "光标闪çƒ" #~ msgid "Cursor Shadow" #~ msgstr "光标阴影" #~ msgid "Quality Option" #~ msgstr "画质选项" FreeRDP-Remmina-356c033/remmina-plugins/rdp/000077500000000000000000000000001171526373700205075ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/rdp/16x16/000077500000000000000000000000001171526373700212745ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/rdp/16x16/emblems/000077500000000000000000000000001171526373700227205ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/rdp/16x16/emblems/remmina-rdp-ssh.png000066400000000000000000000016041171526373700264350ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8…“OLTWÆ¿{ß›÷ÞÌ  lµ‚4@c§6EQ(ë’¸´„ƅŘtm\v…†ÄDMƒ¤Ablü³1u¥­K52V¡;gÂ0Ã<Þ»÷Í=]45V'zÖ_~9_Îï0"B¾‰v²=œã{B)Òí|9–ídû4Óº\nò“'ñüÁ;çymáAúõ½€h'«Ñ,ÿHh{[ÐT@3àHŽÉß~¶•'+Ã4ózžçYê`qeƒé_QFÌË!°z‚eåàË7Ó¯¡HOi(Òsðžødxáé˜ð|…`eµàkàØ²³ :W¯Ç;ÎZ'÷÷™Mÿ«Šô4êšvcýG¥ìÙô:«}Åc‡«Z¿ ¸K)ÜûËWíJN'3Ž>‡${ SÁñcWºNi÷­F]Ónìml®ÿØø´zq~,P¯ËÔ鲨OG}5r±¦ÝWUUWÞô[åÿ¹É ¦²æ®¾‰®8gœ_ØúymaZx>»„•+W ëÀŽÀ¹¿Cy¢ôEɪaÓfãñßãèïïÇÄ“q4mÛ k±BgŒõrù-2§þ-E]×i·±X¬Láá£Øq´ñ§ €Î8´\`^[UÝ’|‘œß]WSn¬.B —o-·TþÒW¿6qÑÎ’?;s,ï13T üesÏ~‡ÌNÁ£ôFD¨l=Ñm™FïÆêuÆèDBîÜpó‡CM#ÝJýEkPP¼Â]‚p3p–á¸iLŧr>š~òJ¤P¤g cˆ´ÕE¿j9_·ó„uçÒ7h>4²/BŠH™‚pç!ÝHµgÏ\ÏéÿÝsòÚ±»îŸ;þÝ¡v³xŠ ŒB‰4r"ƒœ›'2€^0–ÇD¢K3±!!Â@òmYߥò¶.z$Åâ×ã·{m"ìô$È<fµ‚[-ÐüÍð÷ Ê䉼ßì}ÙÕ~œ}É m‡ÃqA¶«à¸€"€Af8þÎQgÀùúDIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/rdp/16x16/emblems/remmina-rdp.png000066400000000000000000000015431171526373700256440ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<àIDAT8“KHTqÆ¿ó¿×¹w®£E©–8“”e%CiE%åd QÑC´ ÕÂMТM‹R‰•ö4 #+°V‚Ú›^bÚP˜ˆ£ÎÜ™ûü·(¢Ç@8»?Îß!Î9b¿„–1†tÛÆ6oo‰ÅQ,¿„ I¾:É›çä¦À«'ªeš…Þ:þðŸ Mdg»{~a¼d‚Qƒ¡»õ–j›†Ç[Çû~åYŒ£6ŽñdK΄± Î@¦%%ñÉ“8€Ò?n_E’ÛW±ñ¹>­mðc‡nÆ%g‚MÈFT"ÜßË/Ì{ŠOËUE§¤¼ßn_EŽ(Ý“ÓÆUÑÊ®5f×tÞ®V r!<4‚®{gB—§PÕ—”„›Þ©yåŠäº_|ZÞ”^p(G„¦å‹½®´Ôd蚆‹×[ÔõŽG‹”§Û‰XðJ†UÓ51qÿÚÅ;Û¡"ÆÝ¶kjD ïdÄX}îœL—C’è!11¥«(õFQ±mêI³ÎF<&È{Ö-Ü­Ä)@Ð @ƒ˜;{BD‡8í”%–ý=çE—Ô%@[-ˆ¢šƒp0‘H˜ƒð•(oyÖŽ—¤&ÅCUUœkhŽ,õ<¨D©O¥Ï^;\sµõ¤:44ŒdG†ƒ*ž¿~²-^FœsxVVî%Çá¬)ï>ôù骷äµï˜¾¨ÒiÛ:í 5…G*_’s߸±©ö—O¶ešù[µöŸErû*æÁW˜Ùìß”Ó~if~¥,Ð'sÂ0\xÓ´W}‰æ>´„,w·jC?"óß¶µ–ô¼(2´ƒ\ ¬àj €ëƒÇùûûÙ¡Öó(ý“ÿ»‰œ7ôu6ëzÔØxPÜ „Þó`_‡ ñŸ¿/К8)ñ|Æœ Š¡y—¿aØ6­EóJù«ÿ@[-­bŽÐoYØ<¯”¿Å}kb=üߺrIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/rdp/22x22/000077500000000000000000000000001171526373700212665ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/rdp/22x22/emblems/000077500000000000000000000000001171526373700227125ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/rdp/22x22/emblems/remmina-rdp-ssh.png000066400000000000000000000025601171526373700264310ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<íIDAT8•[lTU†ÿ½Ï™sΜ™a:ÓÒÖ’vZ@¤B‘¹T¦XK šcðP#Á//h¼<€¦& 5DD‹ÁÒHE¹¤…Ò¡¤„´HAC)Ð2Ø©´¶Ó¹œËœ½}`@‹`£+ù³“µóYYYkoÂ9ÇXѾšäSŠÍrÃy5¼z, ܾš,D[}ú´™ªdWIà·‹Q#<´cf5{óß|tL¨Mª÷Í[êp{ÜÄN dÏ[¢ÊîäW.¬¶þ¯ŠÛW•BïÄgVº!>¸s!9ÀÇe¢óÄÁ¨.Ê«á-ÿµâRgªª'ÄÔ@ÏQ "¥Hžô„B(}ñafñþDNI…`vÇ~Ffsƒº3#’pÈ€k†n6Äâ` eUò2½uåzûC[‘SRQ&t÷8§Ý6ѯ©µG§þ±bòsT,8ÓÐÕTî v4oÏ—f¤¸Ò“ÃZˆhfød’=w‰Óãõ5‘3w±ªx|oµ­a[þWâÖÕD%Œõç>¿ÒmgqˆPßè‚ì„HÊD÷©ÃZ,2\VX'Zþkâå®Ôl¨ÞT˜j÷ŽŠÊ°Q ß”gí„ÒWÆ3Ûý(¯‘ÕyçØ`ã’Ô“ ˜‘„Cܺq,?V¹KY ¿¡Êhw+å5•ŒÑýI.‡ŠèáwÔÇ¥Þ^‘÷â'5F\i6Õ†ƒƒ]ÍÛ‹å~wº/¬=þ%·*ª s 8P^Sá°Ëõ•eÅÎ4ÿ$ ‡qðè™ð¥þèâôŠœ¥ëU*)¸ÙT¹vïRó³•Y Wú33²˜iEÑÒv"ìýëŒç/4T&B P^³Ì®Hß-]X¤2I†Å ²Ó=ˆQìû¶9ü¶ýë}óäŽ7„mÄN¿ÜV¢¬,›½ÊŸ•‘ÃúôË0, NâÃùöÓÑ›ý×NZ«/§@(Ý9oN¾÷B`0dÀëõ॥sœÛôW§p+æVF0Ùírb(lŒ)R7-ø“ÝÀ´Â:aÖ‰¥lš/)]²„ àŸ~8,PÆ8í9öÞ]KàÇîžÞXVš”€"1¸†ÃÇ/hÉJßîßêí[ÏP•ˆèOÍí?ºƒƒzFg–Ø*çáÊÕNÓ0µ?ªŒ çk.uÝìé öÅ2S\p«¼.j¿oÖôÐõÆ-Ë·¿Ÿ=sý†©%›V,tûöL·B»¿:ñ™féI¶tø¥:»;Ì®à¥+ÜKŠdÆèÙ§s'gåe§ÙÏ·]Õ,ýVãç[–å—V»]ÞB<žŒŽ¦ÑÆÐàÎNê\W0uŽÜ{÷†Ù;ì±âÖ¼†*cøIsœDYg³±2";ö¼üÉ®üÒ½®In‹ˆ-–ÈAû‰w£Çµ‘Š \*眷8ØPe<(iÜ»¢e?YåË(Ù›;ë5ÕÒNŽ)Š)E¸}½3~«ã›Oç¾nmz’ÿ±#ý e W"CA"8à1>2š„8âÁp›)ÀÏç÷*]+~EN]ÿc¿Ní¥Ü‚à:¨cn]> Ýë:û\ÇóCñ˜0jáT¤ü¼—4]nš¥kwª…v§ZtŸž=µ—ü:#OHà ?ʳDŽ5!Õ톳n3ªS“ó e¸=>ÿæøhpч¤%&„ÎD5ñýà=&2 ´\D/=‹<Œ~ üPj@ °'ä  8#¿/€)„à÷9æª.Öån—IEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/rdp/CMakeLists.txt000066400000000000000000000031561171526373700232540ustar00rootroot00000000000000# remmina-plugin-rdp - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(CMAKE_THREAD_PREFER_PTHREAD) find_package(Threads) set(REMMINA_PLUGIN_RDP_SRCS rdp_plugin.c rdp_plugin.h rdp_event.c rdp_event.h rdp_file.c rdp_file.h rdp_settings.c rdp_settings.h rdp_gdi.c rdp_gdi.h rdp_graphics.c rdp_graphics.h ) add_library(remmina-plugin-rdp ${REMMINA_PLUGIN_RDP_SRCS}) set_target_properties(remmina-plugin-rdp PROPERTIES PREFIX "") include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${FREERDP_INCLUDE_DIRS}) target_link_libraries(remmina-plugin-rdp ${REMMINA_COMMON_LIBRARIES} ${FREERDP_LIBRARIES}) install(TARGETS remmina-plugin-rdp DESTINATION ${REMMINA_PLUGINDIR}) install(FILES 16x16/emblems/remmina-rdp-ssh.png 16x16/emblems/remmina-rdp.png DESTINATION ${APPICON16_EMBLEMS_DIR}) install(FILES 22x22/emblems/remmina-rdp-ssh.png 22x22/emblems/remmina-rdp.png DESTINATION ${APPICON22_EMBLEMS_DIR}) FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_event.c000066400000000000000000000571151171526373700226520ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Jay Sorg * Copyright (C) 2010-2011 Vic Lee * Copyright (C) 2011 Marc-Andre Moreau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ /* X11 drawings were ported from xfreerdp */ #include "rdp_plugin.h" #include "rdp_event.h" #include "rdp_gdi.h" #include #include #include static void remmina_rdp_event_event_push(RemminaProtocolWidget* gp, const RemminaPluginRdpEvent* e) { rfContext* rfi; RemminaPluginRdpEvent* event; rfi = GET_DATA(gp); if (rfi->event_queue) { event = g_memdup(e, sizeof(RemminaPluginRdpEvent)); g_async_queue_push(rfi->event_queue, event); if (write(rfi->event_pipe[1], "\0", 1)) { } } } static void remmina_rdp_event_release_key(RemminaProtocolWidget* gp, gint scancode) { gint i, k; rfContext* rfi; RemminaPluginRdpEvent rdp_event = { 0 }; rfi = GET_DATA(gp); rdp_event.type = REMMINA_RDP_EVENT_TYPE_SCANCODE; if (scancode == 0) { /* Send all release key events for previously pressed keys */ rdp_event.key_event.up = True; for (i = 0; i < rfi->pressed_keys->len; i++) { rdp_event.key_event.key_code = g_array_index(rfi->pressed_keys, gint, i); remmina_rdp_event_event_push(gp, &rdp_event); } g_array_set_size(rfi->pressed_keys, 0); } else { /* Unregister the keycode only */ for (i = 0; i < rfi->pressed_keys->len; i++) { k = g_array_index(rfi->pressed_keys, gint, i); if (k == scancode) { g_array_remove_index_fast(rfi->pressed_keys, i); break; } } } } static void remmina_rdp_event_scale_area(RemminaProtocolWidget* gp, gint* x, gint* y, gint* w, gint* h) { gint width, height; gint sx, sy, sw, sh; rfContext* rfi; rfi = GET_DATA(gp); if (!rfi->rgb_surface) return; width = remmina_plugin_service->protocol_plugin_get_width(gp); height = remmina_plugin_service->protocol_plugin_get_height(gp); if ((width == 0) || (height == 0)) return; if ((rfi->scale_width == width) && (rfi->scale_height == height)) { /* Same size, just copy the pixels */ *x = MIN(MAX(0, *x), width - 1); *y = MIN(MAX(0, *y), height - 1); *w = MIN(width - *x, *w); *h = MIN(height - *y, *h); return; } /* We have to extend the scaled region one scaled pixel, to avoid gaps */ sx = MIN(MAX(0, (*x) * rfi->scale_width / width - rfi->scale_width / width - 2), rfi->scale_width - 1); sy = MIN(MAX(0, (*y) * rfi->scale_height / height - rfi->scale_height / height - 2), rfi->scale_height - 1); sw = MIN(rfi->scale_width - sx, (*w) * rfi->scale_width / width + rfi->scale_width / width + 4); sh = MIN(rfi->scale_height - sy, (*h) * rfi->scale_height / height + rfi->scale_height / height + 4); *x = sx; *y = sy; *w = sw; *h = sh; } void remmina_rdp_event_update_region(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) { rfContext* rfi; gint x, y, w, h; x = ui->region.x; y = ui->region.y; w = ui->region.width; h = ui->region.height; rfi = GET_DATA(gp); if (rfi->sw_gdi) { XPutImage(rfi->display, rfi->primary, rfi->gc, rfi->image, x, y, x, y, w, h); XCopyArea(rfi->display, rfi->primary, rfi->rgb_surface, rfi->gc, x, y, w, h, x, y); } if (remmina_plugin_service->protocol_plugin_get_scale(gp)) remmina_rdp_event_scale_area(gp, &x, &y, &w, &h); gtk_widget_queue_draw_area(rfi->drawing_area, x, y, w, h); } void remmina_rdp_event_update_rect(RemminaProtocolWidget* gp, gint x, gint y, gint w, gint h) { rfContext* rfi; rfi = GET_DATA(gp); if (rfi->sw_gdi) { XPutImage(rfi->display, rfi->primary, rfi->gc, rfi->image, x, y, x, y, w, h); XCopyArea(rfi->display, rfi->primary, rfi->rgb_surface, rfi->gc, x, y, w, h, x, y); } if (remmina_plugin_service->protocol_plugin_get_scale(gp)) remmina_rdp_event_scale_area(gp, &x, &y, &w, &h); gtk_widget_queue_draw_area(rfi->drawing_area, x, y, w, h); } static gboolean remmina_rdp_event_update_scale_factor(RemminaProtocolWidget* gp) { GtkAllocation a; gboolean scale; gint width, height; gint hscale, vscale; gint gpwidth, gpheight; RemminaFile* remminafile; rfContext* rfi; rfi = GET_DATA(gp); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); gtk_widget_get_allocation(GTK_WIDGET(gp), &a); width = a.width; height = a.height; scale = remmina_plugin_service->protocol_plugin_get_scale(gp); if (scale) { if ((width > 1) && (height > 1)) { gpwidth = remmina_plugin_service->protocol_plugin_get_width(gp); gpheight = remmina_plugin_service->protocol_plugin_get_height(gp); hscale = remmina_plugin_service->file_get_int(remminafile, "hscale", 0); vscale = remmina_plugin_service->file_get_int(remminafile, "vscale", 0); rfi->scale_width = (hscale > 0 ? MAX(1, gpwidth * hscale / 100) : width); rfi->scale_height = (vscale > 0 ? MAX(1, gpheight * vscale / 100) : height); rfi->scale_x = (gdouble) rfi->scale_width / (gdouble) gpwidth; rfi->scale_y = (gdouble) rfi->scale_height / (gdouble) gpheight; } } else { rfi->scale_width = 0; rfi->scale_height = 0; rfi->scale_x = 0; rfi->scale_y = 0; } if ((width > 1) && (height > 1)) gtk_widget_queue_draw_area(GTK_WIDGET(gp), 0, 0, width, height); rfi->scale_handler = 0; return FALSE; } #if GTK_VERSION == 2 static gboolean remmina_rdp_event_on_expose(GtkWidget *widget, GdkEventExpose *event, RemminaProtocolWidget *gp) #else static gboolean remmina_rdp_event_on_draw(GtkWidget* widget, cairo_t* context, RemminaProtocolWidget* gp) #endif { gboolean scale; rfContext* rfi; #if GTK_VERSION == 2 gint x, y; cairo_t *context; #endif rfi = GET_DATA(gp); if (!rfi->rgb_cairo_surface) return FALSE; scale = remmina_plugin_service->protocol_plugin_get_scale(gp); #if GTK_VERSION == 2 x = event->area.x; y = event->area.y; context = gdk_cairo_create(gtk_widget_get_window (rfi->drawing_area)); cairo_rectangle(context, x, y, event->area.width, event->area.height); #else cairo_rectangle(context, 0, 0, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget)); #endif if (scale) cairo_scale(context, rfi->scale_x, rfi->scale_y); cairo_set_source_surface(context, rfi->rgb_cairo_surface, 0, 0); cairo_fill(context); #if GTK_VERSION == 2 cairo_destroy(context); #endif return TRUE; } static gboolean remmina_rdp_event_on_configure(GtkWidget* widget, GdkEventConfigure* event, RemminaProtocolWidget* gp) { rfContext* rfi; rfi = GET_DATA(gp); /* We do a delayed reallocating to improve performance */ if (rfi->scale_handler) g_source_remove(rfi->scale_handler); rfi->scale_handler = g_timeout_add(1000, (GSourceFunc) remmina_rdp_event_update_scale_factor, gp); return FALSE; } static void remmina_rdp_event_translate_pos(RemminaProtocolWidget* gp, int ix, int iy, uint16* ox, uint16* oy) { rfContext* rfi; rfi = GET_DATA(gp); if ((rfi->scale) && (rfi->scale_width >= 1) && (rfi->scale_height >= 1)) { *ox = (uint16) (ix * remmina_plugin_service->protocol_plugin_get_width(gp) / rfi->scale_width); *oy = (uint16) (iy * remmina_plugin_service->protocol_plugin_get_height(gp) / rfi->scale_height); } else { *ox = (uint16) ix; *oy = (uint16) iy; } } static gboolean remmina_rdp_event_on_motion(GtkWidget* widget, GdkEventMotion* event, RemminaProtocolWidget* gp) { RemminaPluginRdpEvent rdp_event = { 0 }; rdp_event.type = REMMINA_RDP_EVENT_TYPE_MOUSE; rdp_event.mouse_event.flags = PTR_FLAGS_MOVE; remmina_rdp_event_translate_pos(gp, event->x, event->y, &rdp_event.mouse_event.x, &rdp_event.mouse_event.y); remmina_rdp_event_event_push(gp, &rdp_event); return TRUE; } static gboolean remmina_rdp_event_on_button(GtkWidget* widget, GdkEventButton* event, RemminaProtocolWidget* gp) { gint flag; RemminaPluginRdpEvent rdp_event = { 0 }; /* We only accept 3 buttons */ if ((event->button < 1) || (event->button > 3)) return FALSE; /* We bypass 2button-press and 3button-press events */ if ((event->type != GDK_BUTTON_PRESS) && (event->type != GDK_BUTTON_RELEASE)) return TRUE; rdp_event.type = REMMINA_RDP_EVENT_TYPE_MOUSE; remmina_rdp_event_translate_pos(gp, event->x, event->y, &rdp_event.mouse_event.x, &rdp_event.mouse_event.y); flag = 0; if (event->type == GDK_BUTTON_PRESS) flag = PTR_FLAGS_DOWN; switch (event->button) { case 1: flag |= PTR_FLAGS_BUTTON1; break; case 2: flag |= PTR_FLAGS_BUTTON3; break; case 3: flag |= PTR_FLAGS_BUTTON2; break; } if (flag != 0) { rdp_event.mouse_event.flags = flag; remmina_rdp_event_event_push(gp, &rdp_event); } return TRUE; } static gboolean remmina_rdp_event_on_scroll(GtkWidget* widget, GdkEventScroll* event, RemminaProtocolWidget* gp) { gint flag; RemminaPluginRdpEvent rdp_event = { 0 }; flag = 0; rdp_event.type = REMMINA_RDP_EVENT_TYPE_MOUSE; switch (event->direction) { case GDK_SCROLL_UP: flag = PTR_FLAGS_WHEEL | 0x0078; break; case GDK_SCROLL_DOWN: flag = PTR_FLAGS_WHEEL | PTR_FLAGS_WHEEL_NEGATIVE | 0x0088; break; default: return FALSE; } rdp_event.mouse_event.flags = flag; remmina_rdp_event_translate_pos(gp, event->x, event->y, &rdp_event.mouse_event.x, &rdp_event.mouse_event.y); remmina_rdp_event_event_push(gp, &rdp_event); return TRUE; } static gboolean remmina_rdp_event_on_key(GtkWidget* widget, GdkEventKey* event, RemminaProtocolWidget* gp) { Display* display; KeyCode cooked_keycode; rfContext* rfi; RemminaPluginRdpEvent rdp_event; rfi = GET_DATA(gp); rdp_event.type = REMMINA_RDP_EVENT_TYPE_SCANCODE; rdp_event.key_event.up = (event->type == GDK_KEY_PRESS ? False : True); rdp_event.key_event.extended = False; switch (event->keyval) { case GDK_KEY_Pause: rdp_event.key_event.key_code = 0x1D; rdp_event.key_event.up = False; remmina_rdp_event_event_push(gp, &rdp_event); rdp_event.key_event.key_code = 0x45; rdp_event.key_event.up = False; remmina_rdp_event_event_push(gp, &rdp_event); rdp_event.key_event.key_code = 0x1D; rdp_event.key_event.up = True; remmina_rdp_event_event_push(gp, &rdp_event); rdp_event.key_event.key_code = 0x45; rdp_event.key_event.up = True; remmina_rdp_event_event_push(gp, &rdp_event); break; default: if (!rfi->use_client_keymap) { rdp_event.key_event.key_code = freerdp_kbd_get_scancode_by_keycode(event->hardware_keycode, &rdp_event.key_event.extended); remmina_plugin_service->log_printf("[RDP]keyval=%04X keycode=%i scancode=%i extended=%i\n", event->keyval, event->hardware_keycode, rdp_event.key_event.key_code, &rdp_event.key_event.extended); } else { display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default()); cooked_keycode = XKeysymToKeycode(display, XKeycodeToKeysym(display, event->hardware_keycode, 0)); rdp_event.key_event.key_code = freerdp_kbd_get_scancode_by_keycode(cooked_keycode, &rdp_event.key_event.extended); remmina_plugin_service->log_printf("[RDP]keyval=%04X raw_keycode=%i cooked_keycode=%i scancode=%i extended=%i\n", event->keyval, event->hardware_keycode, cooked_keycode, rdp_event.key_event.key_code, &rdp_event.key_event.extended); } if (rdp_event.key_event.key_code) remmina_rdp_event_event_push(gp, &rdp_event); break; } /* Register/unregister the pressed key */ if (rdp_event.key_event.key_code) { if (event->type == GDK_KEY_PRESS) g_array_append_val(rfi->pressed_keys, rdp_event.key_event.key_code); else remmina_rdp_event_release_key(gp, rdp_event.key_event.key_code); } return TRUE; } void remmina_rdp_event_init(RemminaProtocolWidget* gp) { gint n; gint i; gchar* s; gint flags; XPixmapFormatValues* pf; XPixmapFormatValues* pfs; rfContext* rfi; rfi = GET_DATA(gp); rfi->drawing_area = gtk_drawing_area_new(); gtk_widget_show(rfi->drawing_area); gtk_container_add(GTK_CONTAINER(gp), rfi->drawing_area); gtk_widget_add_events(rfi->drawing_area, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus(rfi->drawing_area, TRUE); remmina_plugin_service->protocol_plugin_register_hostkey(gp, rfi->drawing_area); s = remmina_plugin_service->pref_get_value("rdp_use_client_keymap"); rfi->use_client_keymap = (s && s[0] == '1' ? TRUE : FALSE); g_free(s); #if GTK_VERSION == 3 g_signal_connect(G_OBJECT(rfi->drawing_area), "draw", G_CALLBACK(remmina_rdp_event_on_draw), gp); #elif GTK_VERSION == 2 g_signal_connect(G_OBJECT(rfi->drawing_area), "expose-event", G_CALLBACK(remmina_rdp_event_on_expose), gp); #endif g_signal_connect(G_OBJECT(rfi->drawing_area), "configure-event", G_CALLBACK(remmina_rdp_event_on_configure), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "motion-notify-event", G_CALLBACK(remmina_rdp_event_on_motion), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "button-press-event", G_CALLBACK(remmina_rdp_event_on_button), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "button-release-event", G_CALLBACK(remmina_rdp_event_on_button), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "scroll-event", G_CALLBACK(remmina_rdp_event_on_scroll), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "key-press-event", G_CALLBACK(remmina_rdp_event_on_key), gp); g_signal_connect(G_OBJECT(rfi->drawing_area), "key-release-event", G_CALLBACK(remmina_rdp_event_on_key), gp); rfi->pressed_keys = g_array_new(FALSE, TRUE, sizeof (gint)); rfi->event_queue = g_async_queue_new_full(g_free); rfi->ui_queue = g_async_queue_new(); if (pipe(rfi->event_pipe)) { g_print("Error creating pipes.\n"); rfi->event_pipe[0] = -1; rfi->event_pipe[1] = -1; } else { flags = fcntl(rfi->event_pipe[0], F_GETFL, 0); fcntl(rfi->event_pipe[0], F_SETFL, flags | O_NONBLOCK); } rfi->object_table = g_hash_table_new_full(NULL, NULL, NULL, g_free); rfi->display = GDK_DISPLAY_XDISPLAY(gdk_display_get_default()); rfi->depth = DefaultDepth(rfi->display, DefaultScreen(rfi->display)); rfi->visual = GDK_VISUAL_XVISUAL(gdk_visual_get_best_with_depth(rfi->depth)); pfs = XListPixmapFormats(rfi->display, &n); if (pfs) { for (i = 0; i < n; i++) { pf = pfs + i; if (pf->depth == rfi->depth) { rfi->scanline_pad = pf->scanline_pad; rfi->bpp = pf->bits_per_pixel; break; } } XFree(pfs); } } void remmina_rdp_event_uninit(RemminaProtocolWidget* gp) { rfContext* rfi; RemminaPluginRdpUiObject* ui; rfi = GET_DATA(gp); if (rfi->scale_handler) { g_source_remove(rfi->scale_handler); rfi->scale_handler = 0; } if (rfi->ui_handler) { g_source_remove(rfi->ui_handler); rfi->ui_handler = 0; } while ((ui =(RemminaPluginRdpUiObject*) g_async_queue_try_pop(rfi->ui_queue)) != NULL) { rf_object_free(gp, ui); } if (rfi->gc) { XFreeGC(rfi->display, rfi->gc); rfi->gc = 0; } if (rfi->gc_default) { XFreeGC(rfi->display, rfi->gc_default); rfi->gc_default = 0; } if (rfi->rgb_cairo_surface) { cairo_surface_destroy(rfi->rgb_cairo_surface); rfi->rgb_cairo_surface = NULL; } if (rfi->rgb_surface) { XFreePixmap(rfi->display, rfi->rgb_surface); rfi->rgb_surface = 0; } if (rfi->gc_mono) { XFreeGC(rfi->display, rfi->gc_mono); rfi->gc_mono = 0; } if (rfi->bitmap_mono) { XFreePixmap(rfi->display, rfi->bitmap_mono); rfi->bitmap_mono = 0; } g_hash_table_destroy(rfi->object_table); g_array_free(rfi->pressed_keys, TRUE); g_async_queue_unref(rfi->event_queue); rfi->event_queue = NULL; g_async_queue_unref(rfi->ui_queue); rfi->ui_queue = NULL; close(rfi->event_pipe[0]); close(rfi->event_pipe[1]); } void remmina_rdp_event_update_scale(RemminaProtocolWidget* gp) { gint width, height; gint hscale, vscale; RemminaFile* remminafile; rfContext* rfi; rfi = GET_DATA(gp); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); width = remmina_plugin_service->protocol_plugin_get_width(gp); height = remmina_plugin_service->protocol_plugin_get_height(gp); hscale = remmina_plugin_service->file_get_int(remminafile, "hscale", 0); vscale = remmina_plugin_service->file_get_int(remminafile, "vscale", 0); if (rfi->scale) { gtk_widget_set_size_request(rfi->drawing_area, (hscale > 0 ? width * hscale / 100 : -1), (vscale > 0 ? height * vscale / 100 : -1)); } else { gtk_widget_set_size_request(rfi->drawing_area, width, height); } remmina_plugin_service->protocol_plugin_emit_signal(gp, "update-align"); } static uint8 remmina_rdp_event_rop2_map[] = { GXclear, /* 0 */ GXnor, /* DPon */ GXandInverted, /* DPna */ GXcopyInverted, /* Pn */ GXandReverse, /* PDna */ GXinvert, /* Dn */ GXxor, /* DPx */ GXnand, /* DPan */ GXand, /* DPa */ GXequiv, /* DPxn */ GXnoop, /* D */ GXorInverted, /* DPno */ GXcopy, /* P */ GXorReverse, /* PDno */ GXor, /* DPo */ GXset /* 1 */ }; static void remmina_rdp_event_set_rop2(rfContext* rfi, gint rop2) { if ((rop2 < 0x01) || (rop2 > 0x10)) { remmina_plugin_service->log_printf("[RDP]unknown rop2 0x%x", rop2); } else { XSetFunction(rfi->display, rfi->gc, remmina_rdp_event_rop2_map[rop2 - 1]); } } static void remmina_rdp_event_set_rop3(rfContext* rfi, gint rop3) { switch (rop3) { case 0x00: /* 0 - 0 */ XSetFunction(rfi->display, rfi->gc, GXclear); break; case 0x05: /* ~(P | D) - DPon */ XSetFunction(rfi->display, rfi->gc, GXnor); break; case 0x0a: /* ~P & D - DPna */ XSetFunction(rfi->display, rfi->gc, GXandInverted); break; case 0x0f: /* ~P - Pn */ XSetFunction(rfi->display, rfi->gc, GXcopyInverted); break; case 0x11: /* ~(S | D) - DSon */ XSetFunction(rfi->display, rfi->gc, GXnor); break; case 0x22: /* ~S & D - DSna */ XSetFunction(rfi->display, rfi->gc, GXandInverted); break; case 0x33: /* ~S - Sn */ XSetFunction(rfi->display, rfi->gc, GXcopyInverted); break; case 0x44: /* S & ~D - SDna */ XSetFunction(rfi->display, rfi->gc, GXandReverse); break; case 0x50: /* P & ~D - PDna */ XSetFunction(rfi->display, rfi->gc, GXandReverse); break; case 0x55: /* ~D - Dn */ XSetFunction(rfi->display, rfi->gc, GXinvert); break; case 0x5a: /* D ^ P - DPx */ XSetFunction(rfi->display, rfi->gc, GXxor); break; case 0x5f: /* ~(P & D) - DPan */ XSetFunction(rfi->display, rfi->gc, GXnand); break; case 0x66: /* D ^ S - DSx */ XSetFunction(rfi->display, rfi->gc, GXxor); break; case 0x77: /* ~(S & D) - DSan */ XSetFunction(rfi->display, rfi->gc, GXnand); break; case 0x88: /* D & S - DSa */ XSetFunction(rfi->display, rfi->gc, GXand); break; case 0x99: /* ~(S ^ D) - DSxn */ XSetFunction(rfi->display, rfi->gc, GXequiv); break; case 0xa0: /* P & D - DPa */ XSetFunction(rfi->display, rfi->gc, GXand); break; case 0xa5: /* ~(P ^ D) - PDxn */ XSetFunction(rfi->display, rfi->gc, GXequiv); break; case 0xaa: /* D - D */ XSetFunction(rfi->display, rfi->gc, GXnoop); break; case 0xaf: /* ~P | D - DPno */ XSetFunction(rfi->display, rfi->gc, GXorInverted); break; case 0xbb: /* ~S | D - DSno */ XSetFunction(rfi->display, rfi->gc, GXorInverted); break; case 0xcc: /* S - S */ XSetFunction(rfi->display, rfi->gc, GXcopy); break; case 0xdd: /* S | ~D - SDno */ XSetFunction(rfi->display, rfi->gc, GXorReverse); break; case 0xee: /* D | S - DSo */ XSetFunction(rfi->display, rfi->gc, GXor); break; case 0xf0: /* P - P */ XSetFunction(rfi->display, rfi->gc, GXcopy); break; case 0xf5: /* P | ~D - PDno */ XSetFunction(rfi->display, rfi->gc, GXorReverse); break; case 0xfa: /* P | D - DPo */ XSetFunction(rfi->display, rfi->gc, GXor); break; case 0xff: /* 1 - 1 */ XSetFunction(rfi->display, rfi->gc, GXset); break; default: remmina_plugin_service->log_printf("[RDP]unknown rop3 0x%x", rop3); break; } } static void remmina_rdp_event_insert_drawable(rfContext* rfi, guint object_id, Drawable obj) { Drawable* p; p = g_new(Drawable, 1); *p = obj; g_hash_table_insert(rfi->object_table, GINT_TO_POINTER(object_id), p); } static Drawable remmina_rdp_event_get_drawable(rfContext* rfi, guint object_id) { Drawable* p; p = (Drawable*) g_hash_table_lookup(rfi->object_table, GINT_TO_POINTER(object_id)); if (!p) return 0; return *p; } static void remmina_rdp_event_connected(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) { rfContext* rfi; rfi = GET_DATA(gp); gtk_widget_realize(rfi->drawing_area); rfi->drawable = GDK_WINDOW_XID(gtk_widget_get_window(rfi->drawing_area)); rfi->rgb_surface = XCreatePixmap(rfi->display, rfi->drawable, rfi->settings->width, rfi->settings->height, rfi->depth); rfi->rgb_cairo_surface = cairo_xlib_surface_create(rfi->display, rfi->rgb_surface, rfi->visual, rfi->width, rfi->height); rfi->drw_surface = rfi->rgb_surface; remmina_rdp_event_update_scale(gp); } static void remmina_rdp_event_rfx(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) { XImage* image; gint i, tx, ty; RFX_MESSAGE* message; rfContext* rfi; rfi = GET_DATA(gp); message = ui->rfx.message; XSetFunction(rfi->display, rfi->gc, GXcopy); XSetFillStyle(rfi->display, rfi->gc, FillSolid); XSetClipRectangles(rfi->display, rfi->gc, ui->rfx.left, ui->rfx.top, (XRectangle*) message->rects, message->num_rects, YXBanded); /* Draw the tiles to primary surface, each is 64x64. */ for (i = 0; i < message->num_tiles; i++) { image = XCreateImage(rfi->display, rfi->visual, 24, ZPixmap, 0, (char*) message->tiles[i]->data, 64, 64, 32, 0); tx = message->tiles[i]->x + ui->rfx.left; ty = message->tiles[i]->y + ui->rfx.top; XPutImage(rfi->display, rfi->rgb_surface, rfi->gc, image, 0, 0, tx, ty, 64, 64); XFree(image); remmina_rdp_event_update_rect(gp, tx, ty, message->rects[i].width, message->rects[i].height); } XSetClipMask(rfi->display, rfi->gc, None); } static void remmina_rdp_event_nocodec(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) { XImage* image; rfContext* rfi; rfi = GET_DATA(gp); XSetFunction(rfi->display, rfi->gc, GXcopy); XSetFillStyle(rfi->display, rfi->gc, FillSolid); image = XCreateImage(rfi->display, rfi->visual, 24, ZPixmap, 0, (char*) ui->nocodec.bitmap, ui->nocodec.width, ui->nocodec.height, 32, 0); XPutImage(rfi->display, rfi->rgb_surface, rfi->gc, image, 0, 0, ui->nocodec.left, ui->nocodec.top, ui->nocodec.width, ui->nocodec.height); remmina_rdp_event_update_rect(gp, ui->nocodec.left, ui->nocodec.top, ui->nocodec.width, ui->nocodec.height); XSetClipMask(rfi->display, rfi->gc, None); } gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp) { rfContext* rfi; RemminaPluginRdpUiObject* ui; rfi = GET_DATA(gp); ui = (RemminaPluginRdpUiObject*) g_async_queue_try_pop(rfi->ui_queue); if (ui) { switch (ui->type) { case REMMINA_RDP_UI_UPDATE_REGION: remmina_rdp_event_update_region(gp, ui); break; case REMMINA_RDP_UI_CONNECTED: remmina_rdp_event_connected(gp, ui); break; case REMMINA_RDP_UI_RFX: remmina_rdp_event_rfx(gp, ui); break; case REMMINA_RDP_UI_NOCODEC: remmina_rdp_event_nocodec(gp, ui); break; default: break; } rf_object_free(gp, ui); return TRUE; } else { LOCK_BUFFER(FALSE) rfi->ui_handler = 0; UNLOCK_BUFFER(FALSE) return FALSE; } } void remmina_rdp_event_unfocus(RemminaProtocolWidget* gp) { remmina_rdp_event_release_key(gp, 0); } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_event.h000066400000000000000000000024321171526373700226470ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_EVENT_H__ #define __REMMINA_RDP_EVENT_H__ G_BEGIN_DECLS void remmina_rdp_event_init(RemminaProtocolWidget* gp); void remmina_rdp_event_uninit(RemminaProtocolWidget* gp); void remmina_rdp_event_update_scale(RemminaProtocolWidget* gp); gboolean remmina_rdp_event_queue_ui(RemminaProtocolWidget* gp); void remmina_rdp_event_unfocus(RemminaProtocolWidget* gp); void remmina_rdp_event_update_rect(RemminaProtocolWidget* gp, gint x, gint y, gint w, gint h); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_file.c000066400000000000000000000217001171526373700224370ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #include "rdp_plugin.h" #include "rdp_file.h" gboolean remmina_rdp_file_import_test(const gchar* from_file) { gchar* ext; ext = strrchr(from_file, '.'); if (!ext) return FALSE; ext++; if (g_strcmp0(ext, "RDP") == 0) return TRUE; if (g_strcmp0(ext, "rdp") == 0) return TRUE; return FALSE; } static void remmina_rdp_file_import_field(RemminaFile* remminafile, const gchar* key, const gchar* value) { if (g_strcmp0(key, "desktopwidth") == 0) { remmina_plugin_service->file_set_string(remminafile, "resolution_width", value); } else if (g_strcmp0(key, "desktopheight") == 0) { remmina_plugin_service->file_set_string(remminafile, "resolution_height", value); } else if (g_strcmp0(key, "session bpp") == 0) { remmina_plugin_service->file_set_string(remminafile, "colordepth", value); } else if (g_strcmp0(key, "keyboardhook") == 0) { remmina_plugin_service->file_set_int(remminafile, "keyboard_grab", (atoi (value) == 1)); } else if (g_strcmp0(key, "full address") == 0) { remmina_plugin_service->file_set_string(remminafile, "server", value); } else if (g_strcmp0(key, "audiomode") == 0) { switch (atoi(value)) { case 0: remmina_plugin_service->file_set_string(remminafile, "sound", "local"); break; case 1: remmina_plugin_service->file_set_string(remminafile, "sound", "remote"); break; } } else if (g_strcmp0(key, "redirectprinters") == 0) { remmina_plugin_service->file_set_int(remminafile, "shareprinter", (atoi (value) == 1)); } else if (g_strcmp0(key, "redirectclipboard") == 0) { remmina_plugin_service->file_set_int(remminafile, "disableclipboard", (atoi (value) != 1)); } else if (g_strcmp0(key, "alternate shell") == 0) { remmina_plugin_service->file_set_string(remminafile, "exec", value); } else if (g_strcmp0(key, "shell working directory") == 0) { remmina_plugin_service->file_set_string(remminafile, "execpath", value); } /* tsclient fields, import only */ else if (g_strcmp0(key, "client hostname") == 0) { remmina_plugin_service->file_set_string(remminafile, "clientname", value); } else if (g_strcmp0(key, "domain") == 0) { remmina_plugin_service->file_set_string(remminafile, "domain", value); } else if (g_strcmp0(key, "username") == 0) { remmina_plugin_service->file_set_string(remminafile, "username", value); } else if (g_strcmp0(key, "password") == 0) { remmina_plugin_service->file_set_string(remminafile, "password", value); } } static RemminaFile* remmina_rdp_file_import_channel(GIOChannel* channel) { gchar* p; const gchar* enc; gchar* line = NULL; GError* error = NULL; gsize bytes_read = 0; RemminaFile* remminafile; guchar magic[2] = { 0 }; if (g_io_channel_set_encoding(channel, NULL, &error) != G_IO_STATUS_NORMAL) { g_print("g_io_channel_set_encoding: %s\n", error->message); return NULL; } /* Try to detect the UTF-16 encoding */ if (g_io_channel_read_chars(channel, (gchar*) magic, 2, &bytes_read, &error) != G_IO_STATUS_NORMAL) { g_print("g_io_channel_read_chars: %s\n", error->message); return NULL; } if (magic[0] == 0xFF && magic[1] == 0xFE) { enc = "UTF-16LE"; } else if (magic[0] == 0xFE && magic[1] == 0xFF) { enc = "UTF-16BE"; } else { enc = "UTF-8"; if (g_io_channel_seek(channel, 0, G_SEEK_SET) != G_IO_ERROR_NONE) { g_print("g_io_channel_seek: failed\n"); return NULL; } } if (g_io_channel_set_encoding(channel, enc, &error) != G_IO_STATUS_NORMAL) { g_print("g_io_channel_set_encoding: %s\n", error->message); return NULL; } remminafile = remmina_plugin_service->file_new(); while (g_io_channel_read_line(channel, &line, NULL, &bytes_read, &error) == G_IO_STATUS_NORMAL) { if (line == NULL) break; line[bytes_read] = '\0'; p = strchr(line, ':'); if (p) { *p++ = '\0'; p = strchr (p, ':'); if (p) { p++; remmina_rdp_file_import_field(remminafile, line, p); } } g_free(line); } if (remmina_plugin_service->file_get_int(remminafile, "resolution_width", 0) > 0 && remmina_plugin_service->file_get_int(remminafile, "resolution_height", 0) > 0) { p = g_strdup_printf("%ix%i", remmina_plugin_service->file_get_int(remminafile, "resolution_width", 0), remmina_plugin_service->file_get_int(remminafile, "resolution_height", 0)); remmina_plugin_service->file_set_string(remminafile, "resolution", p); g_free(p); } remmina_plugin_service->file_set_string(remminafile, "name", remmina_plugin_service->file_get_string(remminafile, "server")); remmina_plugin_service->file_set_string(remminafile, "protocol", "RDP"); return remminafile; } RemminaFile* remmina_rdp_file_import(const gchar* from_file) { GIOChannel* channel; GError* error = NULL; RemminaFile* remminafile; channel = g_io_channel_new_file(from_file, "r", &error); if (channel == NULL) { g_print("Failed to import %s: %s\n", from_file, error->message); return NULL; } remminafile = remmina_rdp_file_import_channel(channel); g_io_channel_close(channel); return remminafile; } gboolean remmina_rdp_file_export_test(RemminaFile* remminafile) { if (g_strcmp0(remmina_plugin_service->file_get_string(remminafile, "protocol"), "RDP") == 0) return TRUE; return FALSE; } gboolean remmina_rdp_file_export_channel(RemminaFile* remminafile, FILE* fp) { gchar* s; gchar* p; const gchar* cs; fprintf(fp, "screen mode id:i:2\r\n"); s = g_strdup(remmina_plugin_service->file_get_string(remminafile, "resolution")); p = strchr(s, 'x'); if (p) { *p++ = '\0'; fprintf(fp, "desktopwidth:i:%s\r\n", s); fprintf(fp, "desktopheight:i:%s\r\n", p); } g_free(s); fprintf(fp, "session bpp:i:%i\r\n", remmina_plugin_service->file_get_int(remminafile, "colordepth", 8)); //fprintf(fp, "winposstr:s:0,1,123,34,931,661\r\n"); fprintf(fp, "compression:i:1\r\n"); fprintf(fp, "keyboardhook:i:2\r\n"); fprintf(fp, "displayconnectionbar:i:1\r\n"); fprintf(fp, "disable wallpaper:i:1\r\n"); fprintf(fp, "disable full window drag:i:1\r\n"); fprintf(fp, "allow desktop composition:i:0\r\n"); fprintf(fp, "allow font smoothing:i:0\r\n"); fprintf(fp, "disable menu anims:i:1\r\n"); fprintf(fp, "disable themes:i:0\r\n"); fprintf(fp, "disable cursor setting:i:0\r\n"); fprintf(fp, "bitmapcachepersistenable:i:1\r\n"); fprintf(fp, "full address:s:%s\r\n", remmina_plugin_service->file_get_string(remminafile, "server")); if (g_strcmp0(remmina_plugin_service->file_get_string(remminafile, "sound"), "local") == 0) fprintf(fp, "audiomode:i:0\r\n"); else if (g_strcmp0(remmina_plugin_service->file_get_string(remminafile, "sound"), "remote") == 0) fprintf(fp, "audiomode:i:1\r\n"); else fprintf(fp, "audiomode:i:2\r\n"); fprintf(fp, "redirectprinters:i:%i\r\n", remmina_plugin_service->file_get_int(remminafile, "shareprinter", FALSE) ? 1 : 0); fprintf(fp, "redirectcomports:i:0\r\n"); fprintf(fp, "redirectsmartcards:i:0\r\n"); fprintf(fp, "redirectclipboard:i:1\r\n"); fprintf(fp, "redirectposdevices:i:0\r\n"); fprintf(fp, "autoreconnection enabled:i:1\r\n"); fprintf(fp, "authentication level:i:0\r\n"); fprintf(fp, "prompt for credentials:i:1\r\n"); fprintf(fp, "negotiate security layer:i:1\r\n"); fprintf(fp, "remoteapplicationmode:i:0\r\n"); cs = remmina_plugin_service->file_get_string(remminafile, "exec"); fprintf(fp, "alternate shell:s:%s\r\n", cs ? cs : ""); cs = remmina_plugin_service->file_get_string(remminafile, "execpath"); fprintf(fp, "shell working directory:s:%s\r\n", cs ? cs : ""); fprintf(fp, "gatewayhostname:s:\r\n"); fprintf(fp, "gatewayusagemethod:i:4\r\n"); fprintf(fp, "gatewaycredentialssource:i:4\r\n"); fprintf(fp, "gatewayprofileusagemethod:i:0\r\n"); fprintf(fp, "promptcredentialonce:i:1\r\n"); fprintf(fp, "drivestoredirect:s:\r\n"); return TRUE; } gboolean remmina_rdp_file_export(RemminaFile* remminafile, const gchar* to_file) { FILE* fp; gchar* p; gboolean ret; p = strrchr (to_file, '.'); if (p && (g_strcmp0(p + 1, "rdp") == 0 || g_strcmp0(p + 1, "RDP") == 0)) { p = g_strdup(to_file); } else { p = g_strdup_printf("%s.rdp", to_file); } fp = g_fopen(p, "w+"); if (fp == NULL) { g_print("Failed to export %s\n", p); g_free(p); return FALSE; } g_free(p); ret = remmina_rdp_file_export_channel(remminafile, fp); fclose(fp); return ret; } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_file.h000066400000000000000000000022341171526373700224450ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_FILE_H__ #define __REMMINA_RDP_FILE_H__ G_BEGIN_DECLS gboolean remmina_rdp_file_import_test(const gchar* from_file); RemminaFile* remmina_rdp_file_import(const gchar* from_file); gboolean remmina_rdp_file_export_test(RemminaFile* remminafile); gboolean remmina_rdp_file_export(RemminaFile* remminafile, const gchar* to_file); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_gdi.c000066400000000000000000000131151171526373700222640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Jay Sorg * Copyright (C) 2010-2011 Vic Lee * Copyright (C) 2011 Marc-Andre Moreau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ /* rdp gdi functions, run inside the rdp thread */ #include "rdp_plugin.h" #include "rdp_event.h" #include "rdp_gdi.h" #include #include #include #include #include #include #include static void rf_desktop_resize(rdpContext* context) { RemminaProtocolWidget* gp; rfContext* rfi; rfi = (rfContext*) context; gp = rfi->protocol_widget; LOCK_BUFFER(TRUE) remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->width); remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->height); UNLOCK_BUFFER(TRUE) THREADS_ENTER remmina_rdp_event_update_scale(gp); THREADS_LEAVE remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); } static void rf_gdi_palette(rdpContext* context, PALETTE_UPDATE* palette) { g_print("palette\n"); } static void rf_gdi_set_bounds(rdpContext* context, rdpBounds* bounds) { /* XRectangle clip; rfContext* rfi = (rfContext*) context; if (bounds != NULL) { clip.x = bounds->left; clip.y = bounds->top; clip.width = bounds->right - bounds->left + 1; clip.height = bounds->bottom - bounds->top + 1; XSetClipRectangles(rfi->display, rfi->gc, 0, 0, &clip, 1, YXBanded); } else { XSetClipMask(rfi->display, rfi->gc, None); } */ } static void rf_gdi_dstblt(rdpContext* context, DSTBLT_ORDER* dstblt) { g_print("dstblt\n"); } static void rf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt) { g_print("patblt\n"); } static void rf_gdi_scrblt(rdpContext* context, SCRBLT_ORDER* scrblt) { g_print("srcblt\n"); } static void rf_gdi_opaque_rect(rdpContext* context, OPAQUE_RECT_ORDER* opaque_rect) { g_print("opaque_rect\n"); } static void rf_gdi_multi_opaque_rect(rdpContext* context, MULTI_OPAQUE_RECT_ORDER* multi_opaque_rect) { g_print("multi_opaque_rect\n"); } static void rf_gdi_line_to(rdpContext* context, LINE_TO_ORDER* line_to) { g_print("line_to\n"); } static void rf_gdi_polyline(rdpContext* context, POLYLINE_ORDER* polyline) { g_print("polyline\n"); } static void rf_gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) { g_print("memblt\n"); } static void rf_gdi_fast_index(rdpContext* context, FAST_INDEX_ORDER* fast_index) { g_print("fast_index\n"); } static void rf_gdi_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND* surface_bits_command) { uint8* bitmap; RFX_MESSAGE* message; RemminaPluginRdpUiObject* ui; rfContext* rfi = (rfContext*) context; if (surface_bits_command->codecID == CODEC_ID_REMOTEFX && rfi->rfx_context) { message = rfx_process_message(rfi->rfx_context, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_RFX; ui->rfx.left = surface_bits_command->destLeft; ui->rfx.top = surface_bits_command->destTop; ui->rfx.message = message; rf_queue_ui(rfi->protocol_widget, ui); } else if (surface_bits_command->codecID == CODEC_ID_NONE) { bitmap = (uint8*) xzalloc(surface_bits_command->width * surface_bits_command->height * 4); freerdp_image_flip(surface_bits_command->bitmapData, bitmap, surface_bits_command->width, surface_bits_command->height, 32); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_NOCODEC; ui->nocodec.left = surface_bits_command->destLeft; ui->nocodec.top = surface_bits_command->destTop; ui->nocodec.width = surface_bits_command->width; ui->nocodec.height = surface_bits_command->height; ui->nocodec.bitmap = bitmap; rf_queue_ui(rfi->protocol_widget, ui); } else { printf("Unsupported codecID %d\n", surface_bits_command->codecID); } } void rf_gdi_register_update_callbacks(rdpUpdate* update) { rdpPrimaryUpdate* primary; rdpSecondaryUpdate* secondary; primary = update->primary; secondary = update->secondary; update->DesktopResize = rf_desktop_resize; update->Palette = rf_gdi_palette; update->SetBounds = rf_gdi_set_bounds; primary->DstBlt = rf_gdi_dstblt; primary->PatBlt = rf_gdi_patblt; primary->ScrBlt = rf_gdi_scrblt; primary->OpaqueRect = rf_gdi_opaque_rect; primary->DrawNineGrid = NULL; primary->MultiDstBlt = NULL; primary->MultiPatBlt = NULL; primary->MultiScrBlt = NULL; primary->MultiOpaqueRect = rf_gdi_multi_opaque_rect; primary->MultiDrawNineGrid = NULL; primary->LineTo = rf_gdi_line_to; primary->Polyline = rf_gdi_polyline; primary->MemBlt = rf_gdi_memblt; primary->Mem3Blt = NULL; primary->SaveBitmap = NULL; primary->GlyphIndex = NULL; primary->FastIndex = rf_gdi_fast_index; primary->FastGlyph = NULL; primary->PolygonSC = NULL; primary->PolygonCB = NULL; primary->EllipseSC = NULL; primary->EllipseCB = NULL; update->SurfaceBits = rf_gdi_surface_bits; } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_gdi.h000066400000000000000000000017351171526373700222760ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_GDI_H__ #define __REMMINA_RDP_GDI_H__ #include "rdp_plugin.h" G_BEGIN_DECLS void rf_gdi_register_update_callbacks(rdpUpdate* update); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_graphics.c000066400000000000000000000174661171526373700233360ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Jay Sorg * Copyright (C) 2010-2011 Vic Lee * Copyright (C) 2011 Marc-Andre Moreau * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "rdp_plugin.h" #include "rdp_event.h" #include "rdp_graphics.h" #include #include #include //#define RF_BITMAP //#define RF_GLYPH /* Bitmap Class */ void rf_Bitmap_New(rdpContext* context, rdpBitmap* bitmap) { #ifdef RF_BITMAP uint8* data; Pixmap pixmap; XImage* image; rfContext* rfi = (rfContext*) context; XSetFunction(rfi->display, rfi->gc, GXcopy); pixmap = XCreatePixmap(rfi->display, rfi->drawable, bitmap->width, bitmap->height, rfi->depth); if (bitmap->data != NULL) { data = freerdp_image_convert(bitmap->data, NULL, bitmap->width, bitmap->height, rfi->srcBpp, rfi->bpp, rfi->clrconv); if (bitmap->ephemeral != true) { image = XCreateImage(rfi->display, rfi->visual, rfi->depth, ZPixmap, 0, (char*) data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); XPutImage(rfi->display, pixmap, rfi->gc, image, 0, 0, 0, 0, bitmap->width, bitmap->height); XFree(image); if (data != bitmap->data) xfree(data); } else { if (data != bitmap->data) xfree(bitmap->data); bitmap->data = data; } } ((rfBitmap*) bitmap)->pixmap = pixmap; #endif } void rf_Bitmap_Free(rdpContext* context, rdpBitmap* bitmap) { #ifdef RF_BITMAP rfContext* rfi = (rfContext*) context; printf("rf_Bitmap_Free\n"); if (((rfBitmap*) bitmap)->pixmap != 0) XFreePixmap(rfi->display, ((rfBitmap*) bitmap)->pixmap); #endif } void rf_Bitmap_Paint(rdpContext* context, rdpBitmap* bitmap) { #ifdef RF_BITMAP XImage* image; int width, height; rfContext* rfi = (rfContext*) context; printf("rf_Bitmap_Paint\n"); width = bitmap->right - bitmap->left + 1; height = bitmap->bottom - bitmap->top + 1; XSetFunction(rfi->display, rfi->gc, GXcopy); image = XCreateImage(rfi->display, rfi->visual, rfi->depth, ZPixmap, 0, (char*) bitmap->data, bitmap->width, bitmap->height, rfi->scanline_pad, 0); XPutImage(rfi->display, rfi->primary, rfi->gc, image, 0, 0, bitmap->left, bitmap->top, width, height); XFree(image); //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, // bitmap->left, bitmap->top, width, height, bitmap->left, bitmap->top); //gdi_InvalidateRegion(rfi->hdc, bitmap->left, bitmap->top, width, height); #endif } void rf_Bitmap_Decompress(rdpContext* context, rdpBitmap* bitmap, uint8* data, int width, int height, int bpp, int length, boolean compressed) { #ifdef RF_BITMAP uint16 size; printf("rf_Bitmap_Decompress\n"); size = width * height * (bpp + 7) / 8; if (bitmap->data == NULL) bitmap->data = (uint8*) xmalloc(size); else bitmap->data = (uint8*) xrealloc(bitmap->data, size); if (compressed) { boolean status; status = bitmap_decompress(data, bitmap->data, width, height, length, bpp, bpp); if (status != true) { printf("Bitmap Decompression Failed\n"); } } else { freerdp_image_flip(data, bitmap->data, width, height, bpp); } bitmap->compressed = false; bitmap->length = size; bitmap->bpp = bpp; #endif } void rf_Bitmap_SetSurface(rdpContext* context, rdpBitmap* bitmap, boolean primary) { #ifdef RF_BITMAP rfContext* rfi = (rfContext*) context; if (primary) rfi->drawing = rfi->primary; else rfi->drawing = ((rfBitmap*) bitmap)->pixmap; #endif } /* Pointer Class */ void rf_Pointer_New(rdpContext* context, rdpPointer* pointer) { } void rf_Pointer_Free(rdpContext* context, rdpPointer* pointer) { } void rf_Pointer_Set(rdpContext* context, rdpPointer* pointer) { } /* Glyph Class */ void rf_Glyph_New(rdpContext* context, rdpGlyph* glyph) { #ifdef RF_GLYPH int scanline; XImage* image; rfContext* rfi; rfGlyph* rf_glyph; rf_glyph = (rfGlyph*) glyph; rfi = (rfContext*) context; scanline = (glyph->cx + 7) / 8; rf_glyph->pixmap = XCreatePixmap(rfi->display, rfi->drawing, glyph->cx, glyph->cy, 1); image = XCreateImage(rfi->display, rfi->visual, 1, ZPixmap, 0, (char*) glyph->aj, glyph->cx, glyph->cy, 8, scanline); image->byte_order = MSBFirst; image->bitmap_bit_order = MSBFirst; XInitImage(image); XPutImage(rfi->display, rf_glyph->pixmap, rfi->gc_mono, image, 0, 0, 0, 0, glyph->cx, glyph->cy); XFree(image); #endif } void rf_Glyph_Free(rdpContext* context, rdpGlyph* glyph) { #ifdef RF_GLYPH rfContext* rfi = (rfContext*) context; if (((rfGlyph*) glyph)->pixmap != 0) XFreePixmap(rfi->display, ((rfGlyph*) glyph)->pixmap); #endif } void rf_Glyph_Draw(rdpContext* context, rdpGlyph* glyph, int x, int y) { #ifdef RF_GLYPH rfGlyph* rf_glyph; rfContext* rfi = (rfContext*) context; rf_glyph = (rfGlyph*) glyph; XSetStipple(rfi->display, rfi->gc, rf_glyph->pixmap); XSetTSOrigin(rfi->display, rfi->gc, x, y); XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, glyph->cx, glyph->cy); XSetStipple(rfi->display, rfi->gc, rfi->bitmap_mono); #endif } void rf_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor) { #ifdef RF_GLYPH rfContext* rfi = (rfContext*) context; bgcolor = (rfi->clrconv->invert)? freerdp_color_convert_var_bgr(bgcolor, rfi->srcBpp, 32, rfi->clrconv): freerdp_color_convert_var_rgb(bgcolor, rfi->srcBpp, 32, rfi->clrconv); fgcolor = (rfi->clrconv->invert)? freerdp_color_convert_var_bgr(fgcolor, rfi->srcBpp, 32, rfi->clrconv): freerdp_color_convert_var_rgb(fgcolor, rfi->srcBpp, 32, rfi->clrconv); XSetFunction(rfi->display, rfi->gc, GXcopy); XSetFillStyle(rfi->display, rfi->gc, FillSolid); XSetForeground(rfi->display, rfi->gc, fgcolor); XFillRectangle(rfi->display, rfi->drawing, rfi->gc, x, y, width, height); XSetForeground(rfi->display, rfi->gc, bgcolor); XSetBackground(rfi->display, rfi->gc, fgcolor); XSetFillStyle(rfi->display, rfi->gc, FillStippled); #endif } void rf_Glyph_EndDraw(rdpContext* context, int x, int y, int width, int height, uint32 bgcolor, uint32 fgcolor) { #ifdef RF_GLYPH rfContext* rfi = (rfContext*) context; if (rfi->drawing == rfi->primary) { //XCopyArea(rfi->display, rfi->primary, rfi->drawable, rfi->gc, x, y, width, height, x, y); //gdi_InvalidateRegion(rfi->hdc, x, y, width, height); } #endif } /* Graphics Module */ void rf_register_graphics(rdpGraphics* graphics) { rdpBitmap* bitmap; rdpPointer* pointer; rdpGlyph* glyph; bitmap = xnew(rdpBitmap); bitmap->size = sizeof(rfBitmap); bitmap->New = rf_Bitmap_New; bitmap->Free = rf_Bitmap_Free; bitmap->Paint = rf_Bitmap_Paint; bitmap->Decompress = rf_Bitmap_Decompress; bitmap->SetSurface = rf_Bitmap_SetSurface; graphics_register_bitmap(graphics, bitmap); xfree(bitmap); pointer = xnew(rdpPointer); pointer->size = sizeof(rfPointer); pointer->New = rf_Pointer_New; pointer->Free = rf_Pointer_Free; pointer->Set = rf_Pointer_Set; graphics_register_pointer(graphics, pointer); xfree(pointer); glyph = xnew(rdpGlyph); glyph->size = sizeof(rfGlyph); glyph->New = rf_Glyph_New; glyph->Free = rf_Glyph_Free; glyph->Draw = rf_Glyph_Draw; glyph->BeginDraw = rf_Glyph_BeginDraw; glyph->EndDraw = rf_Glyph_EndDraw; graphics_register_glyph(graphics, glyph); xfree(glyph); } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_graphics.h000066400000000000000000000017031171526373700233260ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_GRAPHICS_H__ #define __REMMINA_RDP_GRAPHICS_H__ #include "rdp_plugin.h" void rf_register_graphics(rdpGraphics* graphics); #endif FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_plugin.c000066400000000000000000000676241171526373700230350ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "rdp_plugin.h" #include "rdp_gdi.h" #include "rdp_event.h" #include "rdp_graphics.h" #include "rdp_file.h" #include "rdp_settings.h" #include #include #include #include #include #include #define REMMINA_RDP_FEATURE_TOOL_REFRESH 1 #define REMMINA_RDP_FEATURE_SCALE 2 #define REMMINA_RDP_FEATURE_UNFOCUS 3 RemminaPluginService* remmina_plugin_service = NULL; /* Migrated from xfreerdp */ static gboolean rf_get_key_state(KeyCode keycode, int state, XModifierKeymap* modmap) { int offset; int modifierpos, key, keysymMask = 0; if (keycode == NoSymbol) return FALSE; for (modifierpos = 0; modifierpos < 8; modifierpos++) { offset = modmap->max_keypermod * modifierpos; for (key = 0; key < modmap->max_keypermod; key++) { if (modmap->modifiermap[offset + key] == keycode) keysymMask |= 1 << modifierpos; } } return (state & keysymMask) ? TRUE : FALSE; } void rf_init(RemminaProtocolWidget* gp) { int dummy; uint32 state; gint keycode; Window wdummy; XModifierKeymap* modmap; rfContext* rfi; rfi = GET_DATA(gp); XQueryPointer(rfi->display, GDK_ROOT_WINDOW(), &wdummy, &wdummy, &dummy, &dummy, &dummy, &dummy, &state); modmap = XGetModifierMapping(rfi->display); keycode = XKeysymToKeycode(rfi->display, XK_Caps_Lock); rfi->capslock_initstate = rf_get_key_state(keycode, state, modmap); keycode = XKeysymToKeycode(rfi->display, XK_Num_Lock); rfi->numlock_initstate = rf_get_key_state(keycode, state, modmap); XFreeModifiermap(modmap); } void rf_uninit(RemminaProtocolWidget* gp) { rfContext* rfi; rfi = GET_DATA(gp); if (rfi->rfx_context) { rfx_context_free(rfi->rfx_context); rfi->rfx_context = NULL; } #if 0 if (rfi->channels) { freerdp_channels_free(rfi->channels); rfi->channels = NULL; } if (rfi->instance) { freerdp_free(rfi->instance); rfi->instance = NULL; } #endif } void rf_get_fds(RemminaProtocolWidget* gp, void** rfds, int* rcount) { rfContext* rfi; rfi = GET_DATA(gp); if (rfi->event_pipe[0] != -1) { rfds[*rcount] = GINT_TO_POINTER(rfi->event_pipe[0]); (*rcount)++; } } boolean rf_check_fds(RemminaProtocolWidget* gp) { uint16 flags; gchar buf[100]; rdpInput* input; rfContext* rfi; RemminaPluginRdpEvent* event; rfi = GET_DATA(gp); if (rfi->event_queue == NULL) return True; input = rfi->instance->input; while ((event =(RemminaPluginRdpEvent*) g_async_queue_try_pop(rfi->event_queue)) != NULL) { switch (event->type) { case REMMINA_RDP_EVENT_TYPE_SCANCODE: flags = event->key_event.extended ? KBD_FLAGS_EXTENDED : 0; flags |= event->key_event.up ? KBD_FLAGS_RELEASE : KBD_FLAGS_DOWN; input->KeyboardEvent(input, flags, event->key_event.key_code); break; case REMMINA_RDP_EVENT_TYPE_MOUSE: input->MouseEvent(input, event->mouse_event.flags, event->mouse_event.x, event->mouse_event.y); break; } g_free(event); } if (read(rfi->event_pipe[0], buf, sizeof (buf))) { } return True; } void rf_queue_ui(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui) { rfContext* rfi; rfi = GET_DATA(gp); g_async_queue_push(rfi->ui_queue, ui); LOCK_BUFFER(TRUE) if (!rfi->ui_handler) rfi->ui_handler = IDLE_ADD((GSourceFunc) remmina_rdp_event_queue_ui, gp); UNLOCK_BUFFER(TRUE) } void rf_object_free(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* obj) { rfContext* rfi; rfi = GET_DATA(gp); switch (obj->type) { case REMMINA_RDP_UI_RFX: rfx_message_free(rfi->rfx_context, obj->rfx.message); break; case REMMINA_RDP_UI_NOCODEC: xfree(obj->nocodec.bitmap); break; default: break; } g_free(obj); } void rf_sw_begin_paint(rdpContext* context) { rdpGdi* gdi = context->gdi; gdi->primary->hdc->hwnd->invalid->null = 1; gdi->primary->hdc->hwnd->ninvalid = 0; } void rf_sw_end_paint(rdpContext* context) { sint32 x, y; uint32 w, h; rdpGdi* gdi; rfContext* rfi; RemminaProtocolWidget* gp; RemminaPluginRdpUiObject* ui; gdi = context->gdi; rfi = (rfContext*) context; gp = rfi->protocol_widget; if (gdi->primary->hdc->hwnd->invalid->null) return; x = gdi->primary->hdc->hwnd->invalid->x; y = gdi->primary->hdc->hwnd->invalid->y; w = gdi->primary->hdc->hwnd->invalid->w; h = gdi->primary->hdc->hwnd->invalid->h; ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_UPDATE_REGION; ui->region.x = x; ui->region.y = y; ui->region.width = w; ui->region.height = h; rf_queue_ui(rfi->protocol_widget, ui); } static void rf_sw_desktop_resize(rdpContext* context) { rfContext* rfi; RemminaProtocolWidget* gp; rfi = (rfContext*) context; gp = rfi->protocol_widget; LOCK_BUFFER(TRUE) remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->width); remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->height); UNLOCK_BUFFER(TRUE) THREADS_ENTER remmina_rdp_event_update_scale(gp); THREADS_LEAVE remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); } void rf_hw_begin_paint(rdpContext* context) { } void rf_hw_end_paint(rdpContext* context) { } static void rf_hw_desktop_resize(rdpContext* context) { rfContext* rfi; RemminaProtocolWidget* gp; rfi = (rfContext*) context; gp = rfi->protocol_widget; LOCK_BUFFER(TRUE) remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->width); remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->height); UNLOCK_BUFFER(TRUE) THREADS_ENTER remmina_rdp_event_update_scale(gp); THREADS_LEAVE remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); } static boolean remmina_rdp_pre_connect(freerdp* instance) { rfContext* rfi; rdpSettings* settings; RemminaProtocolWidget* gp; rfi = (rfContext*) instance->context; settings = instance->settings; gp = rfi->protocol_widget; settings->bitmap_cache = True; settings->offscreen_bitmap_cache = True; settings->order_support[NEG_DSTBLT_INDEX] = True; settings->order_support[NEG_PATBLT_INDEX] = True; settings->order_support[NEG_SCRBLT_INDEX] = True; settings->order_support[NEG_OPAQUE_RECT_INDEX] = True; settings->order_support[NEG_DRAWNINEGRID_INDEX] = False; settings->order_support[NEG_MULTIDSTBLT_INDEX] = False; settings->order_support[NEG_MULTIPATBLT_INDEX] = False; settings->order_support[NEG_MULTISCRBLT_INDEX] = False; settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = True; settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = False; settings->order_support[NEG_LINETO_INDEX] = True; settings->order_support[NEG_POLYLINE_INDEX] = True; settings->order_support[NEG_MEMBLT_INDEX] = True; settings->order_support[NEG_MEM3BLT_INDEX] = False; settings->order_support[NEG_MEMBLT_V2_INDEX] = True; settings->order_support[NEG_MEM3BLT_V2_INDEX] = False; settings->order_support[NEG_SAVEBITMAP_INDEX] = False; settings->order_support[NEG_GLYPH_INDEX_INDEX] = True; settings->order_support[NEG_FAST_INDEX_INDEX] = True; settings->order_support[NEG_FAST_GLYPH_INDEX] = False; settings->order_support[NEG_POLYGON_SC_INDEX] = False; settings->order_support[NEG_POLYGON_CB_INDEX] = False; settings->order_support[NEG_ELLIPSE_SC_INDEX] = False; settings->order_support[NEG_ELLIPSE_CB_INDEX] = False; if (settings->rfx_codec == True) { settings->frame_acknowledge = False; settings->large_pointer = True; settings->performance_flags = PERF_FLAG_NONE; rfi->rfx_context = rfx_context_new(); rfx_context_set_cpu_opt(rfi->rfx_context, CPU_SSE2); } freerdp_channels_pre_connect(rfi->channels, instance); rfi->clrconv = xnew(CLRCONV); rfi->clrconv->alpha = true; rfi->clrconv->invert = false; rfi->clrconv->rgb555 = false; rfi->clrconv->palette = xnew(rdpPalette); instance->context->cache = cache_new(instance->settings); return True; } static boolean remmina_rdp_post_connect(freerdp* instance) { rfContext* rfi; XGCValues gcv = { 0 }; RemminaProtocolWidget* gp; RemminaPluginRdpUiObject* ui; rfi = (rfContext*) instance->context; gp = rfi->protocol_widget; rfi->width = rfi->settings->width; rfi->height = rfi->settings->height; rfi->srcBpp = rfi->settings->color_depth; rfi->drawable = DefaultRootWindow(rfi->display); rfi->primary = XCreatePixmap(rfi->display, rfi->drawable, rfi->width, rfi->height, rfi->depth); rfi->drawing = rfi->primary; rfi->drawable = rfi->primary; rfi->gc = XCreateGC(rfi->display, rfi->drawable, GCGraphicsExposures, &gcv); rfi->gc_default = XCreateGC(rfi->display, rfi->drawable, GCGraphicsExposures, &gcv); rfi->bitmap_mono = XCreatePixmap(rfi->display, rfi->drawable, 8, 8, 1); rfi->gc_mono = XCreateGC(rfi->display, rfi->bitmap_mono, GCGraphicsExposures, &gcv); if (rfi->settings->rfx_codec == false) rfi->sw_gdi = true; rf_register_graphics(instance->context->graphics); if (rfi->sw_gdi) { rdpGdi* gdi; uint32 flags; flags = CLRCONV_ALPHA; if (rfi->bpp > 16) flags |= CLRBUF_32BPP; else flags |= CLRBUF_16BPP; gdi_init(instance, flags, NULL); gdi = instance->context->gdi; rfi->primary_buffer = gdi->primary_buffer; rfi->image = XCreateImage(rfi->display, rfi->visual, rfi->depth, ZPixmap, 0, (char*) rfi->primary_buffer, rfi->width, rfi->height, rfi->scanline_pad, 0); } else { rf_gdi_register_update_callbacks(instance->update); } rfi->hdc = gdi_GetDC(); rfi->hdc->bitsPerPixel = rfi->bpp; rfi->hdc->bytesPerPixel = rfi->bpp / 8; rfi->hdc->hwnd = (HGDI_WND) malloc(sizeof(GDI_WND)); rfi->hdc->hwnd->invalid = gdi_CreateRectRgn(0, 0, 0, 0); rfi->hdc->hwnd->invalid->null = 1; rfi->hdc->hwnd->count = 32; rfi->hdc->hwnd->cinvalid = (HGDI_RGN) malloc(sizeof(GDI_RGN) * rfi->hdc->hwnd->count); rfi->hdc->hwnd->ninvalid = 0; pointer_cache_register_callbacks(instance->update); if (rfi->sw_gdi != true) { glyph_cache_register_callbacks(instance->update); brush_cache_register_callbacks(instance->update); bitmap_cache_register_callbacks(instance->update); offscreen_cache_register_callbacks(instance->update); palette_cache_register_callbacks(instance->update); } if (rfi->sw_gdi) { instance->update->BeginPaint = rf_sw_begin_paint; instance->update->EndPaint = rf_sw_end_paint; instance->update->DesktopResize = rf_sw_desktop_resize; } else { instance->update->BeginPaint = rf_hw_begin_paint; instance->update->EndPaint = rf_hw_end_paint; instance->update->DesktopResize = rf_hw_desktop_resize; } freerdp_channels_post_connect(rfi->channels, instance); remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect"); ui = g_new0(RemminaPluginRdpUiObject, 1); ui->type = REMMINA_RDP_UI_CONNECTED; rf_queue_ui(gp, ui); return True; } static boolean remmina_rdp_authenticate(freerdp* instance, char** username, char** password, char** domain) { gchar* s; gint ret; rfContext* rfi; RemminaProtocolWidget* gp; rfi = (rfContext*) instance->context; gp = rfi->protocol_widget; THREADS_ENTER ret = remmina_plugin_service->protocol_plugin_init_authuserpwd(gp, TRUE); THREADS_LEAVE if (ret == GTK_RESPONSE_OK) { s = remmina_plugin_service->protocol_plugin_init_get_username(gp); if (s) { rfi->settings->username = xstrdup(s); g_free(s); } s = remmina_plugin_service->protocol_plugin_init_get_password(gp); if (s) { rfi->settings->password = xstrdup(s); g_free(s); } s = remmina_plugin_service->protocol_plugin_init_get_domain(gp); if (s) { rfi->settings->domain = xstrdup(s); g_free(s); } return True; } else { rfi->user_cancelled = TRUE; return False; } return True; } static boolean remmina_rdp_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint) { gint status; rfContext* rfi; RemminaProtocolWidget* gp; rfi = (rfContext*) instance->context; gp = rfi->protocol_widget; THREADS_ENTER status = remmina_plugin_service->protocol_plugin_init_certificate(gp, subject, issuer, fingerprint); THREADS_LEAVE if (status == GTK_RESPONSE_OK) return True; return False; } static int remmina_rdp_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size) { return freerdp_channels_data(instance, channelId, data, size, flags, total_size); } static void remmina_rdp_main_loop(RemminaProtocolWidget* gp) { int i; int fds; int rcount; int wcount; int max_fds; void *rfds[32]; void *wfds[32]; fd_set rfds_set; fd_set wfds_set; rfContext* rfi; memset(rfds, 0, sizeof(rfds)); memset(wfds, 0, sizeof(wfds)); rfi = GET_DATA(gp); while (1) { rcount = 0; wcount = 0; if (!freerdp_get_fds(rfi->instance, rfds, &rcount, wfds, &wcount)) { break; } if (!freerdp_channels_get_fds(rfi->channels, rfi->instance, rfds, &rcount, wfds, &wcount)) { break; } rf_get_fds(gp, rfds, &rcount); max_fds = 0; FD_ZERO(&rfds_set); for (i = 0; i < rcount; i++) { fds = (int) (uint64) (rfds[i]); if (fds > max_fds) max_fds = fds; FD_SET(fds, &rfds_set); } FD_ZERO(&wfds_set); for (i = 0; i < wcount; i++) { fds = GPOINTER_TO_INT(wfds[i]); if (fds > max_fds) max_fds = fds; FD_SET(fds, &wfds_set); } /* exit if nothing to do */ if (max_fds == 0) { break; } /* do the wait */ if (select(max_fds + 1, &rfds_set, &wfds_set, NULL, NULL) == -1) { /* these are not really errors */ if (!((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINPROGRESS) || (errno == EINTR))) /* signal occurred */ { break; } } /* check the libfreerdp fds */ if (!freerdp_check_fds(rfi->instance)) { break; } /* check channel fds */ if (!freerdp_channels_check_fds(rfi->channels, rfi->instance)) { break; } /* check ui */ if (!rf_check_fds(gp)) { break; } } } static gboolean remmina_rdp_main(RemminaProtocolWidget* gp) { gchar* s; gint port; gchar* host; gchar* value; gint rdpdr_num; gint drdynvc_num; gint rdpsnd_num; const gchar* cs; RemminaFile* remminafile; rfContext* rfi; rfi = GET_DATA(gp); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); s = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 3389, FALSE); if (s == NULL) return FALSE; remmina_plugin_service->get_server_port(s, 3389, &host, &port); rfi->settings->hostname = xstrdup(host); g_free(host); g_free(s); rfi->settings->port = port; rfi->settings->color_depth = remmina_plugin_service->file_get_int(remminafile, "colordepth", 0); if (rfi->settings->color_depth == 0) { rfi->settings->rfx_codec = True; rfi->settings->color_depth = 32; } rfi->settings->width = remmina_plugin_service->file_get_int(remminafile, "resolution_width", 1024); rfi->settings->height = remmina_plugin_service->file_get_int(remminafile, "resolution_height", 768); remmina_plugin_service->protocol_plugin_set_width(gp, rfi->settings->width); remmina_plugin_service->protocol_plugin_set_height(gp, rfi->settings->height); if (remmina_plugin_service->file_get_string(remminafile, "username")) rfi->settings->username = xstrdup(remmina_plugin_service->file_get_string(remminafile, "username")); if (remmina_plugin_service->file_get_string(remminafile, "domain")) rfi->settings->domain = xstrdup(remmina_plugin_service->file_get_string(remminafile, "domain")); THREADS_ENTER s = remmina_plugin_service->file_get_secret(remminafile, "password"); THREADS_LEAVE if (s) { rfi->settings->password = xstrdup(s); rfi->settings->autologon = 1; g_free(s); } if (remmina_plugin_service->file_get_string(remminafile, "clientname")) { strncpy(rfi->settings->client_hostname, remmina_plugin_service->file_get_string(remminafile, "clientname"), sizeof(rfi->settings->client_hostname) - 1); } else { strncpy(rfi->settings->client_hostname, g_get_host_name(), sizeof(rfi->settings->client_hostname) - 1); } if (remmina_plugin_service->file_get_string(remminafile, "exec")) { rfi->settings->shell = xstrdup(remmina_plugin_service->file_get_string(remminafile, "exec")); } if (remmina_plugin_service->file_get_string(remminafile, "execpath")) { rfi->settings->directory = xstrdup(remmina_plugin_service->file_get_string(remminafile, "execpath")); } s = g_strdup_printf("rdp_quality_%i", remmina_plugin_service->file_get_int(remminafile, "quality", DEFAULT_QUALITY_0)); value = remmina_plugin_service->pref_get_value(s); g_free(s); if (value && value[0]) { rfi->settings->performance_flags = strtoul(value, NULL, 16); } else { switch (remmina_plugin_service->file_get_int(remminafile, "quality", DEFAULT_QUALITY_0)) { case 9: rfi->settings->performance_flags = DEFAULT_QUALITY_9; break; case 2: rfi->settings->performance_flags = DEFAULT_QUALITY_2; break; case 1: rfi->settings->performance_flags = DEFAULT_QUALITY_1; break; case 0: default: rfi->settings->performance_flags = DEFAULT_QUALITY_0; break; } } g_free(value); rfi->settings->kbd_layout = remmina_rdp_settings_get_keyboard_layout(); if (remmina_plugin_service->file_get_int(remminafile, "console", FALSE)) { rfi->settings->console_session = True; } cs = remmina_plugin_service->file_get_string(remminafile, "security"); if (g_strcmp0(cs, "rdp") == 0) { rfi->settings->rdp_security = True; rfi->settings->tls_security = False; rfi->settings->nla_security = False; } else if (g_strcmp0(cs, "tls") == 0) { rfi->settings->rdp_security = False; rfi->settings->tls_security = True; rfi->settings->nla_security = False; } else if (g_strcmp0(cs, "nla") == 0) { rfi->settings->rdp_security = False; rfi->settings->tls_security = False; rfi->settings->nla_security = True; } rfi->settings->compression = True; rfi->settings->fastpath_input = True; rfi->settings->fastpath_output = True; drdynvc_num = 0; rdpsnd_num = 0; cs = remmina_plugin_service->file_get_string(remminafile, "sound"); if (g_strcmp0(cs, "remote") == 0) { rfi->settings->console_audio = 1; } else if (g_str_has_prefix(cs, "local")) { cs = strchr(cs, ','); if (cs) { snprintf(rfi->rdpsnd_options, sizeof(rfi->rdpsnd_options), "%s", cs + 1); s = strchr(rfi->rdpsnd_options, ','); if (s) *s++ = '\0'; rfi->rdpsnd_data[rdpsnd_num].size = sizeof(RDP_PLUGIN_DATA); rfi->rdpsnd_data[rdpsnd_num].data[0] = "rate"; rfi->rdpsnd_data[rdpsnd_num].data[1] = rfi->rdpsnd_options; rdpsnd_num++; if (s) { rfi->rdpsnd_data[rdpsnd_num].size = sizeof(RDP_PLUGIN_DATA); rfi->rdpsnd_data[rdpsnd_num].data[0] = "channel"; rfi->rdpsnd_data[rdpsnd_num].data[1] = s; rdpsnd_num++; } } freerdp_channels_load_plugin(rfi->channels, rfi->settings, "rdpsnd", rfi->rdpsnd_data); rfi->drdynvc_data[drdynvc_num].size = sizeof(RDP_PLUGIN_DATA); rfi->drdynvc_data[drdynvc_num].data[0] = "audin"; drdynvc_num++; } if (drdynvc_num) { freerdp_channels_load_plugin(rfi->channels, rfi->settings, "drdynvc", rfi->drdynvc_data); } if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE)) { freerdp_channels_load_plugin(rfi->channels, rfi->settings, "cliprdr", NULL); } rdpdr_num = 0; cs = remmina_plugin_service->file_get_string(remminafile, "sharefolder"); if (cs && cs[0] == '/') { s = strrchr (cs, '/'); s = (s && s[1] ? s + 1 : "root"); rfi->rdpdr_data[rdpdr_num].size = sizeof(RDP_PLUGIN_DATA); rfi->rdpdr_data[rdpdr_num].data[0] = "disk"; rfi->rdpdr_data[rdpdr_num].data[1] = s; rfi->rdpdr_data[rdpdr_num].data[2] = (gchar*) cs; rdpdr_num++; } if (remmina_plugin_service->file_get_int(remminafile, "shareprinter", FALSE)) { rfi->rdpdr_data[rdpdr_num].size = sizeof(RDP_PLUGIN_DATA); rfi->rdpdr_data[rdpdr_num].data[0] = "printer"; rdpdr_num++; } if (rdpdr_num) { freerdp_channels_load_plugin(rfi->channels, rfi->settings, "rdpdr", rfi->rdpdr_data); } if (!freerdp_connect(rfi->instance)) { if (!rfi->user_cancelled) { remmina_plugin_service->protocol_plugin_set_error(gp, _("Unable to connect to RDP server %s"), rfi->settings->hostname); } return FALSE; } remmina_rdp_main_loop(gp); return TRUE; } static gpointer remmina_rdp_main_thread(gpointer data) { RemminaProtocolWidget* gp; rfContext* rfi; pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC gp = (RemminaProtocolWidget*) data; rfi = GET_DATA(gp); remmina_rdp_main(gp); rfi->thread = 0; IDLE_ADD((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, gp); return NULL; } static void remmina_rdp_init(RemminaProtocolWidget* gp) { freerdp* instance; rfContext* rfi; instance = freerdp_new(); instance->PreConnect = remmina_rdp_pre_connect; instance->PostConnect = remmina_rdp_post_connect; instance->Authenticate = remmina_rdp_authenticate; instance->VerifyCertificate = remmina_rdp_verify_certificate; instance->ReceiveChannelData = remmina_rdp_receive_channel_data; instance->context_size = sizeof(rfContext); freerdp_context_new(instance); rfi = (rfContext*) instance->context; g_object_set_data_full(G_OBJECT(gp), "plugin-data", rfi, xfree); rfi->protocol_widget = gp; rfi->instance = instance; rfi->settings = instance->settings; rfi->channels = freerdp_channels_new(); pthread_mutex_init(&rfi->mutex, NULL); remmina_rdp_event_init(gp); rf_init(gp); } static gboolean remmina_rdp_open_connection(RemminaProtocolWidget* gp) { rfContext* rfi; rfi = GET_DATA(gp); rfi->scale = remmina_plugin_service->protocol_plugin_get_scale(gp); if (pthread_create(&rfi->thread, NULL, remmina_rdp_main_thread, gp)) { remmina_plugin_service->protocol_plugin_set_error(gp, "%s", "Failed to initialize pthread. Falling back to non-thread mode..."); rfi->thread = 0; return FALSE; } return TRUE; } static gboolean remmina_rdp_close_connection(RemminaProtocolWidget* gp) { rfContext* rfi; rfi = GET_DATA(gp); if (rfi->thread) { pthread_cancel(rfi->thread); if (rfi->thread) pthread_join(rfi->thread, NULL); } if (rfi->instance) { if (rfi->channels) { //freerdp_channels_close(rfi->channels, rfi->instance); } freerdp_disconnect(rfi->instance); } pthread_mutex_destroy(&rfi->mutex); remmina_rdp_event_uninit(gp); remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect"); rf_uninit(gp); return FALSE; } static gboolean remmina_rdp_query_feature(RemminaProtocolWidget* gp, const RemminaProtocolFeature* feature) { return TRUE; } static void remmina_rdp_call_feature(RemminaProtocolWidget* gp, const RemminaProtocolFeature* feature) { RemminaFile* remminafile; rfContext* rfi; rfi = GET_DATA(gp); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); switch (feature->id) { case REMMINA_RDP_FEATURE_UNFOCUS: remmina_rdp_event_unfocus(gp); break; case REMMINA_RDP_FEATURE_SCALE: rfi->scale = remmina_plugin_service->file_get_int(remminafile, "scale", FALSE); remmina_rdp_event_update_scale(gp); break; case REMMINA_RDP_FEATURE_TOOL_REFRESH: gtk_widget_queue_draw_area(rfi->drawing_area, 0, 0, remmina_plugin_service->protocol_plugin_get_width(gp), remmina_plugin_service->protocol_plugin_get_height(gp)); break; default: break; } } static gpointer colordepth_list[] = { "8", N_("256 colors (8 bpp)"), "15", N_("High color (15 bpp)"), "16", N_("High color (16 bpp)"), "24", N_("True color (24 bpp)"), "32", N_("True color (32 bpp)"), "0", N_("RemoteFX (32 bpp)"), NULL }; static gpointer quality_list[] = { "0", N_("Poor (fastest)"), "1", N_("Medium"), "2", N_("Good"), "9", N_("Best (slowest)"), NULL }; static gpointer sound_list[] = { "off", N_("Off"), "local", N_("Local"), "local,11025,1", N_("Local - low quality"), "local,22050,2", N_("Local - medium quality"), "local,44100,2", N_("Local - high quality"), "remote", N_("Remote"), NULL }; static gpointer security_list[] = { "", N_("Negotiate"), "nla", "NLA", "tls", "TLS", "rdp", "RDP", NULL }; static const RemminaProtocolSetting remmina_rdp_basic_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("User name"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "domain", N_("Domain"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Color depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_FOLDER, "sharefolder", N_("Share folder"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolSetting remmina_rdp_advanced_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "sound", N_("Sound"), FALSE, sound_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "security", N_("Security"), FALSE, security_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "clientname", N_("Client name"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "exec", N_("Startup program"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "execpath", N_("Startup path"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "shareprinter", N_("Share local printers"), TRUE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Disable clipboard sync"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "console", N_("Attach to console (Windows 2003 / 2003 R2)"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolFeature remmina_rdp_features[] = { { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_RDP_FEATURE_TOOL_REFRESH, N_("Refresh"), GTK_STOCK_REFRESH, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, REMMINA_RDP_FEATURE_SCALE, NULL, NULL, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, REMMINA_RDP_FEATURE_UNFOCUS, NULL, NULL, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL } }; static RemminaProtocolPlugin remmina_rdp = { REMMINA_PLUGIN_TYPE_PROTOCOL, "RDP", N_("RDP - Remote Desktop Protocol"), GETTEXT_PACKAGE, VERSION, "remmina-rdp", "remmina-rdp-ssh", remmina_rdp_basic_settings, remmina_rdp_advanced_settings, REMMINA_PROTOCOL_SSH_SETTING_TUNNEL, remmina_rdp_features, remmina_rdp_init, remmina_rdp_open_connection, remmina_rdp_close_connection, remmina_rdp_query_feature, remmina_rdp_call_feature }; static RemminaFilePlugin remmina_rdpf = { REMMINA_PLUGIN_TYPE_FILE, "RDPF", N_("RDP - RDP File Handler"), GETTEXT_PACKAGE, VERSION, remmina_rdp_file_import_test, remmina_rdp_file_import, remmina_rdp_file_export_test, remmina_rdp_file_export, NULL }; static RemminaPrefPlugin remmina_rdps = { REMMINA_PLUGIN_TYPE_PREF, "RDPS", N_("RDP - Preferences"), GETTEXT_PACKAGE, VERSION, "RDP", remmina_rdp_settings_new }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService* service) { remmina_plugin_service = service; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); if (! service->register_plugin((RemminaPlugin*) &remmina_rdp)) return FALSE; remmina_rdpf.export_hints = _("Export connection in Windows .rdp file format"); if (! service->register_plugin((RemminaPlugin*) &remmina_rdpf)) return FALSE; if (! service->register_plugin((RemminaPlugin*) &remmina_rdps)) return FALSE; freerdp_channels_global_init(); remmina_rdp_settings_init(); return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_plugin.h000066400000000000000000000105171171526373700230270ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_H__ #define __REMMINA_RDP_H__ #include "common/remmina_plugin.h" #include #include #include #include #include #include #include #include typedef struct rf_context rfContext; #define LOCK_BUFFER(t) if (t) {CANCEL_DEFER} pthread_mutex_lock(&rfi->mutex); #define UNLOCK_BUFFER(t) pthread_mutex_unlock(&rfi->mutex); if (t) {CANCEL_ASYNC} #define GET_DATA(_rfi) (rfContext*) g_object_get_data(G_OBJECT(_rfi), "plugin-data") #define DEFAULT_QUALITY_0 0x6f #define DEFAULT_QUALITY_1 0x07 #define DEFAULT_QUALITY_2 0x01 #define DEFAULT_QUALITY_9 0x80 extern RemminaPluginService* remmina_plugin_service; struct rf_pointer { rdpPointer pointer; Cursor cursor; }; typedef struct rf_pointer rfPointer; struct rf_bitmap { rdpBitmap bitmap; Pixmap pixmap; }; typedef struct rf_bitmap rfBitmap; struct rf_glyph { rdpGlyph glyph; Pixmap pixmap; }; typedef struct rf_glyph rfGlyph; struct rf_context { rdpContext _p; RemminaProtocolWidget* protocol_widget; /* main */ rdpSettings* settings; freerdp* instance; rdpChannels* channels; pthread_t thread; pthread_mutex_t mutex; gboolean scale; gboolean user_cancelled; RDP_PLUGIN_DATA rdpdr_data[5]; RDP_PLUGIN_DATA drdynvc_data[5]; RDP_PLUGIN_DATA rdpsnd_data[5]; gchar rdpsnd_options[20]; RFX_CONTEXT* rfx_context; gboolean sw_gdi; GtkWidget* drawing_area; gint scale_width; gint scale_height; gdouble scale_x; gdouble scale_y; guint scale_handler; gboolean capslock_initstate; gboolean numlock_initstate; gboolean use_client_keymap; HGDI_DC hdc; gint srcBpp; Display* display; Visual* visual; Drawable drawable; Drawable drw_surface; Pixmap rgb_surface; GC gc; GC gc_default; Pixmap bitmap_mono; GC gc_mono; gint depth; gint bpp; gint width; gint height; gint scanline_pad; gint* colormap; HCLRCONV clrconv; Pixmap primary; Pixmap drawing; XImage* image; uint8* primary_buffer; cairo_surface_t* rgb_cairo_surface; guint object_id_seq; GHashTable* object_table; GAsyncQueue* ui_queue; guint ui_handler; GArray* pressed_keys; GAsyncQueue* event_queue; gint event_pipe[2]; }; typedef enum { REMMINA_RDP_EVENT_TYPE_SCANCODE, REMMINA_RDP_EVENT_TYPE_MOUSE } RemminaPluginRdpEventType; struct remmina_plugin_rdp_event { RemminaPluginRdpEventType type; union { struct { boolean up; boolean extended; uint8 key_code; } key_event; struct { uint16 flags; uint16 x; uint16 y; } mouse_event; }; }; typedef struct remmina_plugin_rdp_event RemminaPluginRdpEvent; typedef enum { REMMINA_RDP_UI_UPDATE_REGION = 0, REMMINA_RDP_UI_CONNECTED, REMMINA_RDP_UI_RFX, REMMINA_RDP_UI_NOCODEC } RemminaPluginRdpUiType; struct remmina_plugin_rdp_ui_object { RemminaPluginRdpUiType type; union { struct { gint x; gint y; gint width; gint height; } region; struct { gint left; gint top; RFX_MESSAGE* message; } rfx; struct { gint left; gint top; gint width; gint height; uint8* bitmap; } nocodec; }; }; typedef struct remmina_plugin_rdp_ui_object RemminaPluginRdpUiObject; void rf_init(RemminaProtocolWidget* gp); void rf_uninit(RemminaProtocolWidget* gp); void rf_get_fds(RemminaProtocolWidget* gp, void** rfds, int* rcount); boolean rf_check_fds(RemminaProtocolWidget* gp); void rf_queue_ui(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* ui); void rf_object_free(RemminaProtocolWidget* gp, RemminaPluginRdpUiObject* obj); #endif FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_settings.c000066400000000000000000000344651171526373700233740ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "rdp_plugin.h" #include "rdp_settings.h" #include static guint keyboard_layout = 0; static guint rdp_keyboard_layout = 0; static void remmina_rdp_settings_kbd_init(void) { keyboard_layout = freerdp_kbd_init(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), rdp_keyboard_layout); } void remmina_rdp_settings_init(void) { gchar* value; value = remmina_plugin_service->pref_get_value("rdp_keyboard_layout"); if (value && value[0]) rdp_keyboard_layout = strtoul(value, NULL, 16); g_free(value); remmina_rdp_settings_kbd_init(); } guint remmina_rdp_settings_get_keyboard_layout(void) { return keyboard_layout; } #define REMMINA_TYPE_PLUGIN_RDPSET_TABLE (remmina_rdp_settings_table_get_type()) #define REMMINA_RDPSET_TABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), REMMINA_TYPE_PLUGIN_RDPSET_TABLE, RemminaPluginRdpsetTable)) #define REMMINA_RDPSET_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), REMMINA_TYPE_PLUGIN_RDPSET_TABLE, RemminaPluginRdpsetTableClass)) #define REMMINA_IS_PLUGIN_RDPSET_TABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), REMMINA_TYPE_PLUGIN_RDPSET_TABLE)) #define REMMINA_IS_PLUGIN_RDPSET_TABLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), REMMINA_TYPE_PLUGIN_RDPSET_TABLE)) #define REMMINA_RDPSET_TABLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_PLUGIN_RDPSET_TABLE, RemminaPluginRdpsetTableClass)) typedef struct _RemminaPluginRdpsetTable { GtkTable table; GtkWidget* keyboard_layout_label; GtkWidget* keyboard_layout_combo; GtkListStore* keyboard_layout_store; GtkWidget* quality_combo; GtkListStore* quality_store; GtkWidget* wallpaper_check; GtkWidget* windowdrag_check; GtkWidget* menuanimation_check; GtkWidget* theme_check; GtkWidget* cursorshadow_check; GtkWidget* cursorblinking_check; GtkWidget* fontsmoothing_check; GtkWidget* composition_check; GtkWidget* use_client_keymap_check; guint quality_values[10]; } RemminaPluginRdpsetTable; typedef struct _RemminaPluginRdpsetTableClass { GtkTableClass parent_class; } RemminaPluginRdpsetTableClass; GType remmina_rdp_settings_table_get_type(void) G_GNUC_CONST; G_DEFINE_TYPE(RemminaPluginRdpsetTable, remmina_rdp_settings_table, GTK_TYPE_TABLE) static void remmina_rdp_settings_table_class_init(RemminaPluginRdpsetTableClass* klass) { } static void remmina_rdp_settings_table_destroy(GtkWidget* widget, gpointer data) { gchar* s; guint new_layout; GtkTreeIter iter; RemminaPluginRdpsetTable* table; table = REMMINA_RDPSET_TABLE(widget); if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(table->keyboard_layout_combo), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(table->keyboard_layout_store), &iter, 0, &new_layout, -1); if (new_layout != rdp_keyboard_layout) { rdp_keyboard_layout = new_layout; s = g_strdup_printf("%X", new_layout); remmina_plugin_service->pref_set_value("rdp_keyboard_layout", s); g_free(s); remmina_rdp_settings_kbd_init(); } } remmina_plugin_service->pref_set_value("rdp_use_client_keymap", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->use_client_keymap_check)) ? "1" : "0"); s = g_strdup_printf("%X", table->quality_values[0]); remmina_plugin_service->pref_set_value("rdp_quality_0", s); g_free(s); s = g_strdup_printf("%X", table->quality_values[1]); remmina_plugin_service->pref_set_value("rdp_quality_1", s); g_free(s); s = g_strdup_printf("%X", table->quality_values[2]); remmina_plugin_service->pref_set_value("rdp_quality_2", s); g_free(s); s = g_strdup_printf("%X", table->quality_values[9]); remmina_plugin_service->pref_set_value("rdp_quality_9", s); g_free(s); } static void remmina_rdp_settings_table_load_layout(RemminaPluginRdpsetTable* table) { gint i; gchar* s; GtkTreeIter iter; rdpKeyboardLayout* layouts; gtk_list_store_append(table->keyboard_layout_store, &iter); gtk_list_store_set(table->keyboard_layout_store, &iter, 0, 0, 1, _(""), -1); if (rdp_keyboard_layout == 0) gtk_combo_box_set_active(GTK_COMBO_BOX(table->keyboard_layout_combo), 0); gtk_label_set_text(GTK_LABEL(table->keyboard_layout_label), "-"); layouts = freerdp_kbd_get_layouts(RDP_KEYBOARD_LAYOUT_TYPE_STANDARD | RDP_KEYBOARD_LAYOUT_TYPE_VARIANT); for (i = 0; layouts[i].code; i++) { s = g_strdup_printf("%08X - %s", layouts[i].code, layouts[i].name); gtk_list_store_append(table->keyboard_layout_store, &iter); gtk_list_store_set(table->keyboard_layout_store, &iter, 0, layouts[i].code, 1, s, -1); if (rdp_keyboard_layout == layouts[i].code) gtk_combo_box_set_active(GTK_COMBO_BOX(table->keyboard_layout_combo), i + 1); if (keyboard_layout == layouts[i].code) gtk_label_set_text(GTK_LABEL(table->keyboard_layout_label), s); g_free(s); } free(layouts); } static void remmina_rdp_settings_table_load_quality(RemminaPluginRdpsetTable* table) { gchar* value; GtkTreeIter iter; gtk_list_store_append(table->quality_store, &iter); gtk_list_store_set(table->quality_store, &iter, 0, 0, 1, _("Poor (fastest)"), -1); gtk_list_store_append(table->quality_store, &iter); gtk_list_store_set(table->quality_store, &iter, 0, 1, 1, _("Medium"), -1); gtk_list_store_append(table->quality_store, &iter); gtk_list_store_set(table->quality_store, &iter, 0, 2, 1, _("Good"), -1); gtk_list_store_append(table->quality_store, &iter); gtk_list_store_set(table->quality_store, &iter, 0, 9, 1, _("Best (slowest)"), -1); memset(table->quality_values, 0, sizeof (table->quality_values)); value = remmina_plugin_service->pref_get_value("rdp_quality_0"); table->quality_values[0] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_0); g_free(value); value = remmina_plugin_service->pref_get_value("rdp_quality_1"); table->quality_values[1] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_1); g_free(value); value = remmina_plugin_service->pref_get_value("rdp_quality_2"); table->quality_values[2] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_2); g_free(value); value = remmina_plugin_service->pref_get_value("rdp_quality_9"); table->quality_values[9] = (value && value[0] ? strtoul(value, NULL, 16) : DEFAULT_QUALITY_9); g_free(value); } static void remmina_rdp_settings_quality_on_changed(GtkComboBox *widget, RemminaPluginRdpsetTable *table) { guint v; guint i = 0; GtkTreeIter iter; if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX (table->quality_combo), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(table->quality_store), &iter, 0, &i, -1); v = table->quality_values[i]; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->wallpaper_check), (v & 1) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->windowdrag_check), (v & 2) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->menuanimation_check), (v & 4) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->theme_check), (v & 8) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->cursorshadow_check), (v & 0x20) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->cursorblinking_check), (v & 0x40) == 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->fontsmoothing_check), (v & 0x80) != 0); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(table->composition_check), (v & 0x100) != 0); } } static void remmina_rdp_settings_quality_option_on_toggled(GtkToggleButton* togglebutton, RemminaPluginRdpsetTable* table) { guint v; guint i = 0; GtkTreeIter iter; if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(table->quality_combo), &iter)) { gtk_tree_model_get(GTK_TREE_MODEL(table->quality_store), &iter, 0, &i, -1); v = 0; v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->wallpaper_check)) ? 0 : 1); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->windowdrag_check)) ? 0 : 2); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->menuanimation_check)) ? 0 : 4); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->theme_check)) ? 0 : 8); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->cursorshadow_check)) ? 0 : 0x20); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->cursorblinking_check)) ? 0 : 0x40); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->fontsmoothing_check)) ? 0x80 : 0); v |= (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(table->composition_check)) ? 0x100 : 0); table->quality_values[i] = v; } } static void remmina_rdp_settings_table_init(RemminaPluginRdpsetTable *table) { gchar* s; GtkWidget* widget; GtkCellRenderer* renderer; /* Create the table */ g_signal_connect(G_OBJECT(table), "destroy", G_CALLBACK(remmina_rdp_settings_table_destroy), NULL); gtk_table_resize(GTK_TABLE(table), 8, 3); gtk_table_set_homogeneous(GTK_TABLE(table), FALSE); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); /* Create the content */ widget = gtk_label_new(_("Keyboard layout")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 0, 1); table->keyboard_layout_store = gtk_list_store_new(2, G_TYPE_UINT, G_TYPE_STRING); widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(table->keyboard_layout_store)); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 4, 0, 1); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer, "text", 1); table->keyboard_layout_combo = widget; widget = gtk_label_new("-"); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 4, 1, 2); table->keyboard_layout_label = widget; remmina_rdp_settings_table_load_layout(table); widget = gtk_check_button_new_with_label(_("Use client keyboard mapping")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 3, 2, 3); table->use_client_keymap_check = widget; s = remmina_plugin_service->pref_get_value("rdp_use_client_keymap"); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), s && s[0] == '1' ? TRUE : FALSE); g_free(s); widget = gtk_label_new(_("Quality option")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 3, 4); table->quality_store = gtk_list_store_new(2, G_TYPE_UINT, G_TYPE_STRING); widget = gtk_combo_box_new_with_model(GTK_TREE_MODEL(table->quality_store)); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 4, 3, 4); renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget), renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(widget), renderer, "text", 1); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(remmina_rdp_settings_quality_on_changed), table); table->quality_combo = widget; remmina_rdp_settings_table_load_quality(table); widget = gtk_check_button_new_with_label(_("Wallpaper")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 4, 5); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->wallpaper_check = widget; widget = gtk_check_button_new_with_label(_("Window drag")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 4, 5); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->windowdrag_check = widget; widget = gtk_check_button_new_with_label(_("Menu animation")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 5, 6); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->menuanimation_check = widget; widget = gtk_check_button_new_with_label(_("Theme")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 5, 6); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->theme_check = widget; widget = gtk_check_button_new_with_label(_("Cursor shadow")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 6, 7); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->cursorshadow_check = widget; widget = gtk_check_button_new_with_label(_("Cursor blinking")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 6, 7); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->cursorblinking_check = widget; widget = gtk_check_button_new_with_label(_("Font smoothing")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 7, 8); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->fontsmoothing_check = widget; widget = gtk_check_button_new_with_label(_("Composition")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 7, 8); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_rdp_settings_quality_option_on_toggled), table); table->composition_check = widget; gtk_combo_box_set_active(GTK_COMBO_BOX (table->quality_combo), 0); } GtkWidget* remmina_rdp_settings_new(void) { GtkWidget* widget; widget = GTK_WIDGET(g_object_new(REMMINA_TYPE_PLUGIN_RDPSET_TABLE, NULL)); gtk_widget_show(widget); return widget; } FreeRDP-Remmina-356c033/remmina-plugins/rdp/rdp_settings.h000066400000000000000000000020331171526373700233630ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_RDP_SETTINGS_H__ #define __REMMINA_RDP_SETTINGS_H__ G_BEGIN_DECLS void remmina_rdp_settings_init(void); guint remmina_rdp_settings_get_keyboard_layout(void); GtkWidget* remmina_rdp_settings_new(void); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/telepathy/000077500000000000000000000000001171526373700217215ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/telepathy/CMakeLists.txt000066400000000000000000000024101171526373700244560ustar00rootroot00000000000000# remmina-plugin-telepathy - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(REMMINA_PLUGIN_TELEPATHY_SRCS telepathy_plugin.c ) add_library(remmina-plugin-telepathy ${REMMINA_PLUGIN_TELEPATHY_SRCS}) set_target_properties(remmina-plugin-telepathy PROPERTIES PREFIX "") find_required_package(GTK3) include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${TELEPATHY_INCLUDE_DIRS}) target_link_libraries(remmina-plugin-telepathy ${REMMINA_COMMON_LIBRARIES} ${TELEPATHY_LIBRARIES}) install(TARGETS remmina-plugin-telepathy DESTINATION ${REMMINA_PLUGINDIR}) FreeRDP-Remmina-356c033/remmina-plugins/telepathy/Remmina.client000066400000000000000000000007331171526373700245140ustar00rootroot00000000000000[org.freedesktop.Telepathy.Client] Interfaces=org.freedesktop.Telepathy.Client.Handler;org.freedesktop.Telepathy.Client.Interface.Requests [org.freedesktop.Telepathy.Client.Handler.HandlerChannelFilter 0] org.freedesktop.Telepathy.Channel.ChannelType s=org.freedesktop.Telepathy.Channel.Type.StreamTube org.freedesktop.Telepathy.Channel.TargetHandleType u=1 org.freedesktop.Telepathy.Channel.Requested b=false org.freedesktop.Telepathy.Channel.Type.StreamTube.Service s=rfb org.freedesktop.Telepathy.Client.Remmina.service.in000066400000000000000000000001411171526373700334700ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/telepathy[D-BUS Service] Name=org.freedesktop.Telepathy.Client.Remmina Exec=@bindir@/remmina -x telepathy FreeRDP-Remmina-356c033/remmina-plugins/telepathy/telepathy_channel_handler.c000066400000000000000000000275521171526373700272640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #include #include #include #include #include #include #include #include #include #include "telepathy_channel_handler.h" extern RemminaPluginService *remmina_plugin_telepathy_service; typedef struct _RemminaTpChannelHandler { gchar *connection_path; gchar *channel_path; GHashTable *channel_properties; DBusGMethodInvocation *context; GtkWidget *proto_widget; guint disconnect_handler; TpDBusDaemon *bus; TpAccount *account; TpConnection *connection; TpChannel *channel; gchar *alias; gchar *host; guint port; gchar *protocol; } RemminaTpChannelHandler; static void remmina_tp_channel_handler_free(RemminaTpChannelHandler *chandler) { if (chandler->disconnect_handler) { g_signal_handler_disconnect(chandler->proto_widget, chandler->disconnect_handler); chandler->disconnect_handler = 0; } g_free(chandler->connection_path); g_free(chandler->channel_path); g_hash_table_destroy(chandler->channel_properties); if (chandler->bus) { g_object_unref(chandler->bus); } if (chandler->account) { g_object_unref(chandler->account); } if (chandler->connection) { g_object_unref(chandler->connection); } if (chandler->channel) { g_object_unref(chandler->channel); } if (chandler->alias) { g_free(chandler->alias); } if (chandler->host) { g_free(chandler->host); } if (chandler->protocol) { g_free(chandler->protocol); } g_free(chandler); } static void remmina_tp_channel_handler_channel_closed(TpChannel *channel, gpointer user_data, GObject *self) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; g_print("remmina_tp_channel_handler_channel_closed: %s\n", chandler->channel_path); remmina_tp_channel_handler_free(chandler); } static void remmina_tp_channel_handler_on_disconnect(GtkWidget *widget, RemminaTpChannelHandler *chandler) { g_print("remmina_tp_channel_handler_on_disconnect: %s\n", chandler->channel_path); g_signal_handler_disconnect(widget, chandler->disconnect_handler); chandler->disconnect_handler = 0; tp_cli_channel_call_close(chandler->channel, -1, NULL, NULL, NULL, NULL); } static void remmina_tp_channel_handler_connect(RemminaTpChannelHandler *chandler) { RemminaFile *remminafile; gchar *s; remminafile = remmina_plugin_telepathy_service->file_new(); remmina_plugin_telepathy_service->file_set_string(remminafile, "name", chandler->alias); remmina_plugin_telepathy_service->file_set_string(remminafile, "protocol", chandler->protocol); s = g_strdup_printf("[%s]:%i", chandler->host, chandler->port); remmina_plugin_telepathy_service->file_set_string(remminafile, "server", s); g_free(s); remmina_plugin_telepathy_service->file_set_int(remminafile, "colordepth", 8); g_free(chandler->alias); chandler->alias = NULL; g_free(chandler->protocol); chandler->protocol = NULL; chandler->proto_widget = remmina_plugin_telepathy_service->open_connection(remminafile, G_CALLBACK(remmina_tp_channel_handler_on_disconnect), chandler, &chandler->disconnect_handler); } static void remmina_tp_channel_handler_get_service(TpProxy *channel, const GValue *service, const GError *error, gpointer user_data, GObject *weak_object) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; const gchar *svc; if (error != NULL) { g_print("remmina_tp_channel_handler_get_service: %s", error->message); remmina_tp_channel_handler_free(chandler); return; } svc = g_value_get_string(service); g_print("remmina_tp_channel_handler_get_service: %s %s:%u\n", svc, chandler->host, chandler->port); if (g_strcmp0(svc, "rfb") == 0) { chandler->protocol = g_strdup("VNC"); } else { chandler->protocol = g_ascii_strup(svc, -1); } remmina_tp_channel_handler_connect(chandler); } static void remmina_tp_channel_handler_accept(TpChannel *channel, const GValue *address, const GError *error, gpointer user_data, GObject *weak_object) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; if (error != NULL) { g_print("remmina_tp_channel_handler_accept: %s", error->message); remmina_tp_channel_handler_free(chandler); return; } dbus_g_type_struct_get(address, 0, &chandler->host, 1, &chandler->port, G_MAXUINT); tp_cli_dbus_properties_call_get(channel, -1, TP_IFACE_CHANNEL_TYPE_STREAM_TUBE, "Service", remmina_tp_channel_handler_get_service, chandler, NULL, NULL); } static void remmina_tp_channel_handler_on_response(GtkDialog *dialog, gint response_id, RemminaTpChannelHandler *chandler) { GValue noop = { 0 }; GError *error; if (response_id == GTK_RESPONSE_YES) { g_value_init(&noop, G_TYPE_INT); tp_cli_channel_type_stream_tube_call_accept(chandler->channel, -1, TP_SOCKET_ADDRESS_TYPE_IPV4, TP_SOCKET_ACCESS_CONTROL_LOCALHOST, &noop, remmina_tp_channel_handler_accept, chandler, NULL, NULL); g_value_unset(&noop); tp_svc_client_handler_return_from_handle_channels(chandler->context); } else { error = g_error_new(TP_ERRORS, TP_ERROR_NOT_AVAILABLE, "Channel rejected by user."); dbus_g_method_return_error(chandler->context, error); g_error_free(error); remmina_tp_channel_handler_free(chandler); } } static void remmina_tp_channel_handler_get_contacts(TpConnection *connection, guint n_contacts, TpContact * const *contacts, guint n_failed, const TpHandle *failed, const GError *error, gpointer user_data, GObject *weak_object) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; TpContact *contact; gchar *token; gchar *cm; gchar *protocol; gchar *filename; GdkPixbuf *pixbuf; GtkWidget *image; GtkWidget *dialog; if (error != NULL) { g_print("remmina_tp_channel_handler_get_contacts: %s", error->message); remmina_tp_channel_handler_free(chandler); return; } if (n_contacts <= 0) { g_print("remmina_tp_channel_handler_get_contacts: no contacts\n"); remmina_tp_channel_handler_free(chandler); return; } contact = contacts[0]; chandler->alias = g_strdup(tp_contact_get_alias(contact)); dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("%s wants to share his/her desktop.\nDo you accept the invitation?"), chandler->alias); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_tp_channel_handler_on_response), chandler); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_window_set_title(GTK_WINDOW(dialog), _("Desktop sharing invitation")); remmina_plugin_telepathy_service->ui_register(dialog); gtk_widget_show(dialog); token = (gchar *) tp_contact_get_avatar_token(contact); if (token == NULL) { return; } if (!tp_connection_parse_object_path(chandler->connection, &protocol, &cm)) { g_print("tp_connection_parse_object_path: failed\n"); return; } token = tp_escape_as_identifier(token); filename = g_build_filename(g_get_user_cache_dir(), "telepathy", "avatars", cm, protocol, token, NULL); g_free(cm); g_free(protocol); g_free(token); if (g_file_test(filename, G_FILE_TEST_EXISTS)) { pixbuf = gdk_pixbuf_new_from_file(filename, NULL); if (pixbuf) { image = gtk_image_new_from_pixbuf(pixbuf); gtk_widget_show(image); g_object_unref(pixbuf); gtk_message_dialog_set_image(GTK_MESSAGE_DIALOG(dialog), image); } } g_free(filename); } static void remmina_tp_channel_handler_channel_ready(TpChannel *channel, const GError *channel_error, gpointer user_data) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; TpHandle handle; GError *error = NULL; TpContactFeature features[] = { TP_CONTACT_FEATURE_ALIAS, TP_CONTACT_FEATURE_AVATAR_TOKEN }; if (channel_error != NULL) { g_print("remmina_tp_channel_handler_channel_ready: %s\n", channel_error->message); remmina_tp_channel_handler_free(chandler); return; } if (tp_cli_channel_connect_to_closed(channel, remmina_tp_channel_handler_channel_closed, chandler, NULL, NULL, &error) == NULL) { g_print("tp_cli_channel_connect_to_closed: %s\n", channel_error->message); remmina_tp_channel_handler_free(chandler); return; } g_print("remmina_tp_channel_handler_channel_ready: %s\n", chandler->channel_path); handle = tp_channel_get_handle(channel, NULL); tp_connection_get_contacts_by_handle(chandler->connection, 1, &handle, G_N_ELEMENTS(features), features, remmina_tp_channel_handler_get_contacts, chandler, NULL, NULL); } static void remmina_tp_channel_handler_connection_ready(TpConnection *connection, const GError *connection_error, gpointer user_data) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; GError *error = NULL; if (connection_error != NULL) { g_print("remmina_tp_channel_handler_connection_ready: %s\n", connection_error->message); remmina_tp_channel_handler_free(chandler); return; } chandler->channel = tp_channel_new_from_properties(connection, chandler->channel_path, chandler->channel_properties, &error); if (chandler->channel == NULL) { g_print("tp_channel_new_from_properties: %s\n", error->message); remmina_tp_channel_handler_free(chandler); return; } tp_channel_call_when_ready(chandler->channel, remmina_tp_channel_handler_channel_ready, chandler); } static void remmina_tp_channel_handler_account_ready(GObject *account, GAsyncResult *res, gpointer user_data) { RemminaTpChannelHandler *chandler = (RemminaTpChannelHandler *) user_data; GError *error = NULL; if (!tp_account_prepare_finish(TP_ACCOUNT(account), res, &error)) { g_print("tp_account_prepare_finish: %s\n", error->message); remmina_tp_channel_handler_free(chandler); return; } chandler->connection = tp_connection_new(chandler->bus, NULL, chandler->connection_path, &error); if (chandler->connection == NULL) { g_print("tp_connection_new: %s\n", error->message); remmina_tp_channel_handler_free(chandler); return; } tp_connection_call_when_ready(chandler->connection, remmina_tp_channel_handler_connection_ready, chandler); } void remmina_tp_channel_handler_new(const gchar *account_path, const gchar *connection_path, const gchar *channel_path, GHashTable *channel_properties, DBusGMethodInvocation *context) { TpDBusDaemon *bus; TpAccount *account; GError *error = NULL; RemminaTpChannelHandler *chandler; bus = tp_dbus_daemon_dup(&error); if (bus == NULL) { g_print("tp_dbus_daemon_dup: %s", error->message); return; } account = tp_account_new(bus, account_path, &error); if (account == NULL) { g_object_unref(bus); g_print("tp_account_new: %s", error->message); return; } chandler = g_new0(RemminaTpChannelHandler, 1); chandler->bus = bus; chandler->account = account; chandler->connection_path = g_strdup(connection_path); chandler->channel_path = g_strdup(channel_path); chandler->channel_properties = tp_asv_new(NULL, NULL); tp_g_hash_table_update(chandler->channel_properties, channel_properties, (GBoxedCopyFunc) g_strdup, (GBoxedCopyFunc) tp_g_value_slice_dup); chandler->context = context; tp_account_prepare_async(account, NULL, remmina_tp_channel_handler_account_ready, chandler); } FreeRDP-Remmina-356c033/remmina-plugins/telepathy/telepathy_channel_handler.h000066400000000000000000000021201171526373700272510ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINATPCHANNELHANDLER_H__ #define __REMMINATPCHANNELHANDLER_H__ G_BEGIN_DECLS void remmina_tp_channel_handler_new(const gchar *account_path, const gchar *connection_path, const gchar *channel_path, GHashTable *channel_properties, DBusGMethodInvocation *context); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/telepathy/telepathy_handler.c000066400000000000000000000070421171526373700255640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #include #include #include #include "telepathy_channel_handler.h" #include "telepathy_handler.h" extern RemminaPluginService *remmina_plugin_telepathy_service; #define REMMINA_TP_BUS_NAME TP_CLIENT_BUS_NAME_BASE "Remmina" #define REMMINA_TP_OBJECT_PATH TP_CLIENT_OBJECT_PATH_BASE "Remmina" static void remmina_tp_handler_iface_init(gpointer g_iface, gpointer iface_data); G_DEFINE_TYPE_WITH_CODE (RemminaTpHandler, remmina_tp_handler, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_CLIENT, NULL); G_IMPLEMENT_INTERFACE( TP_TYPE_SVC_CLIENT_HANDLER, remmina_tp_handler_iface_init); ); static void remmina_tp_handler_class_init(RemminaTpHandlerClass *klass) { } static void remmina_tp_handler_init(RemminaTpHandler *handler) { } static void remmina_tp_handler_handle_channels(TpSvcClientHandler *handler, const char *account_path, const char *connection_path, const GPtrArray *channels, const GPtrArray *requests_satisfied, guint64 user_action_time, GHashTable *handler_info, DBusGMethodInvocation *context) { gint i; GValueArray *array; for (i = 0; i < channels->len; i++) { array = g_ptr_array_index(channels, i); remmina_tp_channel_handler_new(account_path, connection_path, (const gchar *) g_value_get_boxed(g_value_array_get_nth(array, 0)), (GHashTable *) g_value_get_boxed(g_value_array_get_nth(array, 1)), context); } } static void remmina_tp_handler_iface_init(gpointer g_iface, gpointer iface_data) { TpSvcClientHandlerClass *klass = (TpSvcClientHandlerClass *) g_iface; #define IMPLEMENT(x) tp_svc_client_handler_implement_##x (klass, remmina_tp_handler_##x) IMPLEMENT(handle_channels); #undef IMPLEMENT } static gboolean remmina_tp_handler_register(RemminaTpHandler *handler) { TpDBusDaemon *bus; GError *error = NULL; bus = tp_dbus_daemon_dup(&error); if (bus == NULL) { g_print("tp_dbus_daemon_dup: %s", error->message); return FALSE; } if (!tp_dbus_daemon_request_name (bus, REMMINA_TP_BUS_NAME, FALSE, &error)) { g_object_unref(bus); g_print("tp_dbus_daemon_request_name: %s", error->message); return FALSE; } dbus_g_connection_register_G_OBJECT( tp_proxy_get_dbus_connection (TP_PROXY (bus)), REMMINA_TP_OBJECT_PATH, G_OBJECT(handler)); g_object_unref(bus); g_print("remmina_tp_handler_register: bus_name " REMMINA_TP_BUS_NAME " object_path " REMMINA_TP_OBJECT_PATH "\n"); return TRUE; } RemminaTpHandler* remmina_tp_handler_new(void) { RemminaTpHandler *handler; handler = REMMINA_TP_HANDLER(g_object_new(REMMINA_TYPE_TP_HANDLER, NULL)); remmina_tp_handler_register(handler); return handler; } FreeRDP-Remmina-356c033/remmina-plugins/telepathy/telepathy_handler.h000066400000000000000000000033531171526373700255720ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINATPHANDLER_H__ #define __REMMINATPHANDLER_H__ G_BEGIN_DECLS #define REMMINA_TYPE_TP_HANDLER (remmina_tp_handler_get_type ()) #define REMMINA_TP_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_TP_HANDLER, RemminaTpHandler)) #define REMMINA_TP_HANDLER_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), REMMINA_TYPE_TP_HANDLER, RemminaTpHandlerClass)) #define REMMINA_IS_TP_HANDLER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_TP_HANDLER)) #define REMMINA_IS_TP_HANDLER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((obj), REMMINA_TYPE_TP_HANDLER)) #define REMMINA_TP_HANDLER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_TP_HANDLER, RemminaTpHandlerClass)) typedef struct _RemminaTpHandler { GObject parent; } RemminaTpHandler; typedef struct _RemminaTpHandlerClass { GObjectClass parent_class; } RemminaTpHandlerClass; RemminaTpHandler* remmina_tp_handler_new(void); G_END_DECLS #endif FreeRDP-Remmina-356c033/remmina-plugins/telepathy/telepathy_plugin.c000066400000000000000000000031751171526373700254500ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #include "telepathy_handler.h" RemminaPluginService *remmina_plugin_telepathy_service = NULL; static RemminaTpHandler *remmina_tp_handler = NULL; void remmina_plugin_telepathy_entry(void) { if (remmina_tp_handler == NULL) { remmina_tp_handler = remmina_tp_handler_new(); } } static RemminaEntryPlugin remmina_plugin_telepathy = { REMMINA_PLUGIN_TYPE_ENTRY, "telepathy", N_("Telepathy - Desktop Sharing"), GETTEXT_PACKAGE, VERSION, remmina_plugin_telepathy_entry }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) { remmina_plugin_telepathy_service = service; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_telepathy)) { return FALSE; } return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/vnc/000077500000000000000000000000001171526373700205105ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/16x16/000077500000000000000000000000001171526373700212755ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/16x16/emblems/000077500000000000000000000000001171526373700227215ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/16x16/emblems/remmina-vnc-ssh.png000066400000000000000000000014201171526373700264330ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8}’KHTqÆ÷þgîŒN¥%EP‚2¡—ZËhUPk{b´iSÐBjµ‚ ­ZEYa­J¦‚´µJ+kLqœ™›“3sç¾O‹!A-?ø6ÎïÎù4áȱC+Å ô>œýG}NzGg{—RÊ4 #½ÐJ)³£³½k)‡¶I6—•i³ c¦ŒüÈÈð×´Œ¦2’ÍeåðÑ6þç@mí*nÜIbæ-rùfÞÂü]âÙ­ÓK*¡Xrù•þ†ŸyO¼\`ÐÑ9À‘c‡da£a³š¦P!à!¾9̹³ghin!Aôô““ŒŽ~&«bûÖm$–%V\º|ñzàÝûל}!”x<ŽRªrÄ¿ai?q™›n;6UÁ0Ÿ‡Ò¬6R8aŽ•ÑiFßdPN]3*€…ú»Acx•ú³,_c°i}e{Ƕ°í)A e5 –U¤&a`þ.±RÞ±ë`ºÿÏ5ñ½\ç¾ëãúÍŒÝX¼ifiÝ\Mëæj~>ÕÐtq’„Nß-à;<·€Dö kú|€RêGòy²©¡¡€¨‚xKQæÇ9548Ô=øj° m'ë\;£ÅâPzŽˆÊ!j-jQ,A¸&²(¥szÔ¿Pv¹‰ÕyeÇǶ}lGðE° ŨàßþürÈAŒÔIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/vnc/16x16/emblems/remmina-vnc.png000066400000000000000000000011601171526373700256410ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<íIDAT8’MkQ†Ÿ›'¡-u#ˆÍªÁ•Øîô¸•¦i$&.Ý(¸¢ÔPÐB–âR?ð7(q)J]AQ©m’™Ñ|N&3ÇEÒIÒÆ¾pàÞsxßs8çU"B2•˜B…ÿâÙËú”|€P&›Îi­mÃ0J‡Ckmg²éÜ,Ö7ÖÄ´L)Û ùV´åÓ^Ev¿”äó÷Š˜–)ëk""ü- ‹P®”F;8€Öz¯ð¦p6[šI°,­õo%22Y2•¸‰D¶E$ö/¥T¹ÓéÜ™øü¦ÈV«kÂ=IEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/vnc/22x22/000077500000000000000000000000001171526373700212675ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/22x22/emblems/000077500000000000000000000000001171526373700227135ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/22x22/emblems/remmina-vnc-ssh.png000066400000000000000000000021271171526373700264320ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÔIDAT8”Û‹UUÇ?kßÎϵԴRd&F2µTR’À7ƒ¤ÀÂLÇqèBOƒÑ_½e¤DHazê¡ËFˆÑÈk::#9ê¨s9çÌ>g_Öe¯Ιљ95ýàËoÁÚë³¾ë»[tuw¾“eÙÇJ©Væ¨ &¬åݯŽûb®oÙ»oÏÄÀÀ5›eÙœê¿Úo»º;ǬµÌ%OJYlkkçÏ+à Ý)S®ÆT„r5¡ÆTª å0aÉCóøäý—PJÍŸÓ-àMî•Bj‰$ŠQ¢ˆI”(jq}|¶âÿðfƒ'ãã#ܼÚGu|›e8Ö²X`-=ûÏàyž·¯{o¥)M-Ç“$ùà>8‘D‰dèÒ/lÞðÛ_ì!‚3Ô4Ž(Šøîûão>szá}pª 'ª„¥aöv~Ä­‘*—nŒOE'ˆR‰HÇÈ»£·©DšP)™Å¬_½’ýo¼íõžê}Õ¸s÷6kVy|qŽ ð}ŸáÑ8UÄ©nôº<5ÂÒÖ˜uO®dÇ+;ؾm+«– 1ÈO½W( dYæ9Žã¨Ák´8UÚ—‚©4R™©ž*Cª49²ví9rø'{O±iËrv­åýËó}ïóC‡>{³P(È,Ë„1º¥³à ¤áï›ý<·ùiÎ?Ϩÿ ¢r™¨áy„y|ôËc=»vï<(¥\ ,Êçóß¹™NSi°jŒåù“\>ù+­U–˜?L‰+¿ (Á·[§?·o¾>~¸¾k÷Îe ²zuè¤S©4냃¬~~9?Ú’!i’¦yÒ¸Âðí[¨ê§óáôw<³”ž•ÊPô®Ñ±éBþ€–e”,£d ™–xä±UôõWÇþœJCÚ€¦ ÷Æ·€ý™#“bdˆõV „3µÞ™´ÔjU´SЩËÓ`­ªÃg”!ˆ¢ZsÇÖZÊ•;æ³®­µþ·¬…ŸS¾{–…‹v€î!D׉!3)µD5[cŒS*—šÆ3ÿ‰÷8ñãÂò±´$)$ 2cñs-¬ÝÒCXKê'°ÖN[ÜÕÝycÛ ÛV´··5…ÏU/\¤·÷Ô™Yà×÷¼ö²çy‡ƒÀÏ»®;9=;Ô™%°Zi×=.¥êšBxAžÝ´q£Òº ¤Êk­sƘ\–eA–Y¬BhÇq´ëº©ë¹©ïù‰ã:•¾ßOŸjMÁ@˜}Ry ×8 " Öè!P™~`ðÊ-@ÚlHYk À?ó—þÀñ’¾IEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/vnc/22x22/emblems/remmina-vnc.png000066400000000000000000000016331171526373700256400ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<IDAT8”Ë‹U‡¿[¯Î¤f’Šâ™A .lÔÿ ¢¢ñ•žÉàƒ¬†€ ÿ.ÅeDA$DݺuÑÉ ¨˜@&u¢Ñé®ézÞ{ë^Uý˜én[zïE”RÇfª¼~óg§G’KÒL‘æŠ4—¤¹"ɪþÇ­ýÿÂ÷{{wøõúe⽬18Ör8n-kç6ñ<Ï;³ºM¤ ¡…`=Ïó÷‡à\’æ’«ßñÌ“óÂókA0MÐD;Ò4åëoÖßÞØÜ81šÞ~L¯³Ërë~»sõÖÞÀ’,¯-**k²\U§,ª>+ÍÇäÜ›ïxíKí—€ÛüÎɇxàîAàû>»õÈ EVèºÖYC“L‘ä’$SÄ™$N%ß¶¯†!ÆÏqGmÿrƒ#NÌÒ½ „@*Tå ª¤Pºª²œ:\žï{Ÿœ?ÿñ[aJcŒ(K½¥ÍÈâ Ë*AGçýp.|~qMJy²Óé<EQËZ+G”ʾâ)'‘‡|õåúMàæko¼rS«E¥#ê–L˜Oûž”ž =hÃAõº4³Á…^RqøòúG—%Rç£1lI’˜ãóÁ:¦TŸõçÖZšÞO’ÄC`­¥uh>rŒ'ç«¿`mµ©µPµ¶®`±áœO7êLÛ²,N·3Í¡ Y€1•ÏÂVR±²ÚºuêÙS---þ/ø•Ÿ¯Ðn_Ú¿~úÕ—<Ïû4ü9×uûc1“(°Zi·,õž”je ,„ð‚ ŸzºÙTZ‡Jª9­u£,ˆ1&0Æz`…B;Ž£]×-\Ï-|ÏÏ׉.¿ñL ÀQ ¬k?ç€F}ä@¤@R×G6p¿Îp¤®Õ‡!¢NY§²Ö–ÿÎäã#}©END®B`‚FreeRDP-Remmina-356c033/remmina-plugins/vnc/CMakeLists.txt000066400000000000000000000030311171526373700232450ustar00rootroot00000000000000# remmina-plugin-vnc - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(LIBVNCSERVER_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/libvncserver) set(LIBVNCSERVER_LIBRARIES vncclient) set(REMMINA_PLUGIN_VNC_SRCS vnc_plugin.c ) add_library(remmina-plugin-vnc ${REMMINA_PLUGIN_VNC_SRCS}) set_target_properties(remmina-plugin-vnc PROPERTIES PREFIX "") include_directories(${REMMINA_COMMON_INCLUDE_DIRS} ${LIBVNCSERVER_INCLUDE_DIRS}) target_link_libraries(remmina-plugin-vnc ${REMMINA_COMMON_LIBRARIES} ${LIBVNCSERVER_LIBRARIES}) install(TARGETS remmina-plugin-vnc DESTINATION ${REMMINA_PLUGINDIR}) install(FILES 16x16/emblems/remmina-vnc-ssh.png 16x16/emblems/remmina-vnc.png DESTINATION ${APPICON16_EMBLEMS_DIR}) install(FILES 22x22/emblems/remmina-vnc-ssh.png 22x22/emblems/remmina-vnc.png DESTINATION ${APPICON22_EMBLEMS_DIR}) FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/000077500000000000000000000000001171526373700232145ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/CMakeLists.txt000066400000000000000000000064171171526373700257640ustar00rootroot00000000000000 include(CheckFunctionExists) include(CheckIncludeFile) include(CheckTypeSize) include(TestBigEndian) #set(PACKAGE_NAME "LibVNCServer") #set(FULL_PACKAGE_NAME "LibVNCServer") #set(PACKAGE_VERSION "0.9.8.2") #set(PROJECT_BUGREPORT_PATH "http://sourceforge.net/projects/libvncserver") include_directories(${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/common) find_package(ZLIB) find_package(JPEG) find_package(GnuTLS) find_package(Threads) find_package(X11) find_library(LIBGCRYPT_LIBRARIES gcrypt) if(Threads_FOUND) option(TIGHTVNC_FILETRANSFER "Enable filetransfer" ON) endif(Threads_FOUND) if(ZLIB_FOUND) set(LIBVNCSERVER_HAVE_LIBZ 1) endif(ZLIB_FOUND) if(JPEG_FOUND) set(LIBVNCSERVER_HAVE_LIBJPEG 1) endif(JPEG_FOUND) option(LIBVNCSERVER_ALLOW24BPP "Allow 24 bpp" ON) if(GNUTLS_FOUND) set(LIBVNCSERVER_WITH_CLIENT_TLS 1) endif(GNUTLS_FOUND) if(LIBGCRYPT_LIBRARIES) message(STATUS "Found libgcrypt: ${LIBGCRYPT_LIBRARIES}") set(LIBVNCSERVER_WITH_CLIENT_GCRYPT 1) endif(LIBGCRYPT_LIBRARIES) check_include_file("fcntl.h" LIBVNCSERVER_HAVE_FCNTL_H) check_include_file("netinet/in.h" LIBVNCSERVER_HAVE_NETINET_IN_H) check_include_file("sys/socket.h" LIBVNCSERVER_HAVE_SYS_SOCKET_H) check_include_file("sys/stat.h" LIBVNCSERVER_HAVE_SYS_STAT_H) check_include_file("sys/time.h" LIBVNCSERVER_HAVE_SYS_TIME_H) check_include_file("sys/types.h" LIBVNCSERVER_HAVE_SYS_TYPES_H) check_include_file("sys/wait.h" LIBVNCSERVER_HAVE_SYS_WAIT_H) check_include_file("unistd.h" LIBVNCSERVER_HAVE_UNISTD_H) # headers needed for check_type_size() check_include_file("arpa/inet.h" HAVE_ARPA_INET_H) check_include_file("stdint.h" HAVE_STDINT_H) check_include_file("stddef.h" HAVE_STDDEF_H) check_include_file("sys/types.h" HAVE_SYS_TYPES_H) check_function_exists(gettimeofday LIBVNCSERVER_HAVE_GETTIMEOFDAY) if(CMAKE_USE_PTHREADS_INIT) set(LIBVNCSERVER_HAVE_LIBPTHREAD 1) endif(CMAKE_USE_PTHREADS_INIT) if(LIBVNCSERVER_HAVE_SYS_SOCKET_H) # socklen_t list(APPEND CMAKE_EXTRA_INCLUDE_FILES "sys/socket.h") endif(LIBVNCSERVER_HAVE_SYS_SOCKET_H) if(HAVE_ARPA_INET_H) # in_addr_t list(APPEND CMAKE_EXTRA_INCLUDE_FILES "arpa/inet.h") endif(HAVE_ARPA_INET_H) check_type_size(pid_t LIBVNCSERVER_PID_T) check_type_size(size_t LIBVNCSERVER_SIZE_T) check_type_size(socklen_t LIBVNCSERVER_SOCKLEN_T) check_type_size(in_addr_t LIBVNCSERVER_IN_ADDR_T) if(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) set(LIBVNCSERVER_NEED_INADDR_T 1) endif(NOT HAVE_LIBVNCSERVER_IN_ADDR_T) TEST_BIG_ENDIAN(LIBVNCSERVER_WORDS_BIGENDIAN) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rfb/rfbconfig.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/rfb/rfbconfig.h) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rfb/rfbint.h.cmake ${CMAKE_CURRENT_SOURCE_DIR}/rfb/rfbint.h) set(COMMON_DIR ${CMAKE_CURRENT_SOURCE_DIR}/common) set(LIBVNCCLIENT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libvncclient) set(LIBVNCCLIENT_SOURCES ${LIBVNCCLIENT_DIR}/cursor.c ${LIBVNCCLIENT_DIR}/listen.c ${LIBVNCCLIENT_DIR}/rfbproto.c ${LIBVNCCLIENT_DIR}/sockets.c ${LIBVNCCLIENT_DIR}/vncviewer.c ${COMMON_DIR}/minilzo.c ${LIBVNCCLIENT_DIR}/tls.c ) add_library(vncclient STATIC ${LIBVNCCLIENT_SOURCES}) if(WIN32) set(ADDITIONAL_LIBS ws2_32) endif(WIN32) target_link_libraries(vncclient ${ADDITIONAL_LIBS} ${ZLIB_LIBRARIES} ${JPEG_LIBRARIES}) FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/000077500000000000000000000000001171526373700245045ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/d3des.c000066400000000000000000000364261171526373700256650ustar00rootroot00000000000000/* * This is D3DES (V5.09) by Richard Outerbridge with the double and * triple-length support removed for use in VNC. Also the bytebit[] array * has been reversed so that the most significant bit in each byte of the * key is ignored, not the least significant. * * These changes are: * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This software 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. */ /* D3DES (V5.09) - * * A portable, public domain, version of the Data Encryption Standard. * * Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge. * Thanks to: Dan Hoey for his excellent Initial and Inverse permutation * code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis * Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau, * for humouring me on. * * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge. * (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992. */ #include "d3des.h" static void scrunch(unsigned char *, unsigned long *); static void unscrun(unsigned long *, unsigned char *); static void desfunc(unsigned long *, unsigned long *); static void cookey(unsigned long *); static unsigned long KnL[32] = { 0L }; /* static unsigned long KnR[32] = { 0L }; static unsigned long Kn3[32] = { 0L }; static unsigned char Df_Key[24] = { 0x01,0x23,0x45,0x67,0x89,0xab,0xcd,0xef, 0xfe,0xdc,0xba,0x98,0x76,0x54,0x32,0x10, 0x89,0xab,0xcd,0xef,0x01,0x23,0x45,0x67 }; */ static unsigned short bytebit[8] = { 01, 02, 04, 010, 020, 040, 0100, 0200 }; static unsigned long bigbyte[24] = { 0x800000L, 0x400000L, 0x200000L, 0x100000L, 0x80000L, 0x40000L, 0x20000L, 0x10000L, 0x8000L, 0x4000L, 0x2000L, 0x1000L, 0x800L, 0x400L, 0x200L, 0x100L, 0x80L, 0x40L, 0x20L, 0x10L, 0x8L, 0x4L, 0x2L, 0x1L }; /* Use the key schedule specified in the Standard (ANSI X3.92-1981). */ static unsigned char pc1[56] = { 56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 }; static unsigned char totrot[16] = { 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 }; static unsigned char pc2[48] = { 13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, 22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, 40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, 43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; void rfbDesKey(unsigned char *key, int edf) { register int i, j, l, m, n; unsigned char pc1m[56], pcr[56]; unsigned long kn[32]; for ( j = 0; j < 56; j++ ) { l = pc1[j]; m = l & 07; pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0; } for( i = 0; i < 16; i++ ) { if( edf == DE1 ) m = (15 - i) << 1; else m = i << 1; n = m + 1; kn[m] = kn[n] = 0L; for( j = 0; j < 28; j++ ) { l = j + totrot[i]; if( l < 28 ) pcr[j] = pc1m[l]; else pcr[j] = pc1m[l - 28]; } for( j = 28; j < 56; j++ ) { l = j + totrot[i]; if( l < 56 ) pcr[j] = pc1m[l]; else pcr[j] = pc1m[l - 28]; } for( j = 0; j < 24; j++ ) { if( pcr[pc2[j]] ) kn[m] |= bigbyte[j]; if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j]; } } cookey(kn); return; } static void cookey(register unsigned long *raw1) { register unsigned long *cook, *raw0; unsigned long dough[32]; register int i; cook = dough; for( i = 0; i < 16; i++, raw1++ ) { raw0 = raw1++; *cook = (*raw0 & 0x00fc0000L) << 6; *cook |= (*raw0 & 0x00000fc0L) << 10; *cook |= (*raw1 & 0x00fc0000L) >> 10; *cook++ |= (*raw1 & 0x00000fc0L) >> 6; *cook = (*raw0 & 0x0003f000L) << 12; *cook |= (*raw0 & 0x0000003fL) << 16; *cook |= (*raw1 & 0x0003f000L) >> 4; *cook++ |= (*raw1 & 0x0000003fL); } rfbUseKey(dough); return; } void rfbCPKey(register unsigned long *into) { register unsigned long *from, *endp; from = KnL, endp = &KnL[32]; while( from < endp ) *into++ = *from++; return; } void rfbUseKey(register unsigned long *from) { register unsigned long *to, *endp; to = KnL, endp = &KnL[32]; while( to < endp ) *to++ = *from++; return; } void rfbDes(unsigned char *inblock, unsigned char *outblock) { unsigned long work[2]; scrunch(inblock, work); desfunc(work, KnL); unscrun(work, outblock); return; } static void scrunch(register unsigned char *outof, register unsigned long *into) { *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into++ |= (*outof++ & 0xffL); *into = (*outof++ & 0xffL) << 24; *into |= (*outof++ & 0xffL) << 16; *into |= (*outof++ & 0xffL) << 8; *into |= (*outof & 0xffL); return; } static void unscrun(register unsigned long *outof, register unsigned char *into) { *into++ = (unsigned char)((*outof >> 24) & 0xffL); *into++ = (unsigned char)((*outof >> 16) & 0xffL); *into++ = (unsigned char)((*outof >> 8) & 0xffL); *into++ = (unsigned char)( *outof++ & 0xffL); *into++ = (unsigned char)((*outof >> 24) & 0xffL); *into++ = (unsigned char)((*outof >> 16) & 0xffL); *into++ = (unsigned char)((*outof >> 8) & 0xffL); *into = (unsigned char)( *outof & 0xffL); return; } static unsigned long SP1[64] = { 0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L, 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L, 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L, 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L, 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L, 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L, 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L, 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L, 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L, 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L, 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L, 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L, 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L, 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L }; static unsigned long SP2[64] = { 0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L, 0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L, 0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L, 0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L, 0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L, 0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L, 0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L, 0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L, 0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L, 0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L, 0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L, 0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L, 0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L, 0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L, 0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L, 0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L }; static unsigned long SP3[64] = { 0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L, 0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L, 0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L, 0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L, 0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L, 0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L, 0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L, 0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L, 0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L, 0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L, 0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L, 0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L, 0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L, 0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L, 0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L, 0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L }; static unsigned long SP4[64] = { 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, 0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L, 0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L, 0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L, 0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L, 0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L, 0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L, 0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L, 0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L, 0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L, 0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L, 0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, 0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L, 0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L, 0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L, 0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L }; static unsigned long SP5[64] = { 0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L, 0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L, 0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L, 0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L, 0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L, 0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L, 0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L, 0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L, 0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L, 0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L, 0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L, 0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L, 0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L, 0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L, 0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L, 0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L }; static unsigned long SP6[64] = { 0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L, 0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L, 0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L, 0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L, 0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L, 0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L, 0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L, 0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L, 0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L, 0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L, 0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L, 0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L, 0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L, 0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L, 0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L, 0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L }; static unsigned long SP7[64] = { 0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L, 0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L, 0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L, 0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L, 0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L, 0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L, 0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L, 0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L, 0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L, 0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L, 0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L, 0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L, 0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L, 0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L, 0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L, 0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L }; static unsigned long SP8[64] = { 0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L, 0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L, 0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L, 0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L, 0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L, 0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L, 0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L, 0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L, 0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L, 0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L, 0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L, 0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L, 0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L, 0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L, 0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L, 0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L }; static void desfunc(register unsigned long *block, register unsigned long *keys) { register unsigned long fval, work, right, leftt; register int round; leftt = block[0]; right = block[1]; work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; right ^= work; leftt ^= (work << 4); work = ((leftt >> 16) ^ right) & 0x0000ffffL; right ^= work; leftt ^= (work << 16); work = ((right >> 2) ^ leftt) & 0x33333333L; leftt ^= work; right ^= (work << 2); work = ((right >> 8) ^ leftt) & 0x00ff00ffL; leftt ^= work; right ^= (work << 8); right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL; work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL; for( round = 0; round < 8; round++ ) { work = (right << 28) | (right >> 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = right ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; leftt ^= fval; work = (leftt << 28) | (leftt >> 4); work ^= *keys++; fval = SP7[ work & 0x3fL]; fval |= SP5[(work >> 8) & 0x3fL]; fval |= SP3[(work >> 16) & 0x3fL]; fval |= SP1[(work >> 24) & 0x3fL]; work = leftt ^ *keys++; fval |= SP8[ work & 0x3fL]; fval |= SP6[(work >> 8) & 0x3fL]; fval |= SP4[(work >> 16) & 0x3fL]; fval |= SP2[(work >> 24) & 0x3fL]; right ^= fval; } right = (right << 31) | (right >> 1); work = (leftt ^ right) & 0xaaaaaaaaL; leftt ^= work; right ^= work; leftt = (leftt << 31) | (leftt >> 1); work = ((leftt >> 8) ^ right) & 0x00ff00ffL; right ^= work; leftt ^= (work << 8); work = ((leftt >> 2) ^ right) & 0x33333333L; right ^= work; leftt ^= (work << 2); work = ((right >> 16) ^ leftt) & 0x0000ffffL; leftt ^= work; right ^= (work << 16); work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; leftt ^= work; right ^= (work << 4); *block++ = right; *block = leftt; return; } /* Validation sets: * * Single-length key, single-length plaintext - * Key : 0123 4567 89ab cdef * Plain : 0123 4567 89ab cde7 * Cipher : c957 4425 6a5e d31d * * Double-length key, single-length plaintext - * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 * Plain : 0123 4567 89ab cde7 * Cipher : 7f1d 0a77 826b 8aff * * Double-length key, double-length plaintext - * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff * Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7 * * Triple-length key, single-length plaintext - * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567 * Plain : 0123 4567 89ab cde7 * Cipher : de0b 7c06 ae5e 0ed5 * * Triple-length key, double-length plaintext - * Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567 * Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff * Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5 * * d3des V5.0a rwo 9208.07 18:44 Graven Imagery **********************************************************************/ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/d3des.h000066400000000000000000000032071171526373700256610ustar00rootroot00000000000000#ifndef D3DES_H #define D3DES_H /* * This is D3DES (V5.09) by Richard Outerbridge with the double and * triple-length support removed for use in VNC. * * These changes are: * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This software 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. */ /* d3des.h - * * Headers and defines for d3des.c * Graven Imagery, 1992. * * Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge * (GEnie : OUTER; CIS : [71755,204]) */ #define EN0 0 /* MODE == encrypt */ #define DE1 1 /* MODE == decrypt */ extern void rfbDesKey(unsigned char *, int); /* hexkey[8] MODE * Sets the internal key register according to the hexadecimal * key contained in the 8 bytes of hexkey, according to the DES, * for encryption or decryption according to MODE. */ extern void rfbUseKey(unsigned long *); /* cookedkey[32] * Loads the internal key register with the data in cookedkey. */ extern void rfbCPKey(unsigned long *); /* cookedkey[32] * Copies the contents of the internal key register into the storage * located at &cookedkey[0]. */ extern void rfbDes(unsigned char *, unsigned char *); /* from[8] to[8] * Encrypts/Decrypts (according to the key currently loaded in the * internal key register) one block of eight bytes at address 'from' * into the block at address 'to'. They can be the same. */ /* d3des.h V5.09 rwo 9208.04 15:06 Graven Imagery ********************************************************************/ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/lzoconf.h000066400000000000000000000337761171526373700263470ustar00rootroot00000000000000/* lzoconf.h -- configuration for the LZO real-time data compression library This file is part of the LZO real-time data compression library. Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. The LZO library 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. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the LZO library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Markus F.X.J. Oberhumer http://www.oberhumer.com/opensource/lzo/ */ #ifndef __LZOCONF_H_INCLUDED #define __LZOCONF_H_INCLUDED 1 #define LZO_VERSION 0x2040 #define LZO_VERSION_STRING "2.04" #define LZO_VERSION_DATE "Oct 31 2010" /* internal Autoconf configuration file - only used when building LZO */ #if defined(LZO_HAVE_CONFIG_H) # include #endif #include #include /*********************************************************************** // LZO requires a conforming ************************************************************************/ #if !defined(CHAR_BIT) || (CHAR_BIT != 8) # error "invalid CHAR_BIT" #endif #if !defined(UCHAR_MAX) || !defined(UINT_MAX) || !defined(ULONG_MAX) # error "check your compiler installation" #endif #if (USHRT_MAX < 1) || (UINT_MAX < 1) || (ULONG_MAX < 1) # error "your limits.h macros are broken" #endif /* get OS and architecture defines */ #ifndef __LZODEFS_H_INCLUDED #include "lzodefs.h" #endif #ifdef __cplusplus extern "C" { #endif /*********************************************************************** // some core defines ************************************************************************/ #if !defined(LZO_UINT32_C) # if (UINT_MAX < LZO_0xffffffffL) # define LZO_UINT32_C(c) c ## UL # else # define LZO_UINT32_C(c) ((c) + 0U) # endif #endif /* memory checkers */ #if !defined(__LZO_CHECKER) # if defined(__BOUNDS_CHECKING_ON) # define __LZO_CHECKER 1 # elif defined(__CHECKER__) # define __LZO_CHECKER 1 # elif defined(__INSURE__) # define __LZO_CHECKER 1 # elif defined(__PURIFY__) # define __LZO_CHECKER 1 # endif #endif /*********************************************************************** // integral and pointer types ************************************************************************/ /* lzo_uint should match size_t */ #if !defined(LZO_UINT_MAX) # if defined(LZO_ABI_LLP64) /* WIN64 */ # if defined(LZO_OS_WIN64) typedef unsigned __int64 lzo_uint; typedef __int64 lzo_int; # else typedef unsigned long long lzo_uint; typedef long long lzo_int; # endif # define LZO_UINT_MAX 0xffffffffffffffffull # define LZO_INT_MAX 9223372036854775807LL # define LZO_INT_MIN (-1LL - LZO_INT_MAX) # elif defined(LZO_ABI_IP32L64) /* MIPS R5900 */ typedef unsigned int lzo_uint; typedef int lzo_int; # define LZO_UINT_MAX UINT_MAX # define LZO_INT_MAX INT_MAX # define LZO_INT_MIN INT_MIN # elif (ULONG_MAX >= LZO_0xffffffffL) typedef unsigned long lzo_uint; typedef long lzo_int; # define LZO_UINT_MAX ULONG_MAX # define LZO_INT_MAX LONG_MAX # define LZO_INT_MIN LONG_MIN # else # error "lzo_uint" # endif #endif /* Integral types with 32 bits or more. */ #if !defined(LZO_UINT32_MAX) # if (UINT_MAX >= LZO_0xffffffffL) typedef unsigned int lzo_uint32; typedef int lzo_int32; # define LZO_UINT32_MAX UINT_MAX # define LZO_INT32_MAX INT_MAX # define LZO_INT32_MIN INT_MIN # elif (ULONG_MAX >= LZO_0xffffffffL) typedef unsigned long lzo_uint32; typedef long lzo_int32; # define LZO_UINT32_MAX ULONG_MAX # define LZO_INT32_MAX LONG_MAX # define LZO_INT32_MIN LONG_MIN # else # error "lzo_uint32" # endif #endif /* The larger type of lzo_uint and lzo_uint32. */ #if (LZO_UINT_MAX >= LZO_UINT32_MAX) # define lzo_xint lzo_uint #else # define lzo_xint lzo_uint32 #endif /* Memory model that allows to access memory at offsets of lzo_uint. */ #if !defined(__LZO_MMODEL) # if (LZO_UINT_MAX <= UINT_MAX) # define __LZO_MMODEL /*empty*/ # elif defined(LZO_HAVE_MM_HUGE_PTR) # define __LZO_MMODEL_HUGE 1 # define __LZO_MMODEL __huge # else # define __LZO_MMODEL /*empty*/ # endif #endif /* no typedef here because of const-pointer issues */ #define lzo_bytep unsigned char __LZO_MMODEL * #define lzo_charp char __LZO_MMODEL * #define lzo_voidp void __LZO_MMODEL * #define lzo_shortp short __LZO_MMODEL * #define lzo_ushortp unsigned short __LZO_MMODEL * #define lzo_uint32p lzo_uint32 __LZO_MMODEL * #define lzo_int32p lzo_int32 __LZO_MMODEL * #define lzo_uintp lzo_uint __LZO_MMODEL * #define lzo_intp lzo_int __LZO_MMODEL * #define lzo_xintp lzo_xint __LZO_MMODEL * #define lzo_voidpp lzo_voidp __LZO_MMODEL * #define lzo_bytepp lzo_bytep __LZO_MMODEL * /* deprecated - use 'lzo_bytep' instead of 'lzo_byte *' */ #define lzo_byte unsigned char __LZO_MMODEL typedef int lzo_bool; /*********************************************************************** // function types ************************************************************************/ /* name mangling */ #if !defined(__LZO_EXTERN_C) # ifdef __cplusplus # define __LZO_EXTERN_C extern "C" # else # define __LZO_EXTERN_C extern # endif #endif /* calling convention */ #if !defined(__LZO_CDECL) # define __LZO_CDECL __lzo_cdecl #endif /* DLL export information */ #if !defined(__LZO_EXPORT1) # define __LZO_EXPORT1 /*empty*/ #endif #if !defined(__LZO_EXPORT2) # define __LZO_EXPORT2 /*empty*/ #endif /* __cdecl calling convention for public C and assembly functions */ #if !defined(LZO_PUBLIC) # define LZO_PUBLIC(_rettype) __LZO_EXPORT1 _rettype __LZO_EXPORT2 __LZO_CDECL #endif #if !defined(LZO_EXTERN) # define LZO_EXTERN(_rettype) __LZO_EXTERN_C LZO_PUBLIC(_rettype) #endif #if !defined(LZO_PRIVATE) # define LZO_PRIVATE(_rettype) static _rettype __LZO_CDECL #endif /* function types */ typedef int (__LZO_CDECL *lzo_compress_t) ( const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem ); typedef int (__LZO_CDECL *lzo_decompress_t) ( const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem ); typedef int (__LZO_CDECL *lzo_optimize_t) ( lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem ); typedef int (__LZO_CDECL *lzo_compress_dict_t)(const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem, const lzo_bytep dict, lzo_uint dict_len ); typedef int (__LZO_CDECL *lzo_decompress_dict_t)(const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem, const lzo_bytep dict, lzo_uint dict_len ); /* Callback interface. Currently only the progress indicator ("nprogress") * is used, but this may change in a future release. */ struct lzo_callback_t; typedef struct lzo_callback_t lzo_callback_t; #define lzo_callback_p lzo_callback_t __LZO_MMODEL * /* malloc & free function types */ typedef lzo_voidp (__LZO_CDECL *lzo_alloc_func_t) (lzo_callback_p self, lzo_uint items, lzo_uint size); typedef void (__LZO_CDECL *lzo_free_func_t) (lzo_callback_p self, lzo_voidp ptr); /* a progress indicator callback function */ typedef void (__LZO_CDECL *lzo_progress_func_t) (lzo_callback_p, lzo_uint, lzo_uint, int); struct lzo_callback_t { /* custom allocators (set to 0 to disable) */ lzo_alloc_func_t nalloc; /* [not used right now] */ lzo_free_func_t nfree; /* [not used right now] */ /* a progress indicator callback function (set to 0 to disable) */ lzo_progress_func_t nprogress; /* NOTE: the first parameter "self" of the nalloc/nfree/nprogress * callbacks points back to this struct, so you are free to store * some extra info in the following variables. */ lzo_voidp user1; lzo_xint user2; lzo_xint user3; }; /*********************************************************************** // error codes and prototypes ************************************************************************/ /* Error codes for the compression/decompression functions. Negative * values are errors, positive values will be used for special but * normal events. */ #define LZO_E_OK 0 #define LZO_E_ERROR (-1) #define LZO_E_OUT_OF_MEMORY (-2) /* [not used right now] */ #define LZO_E_NOT_COMPRESSIBLE (-3) /* [not used right now] */ #define LZO_E_INPUT_OVERRUN (-4) #define LZO_E_OUTPUT_OVERRUN (-5) #define LZO_E_LOOKBEHIND_OVERRUN (-6) #define LZO_E_EOF_NOT_FOUND (-7) #define LZO_E_INPUT_NOT_CONSUMED (-8) #define LZO_E_NOT_YET_IMPLEMENTED (-9) /* [not used right now] */ #ifndef lzo_sizeof_dict_t # define lzo_sizeof_dict_t ((unsigned)sizeof(lzo_bytep)) #endif /* lzo_init() should be the first function you call. * Check the return code ! * * lzo_init() is a macro to allow checking that the library and the * compiler's view of various types are consistent. */ #define lzo_init() __lzo_init_v2(LZO_VERSION,(int)sizeof(short),(int)sizeof(int),\ (int)sizeof(long),(int)sizeof(lzo_uint32),(int)sizeof(lzo_uint),\ (int)lzo_sizeof_dict_t,(int)sizeof(char *),(int)sizeof(lzo_voidp),\ (int)sizeof(lzo_callback_t)) LZO_EXTERN(int) __lzo_init_v2(unsigned,int,int,int,int,int,int,int,int,int); /* version functions (useful for shared libraries) */ LZO_EXTERN(unsigned) lzo_version(void); LZO_EXTERN(const char *) lzo_version_string(void); LZO_EXTERN(const char *) lzo_version_date(void); LZO_EXTERN(const lzo_charp) _lzo_version_string(void); LZO_EXTERN(const lzo_charp) _lzo_version_date(void); /* string functions */ LZO_EXTERN(int) lzo_memcmp(const lzo_voidp a, const lzo_voidp b, lzo_uint len); LZO_EXTERN(lzo_voidp) lzo_memcpy(lzo_voidp dst, const lzo_voidp src, lzo_uint len); LZO_EXTERN(lzo_voidp) lzo_memmove(lzo_voidp dst, const lzo_voidp src, lzo_uint len); LZO_EXTERN(lzo_voidp) lzo_memset(lzo_voidp buf, int c, lzo_uint len); /* checksum functions */ LZO_EXTERN(lzo_uint32) lzo_adler32(lzo_uint32 c, const lzo_bytep buf, lzo_uint len); LZO_EXTERN(lzo_uint32) lzo_crc32(lzo_uint32 c, const lzo_bytep buf, lzo_uint len); LZO_EXTERN(const lzo_uint32p) lzo_get_crc32_table(void); /* misc. */ LZO_EXTERN(int) _lzo_config_check(void); typedef union { lzo_bytep p; lzo_uint u; } __lzo_pu_u; typedef union { lzo_bytep p; lzo_uint32 u32; } __lzo_pu32_u; typedef union { void *vp; lzo_bytep bp; lzo_uint u; lzo_uint32 u32; unsigned long l; } lzo_align_t; /* align a char pointer on a boundary that is a multiple of 'size' */ LZO_EXTERN(unsigned) __lzo_align_gap(const lzo_voidp p, lzo_uint size); #define LZO_PTR_ALIGN_UP(p,size) \ ((p) + (lzo_uint) __lzo_align_gap((const lzo_voidp)(p),(lzo_uint)(size))) /*********************************************************************** // deprecated macros - only for backward compatibility with LZO v1.xx ************************************************************************/ #if defined(LZO_CFG_COMPAT) #define __LZOCONF_H 1 #if defined(LZO_ARCH_I086) # define __LZO_i386 1 #elif defined(LZO_ARCH_I386) # define __LZO_i386 1 #endif #if defined(LZO_OS_DOS16) # define __LZO_DOS 1 # define __LZO_DOS16 1 #elif defined(LZO_OS_DOS32) # define __LZO_DOS 1 #elif defined(LZO_OS_WIN16) # define __LZO_WIN 1 # define __LZO_WIN16 1 #elif defined(LZO_OS_WIN32) # define __LZO_WIN 1 #endif #define __LZO_CMODEL /*empty*/ #define __LZO_DMODEL /*empty*/ #define __LZO_ENTRY __LZO_CDECL #define LZO_EXTERN_CDECL LZO_EXTERN #define LZO_ALIGN LZO_PTR_ALIGN_UP #define lzo_compress_asm_t lzo_compress_t #define lzo_decompress_asm_t lzo_decompress_t #endif /* LZO_CFG_COMPAT */ #ifdef __cplusplus } /* extern "C" */ #endif #endif /* already included */ /* vim:set ts=4 et: */ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/lzodefs.h000066400000000000000000002053471171526373700263360ustar00rootroot00000000000000/* lzodefs.h -- architecture, OS and compiler specific defines This file is part of the LZO real-time data compression library. Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. The LZO library 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. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the LZO library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Markus F.X.J. Oberhumer http://www.oberhumer.com/opensource/lzo/ */ #ifndef __LZODEFS_H_INCLUDED #define __LZODEFS_H_INCLUDED 1 #if defined(__CYGWIN32__) && !defined(__CYGWIN__) # define __CYGWIN__ __CYGWIN32__ #endif #if defined(__IBMCPP__) && !defined(__IBMC__) # define __IBMC__ __IBMCPP__ #endif #if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER) # define __INTEL_COMPILER __ICL #endif #if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE) # define _ALL_SOURCE 1 #endif #if defined(__mips__) && defined(__R5900__) # if !defined(__LONG_MAX__) # define __LONG_MAX__ 9223372036854775807L # endif #endif #if defined(__INTEL_COMPILER) && defined(__linux__) # pragma warning(disable: 193) #endif #if defined(__KEIL__) && defined(__C166__) # pragma warning disable = 322 #elif 0 && defined(__C251__) # pragma warning disable = 322 #endif #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__) # if (_MSC_VER >= 1300) # pragma warning(disable: 4668) # endif #endif #if 0 && defined(__WATCOMC__) # if (__WATCOMC__ >= 1050) && (__WATCOMC__ < 1060) # pragma warning 203 9 # endif #endif #if defined(__BORLANDC__) && defined(__MSDOS__) && !defined(__FLAT__) # pragma option -h #endif #if 0 #define LZO_0xffffL 0xfffful #define LZO_0xffffffffL 0xfffffffful #else #define LZO_0xffffL 65535ul #define LZO_0xffffffffL 4294967295ul #endif #if (LZO_0xffffL == LZO_0xffffffffL) # error "your preprocessor is broken 1" #endif #if (16ul * 16384ul != 262144ul) # error "your preprocessor is broken 2" #endif #if 0 #if (32767 >= 4294967295ul) # error "your preprocessor is broken 3" #endif #if (65535u >= 4294967295ul) # error "your preprocessor is broken 4" #endif #endif #if (UINT_MAX == LZO_0xffffL) #if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__) # if !defined(MSDOS) # define MSDOS 1 # endif # if !defined(_MSDOS) # define _MSDOS 1 # endif #elif 0 && defined(__VERSION) && defined(MB_LEN_MAX) # if (__VERSION == 520) && (MB_LEN_MAX == 1) # if !defined(__AZTEC_C__) # define __AZTEC_C__ __VERSION # endif # if !defined(__DOS__) # define __DOS__ 1 # endif # endif #endif #endif #if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == LZO_0xffffL) # define ptrdiff_t long # define _PTRDIFF_T_DEFINED 1 #endif #if (UINT_MAX == LZO_0xffffL) # undef __LZO_RENAME_A # undef __LZO_RENAME_B # if defined(__AZTEC_C__) && defined(__DOS__) # define __LZO_RENAME_A 1 # elif defined(_MSC_VER) && defined(MSDOS) # if (_MSC_VER < 600) # define __LZO_RENAME_A 1 # elif (_MSC_VER < 700) # define __LZO_RENAME_B 1 # endif # elif defined(__TSC__) && defined(__OS2__) # define __LZO_RENAME_A 1 # elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410) # define __LZO_RENAME_A 1 # elif defined(__PACIFIC__) && defined(DOS) # if !defined(__far) # define __far far # endif # if !defined(__near) # define __near near # endif # endif # if defined(__LZO_RENAME_A) # if !defined(__cdecl) # define __cdecl cdecl # endif # if !defined(__far) # define __far far # endif # if !defined(__huge) # define __huge huge # endif # if !defined(__near) # define __near near # endif # if !defined(__pascal) # define __pascal pascal # endif # if !defined(__huge) # define __huge huge # endif # elif defined(__LZO_RENAME_B) # if !defined(__cdecl) # define __cdecl _cdecl # endif # if !defined(__far) # define __far _far # endif # if !defined(__huge) # define __huge _huge # endif # if !defined(__near) # define __near _near # endif # if !defined(__pascal) # define __pascal _pascal # endif # elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) # if !defined(__cdecl) # define __cdecl cdecl # endif # if !defined(__pascal) # define __pascal pascal # endif # endif # undef __LZO_RENAME_A # undef __LZO_RENAME_B #endif #if (UINT_MAX == LZO_0xffffL) #if defined(__AZTEC_C__) && defined(__DOS__) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 #elif defined(_MSC_VER) && defined(MSDOS) # if (_MSC_VER < 600) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 # endif # if (_MSC_VER < 700) # define LZO_BROKEN_INTEGRAL_PROMOTION 1 # define LZO_BROKEN_SIZEOF 1 # endif #elif defined(__PACIFIC__) && defined(DOS) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #elif defined(__TURBOC__) && defined(__MSDOS__) # if (__TURBOC__ < 0x0150) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 # define LZO_BROKEN_INTEGRAL_PROMOTION 1 # endif # if (__TURBOC__ < 0x0200) # define LZO_BROKEN_SIZEOF 1 # endif # if (__TURBOC__ < 0x0400) && defined(__cplusplus) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # endif #elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # define LZO_BROKEN_SIZEOF 1 #endif #endif #if defined(__WATCOMC__) && (__WATCOMC__ < 900) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #endif #if defined(_CRAY) && defined(_CRAY1) # define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 #endif #define LZO_PP_STRINGIZE(x) #x #define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) #define LZO_PP_CONCAT2(a,b) a ## b #define LZO_PP_CONCAT3(a,b,c) a ## b ## c #define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d #define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e #define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) #define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) #define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) #define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) #if 1 #define LZO_CPP_STRINGIZE(x) #x #define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) #define LZO_CPP_CONCAT2(a,b) a ## b #define LZO_CPP_CONCAT3(a,b,c) a ## b ## c #define LZO_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d #define LZO_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e #define LZO_CPP_ECONCAT2(a,b) LZO_CPP_CONCAT2(a,b) #define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) #define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) #define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) #endif #define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) #if 1 && defined(__cplusplus) # if !defined(__STDC_CONSTANT_MACROS) # define __STDC_CONSTANT_MACROS 1 # endif # if !defined(__STDC_LIMIT_MACROS) # define __STDC_LIMIT_MACROS 1 # endif #endif #if defined(__cplusplus) # define LZO_EXTERN_C extern "C" #else # define LZO_EXTERN_C extern #endif #if !defined(__LZO_OS_OVERRIDE) #if (LZO_OS_FREESTANDING) # define LZO_INFO_OS "freestanding" #elif (LZO_OS_EMBEDDED) # define LZO_INFO_OS "embedded" #elif 1 && defined(__IAR_SYSTEMS_ICC__) # define LZO_OS_EMBEDDED 1 # define LZO_INFO_OS "embedded" #elif defined(__CYGWIN__) && defined(__GNUC__) # define LZO_OS_CYGWIN 1 # define LZO_INFO_OS "cygwin" #elif defined(__EMX__) && defined(__GNUC__) # define LZO_OS_EMX 1 # define LZO_INFO_OS "emx" #elif defined(__BEOS__) # define LZO_OS_BEOS 1 # define LZO_INFO_OS "beos" #elif defined(__Lynx__) # define LZO_OS_LYNXOS 1 # define LZO_INFO_OS "lynxos" #elif defined(__OS400__) # define LZO_OS_OS400 1 # define LZO_INFO_OS "os400" #elif defined(__QNX__) # define LZO_OS_QNX 1 # define LZO_INFO_OS "qnx" #elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" #elif defined(__BORLANDC__) && defined(__DPMI16__) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" #elif defined(__ZTC__) && defined(DOS386) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" #elif defined(__OS2__) || defined(__OS2V2__) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_OS216 1 # define LZO_INFO_OS "os216" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_OS2 1 # define LZO_INFO_OS "os2" # else # error "check your limits.h header" # endif #elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64) # define LZO_OS_WIN64 1 # define LZO_INFO_OS "win64" #elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" #elif defined(__MWERKS__) && defined(__INTEL__) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" #elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_WIN16 1 # define LZO_INFO_OS "win16" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" # else # error "check your limits.h header" # endif #elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS)) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" # else # error "check your limits.h header" # endif #elif defined(__WATCOMC__) # if defined(__NT__) && (UINT_MAX == LZO_0xffffL) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" # elif defined(__NT__) && (__WATCOMC__ < 1100) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" # elif defined(__linux__) || defined(__LINUX__) # define LZO_OS_POSIX 1 # define LZO_INFO_OS "posix" # else # error "please specify a target using the -bt compiler option" # endif #elif defined(__palmos__) # define LZO_OS_PALMOS 1 # define LZO_INFO_OS "palmos" #elif defined(__TOS__) || defined(__atarist__) # define LZO_OS_TOS 1 # define LZO_INFO_OS "tos" #elif defined(macintosh) && !defined(__ppc__) # define LZO_OS_MACCLASSIC 1 # define LZO_INFO_OS "macclassic" #elif defined(__VMS) # define LZO_OS_VMS 1 # define LZO_INFO_OS "vms" #elif ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) # define LZO_OS_CONSOLE 1 # define LZO_OS_CONSOLE_PS2 1 # define LZO_INFO_OS "console" # define LZO_INFO_OS_CONSOLE "ps2" #elif (defined(__mips__) && defined(__psp__)) # define LZO_OS_CONSOLE 1 # define LZO_OS_CONSOLE_PSP 1 # define LZO_INFO_OS "console" # define LZO_INFO_OS_CONSOLE "psp" #else # define LZO_OS_POSIX 1 # define LZO_INFO_OS "posix" #endif #if (LZO_OS_POSIX) # if defined(_AIX) || defined(__AIX__) || defined(__aix__) # define LZO_OS_POSIX_AIX 1 # define LZO_INFO_OS_POSIX "aix" # elif defined(__FreeBSD__) # define LZO_OS_POSIX_FREEBSD 1 # define LZO_INFO_OS_POSIX "freebsd" # elif defined(__hpux__) || defined(__hpux) # define LZO_OS_POSIX_HPUX 1 # define LZO_INFO_OS_POSIX "hpux" # elif defined(__INTERIX) # define LZO_OS_POSIX_INTERIX 1 # define LZO_INFO_OS_POSIX "interix" # elif defined(__IRIX__) || defined(__irix__) # define LZO_OS_POSIX_IRIX 1 # define LZO_INFO_OS_POSIX "irix" # elif defined(__linux__) || defined(__linux) || defined(__LINUX__) # define LZO_OS_POSIX_LINUX 1 # define LZO_INFO_OS_POSIX "linux" # elif defined(__APPLE__) || defined(__MACOS__) # define LZO_OS_POSIX_MACOSX 1 # define LZO_INFO_OS_POSIX "macosx" # elif defined(__minix__) || defined(__minix) # define LZO_OS_POSIX_MINIX 1 # define LZO_INFO_OS_POSIX "minix" # elif defined(__NetBSD__) # define LZO_OS_POSIX_NETBSD 1 # define LZO_INFO_OS_POSIX "netbsd" # elif defined(__OpenBSD__) # define LZO_OS_POSIX_OPENBSD 1 # define LZO_INFO_OS_POSIX "openbsd" # elif defined(__osf__) # define LZO_OS_POSIX_OSF 1 # define LZO_INFO_OS_POSIX "osf" # elif defined(__solaris__) || defined(__sun) # if defined(__SVR4) || defined(__svr4__) # define LZO_OS_POSIX_SOLARIS 1 # define LZO_INFO_OS_POSIX "solaris" # else # define LZO_OS_POSIX_SUNOS 1 # define LZO_INFO_OS_POSIX "sunos" # endif # elif defined(__ultrix__) || defined(__ultrix) # define LZO_OS_POSIX_ULTRIX 1 # define LZO_INFO_OS_POSIX "ultrix" # elif defined(_UNICOS) # define LZO_OS_POSIX_UNICOS 1 # define LZO_INFO_OS_POSIX "unicos" # else # define LZO_OS_POSIX_UNKNOWN 1 # define LZO_INFO_OS_POSIX "unknown" # endif #endif #endif #if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # if (UINT_MAX != LZO_0xffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if (LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_WIN32 || LZO_OS_WIN64) # if (UINT_MAX != LZO_0xffffffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if defined(CIL) && defined(_GNUCC) && defined(__GNUC__) # define LZO_CC_CILLY 1 # define LZO_INFO_CC "Cilly" # if defined(__CILLY__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) # else # define LZO_INFO_CCVER "unknown" # endif #elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) # define LZO_CC_SDCC 1 # define LZO_INFO_CC "sdcc" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) #elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) # define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) # define LZO_INFO_CC "Pathscale C" # define LZO_INFO_CCVER __PATHSCALE__ #elif defined(__INTEL_COMPILER) # define LZO_CC_INTELC 1 # define LZO_INFO_CC "Intel C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) # if defined(_WIN32) || defined(_WIN64) # define LZO_CC_SYNTAX_MSC 1 # else # define LZO_CC_SYNTAX_GNUC 1 # endif #elif defined(__POCC__) && defined(_WIN32) # define LZO_CC_PELLESC 1 # define LZO_INFO_CC "Pelles C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) #elif defined(__clang__) && defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) # if defined(__GNUC_PATCHLEVEL__) # define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # else # define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # endif # if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) # define LZO_CC_CLANG_CLANG (__clang_major__ * 0x10000L + __clang_minor__ * 0x100 + __clang_patchlevel__) # else # define LZO_CC_CLANG_CLANG 0x020700L # endif # define LZO_CC_CLANG LZO_CC_CLANG_GNUC # define LZO_INFO_CC "clang" # define LZO_INFO_CCVER __VERSION__ #elif defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) # if defined(__GNUC_PATCHLEVEL__) # define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # else # define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # endif # define LZO_CC_LLVM LZO_CC_LLVM_GNUC # define LZO_INFO_CC "llvm-gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__GNUC__) && defined(__VERSION__) # if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) # define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # elif defined(__GNUC_MINOR__) # define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # else # define LZO_CC_GNUC (__GNUC__ * 0x10000L) # endif # define LZO_INFO_CC "gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__ACK__) && defined(_ACK) # define LZO_CC_ACK 1 # define LZO_INFO_CC "Amsterdam Compiler Kit C" # define LZO_INFO_CCVER "unknown" #elif defined(__AZTEC_C__) # define LZO_CC_AZTECC 1 # define LZO_INFO_CC "Aztec C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) #elif defined(__CODEGEARC__) # define LZO_CC_CODEGEARC 1 # define LZO_INFO_CC "CodeGear C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CODEGEARC__) #elif defined(__BORLANDC__) # define LZO_CC_BORLANDC 1 # define LZO_INFO_CC "Borland C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) #elif defined(_CRAYC) && defined(_RELEASE) # define LZO_CC_CRAYC 1 # define LZO_INFO_CC "Cray C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) #elif defined(__DMC__) && defined(__SC__) # define LZO_CC_DMC 1 # define LZO_INFO_CC "Digital Mars C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) #elif defined(__DECC) # define LZO_CC_DECC 1 # define LZO_INFO_CC "DEC C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) #elif defined(__HIGHC__) # define LZO_CC_HIGHC 1 # define LZO_INFO_CC "MetaWare High C" # define LZO_INFO_CCVER "unknown" #elif defined(__IAR_SYSTEMS_ICC__) # define LZO_CC_IARC 1 # define LZO_INFO_CC "IAR C" # if defined(__VER__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) # else # define LZO_INFO_CCVER "unknown" # endif #elif defined(__IBMC__) # define LZO_CC_IBMC 1 # define LZO_INFO_CC "IBM C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) #elif defined(__KEIL__) && defined(__C166__) # define LZO_CC_KEILC 1 # define LZO_INFO_CC "Keil C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) #elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) # define LZO_CC_LCCWIN32 1 # define LZO_INFO_CC "lcc-win32" # define LZO_INFO_CCVER "unknown" #elif defined(__LCC__) # define LZO_CC_LCC 1 # define LZO_INFO_CC "lcc" # if defined(__LCC_VERSION__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) # else # define LZO_INFO_CCVER "unknown" # endif #elif defined(_MSC_VER) # define LZO_CC_MSC 1 # define LZO_INFO_CC "Microsoft C" # if defined(_MSC_FULL_VER) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) # else # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) # endif #elif defined(__MWERKS__) # define LZO_CC_MWERKS 1 # define LZO_INFO_CC "Metrowerks C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) #elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) # define LZO_CC_NDPC 1 # define LZO_INFO_CC "Microway NDP C" # define LZO_INFO_CCVER "unknown" #elif defined(__PACIFIC__) # define LZO_CC_PACIFICC 1 # define LZO_INFO_CC "Pacific C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) #elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) # define LZO_CC_PGI 1 # define LZO_INFO_CC "Portland Group PGI C" # define LZO_INFO_CCVER "unknown" #elif defined(__PUREC__) && defined(__TOS__) # define LZO_CC_PUREC 1 # define LZO_INFO_CC "Pure C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) #elif defined(__SC__) && defined(__ZTC__) # define LZO_CC_SYMANTECC 1 # define LZO_INFO_CC "Symantec C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) #elif defined(__SUNPRO_C) # define LZO_INFO_CC "SunPro C" # if ((__SUNPRO_C)+0 > 0) # define LZO_CC_SUNPROC __SUNPRO_C # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) # else # define LZO_CC_SUNPROC 1 # define LZO_INFO_CCVER "unknown" # endif #elif defined(__SUNPRO_CC) # define LZO_INFO_CC "SunPro C" # if ((__SUNPRO_CC)+0 > 0) # define LZO_CC_SUNPROC __SUNPRO_CC # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) # else # define LZO_CC_SUNPROC 1 # define LZO_INFO_CCVER "unknown" # endif #elif defined(__TINYC__) # define LZO_CC_TINYC 1 # define LZO_INFO_CC "Tiny C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) #elif defined(__TSC__) # define LZO_CC_TOPSPEEDC 1 # define LZO_INFO_CC "TopSpeed C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) #elif defined(__WATCOMC__) # define LZO_CC_WATCOMC 1 # define LZO_INFO_CC "Watcom C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) #elif defined(__TURBOC__) # define LZO_CC_TURBOC 1 # define LZO_INFO_CC "Turbo C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) #elif defined(__ZTC__) # define LZO_CC_ZORTECHC 1 # define LZO_INFO_CC "Zortech C" # if (__ZTC__ == 0x310) # define LZO_INFO_CCVER "0x310" # else # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) # endif #else # define LZO_CC_UNKNOWN 1 # define LZO_INFO_CC "unknown" # define LZO_INFO_CCVER "unknown" #endif #if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) # error "LZO_CC_MSC: _MSC_FULL_VER is not defined" #endif #if !defined(__LZO_ARCH_OVERRIDE) && !(LZO_ARCH_GENERIC) && defined(_CRAY) # if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) # if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) # define LZO_ARCH_CRAY_MPP 1 # elif defined(_CRAY1) # define LZO_ARCH_CRAY_PVP 1 # endif # endif #endif #if !defined(__LZO_ARCH_OVERRIDE) #if (LZO_ARCH_GENERIC) # define LZO_INFO_ARCH "generic" #elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086 1 # define LZO_ARCH_IA16 1 # define LZO_INFO_ARCH "i086" #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" #elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" #elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) # define LZO_ARCH_AMD64 1 # define LZO_INFO_ARCH "amd64" #elif defined(__thumb__) || (defined(_M_ARM) && defined(_M_THUMB)) # define LZO_ARCH_ARM 1 # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) # define LZO_ARCH_ARM 1 # if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" # elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) # define LZO_INFO_ARCH "arm" # else # define LZO_INFO_ARCH "arm" # endif #elif defined(__arm__) || defined(_M_ARM) # define LZO_ARCH_ARM 1 # define LZO_INFO_ARCH "arm" #elif (UINT_MAX <= LZO_0xffffL) && defined(__AVR__) # define LZO_ARCH_AVR 1 # define LZO_INFO_ARCH "avr" #elif defined(__avr32__) || defined(__AVR32__) # define LZO_ARCH_AVR32 1 # define LZO_INFO_ARCH "avr32" #elif defined(__bfin__) # define LZO_ARCH_BLACKFIN 1 # define LZO_INFO_ARCH "blackfin" #elif (UINT_MAX == LZO_0xffffL) && defined(__C166__) # define LZO_ARCH_C166 1 # define LZO_INFO_ARCH "c166" #elif defined(__cris__) # define LZO_ARCH_CRIS 1 # define LZO_INFO_ARCH "cris" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) # define LZO_ARCH_EZ80 1 # define LZO_INFO_ARCH "ez80" #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define LZO_ARCH_H8300 1 # define LZO_INFO_ARCH "h8300" #elif defined(__hppa__) || defined(__hppa) # define LZO_ARCH_HPPA 1 # define LZO_INFO_ARCH "hppa" #elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif (LZO_CC_ZORTECHC && defined(__I86__)) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif (LZO_OS_DOS32 && LZO_CC_HIGHC) && defined(_I386) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64) # define LZO_ARCH_IA64 1 # define LZO_INFO_ARCH "ia64" #elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" #elif defined(__m32r__) # define LZO_ARCH_M32R 1 # define LZO_INFO_ARCH "m32r" #elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) # define LZO_ARCH_M68K 1 # define LZO_INFO_ARCH "m68k" #elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) # define LZO_ARCH_MCS251 1 # define LZO_INFO_ARCH "mcs251" #elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" #elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) # define LZO_ARCH_MIPS 1 # define LZO_INFO_ARCH "mips" #elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" #elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) # define LZO_ARCH_POWERPC 1 # define LZO_INFO_ARCH "powerpc" #elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) # define LZO_ARCH_S390 1 # define LZO_INFO_ARCH "s390" #elif defined(__sh__) || defined(_M_SH) # define LZO_ARCH_SH 1 # define LZO_INFO_ARCH "sh" #elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) # define LZO_ARCH_SPARC 1 # define LZO_INFO_ARCH "sparc" #elif defined(__SPU__) # define LZO_ARCH_SPU 1 # define LZO_INFO_ARCH "spu" #elif (UINT_MAX == LZO_0xffffL) && defined(__z80) # define LZO_ARCH_Z80 1 # define LZO_INFO_ARCH "z80" #elif (LZO_ARCH_CRAY_PVP) # if defined(_CRAYSV1) # define LZO_ARCH_CRAY_SV1 1 # define LZO_INFO_ARCH "cray_sv1" # elif (_ADDR64) # define LZO_ARCH_CRAY_T90 1 # define LZO_INFO_ARCH "cray_t90" # elif (_ADDR32) # define LZO_ARCH_CRAY_YMP 1 # define LZO_INFO_ARCH "cray_ymp" # else # define LZO_ARCH_CRAY_XMP 1 # define LZO_INFO_ARCH "cray_xmp" # endif #else # define LZO_ARCH_UNKNOWN 1 # define LZO_INFO_ARCH "unknown" #endif #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_DOS32 || LZO_OS_OS2) # error "FIXME - missing define for CPU architecture" #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN32) # error "FIXME - missing WIN32 define for CPU architecture" #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN64) # error "FIXME - missing WIN64 define for CPU architecture" #endif #if (LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && defined(BLX286)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && defined(DOSX286)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && LZO_CC_BORLANDC && defined(__DPMI16__)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #endif #if (LZO_ARCH_ARM_THUMB) && !(LZO_ARCH_ARM) # error "this should not happen" #endif #if (LZO_ARCH_I086PM) && !(LZO_ARCH_I086) # error "this should not happen" #endif #if (LZO_ARCH_I086) # if (UINT_MAX != LZO_0xffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if (LZO_ARCH_I386) # if (UINT_MAX != LZO_0xffffL) && defined(__i386_int16__) # error "this should not happen" # endif # if (UINT_MAX != LZO_0xffffffffL) && !defined(__i386_int16__) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if !defined(__LZO_MM_OVERRIDE) #if (LZO_ARCH_I086) #if (UINT_MAX != LZO_0xffffL) # error "this should not happen" #endif #if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM) # define LZO_MM_TINY 1 #elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM) # define LZO_MM_HUGE 1 #elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL) # define LZO_MM_SMALL 1 #elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM) # define LZO_MM_MEDIUM 1 #elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM) # define LZO_MM_COMPACT 1 #elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL) # define LZO_MM_LARGE 1 #elif (LZO_CC_AZTECC) # if defined(_LARGE_CODE) && defined(_LARGE_DATA) # define LZO_MM_LARGE 1 # elif defined(_LARGE_CODE) # define LZO_MM_MEDIUM 1 # elif defined(_LARGE_DATA) # define LZO_MM_COMPACT 1 # else # define LZO_MM_SMALL 1 # endif #elif (LZO_CC_ZORTECHC && defined(__VCM__)) # define LZO_MM_LARGE 1 #else # error "unknown memory model" #endif #if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) #define LZO_HAVE_MM_HUGE_PTR 1 #define LZO_HAVE_MM_HUGE_ARRAY 1 #if (LZO_MM_TINY) # undef LZO_HAVE_MM_HUGE_ARRAY #endif #if (LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_ZORTECHC) # undef LZO_HAVE_MM_HUGE_PTR # undef LZO_HAVE_MM_HUGE_ARRAY #elif (LZO_CC_DMC || LZO_CC_SYMANTECC) # undef LZO_HAVE_MM_HUGE_ARRAY #elif (LZO_CC_MSC && defined(_QC)) # undef LZO_HAVE_MM_HUGE_ARRAY # if (_MSC_VER < 600) # undef LZO_HAVE_MM_HUGE_PTR # endif #elif (LZO_CC_TURBOC && (__TURBOC__ < 0x0295)) # undef LZO_HAVE_MM_HUGE_ARRAY #endif #if (LZO_ARCH_I086PM) && !(LZO_HAVE_MM_HUGE_PTR) # if (LZO_OS_DOS16) # error "this should not happen" # elif (LZO_CC_ZORTECHC) # else # error "this should not happen" # endif #endif #ifdef __cplusplus extern "C" { #endif #if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0200)) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_MSC || LZO_CC_TOPSPEEDC) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_TURBOC && (__TURBOC__ >= 0x0295)) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif ((LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_TURBOC) && LZO_OS_DOS16) # define LZO_MM_AHSHIFT 12 #elif (LZO_CC_WATCOMC) extern unsigned char _HShift; # define LZO_MM_AHSHIFT ((unsigned) _HShift) #else # error "FIXME - implement LZO_MM_AHSHIFT" #endif #ifdef __cplusplus } #endif #endif #elif (LZO_ARCH_C166) #if !defined(__MODEL__) # error "FIXME - C166 __MODEL__" #elif ((__MODEL__) == 0) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 1) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - C166 __MODEL__" #endif #elif (LZO_ARCH_MCS251) #if !defined(__MODEL__) # error "FIXME - MCS251 __MODEL__" #elif ((__MODEL__) == 0) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - MCS251 __MODEL__" #endif #elif (LZO_ARCH_MCS51) #if !defined(__MODEL__) # error "FIXME - MCS51 __MODEL__" #elif ((__MODEL__) == 1) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - MCS51 __MODEL__" #endif #elif (LZO_ARCH_CRAY_PVP) # define LZO_MM_PVP 1 #else # define LZO_MM_FLAT 1 #endif #if (LZO_MM_COMPACT) # define LZO_INFO_MM "compact" #elif (LZO_MM_FLAT) # define LZO_INFO_MM "flat" #elif (LZO_MM_HUGE) # define LZO_INFO_MM "huge" #elif (LZO_MM_LARGE) # define LZO_INFO_MM "large" #elif (LZO_MM_MEDIUM) # define LZO_INFO_MM "medium" #elif (LZO_MM_PVP) # define LZO_INFO_MM "pvp" #elif (LZO_MM_SMALL) # define LZO_INFO_MM "small" #elif (LZO_MM_TINY) # define LZO_INFO_MM "tiny" #else # error "unknown memory model" #endif #endif #if defined(SIZEOF_SHORT) # define LZO_SIZEOF_SHORT (SIZEOF_SHORT) #endif #if defined(SIZEOF_INT) # define LZO_SIZEOF_INT (SIZEOF_INT) #endif #if defined(SIZEOF_LONG) # define LZO_SIZEOF_LONG (SIZEOF_LONG) #endif #if defined(SIZEOF_LONG_LONG) # define LZO_SIZEOF_LONG_LONG (SIZEOF_LONG_LONG) #endif #if defined(SIZEOF___INT16) # define LZO_SIZEOF___INT16 (SIZEOF___INT16) #endif #if defined(SIZEOF___INT32) # define LZO_SIZEOF___INT32 (SIZEOF___INT32) #endif #if defined(SIZEOF___INT64) # define LZO_SIZEOF___INT64 (SIZEOF___INT64) #endif #if defined(SIZEOF_VOID_P) # define LZO_SIZEOF_VOID_P (SIZEOF_VOID_P) #endif #if defined(SIZEOF_SIZE_T) # define LZO_SIZEOF_SIZE_T (SIZEOF_SIZE_T) #endif #if defined(SIZEOF_PTRDIFF_T) # define LZO_SIZEOF_PTRDIFF_T (SIZEOF_PTRDIFF_T) #endif #define __LZO_LSR(x,b) (((x)+0ul) >> (b)) #if !defined(LZO_SIZEOF_SHORT) # if (LZO_ARCH_CRAY_PVP) # define LZO_SIZEOF_SHORT 8 # elif (USHRT_MAX == LZO_0xffffL) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,7) == 1) # define LZO_SIZEOF_SHORT 1 # elif (__LZO_LSR(USHRT_MAX,15) == 1) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,31) == 1) # define LZO_SIZEOF_SHORT 4 # elif (__LZO_LSR(USHRT_MAX,63) == 1) # define LZO_SIZEOF_SHORT 8 # elif (__LZO_LSR(USHRT_MAX,127) == 1) # define LZO_SIZEOF_SHORT 16 # else # error "LZO_SIZEOF_SHORT" # endif #endif #if !defined(LZO_SIZEOF_INT) # if (LZO_ARCH_CRAY_PVP) # define LZO_SIZEOF_INT 8 # elif (UINT_MAX == LZO_0xffffL) # define LZO_SIZEOF_INT 2 # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_INT 4 # elif (__LZO_LSR(UINT_MAX,7) == 1) # define LZO_SIZEOF_INT 1 # elif (__LZO_LSR(UINT_MAX,15) == 1) # define LZO_SIZEOF_INT 2 # elif (__LZO_LSR(UINT_MAX,31) == 1) # define LZO_SIZEOF_INT 4 # elif (__LZO_LSR(UINT_MAX,63) == 1) # define LZO_SIZEOF_INT 8 # elif (__LZO_LSR(UINT_MAX,127) == 1) # define LZO_SIZEOF_INT 16 # else # error "LZO_SIZEOF_INT" # endif #endif #if !defined(LZO_SIZEOF_LONG) # if (ULONG_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_LONG 4 # elif (__LZO_LSR(ULONG_MAX,7) == 1) # define LZO_SIZEOF_LONG 1 # elif (__LZO_LSR(ULONG_MAX,15) == 1) # define LZO_SIZEOF_LONG 2 # elif (__LZO_LSR(ULONG_MAX,31) == 1) # define LZO_SIZEOF_LONG 4 # elif (__LZO_LSR(ULONG_MAX,63) == 1) # define LZO_SIZEOF_LONG 8 # elif (__LZO_LSR(ULONG_MAX,127) == 1) # define LZO_SIZEOF_LONG 16 # else # error "LZO_SIZEOF_LONG" # endif #endif #if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) #if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) # if defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__) # if (LZO_CC_GNUC >= 0x030300ul) # if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) # define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG # elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) # define LZO_SIZEOF_LONG_LONG 4 # endif # endif # endif #endif #endif #if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) #if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) #if (LZO_ARCH_I086 && LZO_CC_DMC) #elif (LZO_CC_CILLY) && defined(__GNUC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_SIZEOF_LONG_LONG 8 #elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_OS_WIN64 || defined(_WIN64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_DMC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_SYMANTECC && (__SC__ >= 0x700))) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_WATCOMC && (__WATCOMC__ >= 1100))) # define LZO_SIZEOF___INT64 8 #elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_SDCC) && (LZO_SIZEOF_INT == 2) #elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define LZO_SIZEOF_LONG_LONG 8 #endif #endif #endif #if defined(__cplusplus) && (LZO_CC_GNUC) # if (LZO_CC_GNUC < 0x020800ul) # undef LZO_SIZEOF_LONG_LONG # endif #endif #if (LZO_CFG_NO_LONG_LONG) || defined(__NO_LONG_LONG) # undef LZO_SIZEOF_LONG_LONG #endif #if !defined(LZO_SIZEOF_VOID_P) #if (LZO_ARCH_I086) # define __LZO_WORDSIZE 2 # if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM) # define LZO_SIZEOF_VOID_P 2 # elif (LZO_MM_COMPACT || LZO_MM_LARGE || LZO_MM_HUGE) # define LZO_SIZEOF_VOID_P 4 # else # error "LZO_MM" # endif #elif (LZO_ARCH_AVR || LZO_ARCH_Z80) # define __LZO_WORDSIZE 1 # define LZO_SIZEOF_VOID_P 2 #elif (LZO_ARCH_C166 || LZO_ARCH_MCS51 || LZO_ARCH_MCS251 || LZO_ARCH_MSP430) # define LZO_SIZEOF_VOID_P 2 #elif (LZO_ARCH_H8300) # if defined(__NORMAL_MODE__) # define __LZO_WORDSIZE 4 # define LZO_SIZEOF_VOID_P 2 # elif defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define __LZO_WORDSIZE 4 # define LZO_SIZEOF_VOID_P 4 # else # define __LZO_WORDSIZE 2 # define LZO_SIZEOF_VOID_P 2 # endif # if (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_SIZEOF_INT == 4) # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_INT # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_INT # endif #elif (LZO_ARCH_M16C) # define __LZO_WORDSIZE 2 # if defined(__m32c_cpu__) || defined(__m32cm_cpu__) # define LZO_SIZEOF_VOID_P 4 # else # define LZO_SIZEOF_VOID_P 2 # endif #elif (LZO_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 4 #elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 8 #elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (LZO_OS_OS400 || defined(__OS400__)) # define __LZO_WORDSIZE LZO_SIZEOF_LONG # define LZO_SIZEOF_VOID_P 16 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_VOID_P 8 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (LZO_ARCH_SPU) # if 0 # define __LZO_WORDSIZE 16 # endif # define LZO_SIZEOF_VOID_P 4 #else # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG #endif #endif #if !defined(LZO_WORDSIZE) # if defined(__LZO_WORDSIZE) # define LZO_WORDSIZE __LZO_WORDSIZE # else # define LZO_WORDSIZE LZO_SIZEOF_VOID_P # endif #endif #if !defined(LZO_SIZEOF_SIZE_T) #if (LZO_ARCH_I086 || LZO_ARCH_M16C) # define LZO_SIZEOF_SIZE_T 2 #else # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_VOID_P #endif #endif #if !defined(LZO_SIZEOF_PTRDIFF_T) #if (LZO_ARCH_I086) # if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM || LZO_MM_HUGE) # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_VOID_P # elif (LZO_MM_COMPACT || LZO_MM_LARGE) # if (LZO_CC_BORLANDC || LZO_CC_TURBOC) # define LZO_SIZEOF_PTRDIFF_T 4 # else # define LZO_SIZEOF_PTRDIFF_T 2 # endif # else # error "LZO_MM" # endif #else # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T #endif #endif #if (LZO_ABI_NEUTRAL_ENDIAN) # undef LZO_ABI_BIG_ENDIAN # undef LZO_ABI_LITTLE_ENDIAN #elif !(LZO_ABI_BIG_ENDIAN) && !(LZO_ABI_LITTLE_ENDIAN) #if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) # define LZO_ABI_BIG_ENDIAN 1 #elif (LZO_ARCH_IA64) && (LZO_OS_POSIX_LINUX || LZO_OS_WIN64) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_AVR32 || LZO_ARCH_M68K || LZO_ARCH_S390) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) # if (__LITTLE_ENDIAN__ == 1) # define LZO_ABI_LITTLE_ENDIAN 1 # else # define LZO_ABI_BIG_ENDIAN 1 # endif #elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) # define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) # define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) # define LZO_ABI_LITTLE_ENDIAN 1 #endif #endif #if (LZO_ABI_BIG_ENDIAN) && (LZO_ABI_LITTLE_ENDIAN) # error "this should not happen" #endif #if (LZO_ABI_BIG_ENDIAN) # define LZO_INFO_ABI_ENDIAN "be" #elif (LZO_ABI_LITTLE_ENDIAN) # define LZO_INFO_ABI_ENDIAN "le" #elif (LZO_ABI_NEUTRAL_ENDIAN) # define LZO_INFO_ABI_ENDIAN "neutral" #endif #if (LZO_SIZEOF_INT == 1 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) # define LZO_ABI_I8LP16 1 # define LZO_INFO_ABI_PM "i8lp16" #elif (LZO_SIZEOF_INT == 2 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) # define LZO_ABI_ILP16 1 # define LZO_INFO_ABI_PM "ilp16" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 4) # define LZO_ABI_ILP32 1 # define LZO_INFO_ABI_PM "ilp32" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 8 && LZO_SIZEOF_SIZE_T == 8) # define LZO_ABI_LLP64 1 # define LZO_INFO_ABI_PM "llp64" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) # define LZO_ABI_LP64 1 # define LZO_INFO_ABI_PM "lp64" #elif (LZO_SIZEOF_INT == 8 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) # define LZO_ABI_ILP64 1 # define LZO_INFO_ABI_PM "ilp64" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 4) # define LZO_ABI_IP32L64 1 # define LZO_INFO_ABI_PM "ip32l64" #endif #if !defined(__LZO_LIBC_OVERRIDE) #if (LZO_LIBC_NAKED) # define LZO_INFO_LIBC "naked" #elif (LZO_LIBC_FREESTANDING) # define LZO_INFO_LIBC "freestanding" #elif (LZO_LIBC_MOSTLY_FREESTANDING) # define LZO_INFO_LIBC "mfreestanding" #elif (LZO_LIBC_ISOC90) # define LZO_INFO_LIBC "isoc90" #elif (LZO_LIBC_ISOC99) # define LZO_INFO_LIBC "isoc99" #elif defined(__dietlibc__) # define LZO_LIBC_DIETLIBC 1 # define LZO_INFO_LIBC "dietlibc" #elif defined(_NEWLIB_VERSION) # define LZO_LIBC_NEWLIB 1 # define LZO_INFO_LIBC "newlib" #elif defined(__UCLIBC__) && defined(__UCLIBC_MAJOR__) && defined(__UCLIBC_MINOR__) # if defined(__UCLIBC_SUBLEVEL__) # define LZO_LIBC_UCLIBC (__UCLIBC_MAJOR__ * 0x10000L + __UCLIBC_MINOR__ * 0x100 + __UCLIBC_SUBLEVEL__) # else # define LZO_LIBC_UCLIBC 0x00090bL # endif # define LZO_INFO_LIBC "uclibc" #elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) # define LZO_LIBC_GLIBC (__GLIBC__ * 0x10000L + __GLIBC_MINOR__ * 0x100) # define LZO_INFO_LIBC "glibc" #elif (LZO_CC_MWERKS) && defined(__MSL__) # define LZO_LIBC_MSL __MSL__ # define LZO_INFO_LIBC "msl" #elif 1 && defined(__IAR_SYSTEMS_ICC__) # define LZO_LIBC_ISOC90 1 # define LZO_INFO_LIBC "isoc90" #else # define LZO_LIBC_DEFAULT 1 # define LZO_INFO_LIBC "default" #endif #endif #if !defined(__lzo_gnuc_extension__) #if (LZO_CC_GNUC >= 0x020800ul) # define __lzo_gnuc_extension__ __extension__ #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_gnuc_extension__ __extension__ #else # define __lzo_gnuc_extension__ /*empty*/ #endif #endif #if !defined(__lzo_ua_volatile) # define __lzo_ua_volatile volatile #endif #if !defined(__lzo_alignof) #if (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) # define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) # define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) # define __lzo_alignof(e) __alignof(e) #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_alignof(e) __alignof__(e) #endif #endif #if defined(__lzo_alignof) # define __lzo_HAVE_alignof 1 #endif #if !defined(__lzo_constructor) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_constructor __attribute__((__constructor__,__used__)) #elif (LZO_CC_GNUC >= 0x020700ul) # define __lzo_constructor __attribute__((__constructor__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_constructor __attribute__((__constructor__)) #endif #endif #if defined(__lzo_constructor) # define __lzo_HAVE_constructor 1 #endif #if !defined(__lzo_destructor) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_destructor __attribute__((__destructor__,__used__)) #elif (LZO_CC_GNUC >= 0x020700ul) # define __lzo_destructor __attribute__((__destructor__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_destructor __attribute__((__destructor__)) #endif #endif #if defined(__lzo_destructor) # define __lzo_HAVE_destructor 1 #endif #if (__lzo_HAVE_destructor) && !(__lzo_HAVE_constructor) # error "this should not happen" #endif #if !defined(__lzo_inline) #if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) #elif defined(__cplusplus) # define __lzo_inline inline #elif (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0550)) # define __lzo_inline __inline #elif (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) # define __lzo_inline __inline__ #elif (LZO_CC_DMC) # define __lzo_inline __inline #elif (LZO_CC_INTELC) # define __lzo_inline __inline #elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x2405)) # define __lzo_inline __inline #elif (LZO_CC_MSC && (_MSC_VER >= 900)) # define __lzo_inline __inline #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_inline __inline__ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define __lzo_inline inline #endif #endif #if defined(__lzo_inline) # define __lzo_HAVE_inline 1 #else # define __lzo_inline /*empty*/ #endif #if !defined(__lzo_forceinline) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_forceinline __forceinline #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_forceinline __forceinline #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #endif #endif #if defined(__lzo_forceinline) # define __lzo_HAVE_forceinline 1 #else # define __lzo_forceinline /*empty*/ #endif #if !defined(__lzo_noinline) #if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) # define __lzo_noinline __attribute__((__noinline__,__used__)) #elif (LZO_CC_GNUC >= 0x030200ul) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) # define __lzo_noinline __declspec(noinline) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) # define __lzo_noinline __declspec(noinline) #elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x3200) && (LZO_OS_WIN32 || LZO_OS_WIN64)) # if defined(__cplusplus) # else # define __lzo_noinline __declspec(noinline) # endif #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_noinline __attribute__((__noinline__)) #endif #endif #if defined(__lzo_noinline) # define __lzo_HAVE_noinline 1 #else # define __lzo_noinline /*empty*/ #endif #if (__lzo_HAVE_forceinline || __lzo_HAVE_noinline) && !(__lzo_HAVE_inline) # error "this should not happen" #endif #if !defined(__lzo_noreturn) #if (LZO_CC_GNUC >= 0x020700ul) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_noreturn __declspec(noreturn) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_noreturn __declspec(noreturn) #endif #endif #if defined(__lzo_noreturn) # define __lzo_HAVE_noreturn 1 #else # define __lzo_noreturn /*empty*/ #endif #if !defined(__lzo_nothrow) #if (LZO_CC_GNUC >= 0x030300ul) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) # define __lzo_nothrow __declspec(nothrow) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 900) && LZO_CC_SYNTAX_GNUC) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) # define __lzo_nothrow __declspec(nothrow) #endif #endif #if defined(__lzo_nothrow) # define __lzo_HAVE_nothrow 1 #else # define __lzo_nothrow /*empty*/ #endif #if !defined(__lzo_restrict) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_restrict __restrict__ #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_restrict __restrict__ #elif (LZO_CC_CLANG || LZO_CC_LLVM) # define __lzo_restrict __restrict__ #elif (LZO_CC_MSC && (_MSC_VER >= 1400)) # define __lzo_restrict __restrict #endif #endif #if defined(__lzo_restrict) # define __lzo_HAVE_restrict 1 #else # define __lzo_restrict /*empty*/ #endif #if !defined(__lzo_likely) && !defined(__lzo_unlikely) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #endif #endif #if defined(__lzo_likely) # define __lzo_HAVE_likely 1 #else # define __lzo_likely(e) (e) #endif #if defined(__lzo_unlikely) # define __lzo_HAVE_unlikely 1 #else # define __lzo_unlikely(e) (e) #endif #if !defined(LZO_UNUSED) # if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) # define LZO_UNUSED(var) ((void) &var) # elif (LZO_CC_BORLANDC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PELLESC || LZO_CC_TURBOC) # define LZO_UNUSED(var) if (&var) ; else # elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_UNUSED(var) ((void) var) # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_UNUSED(var) if (&var) ; else # elif (LZO_CC_KEILC) # define LZO_UNUSED(var) {extern int __lzo_unused[1-2*!(sizeof(var)>0)];} # elif (LZO_CC_PACIFICC) # define LZO_UNUSED(var) ((void) sizeof(var)) # elif (LZO_CC_WATCOMC) && defined(__cplusplus) # define LZO_UNUSED(var) ((void) var) # else # define LZO_UNUSED(var) ((void) &var) # endif #endif #if !defined(LZO_UNUSED_FUNC) # if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) # define LZO_UNUSED_FUNC(func) ((void) func) # elif (LZO_CC_BORLANDC || LZO_CC_NDPC || LZO_CC_TURBOC) # define LZO_UNUSED_FUNC(func) if (func) ; else # elif (LZO_CC_CLANG || LZO_CC_LLVM) # define LZO_UNUSED_FUNC(func) ((void) &func) # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_UNUSED_FUNC(func) if (func) ; else # elif (LZO_CC_MSC) # define LZO_UNUSED_FUNC(func) ((void) &func) # elif (LZO_CC_KEILC || LZO_CC_PELLESC) # define LZO_UNUSED_FUNC(func) {extern int __lzo_unused[1-2*!(sizeof((int)func)>0)];} # else # define LZO_UNUSED_FUNC(func) ((void) func) # endif #endif #if !defined(LZO_UNUSED_LABEL) # if (LZO_CC_WATCOMC) && defined(__cplusplus) # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # elif (LZO_CC_CLANG || LZO_CC_INTELC || LZO_CC_WATCOMC) # define LZO_UNUSED_LABEL(l) if (0) goto l # else # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # endif #endif #if !defined(LZO_DEFINE_UNINITIALIZED_VAR) # if 0 # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var # elif 0 && (LZO_CC_GNUC) # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var # else # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init # endif #endif #if !defined(LZO_UNCONST_CAST) # if 0 && defined(__cplusplus) # define LZO_UNCONST_CAST(t,e) (const_cast (e)) # elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((lzo_uintptr_t) ((const void *) (e)))))) # else # define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((const void *) (e))))) # endif #endif #if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) # if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; # elif (LZO_CC_DMC || LZO_CC_SYMANTECC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1u-2*!(e)]; # elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; # else # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-2*!(e)]; # endif #endif #if !defined(LZO_COMPILE_TIME_ASSERT) # if (LZO_CC_AZTECC) # define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-!(e)];} # elif (LZO_CC_DMC || LZO_CC_PACIFICC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # else # define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-2*!(e)];} # endif #endif #if (LZO_ARCH_I086 || LZO_ARCH_I386) && (LZO_OS_DOS16 || LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_OS216 || LZO_OS_WIN16 || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC) # elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) # define __lzo_cdecl __cdecl # define __lzo_cdecl_atexit /*empty*/ # define __lzo_cdecl_main __cdecl # if (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) # define __lzo_cdecl_qsort __pascal # elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) # define __lzo_cdecl_qsort _stdcall # else # define __lzo_cdecl_qsort __cdecl # endif # elif (LZO_CC_WATCOMC) # define __lzo_cdecl __cdecl # else # define __lzo_cdecl __cdecl # define __lzo_cdecl_atexit __cdecl # define __lzo_cdecl_main __cdecl # define __lzo_cdecl_qsort __cdecl # endif # if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC || LZO_CC_WATCOMC) # elif (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) # define __lzo_cdecl_sighandler __pascal # elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) # define __lzo_cdecl_sighandler _stdcall # elif (LZO_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE) # define __lzo_cdecl_sighandler __clrcall # elif (LZO_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700)) # if defined(_DLL) # define __lzo_cdecl_sighandler _far _cdecl _loadds # elif defined(_MT) # define __lzo_cdecl_sighandler _far _cdecl # else # define __lzo_cdecl_sighandler _cdecl # endif # else # define __lzo_cdecl_sighandler __cdecl # endif #elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) # define __lzo_cdecl __cdecl #elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) # define __lzo_cdecl cdecl #endif #if !defined(__lzo_cdecl) # define __lzo_cdecl /*empty*/ #endif #if !defined(__lzo_cdecl_atexit) # define __lzo_cdecl_atexit /*empty*/ #endif #if !defined(__lzo_cdecl_main) # define __lzo_cdecl_main /*empty*/ #endif #if !defined(__lzo_cdecl_qsort) # define __lzo_cdecl_qsort /*empty*/ #endif #if !defined(__lzo_cdecl_sighandler) # define __lzo_cdecl_sighandler /*empty*/ #endif #if !defined(__lzo_cdecl_va) # define __lzo_cdecl_va __lzo_cdecl #endif #if !(LZO_CFG_NO_WINDOWS_H) #if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) # elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) # elif ((LZO_OS_CYGWIN || defined(__MINGW32__)) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x025f00ul))) # else # define LZO_HAVE_WINDOWS_H 1 # endif #endif #endif #if (LZO_ARCH_ALPHA) # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_AVOID_SHORT 1 # define LZO_OPT_AVOID_USHORT 1 #elif (LZO_ARCH_AMD64) # define LZO_OPT_AVOID_INT_INDEX 1 # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # define LZO_OPT_UNALIGNED64 1 #elif (LZO_ARCH_ARM && LZO_ARCH_ARM_THUMB) #elif (LZO_ARCH_ARM) # define LZO_OPT_AVOID_SHORT 1 # define LZO_OPT_AVOID_USHORT 1 #elif (LZO_ARCH_CRIS) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 #elif (LZO_ARCH_I386) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 #elif (LZO_ARCH_IA64) # define LZO_OPT_AVOID_INT_INDEX 1 # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_PREFER_POSTINC 1 #elif (LZO_ARCH_M68K) # define LZO_OPT_PREFER_POSTINC 1 # define LZO_OPT_PREFER_PREDEC 1 # if defined(__mc68020__) && !defined(__mcoldfire__) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # endif #elif (LZO_ARCH_MIPS) # define LZO_OPT_AVOID_UINT_INDEX 1 #elif (LZO_ARCH_POWERPC) # define LZO_OPT_PREFER_PREINC 1 # define LZO_OPT_PREFER_PREDEC 1 # if (LZO_ABI_BIG_ENDIAN) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # endif #elif (LZO_ARCH_S390) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # if (LZO_SIZEOF_SIZE_T == 8) # define LZO_OPT_UNALIGNED64 1 # endif #elif (LZO_ARCH_SH) # define LZO_OPT_PREFER_POSTINC 1 # define LZO_OPT_PREFER_PREDEC 1 #endif #ifndef LZO_CFG_NO_INLINE_ASM #if (LZO_CC_LLVM) # define LZO_CFG_NO_INLINE_ASM 1 #endif #endif #ifndef LZO_CFG_NO_UNALIGNED #if (LZO_ABI_NEUTRAL_ENDIAN) || (LZO_ARCH_GENERIC) # define LZO_CFG_NO_UNALIGNED 1 #endif #endif #if (LZO_CFG_NO_UNALIGNED) # undef LZO_OPT_UNALIGNED16 # undef LZO_OPT_UNALIGNED32 # undef LZO_OPT_UNALIGNED64 #endif #if (LZO_CFG_NO_INLINE_ASM) #elif (LZO_ARCH_I386 && (LZO_OS_DOS32 || LZO_OS_WIN32) && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) # define LZO_ASM_SYNTAX_MSC 1 #elif (LZO_OS_WIN64 && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) #elif (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC == 0x011f00ul)) #elif (LZO_ARCH_I386 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) # define LZO_ASM_SYNTAX_GNUC 1 #elif (LZO_ARCH_AMD64 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) # define LZO_ASM_SYNTAX_GNUC 1 #endif #if (LZO_ASM_SYNTAX_GNUC) #if (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC < 0x020000ul)) # define __LZO_ASM_CLOBBER "ax" #elif (LZO_CC_INTELC) # define __LZO_ASM_CLOBBER "memory" #else # define __LZO_ASM_CLOBBER "cc", "memory" #endif #endif #if defined(__LZO_INFOSTR_MM) #elif (LZO_MM_FLAT) && (defined(__LZO_INFOSTR_PM) || defined(LZO_INFO_ABI_PM)) # define __LZO_INFOSTR_MM "" #elif defined(LZO_INFO_MM) # define __LZO_INFOSTR_MM "." LZO_INFO_MM #else # define __LZO_INFOSTR_MM "" #endif #if defined(__LZO_INFOSTR_PM) #elif defined(LZO_INFO_ABI_PM) # define __LZO_INFOSTR_PM "." LZO_INFO_ABI_PM #else # define __LZO_INFOSTR_PM "" #endif #if defined(__LZO_INFOSTR_ENDIAN) #elif defined(LZO_INFO_ABI_ENDIAN) # define __LZO_INFOSTR_ENDIAN "." LZO_INFO_ABI_ENDIAN #else # define __LZO_INFOSTR_ENDIAN "" #endif #if defined(__LZO_INFOSTR_OSNAME) #elif defined(LZO_INFO_OS_CONSOLE) # define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_CONSOLE #elif defined(LZO_INFO_OS_POSIX) # define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_POSIX #else # define __LZO_INFOSTR_OSNAME LZO_INFO_OS #endif #if defined(__LZO_INFOSTR_LIBC) #elif defined(LZO_INFO_LIBC) # define __LZO_INFOSTR_LIBC "." LZO_INFO_LIBC #else # define __LZO_INFOSTR_LIBC "" #endif #if defined(__LZO_INFOSTR_CCVER) #elif defined(LZO_INFO_CCVER) # define __LZO_INFOSTR_CCVER " " LZO_INFO_CCVER #else # define __LZO_INFOSTR_CCVER "" #endif #define LZO_INFO_STRING \ LZO_INFO_ARCH __LZO_INFOSTR_MM __LZO_INFOSTR_PM __LZO_INFOSTR_ENDIAN \ " " __LZO_INFOSTR_OSNAME __LZO_INFOSTR_LIBC " " LZO_INFO_CC __LZO_INFOSTR_CCVER #endif /* already included */ /* vim:set ts=4 et: */ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/minilzo.c000066400000000000000000003725241171526373700263460ustar00rootroot00000000000000/* minilzo.c -- mini subset of the LZO real-time data compression library This file is part of the LZO real-time data compression library. Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. The LZO library 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. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the LZO library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Markus F.X.J. Oberhumer http://www.oberhumer.com/opensource/lzo/ */ /* * NOTE: * the full LZO package can be found at * http://www.oberhumer.com/opensource/lzo/ */ #define __LZO_IN_MINILZO 1 #if defined(LZO_CFG_FREESTANDING) # undef MINILZO_HAVE_CONFIG_H # define LZO_LIBC_FREESTANDING 1 # define LZO_OS_FREESTANDING 1 #endif #ifdef MINILZO_HAVE_CONFIG_H # include #endif #include #include #if defined(MINILZO_CFG_USE_INTERNAL_LZODEFS) #ifndef __LZODEFS_H_INCLUDED #define __LZODEFS_H_INCLUDED 1 #if defined(__CYGWIN32__) && !defined(__CYGWIN__) # define __CYGWIN__ __CYGWIN32__ #endif #if defined(__IBMCPP__) && !defined(__IBMC__) # define __IBMC__ __IBMCPP__ #endif #if defined(__ICL) && defined(_WIN32) && !defined(__INTEL_COMPILER) # define __INTEL_COMPILER __ICL #endif #if 1 && defined(__INTERIX) && defined(__GNUC__) && !defined(_ALL_SOURCE) # define _ALL_SOURCE 1 #endif #if defined(__mips__) && defined(__R5900__) # if !defined(__LONG_MAX__) # define __LONG_MAX__ 9223372036854775807L # endif #endif #if defined(__INTEL_COMPILER) && defined(__linux__) # pragma warning(disable: 193) #endif #if defined(__KEIL__) && defined(__C166__) # pragma warning disable = 322 #elif 0 && defined(__C251__) # pragma warning disable = 322 #endif #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__MWERKS__) # if (_MSC_VER >= 1300) # pragma warning(disable: 4668) # endif #endif #if 0 && defined(__WATCOMC__) # if (__WATCOMC__ >= 1050) && (__WATCOMC__ < 1060) # pragma warning 203 9 # endif #endif #if defined(__BORLANDC__) && defined(__MSDOS__) && !defined(__FLAT__) # pragma option -h #endif #if 0 #define LZO_0xffffL 0xfffful #define LZO_0xffffffffL 0xfffffffful #else #define LZO_0xffffL 65535ul #define LZO_0xffffffffL 4294967295ul #endif #if (LZO_0xffffL == LZO_0xffffffffL) # error "your preprocessor is broken 1" #endif #if (16ul * 16384ul != 262144ul) # error "your preprocessor is broken 2" #endif #if 0 #if (32767 >= 4294967295ul) # error "your preprocessor is broken 3" #endif #if (65535u >= 4294967295ul) # error "your preprocessor is broken 4" #endif #endif #if (UINT_MAX == LZO_0xffffL) #if defined(__ZTC__) && defined(__I86__) && !defined(__OS2__) # if !defined(MSDOS) # define MSDOS 1 # endif # if !defined(_MSDOS) # define _MSDOS 1 # endif #elif 0 && defined(__VERSION) && defined(MB_LEN_MAX) # if (__VERSION == 520) && (MB_LEN_MAX == 1) # if !defined(__AZTEC_C__) # define __AZTEC_C__ __VERSION # endif # if !defined(__DOS__) # define __DOS__ 1 # endif # endif #endif #endif #if defined(_MSC_VER) && defined(M_I86HM) && (UINT_MAX == LZO_0xffffL) # define ptrdiff_t long # define _PTRDIFF_T_DEFINED 1 #endif #if (UINT_MAX == LZO_0xffffL) # undef __LZO_RENAME_A # undef __LZO_RENAME_B # if defined(__AZTEC_C__) && defined(__DOS__) # define __LZO_RENAME_A 1 # elif defined(_MSC_VER) && defined(MSDOS) # if (_MSC_VER < 600) # define __LZO_RENAME_A 1 # elif (_MSC_VER < 700) # define __LZO_RENAME_B 1 # endif # elif defined(__TSC__) && defined(__OS2__) # define __LZO_RENAME_A 1 # elif defined(__MSDOS__) && defined(__TURBOC__) && (__TURBOC__ < 0x0410) # define __LZO_RENAME_A 1 # elif defined(__PACIFIC__) && defined(DOS) # if !defined(__far) # define __far far # endif # if !defined(__near) # define __near near # endif # endif # if defined(__LZO_RENAME_A) # if !defined(__cdecl) # define __cdecl cdecl # endif # if !defined(__far) # define __far far # endif # if !defined(__huge) # define __huge huge # endif # if !defined(__near) # define __near near # endif # if !defined(__pascal) # define __pascal pascal # endif # if !defined(__huge) # define __huge huge # endif # elif defined(__LZO_RENAME_B) # if !defined(__cdecl) # define __cdecl _cdecl # endif # if !defined(__far) # define __far _far # endif # if !defined(__huge) # define __huge _huge # endif # if !defined(__near) # define __near _near # endif # if !defined(__pascal) # define __pascal _pascal # endif # elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) # if !defined(__cdecl) # define __cdecl cdecl # endif # if !defined(__pascal) # define __pascal pascal # endif # endif # undef __LZO_RENAME_A # undef __LZO_RENAME_B #endif #if (UINT_MAX == LZO_0xffffL) #if defined(__AZTEC_C__) && defined(__DOS__) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 #elif defined(_MSC_VER) && defined(MSDOS) # if (_MSC_VER < 600) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 # endif # if (_MSC_VER < 700) # define LZO_BROKEN_INTEGRAL_PROMOTION 1 # define LZO_BROKEN_SIZEOF 1 # endif #elif defined(__PACIFIC__) && defined(DOS) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #elif defined(__TURBOC__) && defined(__MSDOS__) # if (__TURBOC__ < 0x0150) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 # define LZO_BROKEN_INTEGRAL_PROMOTION 1 # endif # if (__TURBOC__ < 0x0200) # define LZO_BROKEN_SIZEOF 1 # endif # if (__TURBOC__ < 0x0400) && defined(__cplusplus) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # endif #elif (defined(__PUREC__) || defined(__TURBOC__)) && defined(__TOS__) # define LZO_BROKEN_CDECL_ALT_SYNTAX 1 # define LZO_BROKEN_SIZEOF 1 #endif #endif #if defined(__WATCOMC__) && (__WATCOMC__ < 900) # define LZO_BROKEN_INTEGRAL_CONSTANTS 1 #endif #if defined(_CRAY) && defined(_CRAY1) # define LZO_BROKEN_SIGNED_RIGHT_SHIFT 1 #endif #define LZO_PP_STRINGIZE(x) #x #define LZO_PP_MACRO_EXPAND(x) LZO_PP_STRINGIZE(x) #define LZO_PP_CONCAT2(a,b) a ## b #define LZO_PP_CONCAT3(a,b,c) a ## b ## c #define LZO_PP_CONCAT4(a,b,c,d) a ## b ## c ## d #define LZO_PP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e #define LZO_PP_ECONCAT2(a,b) LZO_PP_CONCAT2(a,b) #define LZO_PP_ECONCAT3(a,b,c) LZO_PP_CONCAT3(a,b,c) #define LZO_PP_ECONCAT4(a,b,c,d) LZO_PP_CONCAT4(a,b,c,d) #define LZO_PP_ECONCAT5(a,b,c,d,e) LZO_PP_CONCAT5(a,b,c,d,e) #if 1 #define LZO_CPP_STRINGIZE(x) #x #define LZO_CPP_MACRO_EXPAND(x) LZO_CPP_STRINGIZE(x) #define LZO_CPP_CONCAT2(a,b) a ## b #define LZO_CPP_CONCAT3(a,b,c) a ## b ## c #define LZO_CPP_CONCAT4(a,b,c,d) a ## b ## c ## d #define LZO_CPP_CONCAT5(a,b,c,d,e) a ## b ## c ## d ## e #define LZO_CPP_ECONCAT2(a,b) LZO_CPP_CONCAT2(a,b) #define LZO_CPP_ECONCAT3(a,b,c) LZO_CPP_CONCAT3(a,b,c) #define LZO_CPP_ECONCAT4(a,b,c,d) LZO_CPP_CONCAT4(a,b,c,d) #define LZO_CPP_ECONCAT5(a,b,c,d,e) LZO_CPP_CONCAT5(a,b,c,d,e) #endif #define __LZO_MASK_GEN(o,b) (((((o) << ((b)-1)) - (o)) << 1) + (o)) #if 1 && defined(__cplusplus) # if !defined(__STDC_CONSTANT_MACROS) # define __STDC_CONSTANT_MACROS 1 # endif # if !defined(__STDC_LIMIT_MACROS) # define __STDC_LIMIT_MACROS 1 # endif #endif #if defined(__cplusplus) # define LZO_EXTERN_C extern "C" #else # define LZO_EXTERN_C extern #endif #if !defined(__LZO_OS_OVERRIDE) #if (LZO_OS_FREESTANDING) # define LZO_INFO_OS "freestanding" #elif (LZO_OS_EMBEDDED) # define LZO_INFO_OS "embedded" #elif 1 && defined(__IAR_SYSTEMS_ICC__) # define LZO_OS_EMBEDDED 1 # define LZO_INFO_OS "embedded" #elif defined(__CYGWIN__) && defined(__GNUC__) # define LZO_OS_CYGWIN 1 # define LZO_INFO_OS "cygwin" #elif defined(__EMX__) && defined(__GNUC__) # define LZO_OS_EMX 1 # define LZO_INFO_OS "emx" #elif defined(__BEOS__) # define LZO_OS_BEOS 1 # define LZO_INFO_OS "beos" #elif defined(__Lynx__) # define LZO_OS_LYNXOS 1 # define LZO_INFO_OS "lynxos" #elif defined(__OS400__) # define LZO_OS_OS400 1 # define LZO_INFO_OS "os400" #elif defined(__QNX__) # define LZO_OS_QNX 1 # define LZO_INFO_OS "qnx" #elif defined(__BORLANDC__) && defined(__DPMI32__) && (__BORLANDC__ >= 0x0460) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" #elif defined(__BORLANDC__) && defined(__DPMI16__) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" #elif defined(__ZTC__) && defined(DOS386) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" #elif defined(__OS2__) || defined(__OS2V2__) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_OS216 1 # define LZO_INFO_OS "os216" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_OS2 1 # define LZO_INFO_OS "os2" # else # error "check your limits.h header" # endif #elif defined(__WIN64__) || defined(_WIN64) || defined(WIN64) # define LZO_OS_WIN64 1 # define LZO_INFO_OS "win64" #elif defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(__WINDOWS_386__) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" #elif defined(__MWERKS__) && defined(__INTEL__) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" #elif defined(__WINDOWS__) || defined(_WINDOWS) || defined(_Windows) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_WIN16 1 # define LZO_INFO_OS "win16" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" # else # error "check your limits.h header" # endif #elif defined(__DOS__) || defined(__MSDOS__) || defined(_MSDOS) || defined(MSDOS) || (defined(__PACIFIC__) && defined(DOS)) # if (UINT_MAX == LZO_0xffffL) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_OS_DOS32 1 # define LZO_INFO_OS "dos32" # else # error "check your limits.h header" # endif #elif defined(__WATCOMC__) # if defined(__NT__) && (UINT_MAX == LZO_0xffffL) # define LZO_OS_DOS16 1 # define LZO_INFO_OS "dos16" # elif defined(__NT__) && (__WATCOMC__ < 1100) # define LZO_OS_WIN32 1 # define LZO_INFO_OS "win32" # elif defined(__linux__) || defined(__LINUX__) # define LZO_OS_POSIX 1 # define LZO_INFO_OS "posix" # else # error "please specify a target using the -bt compiler option" # endif #elif defined(__palmos__) # define LZO_OS_PALMOS 1 # define LZO_INFO_OS "palmos" #elif defined(__TOS__) || defined(__atarist__) # define LZO_OS_TOS 1 # define LZO_INFO_OS "tos" #elif defined(macintosh) && !defined(__ppc__) # define LZO_OS_MACCLASSIC 1 # define LZO_INFO_OS "macclassic" #elif defined(__VMS) # define LZO_OS_VMS 1 # define LZO_INFO_OS "vms" #elif ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) # define LZO_OS_CONSOLE 1 # define LZO_OS_CONSOLE_PS2 1 # define LZO_INFO_OS "console" # define LZO_INFO_OS_CONSOLE "ps2" #elif (defined(__mips__) && defined(__psp__)) # define LZO_OS_CONSOLE 1 # define LZO_OS_CONSOLE_PSP 1 # define LZO_INFO_OS "console" # define LZO_INFO_OS_CONSOLE "psp" #else # define LZO_OS_POSIX 1 # define LZO_INFO_OS "posix" #endif #if (LZO_OS_POSIX) # if defined(_AIX) || defined(__AIX__) || defined(__aix__) # define LZO_OS_POSIX_AIX 1 # define LZO_INFO_OS_POSIX "aix" # elif defined(__FreeBSD__) # define LZO_OS_POSIX_FREEBSD 1 # define LZO_INFO_OS_POSIX "freebsd" # elif defined(__hpux__) || defined(__hpux) # define LZO_OS_POSIX_HPUX 1 # define LZO_INFO_OS_POSIX "hpux" # elif defined(__INTERIX) # define LZO_OS_POSIX_INTERIX 1 # define LZO_INFO_OS_POSIX "interix" # elif defined(__IRIX__) || defined(__irix__) # define LZO_OS_POSIX_IRIX 1 # define LZO_INFO_OS_POSIX "irix" # elif defined(__linux__) || defined(__linux) || defined(__LINUX__) # define LZO_OS_POSIX_LINUX 1 # define LZO_INFO_OS_POSIX "linux" # elif defined(__APPLE__) || defined(__MACOS__) # define LZO_OS_POSIX_MACOSX 1 # define LZO_INFO_OS_POSIX "macosx" # elif defined(__minix__) || defined(__minix) # define LZO_OS_POSIX_MINIX 1 # define LZO_INFO_OS_POSIX "minix" # elif defined(__NetBSD__) # define LZO_OS_POSIX_NETBSD 1 # define LZO_INFO_OS_POSIX "netbsd" # elif defined(__OpenBSD__) # define LZO_OS_POSIX_OPENBSD 1 # define LZO_INFO_OS_POSIX "openbsd" # elif defined(__osf__) # define LZO_OS_POSIX_OSF 1 # define LZO_INFO_OS_POSIX "osf" # elif defined(__solaris__) || defined(__sun) # if defined(__SVR4) || defined(__svr4__) # define LZO_OS_POSIX_SOLARIS 1 # define LZO_INFO_OS_POSIX "solaris" # else # define LZO_OS_POSIX_SUNOS 1 # define LZO_INFO_OS_POSIX "sunos" # endif # elif defined(__ultrix__) || defined(__ultrix) # define LZO_OS_POSIX_ULTRIX 1 # define LZO_INFO_OS_POSIX "ultrix" # elif defined(_UNICOS) # define LZO_OS_POSIX_UNICOS 1 # define LZO_INFO_OS_POSIX "unicos" # else # define LZO_OS_POSIX_UNKNOWN 1 # define LZO_INFO_OS_POSIX "unknown" # endif #endif #endif #if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # if (UINT_MAX != LZO_0xffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if (LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_WIN32 || LZO_OS_WIN64) # if (UINT_MAX != LZO_0xffffffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if defined(CIL) && defined(_GNUCC) && defined(__GNUC__) # define LZO_CC_CILLY 1 # define LZO_INFO_CC "Cilly" # if defined(__CILLY__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CILLY__) # else # define LZO_INFO_CCVER "unknown" # endif #elif 0 && defined(SDCC) && defined(__VERSION__) && !defined(__GNUC__) # define LZO_CC_SDCC 1 # define LZO_INFO_CC "sdcc" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(SDCC) #elif defined(__PATHSCALE__) && defined(__PATHCC_PATCHLEVEL__) # define LZO_CC_PATHSCALE (__PATHCC__ * 0x10000L + __PATHCC_MINOR__ * 0x100 + __PATHCC_PATCHLEVEL__) # define LZO_INFO_CC "Pathscale C" # define LZO_INFO_CCVER __PATHSCALE__ #elif defined(__INTEL_COMPILER) # define LZO_CC_INTELC 1 # define LZO_INFO_CC "Intel C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__INTEL_COMPILER) # if defined(_WIN32) || defined(_WIN64) # define LZO_CC_SYNTAX_MSC 1 # else # define LZO_CC_SYNTAX_GNUC 1 # endif #elif defined(__POCC__) && defined(_WIN32) # define LZO_CC_PELLESC 1 # define LZO_INFO_CC "Pelles C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__POCC__) #elif defined(__clang__) && defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) # if defined(__GNUC_PATCHLEVEL__) # define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # else # define LZO_CC_CLANG_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # endif # if defined(__clang_major__) && defined(__clang_minor__) && defined(__clang_patchlevel__) # define LZO_CC_CLANG_CLANG (__clang_major__ * 0x10000L + __clang_minor__ * 0x100 + __clang_patchlevel__) # else # define LZO_CC_CLANG_CLANG 0x020700L # endif # define LZO_CC_CLANG LZO_CC_CLANG_GNUC # define LZO_INFO_CC "clang" # define LZO_INFO_CCVER __VERSION__ #elif defined(__llvm__) && defined(__GNUC__) && defined(__GNUC_MINOR__) && defined(__VERSION__) # if defined(__GNUC_PATCHLEVEL__) # define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # else # define LZO_CC_LLVM_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # endif # define LZO_CC_LLVM LZO_CC_LLVM_GNUC # define LZO_INFO_CC "llvm-gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__GNUC__) && defined(__VERSION__) # if defined(__GNUC_MINOR__) && defined(__GNUC_PATCHLEVEL__) # define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100 + __GNUC_PATCHLEVEL__) # elif defined(__GNUC_MINOR__) # define LZO_CC_GNUC (__GNUC__ * 0x10000L + __GNUC_MINOR__ * 0x100) # else # define LZO_CC_GNUC (__GNUC__ * 0x10000L) # endif # define LZO_INFO_CC "gcc" # define LZO_INFO_CCVER __VERSION__ #elif defined(__ACK__) && defined(_ACK) # define LZO_CC_ACK 1 # define LZO_INFO_CC "Amsterdam Compiler Kit C" # define LZO_INFO_CCVER "unknown" #elif defined(__AZTEC_C__) # define LZO_CC_AZTECC 1 # define LZO_INFO_CC "Aztec C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__AZTEC_C__) #elif defined(__CODEGEARC__) # define LZO_CC_CODEGEARC 1 # define LZO_INFO_CC "CodeGear C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__CODEGEARC__) #elif defined(__BORLANDC__) # define LZO_CC_BORLANDC 1 # define LZO_INFO_CC "Borland C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__BORLANDC__) #elif defined(_CRAYC) && defined(_RELEASE) # define LZO_CC_CRAYC 1 # define LZO_INFO_CC "Cray C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_RELEASE) #elif defined(__DMC__) && defined(__SC__) # define LZO_CC_DMC 1 # define LZO_INFO_CC "Digital Mars C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DMC__) #elif defined(__DECC) # define LZO_CC_DECC 1 # define LZO_INFO_CC "DEC C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__DECC) #elif defined(__HIGHC__) # define LZO_CC_HIGHC 1 # define LZO_INFO_CC "MetaWare High C" # define LZO_INFO_CCVER "unknown" #elif defined(__IAR_SYSTEMS_ICC__) # define LZO_CC_IARC 1 # define LZO_INFO_CC "IAR C" # if defined(__VER__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__VER__) # else # define LZO_INFO_CCVER "unknown" # endif #elif defined(__IBMC__) # define LZO_CC_IBMC 1 # define LZO_INFO_CC "IBM C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__IBMC__) #elif defined(__KEIL__) && defined(__C166__) # define LZO_CC_KEILC 1 # define LZO_INFO_CC "Keil C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__C166__) #elif defined(__LCC__) && defined(_WIN32) && defined(__LCCOPTIMLEVEL) # define LZO_CC_LCCWIN32 1 # define LZO_INFO_CC "lcc-win32" # define LZO_INFO_CCVER "unknown" #elif defined(__LCC__) # define LZO_CC_LCC 1 # define LZO_INFO_CC "lcc" # if defined(__LCC_VERSION__) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__LCC_VERSION__) # else # define LZO_INFO_CCVER "unknown" # endif #elif defined(_MSC_VER) # define LZO_CC_MSC 1 # define LZO_INFO_CC "Microsoft C" # if defined(_MSC_FULL_VER) # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) "." LZO_PP_MACRO_EXPAND(_MSC_FULL_VER) # else # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(_MSC_VER) # endif #elif defined(__MWERKS__) # define LZO_CC_MWERKS 1 # define LZO_INFO_CC "Metrowerks C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__MWERKS__) #elif (defined(__NDPC__) || defined(__NDPX__)) && defined(__i386) # define LZO_CC_NDPC 1 # define LZO_INFO_CC "Microway NDP C" # define LZO_INFO_CCVER "unknown" #elif defined(__PACIFIC__) # define LZO_CC_PACIFICC 1 # define LZO_INFO_CC "Pacific C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PACIFIC__) #elif defined(__PGI) && (defined(__linux__) || defined(__WIN32__)) # define LZO_CC_PGI 1 # define LZO_INFO_CC "Portland Group PGI C" # define LZO_INFO_CCVER "unknown" #elif defined(__PUREC__) && defined(__TOS__) # define LZO_CC_PUREC 1 # define LZO_INFO_CC "Pure C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__PUREC__) #elif defined(__SC__) && defined(__ZTC__) # define LZO_CC_SYMANTECC 1 # define LZO_INFO_CC "Symantec C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SC__) #elif defined(__SUNPRO_C) # define LZO_INFO_CC "SunPro C" # if ((__SUNPRO_C)+0 > 0) # define LZO_CC_SUNPROC __SUNPRO_C # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_C) # else # define LZO_CC_SUNPROC 1 # define LZO_INFO_CCVER "unknown" # endif #elif defined(__SUNPRO_CC) # define LZO_INFO_CC "SunPro C" # if ((__SUNPRO_CC)+0 > 0) # define LZO_CC_SUNPROC __SUNPRO_CC # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__SUNPRO_CC) # else # define LZO_CC_SUNPROC 1 # define LZO_INFO_CCVER "unknown" # endif #elif defined(__TINYC__) # define LZO_CC_TINYC 1 # define LZO_INFO_CC "Tiny C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TINYC__) #elif defined(__TSC__) # define LZO_CC_TOPSPEEDC 1 # define LZO_INFO_CC "TopSpeed C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TSC__) #elif defined(__WATCOMC__) # define LZO_CC_WATCOMC 1 # define LZO_INFO_CC "Watcom C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__WATCOMC__) #elif defined(__TURBOC__) # define LZO_CC_TURBOC 1 # define LZO_INFO_CC "Turbo C" # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__TURBOC__) #elif defined(__ZTC__) # define LZO_CC_ZORTECHC 1 # define LZO_INFO_CC "Zortech C" # if (__ZTC__ == 0x310) # define LZO_INFO_CCVER "0x310" # else # define LZO_INFO_CCVER LZO_PP_MACRO_EXPAND(__ZTC__) # endif #else # define LZO_CC_UNKNOWN 1 # define LZO_INFO_CC "unknown" # define LZO_INFO_CCVER "unknown" #endif #if 0 && (LZO_CC_MSC && (_MSC_VER >= 1200)) && !defined(_MSC_FULL_VER) # error "LZO_CC_MSC: _MSC_FULL_VER is not defined" #endif #if !defined(__LZO_ARCH_OVERRIDE) && !(LZO_ARCH_GENERIC) && defined(_CRAY) # if (UINT_MAX > LZO_0xffffffffL) && defined(_CRAY) # if defined(_CRAYMPP) || defined(_CRAYT3D) || defined(_CRAYT3E) # define LZO_ARCH_CRAY_MPP 1 # elif defined(_CRAY1) # define LZO_ARCH_CRAY_PVP 1 # endif # endif #endif #if !defined(__LZO_ARCH_OVERRIDE) #if (LZO_ARCH_GENERIC) # define LZO_INFO_ARCH "generic" #elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086 1 # define LZO_ARCH_IA16 1 # define LZO_INFO_ARCH "i086" #elif defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" #elif (LZO_ARCH_CRAY_MPP) && (defined(_CRAYT3D) || defined(_CRAYT3E)) # define LZO_ARCH_ALPHA 1 # define LZO_INFO_ARCH "alpha" #elif defined(__amd64__) || defined(__x86_64__) || defined(_M_AMD64) # define LZO_ARCH_AMD64 1 # define LZO_INFO_ARCH "amd64" #elif defined(__thumb__) || (defined(_M_ARM) && defined(_M_THUMB)) # define LZO_ARCH_ARM 1 # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCARM__) # define LZO_ARCH_ARM 1 # if defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 1) # define LZO_ARCH_ARM_THUMB 1 # define LZO_INFO_ARCH "arm_thumb" # elif defined(__CPU_MODE__) && ((__CPU_MODE__)+0 == 2) # define LZO_INFO_ARCH "arm" # else # define LZO_INFO_ARCH "arm" # endif #elif defined(__arm__) || defined(_M_ARM) # define LZO_ARCH_ARM 1 # define LZO_INFO_ARCH "arm" #elif (UINT_MAX <= LZO_0xffffL) && defined(__AVR__) # define LZO_ARCH_AVR 1 # define LZO_INFO_ARCH "avr" #elif defined(__avr32__) || defined(__AVR32__) # define LZO_ARCH_AVR32 1 # define LZO_INFO_ARCH "avr32" #elif defined(__bfin__) # define LZO_ARCH_BLACKFIN 1 # define LZO_INFO_ARCH "blackfin" #elif (UINT_MAX == LZO_0xffffL) && defined(__C166__) # define LZO_ARCH_C166 1 # define LZO_INFO_ARCH "c166" #elif defined(__cris__) # define LZO_ARCH_CRIS 1 # define LZO_INFO_ARCH "cris" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCEZ80__) # define LZO_ARCH_EZ80 1 # define LZO_INFO_ARCH "ez80" #elif defined(__H8300__) || defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define LZO_ARCH_H8300 1 # define LZO_INFO_ARCH "h8300" #elif defined(__hppa__) || defined(__hppa) # define LZO_ARCH_HPPA 1 # define LZO_INFO_ARCH "hppa" #elif defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif (LZO_CC_ZORTECHC && defined(__I86__)) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif (LZO_OS_DOS32 && LZO_CC_HIGHC) && defined(_I386) # define LZO_ARCH_I386 1 # define LZO_ARCH_IA32 1 # define LZO_INFO_ARCH "i386" #elif defined(__ia64__) || defined(__ia64) || defined(_M_IA64) # define LZO_ARCH_IA64 1 # define LZO_INFO_ARCH "ia64" #elif (UINT_MAX == LZO_0xffffL) && defined(__m32c__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICCM16C__) # define LZO_ARCH_M16C 1 # define LZO_INFO_ARCH "m16c" #elif defined(__m32r__) # define LZO_ARCH_M32R 1 # define LZO_INFO_ARCH "m32r" #elif (LZO_OS_TOS) || defined(__m68k__) || defined(__m68000__) || defined(__mc68000__) || defined(__mc68020__) || defined(_M_M68K) # define LZO_ARCH_M68K 1 # define LZO_INFO_ARCH "m68k" #elif (UINT_MAX == LZO_0xffffL) && defined(__C251__) # define LZO_ARCH_MCS251 1 # define LZO_INFO_ARCH "mcs251" #elif (UINT_MAX == LZO_0xffffL) && defined(__C51__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC8051__) # define LZO_ARCH_MCS51 1 # define LZO_INFO_ARCH "mcs51" #elif defined(__mips__) || defined(__mips) || defined(_MIPS_ARCH) || defined(_M_MRX000) # define LZO_ARCH_MIPS 1 # define LZO_INFO_ARCH "mips" #elif (UINT_MAX == LZO_0xffffL) && defined(__MSP430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" #elif defined(__IAR_SYSTEMS_ICC__) && defined(__ICC430__) # define LZO_ARCH_MSP430 1 # define LZO_INFO_ARCH "msp430" #elif defined(__powerpc__) || defined(__powerpc) || defined(__ppc__) || defined(__PPC__) || defined(_M_PPC) || defined(_ARCH_PPC) || defined(_ARCH_PWR) # define LZO_ARCH_POWERPC 1 # define LZO_INFO_ARCH "powerpc" #elif defined(__s390__) || defined(__s390) || defined(__s390x__) || defined(__s390x) # define LZO_ARCH_S390 1 # define LZO_INFO_ARCH "s390" #elif defined(__sh__) || defined(_M_SH) # define LZO_ARCH_SH 1 # define LZO_INFO_ARCH "sh" #elif defined(__sparc__) || defined(__sparc) || defined(__sparcv8) # define LZO_ARCH_SPARC 1 # define LZO_INFO_ARCH "sparc" #elif defined(__SPU__) # define LZO_ARCH_SPU 1 # define LZO_INFO_ARCH "spu" #elif (UINT_MAX == LZO_0xffffL) && defined(__z80) # define LZO_ARCH_Z80 1 # define LZO_INFO_ARCH "z80" #elif (LZO_ARCH_CRAY_PVP) # if defined(_CRAYSV1) # define LZO_ARCH_CRAY_SV1 1 # define LZO_INFO_ARCH "cray_sv1" # elif (_ADDR64) # define LZO_ARCH_CRAY_T90 1 # define LZO_INFO_ARCH "cray_t90" # elif (_ADDR32) # define LZO_ARCH_CRAY_YMP 1 # define LZO_INFO_ARCH "cray_ymp" # else # define LZO_ARCH_CRAY_XMP 1 # define LZO_INFO_ARCH "cray_xmp" # endif #else # define LZO_ARCH_UNKNOWN 1 # define LZO_INFO_ARCH "unknown" #endif #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_DOS32 || LZO_OS_OS2) # error "FIXME - missing define for CPU architecture" #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN32) # error "FIXME - missing WIN32 define for CPU architecture" #endif #if 1 && (LZO_ARCH_UNKNOWN) && (LZO_OS_WIN64) # error "FIXME - missing WIN64 define for CPU architecture" #endif #if (LZO_OS_OS216 || LZO_OS_WIN16) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && defined(BLX286)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && defined(DOSX286)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #elif 1 && (LZO_OS_DOS16 && LZO_CC_BORLANDC && defined(__DPMI16__)) # define LZO_ARCH_I086PM 1 # define LZO_ARCH_IA16PM 1 #endif #if (LZO_ARCH_ARM_THUMB) && !(LZO_ARCH_ARM) # error "this should not happen" #endif #if (LZO_ARCH_I086PM) && !(LZO_ARCH_I086) # error "this should not happen" #endif #if (LZO_ARCH_I086) # if (UINT_MAX != LZO_0xffffL) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if (LZO_ARCH_I386) # if (UINT_MAX != LZO_0xffffL) && defined(__i386_int16__) # error "this should not happen" # endif # if (UINT_MAX != LZO_0xffffffffL) && !defined(__i386_int16__) # error "this should not happen" # endif # if (ULONG_MAX != LZO_0xffffffffL) # error "this should not happen" # endif #endif #if !defined(__LZO_MM_OVERRIDE) #if (LZO_ARCH_I086) #if (UINT_MAX != LZO_0xffffL) # error "this should not happen" #endif #if defined(__TINY__) || defined(M_I86TM) || defined(_M_I86TM) # define LZO_MM_TINY 1 #elif defined(__HUGE__) || defined(_HUGE_) || defined(M_I86HM) || defined(_M_I86HM) # define LZO_MM_HUGE 1 #elif defined(__SMALL__) || defined(M_I86SM) || defined(_M_I86SM) || defined(SMALL_MODEL) # define LZO_MM_SMALL 1 #elif defined(__MEDIUM__) || defined(M_I86MM) || defined(_M_I86MM) # define LZO_MM_MEDIUM 1 #elif defined(__COMPACT__) || defined(M_I86CM) || defined(_M_I86CM) # define LZO_MM_COMPACT 1 #elif defined(__LARGE__) || defined(M_I86LM) || defined(_M_I86LM) || defined(LARGE_MODEL) # define LZO_MM_LARGE 1 #elif (LZO_CC_AZTECC) # if defined(_LARGE_CODE) && defined(_LARGE_DATA) # define LZO_MM_LARGE 1 # elif defined(_LARGE_CODE) # define LZO_MM_MEDIUM 1 # elif defined(_LARGE_DATA) # define LZO_MM_COMPACT 1 # else # define LZO_MM_SMALL 1 # endif #elif (LZO_CC_ZORTECHC && defined(__VCM__)) # define LZO_MM_LARGE 1 #else # error "unknown memory model" #endif #if (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) #define LZO_HAVE_MM_HUGE_PTR 1 #define LZO_HAVE_MM_HUGE_ARRAY 1 #if (LZO_MM_TINY) # undef LZO_HAVE_MM_HUGE_ARRAY #endif #if (LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_ZORTECHC) # undef LZO_HAVE_MM_HUGE_PTR # undef LZO_HAVE_MM_HUGE_ARRAY #elif (LZO_CC_DMC || LZO_CC_SYMANTECC) # undef LZO_HAVE_MM_HUGE_ARRAY #elif (LZO_CC_MSC && defined(_QC)) # undef LZO_HAVE_MM_HUGE_ARRAY # if (_MSC_VER < 600) # undef LZO_HAVE_MM_HUGE_PTR # endif #elif (LZO_CC_TURBOC && (__TURBOC__ < 0x0295)) # undef LZO_HAVE_MM_HUGE_ARRAY #endif #if (LZO_ARCH_I086PM) && !(LZO_HAVE_MM_HUGE_PTR) # if (LZO_OS_DOS16) # error "this should not happen" # elif (LZO_CC_ZORTECHC) # else # error "this should not happen" # endif #endif #ifdef __cplusplus extern "C" { #endif #if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0200)) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_MSC || LZO_CC_TOPSPEEDC) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif (LZO_CC_TURBOC && (__TURBOC__ >= 0x0295)) extern void __near __cdecl _AHSHIFT(void); # define LZO_MM_AHSHIFT ((unsigned) _AHSHIFT) #elif ((LZO_CC_AZTECC || LZO_CC_PACIFICC || LZO_CC_TURBOC) && LZO_OS_DOS16) # define LZO_MM_AHSHIFT 12 #elif (LZO_CC_WATCOMC) extern unsigned char _HShift; # define LZO_MM_AHSHIFT ((unsigned) _HShift) #else # error "FIXME - implement LZO_MM_AHSHIFT" #endif #ifdef __cplusplus } #endif #endif #elif (LZO_ARCH_C166) #if !defined(__MODEL__) # error "FIXME - C166 __MODEL__" #elif ((__MODEL__) == 0) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 1) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - C166 __MODEL__" #endif #elif (LZO_ARCH_MCS251) #if !defined(__MODEL__) # error "FIXME - MCS251 __MODEL__" #elif ((__MODEL__) == 0) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - MCS251 __MODEL__" #endif #elif (LZO_ARCH_MCS51) #if !defined(__MODEL__) # error "FIXME - MCS51 __MODEL__" #elif ((__MODEL__) == 1) # define LZO_MM_SMALL 1 #elif ((__MODEL__) == 2) # define LZO_MM_LARGE 1 #elif ((__MODEL__) == 3) # define LZO_MM_TINY 1 #elif ((__MODEL__) == 4) # define LZO_MM_XTINY 1 #elif ((__MODEL__) == 5) # define LZO_MM_XSMALL 1 #else # error "FIXME - MCS51 __MODEL__" #endif #elif (LZO_ARCH_CRAY_PVP) # define LZO_MM_PVP 1 #else # define LZO_MM_FLAT 1 #endif #if (LZO_MM_COMPACT) # define LZO_INFO_MM "compact" #elif (LZO_MM_FLAT) # define LZO_INFO_MM "flat" #elif (LZO_MM_HUGE) # define LZO_INFO_MM "huge" #elif (LZO_MM_LARGE) # define LZO_INFO_MM "large" #elif (LZO_MM_MEDIUM) # define LZO_INFO_MM "medium" #elif (LZO_MM_PVP) # define LZO_INFO_MM "pvp" #elif (LZO_MM_SMALL) # define LZO_INFO_MM "small" #elif (LZO_MM_TINY) # define LZO_INFO_MM "tiny" #else # error "unknown memory model" #endif #endif #if defined(SIZEOF_SHORT) # define LZO_SIZEOF_SHORT (SIZEOF_SHORT) #endif #if defined(SIZEOF_INT) # define LZO_SIZEOF_INT (SIZEOF_INT) #endif #if defined(SIZEOF_LONG) # define LZO_SIZEOF_LONG (SIZEOF_LONG) #endif #if defined(SIZEOF_LONG_LONG) # define LZO_SIZEOF_LONG_LONG (SIZEOF_LONG_LONG) #endif #if defined(SIZEOF___INT16) # define LZO_SIZEOF___INT16 (SIZEOF___INT16) #endif #if defined(SIZEOF___INT32) # define LZO_SIZEOF___INT32 (SIZEOF___INT32) #endif #if defined(SIZEOF___INT64) # define LZO_SIZEOF___INT64 (SIZEOF___INT64) #endif #if defined(SIZEOF_VOID_P) # define LZO_SIZEOF_VOID_P (SIZEOF_VOID_P) #endif #if defined(SIZEOF_SIZE_T) # define LZO_SIZEOF_SIZE_T (SIZEOF_SIZE_T) #endif #if defined(SIZEOF_PTRDIFF_T) # define LZO_SIZEOF_PTRDIFF_T (SIZEOF_PTRDIFF_T) #endif #define __LZO_LSR(x,b) (((x)+0ul) >> (b)) #if !defined(LZO_SIZEOF_SHORT) # if (LZO_ARCH_CRAY_PVP) # define LZO_SIZEOF_SHORT 8 # elif (USHRT_MAX == LZO_0xffffL) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,7) == 1) # define LZO_SIZEOF_SHORT 1 # elif (__LZO_LSR(USHRT_MAX,15) == 1) # define LZO_SIZEOF_SHORT 2 # elif (__LZO_LSR(USHRT_MAX,31) == 1) # define LZO_SIZEOF_SHORT 4 # elif (__LZO_LSR(USHRT_MAX,63) == 1) # define LZO_SIZEOF_SHORT 8 # elif (__LZO_LSR(USHRT_MAX,127) == 1) # define LZO_SIZEOF_SHORT 16 # else # error "LZO_SIZEOF_SHORT" # endif #endif #if !defined(LZO_SIZEOF_INT) # if (LZO_ARCH_CRAY_PVP) # define LZO_SIZEOF_INT 8 # elif (UINT_MAX == LZO_0xffffL) # define LZO_SIZEOF_INT 2 # elif (UINT_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_INT 4 # elif (__LZO_LSR(UINT_MAX,7) == 1) # define LZO_SIZEOF_INT 1 # elif (__LZO_LSR(UINT_MAX,15) == 1) # define LZO_SIZEOF_INT 2 # elif (__LZO_LSR(UINT_MAX,31) == 1) # define LZO_SIZEOF_INT 4 # elif (__LZO_LSR(UINT_MAX,63) == 1) # define LZO_SIZEOF_INT 8 # elif (__LZO_LSR(UINT_MAX,127) == 1) # define LZO_SIZEOF_INT 16 # else # error "LZO_SIZEOF_INT" # endif #endif #if !defined(LZO_SIZEOF_LONG) # if (ULONG_MAX == LZO_0xffffffffL) # define LZO_SIZEOF_LONG 4 # elif (__LZO_LSR(ULONG_MAX,7) == 1) # define LZO_SIZEOF_LONG 1 # elif (__LZO_LSR(ULONG_MAX,15) == 1) # define LZO_SIZEOF_LONG 2 # elif (__LZO_LSR(ULONG_MAX,31) == 1) # define LZO_SIZEOF_LONG 4 # elif (__LZO_LSR(ULONG_MAX,63) == 1) # define LZO_SIZEOF_LONG 8 # elif (__LZO_LSR(ULONG_MAX,127) == 1) # define LZO_SIZEOF_LONG 16 # else # error "LZO_SIZEOF_LONG" # endif #endif #if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) #if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) # if defined(__LONG_MAX__) && defined(__LONG_LONG_MAX__) # if (LZO_CC_GNUC >= 0x030300ul) # if ((__LONG_MAX__)+0 == (__LONG_LONG_MAX__)+0) # define LZO_SIZEOF_LONG_LONG LZO_SIZEOF_LONG # elif (__LZO_LSR(__LONG_LONG_MAX__,30) == 1) # define LZO_SIZEOF_LONG_LONG 4 # endif # endif # endif #endif #endif #if !defined(LZO_SIZEOF_LONG_LONG) && !defined(LZO_SIZEOF___INT64) #if (LZO_SIZEOF_LONG > 0 && LZO_SIZEOF_LONG < 8) #if (LZO_ARCH_I086 && LZO_CC_DMC) #elif (LZO_CC_CILLY) && defined(__GNUC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_SIZEOF_LONG_LONG 8 #elif ((LZO_OS_WIN32 || LZO_OS_WIN64 || defined(_WIN32)) && LZO_CC_MSC && (_MSC_VER >= 1400)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_OS_WIN64 || defined(_WIN64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_DMC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_SYMANTECC && (__SC__ >= 0x700))) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC && defined(__linux__))) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_MWERKS || LZO_CC_PELLESC || LZO_CC_PGI || LZO_CC_SUNPROC)) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_ARCH_I386 && (LZO_CC_INTELC || LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif ((LZO_OS_WIN32 || defined(_WIN32)) && (LZO_CC_MSC)) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0520))) # define LZO_SIZEOF___INT64 8 #elif (LZO_ARCH_I386 && (LZO_CC_WATCOMC && (__WATCOMC__ >= 1100))) # define LZO_SIZEOF___INT64 8 #elif (LZO_CC_WATCOMC && defined(_INTEGRAL_MAX_BITS) && (_INTEGRAL_MAX_BITS == 64)) # define LZO_SIZEOF___INT64 8 #elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_LONG_LONG 8 #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_LONG_LONG 8 #elif (LZO_CC_SDCC) && (LZO_SIZEOF_INT == 2) #elif 1 && defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define LZO_SIZEOF_LONG_LONG 8 #endif #endif #endif #if defined(__cplusplus) && (LZO_CC_GNUC) # if (LZO_CC_GNUC < 0x020800ul) # undef LZO_SIZEOF_LONG_LONG # endif #endif #if (LZO_CFG_NO_LONG_LONG) || defined(__NO_LONG_LONG) # undef LZO_SIZEOF_LONG_LONG #endif #if !defined(LZO_SIZEOF_VOID_P) #if (LZO_ARCH_I086) # define __LZO_WORDSIZE 2 # if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM) # define LZO_SIZEOF_VOID_P 2 # elif (LZO_MM_COMPACT || LZO_MM_LARGE || LZO_MM_HUGE) # define LZO_SIZEOF_VOID_P 4 # else # error "LZO_MM" # endif #elif (LZO_ARCH_AVR || LZO_ARCH_Z80) # define __LZO_WORDSIZE 1 # define LZO_SIZEOF_VOID_P 2 #elif (LZO_ARCH_C166 || LZO_ARCH_MCS51 || LZO_ARCH_MCS251 || LZO_ARCH_MSP430) # define LZO_SIZEOF_VOID_P 2 #elif (LZO_ARCH_H8300) # if defined(__NORMAL_MODE__) # define __LZO_WORDSIZE 4 # define LZO_SIZEOF_VOID_P 2 # elif defined(__H8300H__) || defined(__H8300S__) || defined(__H8300SX__) # define __LZO_WORDSIZE 4 # define LZO_SIZEOF_VOID_P 4 # else # define __LZO_WORDSIZE 2 # define LZO_SIZEOF_VOID_P 2 # endif # if (LZO_CC_GNUC && (LZO_CC_GNUC < 0x040000ul)) && (LZO_SIZEOF_INT == 4) # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_INT # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_INT # endif #elif (LZO_ARCH_M16C) # define __LZO_WORDSIZE 2 # if defined(__m32c_cpu__) || defined(__m32cm_cpu__) # define LZO_SIZEOF_VOID_P 4 # else # define LZO_SIZEOF_VOID_P 2 # endif #elif (LZO_SIZEOF_LONG == 8) && ((defined(__mips__) && defined(__R5900__)) || defined(__MIPS_PSX2__)) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 4 #elif defined(__LLP64__) || defined(__LLP64) || defined(_LLP64) || defined(_WIN64) # define __LZO_WORDSIZE 8 # define LZO_SIZEOF_VOID_P 8 #elif (LZO_OS_OS400 || defined(__OS400__)) && defined(__LLP64_IFC__) # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (LZO_OS_OS400 || defined(__OS400__)) # define __LZO_WORDSIZE LZO_SIZEOF_LONG # define LZO_SIZEOF_VOID_P 16 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (defined(__vms) || defined(__VMS)) && (__INITIAL_POINTER_SIZE+0 == 64) # define LZO_SIZEOF_VOID_P 8 # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_LONG # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_LONG #elif (LZO_ARCH_SPU) # if 0 # define __LZO_WORDSIZE 16 # endif # define LZO_SIZEOF_VOID_P 4 #else # define LZO_SIZEOF_VOID_P LZO_SIZEOF_LONG #endif #endif #if !defined(LZO_WORDSIZE) # if defined(__LZO_WORDSIZE) # define LZO_WORDSIZE __LZO_WORDSIZE # else # define LZO_WORDSIZE LZO_SIZEOF_VOID_P # endif #endif #if !defined(LZO_SIZEOF_SIZE_T) #if (LZO_ARCH_I086 || LZO_ARCH_M16C) # define LZO_SIZEOF_SIZE_T 2 #else # define LZO_SIZEOF_SIZE_T LZO_SIZEOF_VOID_P #endif #endif #if !defined(LZO_SIZEOF_PTRDIFF_T) #if (LZO_ARCH_I086) # if (LZO_MM_TINY || LZO_MM_SMALL || LZO_MM_MEDIUM || LZO_MM_HUGE) # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_VOID_P # elif (LZO_MM_COMPACT || LZO_MM_LARGE) # if (LZO_CC_BORLANDC || LZO_CC_TURBOC) # define LZO_SIZEOF_PTRDIFF_T 4 # else # define LZO_SIZEOF_PTRDIFF_T 2 # endif # else # error "LZO_MM" # endif #else # define LZO_SIZEOF_PTRDIFF_T LZO_SIZEOF_SIZE_T #endif #endif #if (LZO_ABI_NEUTRAL_ENDIAN) # undef LZO_ABI_BIG_ENDIAN # undef LZO_ABI_LITTLE_ENDIAN #elif !(LZO_ABI_BIG_ENDIAN) && !(LZO_ABI_LITTLE_ENDIAN) #if (LZO_ARCH_ALPHA) && (LZO_ARCH_CRAY_MPP) # define LZO_ABI_BIG_ENDIAN 1 #elif (LZO_ARCH_IA64) && (LZO_OS_POSIX_LINUX || LZO_OS_WIN64) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_ALPHA || LZO_ARCH_AMD64 || LZO_ARCH_BLACKFIN || LZO_ARCH_CRIS || LZO_ARCH_I086 || LZO_ARCH_I386 || LZO_ARCH_MSP430) # define LZO_ABI_LITTLE_ENDIAN 1 #elif (LZO_ARCH_AVR32 || LZO_ARCH_M68K || LZO_ARCH_S390) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__IAR_SYSTEMS_ICC__) && defined(__LITTLE_ENDIAN__) # if (__LITTLE_ENDIAN__ == 1) # define LZO_ABI_LITTLE_ENDIAN 1 # else # define LZO_ABI_BIG_ENDIAN 1 # endif #elif 1 && defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__) # define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_ARM) && defined(__ARMEB__) && !defined(__ARMEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_ARM) && defined(__ARMEL__) && !defined(__ARMEB__) # define LZO_ABI_LITTLE_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEB__) && !defined(__MIPSEL__) # define LZO_ABI_BIG_ENDIAN 1 #elif 1 && (LZO_ARCH_MIPS) && defined(__MIPSEL__) && !defined(__MIPSEB__) # define LZO_ABI_LITTLE_ENDIAN 1 #endif #endif #if (LZO_ABI_BIG_ENDIAN) && (LZO_ABI_LITTLE_ENDIAN) # error "this should not happen" #endif #if (LZO_ABI_BIG_ENDIAN) # define LZO_INFO_ABI_ENDIAN "be" #elif (LZO_ABI_LITTLE_ENDIAN) # define LZO_INFO_ABI_ENDIAN "le" #elif (LZO_ABI_NEUTRAL_ENDIAN) # define LZO_INFO_ABI_ENDIAN "neutral" #endif #if (LZO_SIZEOF_INT == 1 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) # define LZO_ABI_I8LP16 1 # define LZO_INFO_ABI_PM "i8lp16" #elif (LZO_SIZEOF_INT == 2 && LZO_SIZEOF_LONG == 2 && LZO_SIZEOF_VOID_P == 2) # define LZO_ABI_ILP16 1 # define LZO_INFO_ABI_PM "ilp16" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 4) # define LZO_ABI_ILP32 1 # define LZO_INFO_ABI_PM "ilp32" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 4 && LZO_SIZEOF_VOID_P == 8 && LZO_SIZEOF_SIZE_T == 8) # define LZO_ABI_LLP64 1 # define LZO_INFO_ABI_PM "llp64" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) # define LZO_ABI_LP64 1 # define LZO_INFO_ABI_PM "lp64" #elif (LZO_SIZEOF_INT == 8 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 8) # define LZO_ABI_ILP64 1 # define LZO_INFO_ABI_PM "ilp64" #elif (LZO_SIZEOF_INT == 4 && LZO_SIZEOF_LONG == 8 && LZO_SIZEOF_VOID_P == 4) # define LZO_ABI_IP32L64 1 # define LZO_INFO_ABI_PM "ip32l64" #endif #if !defined(__LZO_LIBC_OVERRIDE) #if (LZO_LIBC_NAKED) # define LZO_INFO_LIBC "naked" #elif (LZO_LIBC_FREESTANDING) # define LZO_INFO_LIBC "freestanding" #elif (LZO_LIBC_MOSTLY_FREESTANDING) # define LZO_INFO_LIBC "mfreestanding" #elif (LZO_LIBC_ISOC90) # define LZO_INFO_LIBC "isoc90" #elif (LZO_LIBC_ISOC99) # define LZO_INFO_LIBC "isoc99" #elif defined(__dietlibc__) # define LZO_LIBC_DIETLIBC 1 # define LZO_INFO_LIBC "dietlibc" #elif defined(_NEWLIB_VERSION) # define LZO_LIBC_NEWLIB 1 # define LZO_INFO_LIBC "newlib" #elif defined(__UCLIBC__) && defined(__UCLIBC_MAJOR__) && defined(__UCLIBC_MINOR__) # if defined(__UCLIBC_SUBLEVEL__) # define LZO_LIBC_UCLIBC (__UCLIBC_MAJOR__ * 0x10000L + __UCLIBC_MINOR__ * 0x100 + __UCLIBC_SUBLEVEL__) # else # define LZO_LIBC_UCLIBC 0x00090bL # endif # define LZO_INFO_LIBC "uclibc" #elif defined(__GLIBC__) && defined(__GLIBC_MINOR__) # define LZO_LIBC_GLIBC (__GLIBC__ * 0x10000L + __GLIBC_MINOR__ * 0x100) # define LZO_INFO_LIBC "glibc" #elif (LZO_CC_MWERKS) && defined(__MSL__) # define LZO_LIBC_MSL __MSL__ # define LZO_INFO_LIBC "msl" #elif 1 && defined(__IAR_SYSTEMS_ICC__) # define LZO_LIBC_ISOC90 1 # define LZO_INFO_LIBC "isoc90" #else # define LZO_LIBC_DEFAULT 1 # define LZO_INFO_LIBC "default" #endif #endif #if !defined(__lzo_gnuc_extension__) #if (LZO_CC_GNUC >= 0x020800ul) # define __lzo_gnuc_extension__ __extension__ #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_gnuc_extension__ __extension__ #else # define __lzo_gnuc_extension__ /*empty*/ #endif #endif #if !defined(__lzo_ua_volatile) # define __lzo_ua_volatile volatile #endif #if !defined(__lzo_alignof) #if (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) # define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 700)) # define __lzo_alignof(e) __alignof__(e) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) # define __lzo_alignof(e) __alignof(e) #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_alignof(e) __alignof__(e) #endif #endif #if defined(__lzo_alignof) # define __lzo_HAVE_alignof 1 #endif #if !defined(__lzo_constructor) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_constructor __attribute__((__constructor__,__used__)) #elif (LZO_CC_GNUC >= 0x020700ul) # define __lzo_constructor __attribute__((__constructor__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_constructor __attribute__((__constructor__)) #endif #endif #if defined(__lzo_constructor) # define __lzo_HAVE_constructor 1 #endif #if !defined(__lzo_destructor) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_destructor __attribute__((__destructor__,__used__)) #elif (LZO_CC_GNUC >= 0x020700ul) # define __lzo_destructor __attribute__((__destructor__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_destructor __attribute__((__destructor__)) #endif #endif #if defined(__lzo_destructor) # define __lzo_HAVE_destructor 1 #endif #if (__lzo_HAVE_destructor) && !(__lzo_HAVE_constructor) # error "this should not happen" #endif #if !defined(__lzo_inline) #if (LZO_CC_TURBOC && (__TURBOC__ <= 0x0295)) #elif defined(__cplusplus) # define __lzo_inline inline #elif (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0550)) # define __lzo_inline __inline #elif (LZO_CC_CILLY || LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE || LZO_CC_PGI) # define __lzo_inline __inline__ #elif (LZO_CC_DMC) # define __lzo_inline __inline #elif (LZO_CC_INTELC) # define __lzo_inline __inline #elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x2405)) # define __lzo_inline __inline #elif (LZO_CC_MSC && (_MSC_VER >= 900)) # define __lzo_inline __inline #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_inline __inline__ #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) # define __lzo_inline inline #endif #endif #if defined(__lzo_inline) # define __lzo_HAVE_inline 1 #else # define __lzo_inline /*empty*/ #endif #if !defined(__lzo_forceinline) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_forceinline __forceinline #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_forceinline __forceinline #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_forceinline __inline__ __attribute__((__always_inline__)) #endif #endif #if defined(__lzo_forceinline) # define __lzo_HAVE_forceinline 1 #else # define __lzo_forceinline /*empty*/ #endif #if !defined(__lzo_noinline) #if 1 && (LZO_ARCH_I386) && (LZO_CC_GNUC >= 0x040000ul) && (LZO_CC_GNUC < 0x040003ul) # define __lzo_noinline __attribute__((__noinline__,__used__)) #elif (LZO_CC_GNUC >= 0x030200ul) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_MSC) # define __lzo_noinline __declspec(noinline) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800) && LZO_CC_SYNTAX_GNUC) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noinline __attribute__((__noinline__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1300)) # define __lzo_noinline __declspec(noinline) #elif (LZO_CC_MWERKS && (__MWERKS__ >= 0x3200) && (LZO_OS_WIN32 || LZO_OS_WIN64)) # if defined(__cplusplus) # else # define __lzo_noinline __declspec(noinline) # endif #elif (LZO_CC_SUNPROC && (LZO_CC_SUNPROC >= 0x5100)) # define __lzo_noinline __attribute__((__noinline__)) #endif #endif #if defined(__lzo_noinline) # define __lzo_HAVE_noinline 1 #else # define __lzo_noinline /*empty*/ #endif #if (__lzo_HAVE_forceinline || __lzo_HAVE_noinline) && !(__lzo_HAVE_inline) # error "this should not happen" #endif #if !defined(__lzo_noreturn) #if (LZO_CC_GNUC >= 0x020700ul) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) # define __lzo_noreturn __declspec(noreturn) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_noreturn __attribute__((__noreturn__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) # define __lzo_noreturn __declspec(noreturn) #endif #endif #if defined(__lzo_noreturn) # define __lzo_HAVE_noreturn 1 #else # define __lzo_noreturn /*empty*/ #endif #if !defined(__lzo_nothrow) #if (LZO_CC_GNUC >= 0x030300ul) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 450) && LZO_CC_SYNTAX_MSC) && defined(__cplusplus) # define __lzo_nothrow __declspec(nothrow) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 900) && LZO_CC_SYNTAX_GNUC) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_nothrow __attribute__((__nothrow__)) #elif (LZO_CC_MSC && (_MSC_VER >= 1200)) && defined(__cplusplus) # define __lzo_nothrow __declspec(nothrow) #endif #endif #if defined(__lzo_nothrow) # define __lzo_HAVE_nothrow 1 #else # define __lzo_nothrow /*empty*/ #endif #if !defined(__lzo_restrict) #if (LZO_CC_GNUC >= 0x030400ul) # define __lzo_restrict __restrict__ #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 600) && LZO_CC_SYNTAX_GNUC) # define __lzo_restrict __restrict__ #elif (LZO_CC_CLANG || LZO_CC_LLVM) # define __lzo_restrict __restrict__ #elif (LZO_CC_MSC && (_MSC_VER >= 1400)) # define __lzo_restrict __restrict #endif #endif #if defined(__lzo_restrict) # define __lzo_HAVE_restrict 1 #else # define __lzo_restrict /*empty*/ #endif #if !defined(__lzo_likely) && !defined(__lzo_unlikely) #if (LZO_CC_GNUC >= 0x030200ul) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #elif (LZO_CC_INTELC && (__INTEL_COMPILER >= 800)) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #elif (LZO_CC_CLANG || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define __lzo_likely(e) (__builtin_expect(!!(e),1)) # define __lzo_unlikely(e) (__builtin_expect(!!(e),0)) #endif #endif #if defined(__lzo_likely) # define __lzo_HAVE_likely 1 #else # define __lzo_likely(e) (e) #endif #if defined(__lzo_unlikely) # define __lzo_HAVE_unlikely 1 #else # define __lzo_unlikely(e) (e) #endif #if !defined(LZO_UNUSED) # if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) # define LZO_UNUSED(var) ((void) &var) # elif (LZO_CC_BORLANDC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PELLESC || LZO_CC_TURBOC) # define LZO_UNUSED(var) if (&var) ; else # elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_UNUSED(var) ((void) var) # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_UNUSED(var) if (&var) ; else # elif (LZO_CC_KEILC) # define LZO_UNUSED(var) {extern int __lzo_unused[1-2*!(sizeof(var)>0)];} # elif (LZO_CC_PACIFICC) # define LZO_UNUSED(var) ((void) sizeof(var)) # elif (LZO_CC_WATCOMC) && defined(__cplusplus) # define LZO_UNUSED(var) ((void) var) # else # define LZO_UNUSED(var) ((void) &var) # endif #endif #if !defined(LZO_UNUSED_FUNC) # if (LZO_CC_BORLANDC && (__BORLANDC__ >= 0x0600)) # define LZO_UNUSED_FUNC(func) ((void) func) # elif (LZO_CC_BORLANDC || LZO_CC_NDPC || LZO_CC_TURBOC) # define LZO_UNUSED_FUNC(func) if (func) ; else # elif (LZO_CC_CLANG || LZO_CC_LLVM) # define LZO_UNUSED_FUNC(func) ((void) &func) # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_UNUSED_FUNC(func) if (func) ; else # elif (LZO_CC_MSC) # define LZO_UNUSED_FUNC(func) ((void) &func) # elif (LZO_CC_KEILC || LZO_CC_PELLESC) # define LZO_UNUSED_FUNC(func) {extern int __lzo_unused[1-2*!(sizeof((int)func)>0)];} # else # define LZO_UNUSED_FUNC(func) ((void) func) # endif #endif #if !defined(LZO_UNUSED_LABEL) # if (LZO_CC_WATCOMC) && defined(__cplusplus) # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # elif (LZO_CC_CLANG || LZO_CC_INTELC || LZO_CC_WATCOMC) # define LZO_UNUSED_LABEL(l) if (0) goto l # else # define LZO_UNUSED_LABEL(l) switch(0) case 1:goto l # endif #endif #if !defined(LZO_DEFINE_UNINITIALIZED_VAR) # if 0 # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var # elif 0 && (LZO_CC_GNUC) # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = var # else # define LZO_DEFINE_UNINITIALIZED_VAR(type,var,init) type var = init # endif #endif #if !defined(LZO_UNCONST_CAST) # if 0 && defined(__cplusplus) # define LZO_UNCONST_CAST(t,e) (const_cast (e)) # elif (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_LLVM || LZO_CC_PATHSCALE) # define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((lzo_uintptr_t) ((const void *) (e)))))) # else # define LZO_UNCONST_CAST(t,e) ((t) ((void *) ((char *) ((const void *) (e))))) # endif #endif #if !defined(LZO_COMPILE_TIME_ASSERT_HEADER) # if (LZO_CC_AZTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; # elif (LZO_CC_DMC || LZO_CC_SYMANTECC) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1u-2*!(e)]; # elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-!(e)]; # else # define LZO_COMPILE_TIME_ASSERT_HEADER(e) extern int __lzo_cta[1-2*!(e)]; # endif #endif #if !defined(LZO_COMPILE_TIME_ASSERT) # if (LZO_CC_AZTECC) # define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-!(e)];} # elif (LZO_CC_DMC || LZO_CC_PACIFICC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # elif (LZO_CC_MSC && (_MSC_VER < 900)) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # elif (LZO_CC_TURBOC && (__TURBOC__ == 0x0295)) # define LZO_COMPILE_TIME_ASSERT(e) switch(0) case 1:case !(e):break; # else # define LZO_COMPILE_TIME_ASSERT(e) {typedef int __lzo_cta_t[1-2*!(e)];} # endif #endif #if (LZO_ARCH_I086 || LZO_ARCH_I386) && (LZO_OS_DOS16 || LZO_OS_DOS32 || LZO_OS_OS2 || LZO_OS_OS216 || LZO_OS_WIN16 || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC) # elif (LZO_CC_DMC || LZO_CC_SYMANTECC || LZO_CC_ZORTECHC) # define __lzo_cdecl __cdecl # define __lzo_cdecl_atexit /*empty*/ # define __lzo_cdecl_main __cdecl # if (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) # define __lzo_cdecl_qsort __pascal # elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) # define __lzo_cdecl_qsort _stdcall # else # define __lzo_cdecl_qsort __cdecl # endif # elif (LZO_CC_WATCOMC) # define __lzo_cdecl __cdecl # else # define __lzo_cdecl __cdecl # define __lzo_cdecl_atexit __cdecl # define __lzo_cdecl_main __cdecl # define __lzo_cdecl_qsort __cdecl # endif # if (LZO_CC_GNUC || LZO_CC_HIGHC || LZO_CC_NDPC || LZO_CC_PACIFICC || LZO_CC_WATCOMC) # elif (LZO_OS_OS2 && (LZO_CC_DMC || LZO_CC_SYMANTECC)) # define __lzo_cdecl_sighandler __pascal # elif (LZO_OS_OS2 && (LZO_CC_ZORTECHC)) # define __lzo_cdecl_sighandler _stdcall # elif (LZO_CC_MSC && (_MSC_VER >= 1400)) && defined(_M_CEE_PURE) # define __lzo_cdecl_sighandler __clrcall # elif (LZO_CC_MSC && (_MSC_VER >= 600 && _MSC_VER < 700)) # if defined(_DLL) # define __lzo_cdecl_sighandler _far _cdecl _loadds # elif defined(_MT) # define __lzo_cdecl_sighandler _far _cdecl # else # define __lzo_cdecl_sighandler _cdecl # endif # else # define __lzo_cdecl_sighandler __cdecl # endif #elif (LZO_ARCH_I386) && (LZO_CC_WATCOMC) # define __lzo_cdecl __cdecl #elif (LZO_ARCH_M68K && LZO_OS_TOS && (LZO_CC_PUREC || LZO_CC_TURBOC)) # define __lzo_cdecl cdecl #endif #if !defined(__lzo_cdecl) # define __lzo_cdecl /*empty*/ #endif #if !defined(__lzo_cdecl_atexit) # define __lzo_cdecl_atexit /*empty*/ #endif #if !defined(__lzo_cdecl_main) # define __lzo_cdecl_main /*empty*/ #endif #if !defined(__lzo_cdecl_qsort) # define __lzo_cdecl_qsort /*empty*/ #endif #if !defined(__lzo_cdecl_sighandler) # define __lzo_cdecl_sighandler /*empty*/ #endif #if !defined(__lzo_cdecl_va) # define __lzo_cdecl_va __lzo_cdecl #endif #if !(LZO_CFG_NO_WINDOWS_H) #if (LZO_OS_CYGWIN || (LZO_OS_EMX && defined(__RSXNT__)) || LZO_OS_WIN32 || LZO_OS_WIN64) # if (LZO_CC_WATCOMC && (__WATCOMC__ < 1000)) # elif (LZO_OS_WIN32 && LZO_CC_GNUC) && defined(__PW32__) # elif ((LZO_OS_CYGWIN || defined(__MINGW32__)) && (LZO_CC_GNUC && (LZO_CC_GNUC < 0x025f00ul))) # else # define LZO_HAVE_WINDOWS_H 1 # endif #endif #endif #if (LZO_ARCH_ALPHA) # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_AVOID_SHORT 1 # define LZO_OPT_AVOID_USHORT 1 #elif (LZO_ARCH_AMD64) # define LZO_OPT_AVOID_INT_INDEX 1 # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # define LZO_OPT_UNALIGNED64 1 #elif (LZO_ARCH_ARM && LZO_ARCH_ARM_THUMB) #elif (LZO_ARCH_ARM) # define LZO_OPT_AVOID_SHORT 1 # define LZO_OPT_AVOID_USHORT 1 #elif (LZO_ARCH_CRIS) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 #elif (LZO_ARCH_I386) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 #elif (LZO_ARCH_IA64) # define LZO_OPT_AVOID_INT_INDEX 1 # define LZO_OPT_AVOID_UINT_INDEX 1 # define LZO_OPT_PREFER_POSTINC 1 #elif (LZO_ARCH_M68K) # define LZO_OPT_PREFER_POSTINC 1 # define LZO_OPT_PREFER_PREDEC 1 # if defined(__mc68020__) && !defined(__mcoldfire__) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # endif #elif (LZO_ARCH_MIPS) # define LZO_OPT_AVOID_UINT_INDEX 1 #elif (LZO_ARCH_POWERPC) # define LZO_OPT_PREFER_PREINC 1 # define LZO_OPT_PREFER_PREDEC 1 # if (LZO_ABI_BIG_ENDIAN) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # endif #elif (LZO_ARCH_S390) # define LZO_OPT_UNALIGNED16 1 # define LZO_OPT_UNALIGNED32 1 # if (LZO_SIZEOF_SIZE_T == 8) # define LZO_OPT_UNALIGNED64 1 # endif #elif (LZO_ARCH_SH) # define LZO_OPT_PREFER_POSTINC 1 # define LZO_OPT_PREFER_PREDEC 1 #endif #ifndef LZO_CFG_NO_INLINE_ASM #if (LZO_CC_LLVM) # define LZO_CFG_NO_INLINE_ASM 1 #endif #endif #ifndef LZO_CFG_NO_UNALIGNED #if (LZO_ABI_NEUTRAL_ENDIAN) || (LZO_ARCH_GENERIC) # define LZO_CFG_NO_UNALIGNED 1 #endif #endif #if (LZO_CFG_NO_UNALIGNED) # undef LZO_OPT_UNALIGNED16 # undef LZO_OPT_UNALIGNED32 # undef LZO_OPT_UNALIGNED64 #endif #if (LZO_CFG_NO_INLINE_ASM) #elif (LZO_ARCH_I386 && (LZO_OS_DOS32 || LZO_OS_WIN32) && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) # define LZO_ASM_SYNTAX_MSC 1 #elif (LZO_OS_WIN64 && (LZO_CC_DMC || LZO_CC_INTELC || LZO_CC_MSC || LZO_CC_PELLESC)) #elif (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC == 0x011f00ul)) #elif (LZO_ARCH_I386 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) # define LZO_ASM_SYNTAX_GNUC 1 #elif (LZO_ARCH_AMD64 && (LZO_CC_CLANG || LZO_CC_GNUC || LZO_CC_INTELC || LZO_CC_PATHSCALE)) # define LZO_ASM_SYNTAX_GNUC 1 #endif #if (LZO_ASM_SYNTAX_GNUC) #if (LZO_ARCH_I386 && LZO_CC_GNUC && (LZO_CC_GNUC < 0x020000ul)) # define __LZO_ASM_CLOBBER "ax" #elif (LZO_CC_INTELC) # define __LZO_ASM_CLOBBER "memory" #else # define __LZO_ASM_CLOBBER "cc", "memory" #endif #endif #if defined(__LZO_INFOSTR_MM) #elif (LZO_MM_FLAT) && (defined(__LZO_INFOSTR_PM) || defined(LZO_INFO_ABI_PM)) # define __LZO_INFOSTR_MM "" #elif defined(LZO_INFO_MM) # define __LZO_INFOSTR_MM "." LZO_INFO_MM #else # define __LZO_INFOSTR_MM "" #endif #if defined(__LZO_INFOSTR_PM) #elif defined(LZO_INFO_ABI_PM) # define __LZO_INFOSTR_PM "." LZO_INFO_ABI_PM #else # define __LZO_INFOSTR_PM "" #endif #if defined(__LZO_INFOSTR_ENDIAN) #elif defined(LZO_INFO_ABI_ENDIAN) # define __LZO_INFOSTR_ENDIAN "." LZO_INFO_ABI_ENDIAN #else # define __LZO_INFOSTR_ENDIAN "" #endif #if defined(__LZO_INFOSTR_OSNAME) #elif defined(LZO_INFO_OS_CONSOLE) # define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_CONSOLE #elif defined(LZO_INFO_OS_POSIX) # define __LZO_INFOSTR_OSNAME LZO_INFO_OS "." LZO_INFO_OS_POSIX #else # define __LZO_INFOSTR_OSNAME LZO_INFO_OS #endif #if defined(__LZO_INFOSTR_LIBC) #elif defined(LZO_INFO_LIBC) # define __LZO_INFOSTR_LIBC "." LZO_INFO_LIBC #else # define __LZO_INFOSTR_LIBC "" #endif #if defined(__LZO_INFOSTR_CCVER) #elif defined(LZO_INFO_CCVER) # define __LZO_INFOSTR_CCVER " " LZO_INFO_CCVER #else # define __LZO_INFOSTR_CCVER "" #endif #define LZO_INFO_STRING \ LZO_INFO_ARCH __LZO_INFOSTR_MM __LZO_INFOSTR_PM __LZO_INFOSTR_ENDIAN \ " " __LZO_INFOSTR_OSNAME __LZO_INFOSTR_LIBC " " LZO_INFO_CC __LZO_INFOSTR_CCVER #endif #endif #undef LZO_HAVE_CONFIG_H #include "minilzo.h" #if !defined(MINILZO_VERSION) || (MINILZO_VERSION != 0x2040) # error "version mismatch in miniLZO source files" #endif #ifdef MINILZO_HAVE_CONFIG_H # define LZO_HAVE_CONFIG_H 1 #endif #ifndef __LZO_CONF_H #define __LZO_CONF_H 1 #if !defined(__LZO_IN_MINILZO) #if (LZO_CFG_FREESTANDING) # define LZO_LIBC_FREESTANDING 1 # define LZO_OS_FREESTANDING 1 # define ACC_LIBC_FREESTANDING 1 # define ACC_OS_FREESTANDING 1 #endif #if (LZO_CFG_NO_UNALIGNED) # define ACC_CFG_NO_UNALIGNED 1 #endif #if (LZO_ARCH_GENERIC) # define ACC_ARCH_GENERIC 1 #endif #if (LZO_ABI_NEUTRAL_ENDIAN) # define ACC_ABI_NEUTRAL_ENDIAN 1 #endif #if (LZO_HAVE_CONFIG_H) # define ACC_CONFIG_NO_HEADER 1 #endif #if defined(LZO_CFG_EXTRA_CONFIG_HEADER) # include LZO_CFG_EXTRA_CONFIG_HEADER #endif #if defined(__LZOCONF_H) || defined(__LZOCONF_H_INCLUDED) # error "include this file first" #endif #include "lzo/lzoconf.h" #endif #if (LZO_VERSION < 0x02000) || !defined(__LZOCONF_H_INCLUDED) # error "version mismatch" #endif #if (LZO_CC_BORLANDC && LZO_ARCH_I086) # pragma option -h #endif #if (LZO_CC_MSC && (_MSC_VER >= 1000)) # pragma warning(disable: 4127 4701) #endif #if (LZO_CC_MSC && (_MSC_VER >= 1300)) # pragma warning(disable: 4820) # pragma warning(disable: 4514 4710 4711) #endif #if (LZO_CC_SUNPROC) #if !defined(__cplusplus) # pragma error_messages(off,E_END_OF_LOOP_CODE_NOT_REACHED) # pragma error_messages(off,E_LOOP_NOT_ENTERED_AT_TOP) # pragma error_messages(off,E_STATEMENT_NOT_REACHED) #endif #endif #if (__LZO_MMODEL_HUGE) && !(LZO_HAVE_MM_HUGE_PTR) # error "this should not happen - check defines for __huge" #endif #if defined(__LZO_IN_MINILZO) || defined(LZO_CFG_FREESTANDING) #elif (LZO_OS_DOS16 || LZO_OS_OS216 || LZO_OS_WIN16) # define ACC_WANT_ACC_INCD_H 1 # define ACC_WANT_ACC_INCE_H 1 # define ACC_WANT_ACC_INCI_H 1 #elif 1 # include #else # define ACC_WANT_ACC_INCD_H 1 #endif #if (LZO_ARCH_I086) # define ACC_MM_AHSHIFT LZO_MM_AHSHIFT # define ACC_PTR_FP_OFF(x) (((const unsigned __far*)&(x))[0]) # define ACC_PTR_FP_SEG(x) (((const unsigned __far*)&(x))[1]) # define ACC_PTR_MK_FP(s,o) ((void __far*)(((unsigned long)(s)<<16)+(unsigned)(o))) #endif #if !defined(lzo_uintptr_t) # if defined(__LZO_MMODEL_HUGE) # define lzo_uintptr_t unsigned long # elif 1 && defined(LZO_OS_OS400) && (LZO_SIZEOF_VOID_P == 16) # define __LZO_UINTPTR_T_IS_POINTER 1 typedef char* lzo_uintptr_t; # define lzo_uintptr_t lzo_uintptr_t # elif (LZO_SIZEOF_SIZE_T == LZO_SIZEOF_VOID_P) # define lzo_uintptr_t size_t # elif (LZO_SIZEOF_LONG == LZO_SIZEOF_VOID_P) # define lzo_uintptr_t unsigned long # elif (LZO_SIZEOF_INT == LZO_SIZEOF_VOID_P) # define lzo_uintptr_t unsigned int # elif (LZO_SIZEOF_LONG_LONG == LZO_SIZEOF_VOID_P) # define lzo_uintptr_t unsigned long long # else # define lzo_uintptr_t size_t # endif #endif LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp)) #if 1 && !defined(LZO_CFG_FREESTANDING) #if 1 && !defined(HAVE_STRING_H) #define HAVE_STRING_H 1 #endif #if 1 && !defined(HAVE_MEMCMP) #define HAVE_MEMCMP 1 #endif #if 1 && !defined(HAVE_MEMCPY) #define HAVE_MEMCPY 1 #endif #if 1 && !defined(HAVE_MEMMOVE) #define HAVE_MEMMOVE 1 #endif #if 1 && !defined(HAVE_MEMSET) #define HAVE_MEMSET 1 #endif #endif #if 1 && defined(HAVE_STRING_H) #include #endif #if (LZO_CFG_FREESTANDING) # undef HAVE_MEMCMP # undef HAVE_MEMCPY # undef HAVE_MEMMOVE # undef HAVE_MEMSET #endif #if !(HAVE_MEMCMP) # undef memcmp # define memcmp(a,b,c) lzo_memcmp(a,b,c) #elif !(__LZO_MMODEL_HUGE) # undef lzo_memcmp # define lzo_memcmp(a,b,c) memcmp(a,b,c) #endif #if !(HAVE_MEMCPY) # undef memcpy # define memcpy(a,b,c) lzo_memcpy(a,b,c) #elif !(__LZO_MMODEL_HUGE) # undef lzo_memcpy # define lzo_memcpy(a,b,c) memcpy(a,b,c) #endif #if !(HAVE_MEMMOVE) # undef memmove # define memmove(a,b,c) lzo_memmove(a,b,c) #elif !(__LZO_MMODEL_HUGE) # undef lzo_memmove # define lzo_memmove(a,b,c) memmove(a,b,c) #endif #if !(HAVE_MEMSET) # undef memset # define memset(a,b,c) lzo_memset(a,b,c) #elif !(__LZO_MMODEL_HUGE) # undef lzo_memset # define lzo_memset(a,b,c) memset(a,b,c) #endif #undef NDEBUG #if (LZO_CFG_FREESTANDING) # undef LZO_DEBUG # define NDEBUG 1 # undef assert # define assert(e) ((void)0) #else # if !defined(LZO_DEBUG) # define NDEBUG 1 # endif # include #endif #if 0 && defined(__BOUNDS_CHECKING_ON) # include #else # define BOUNDS_CHECKING_OFF_DURING(stmt) stmt # define BOUNDS_CHECKING_OFF_IN_EXPR(expr) (expr) #endif #if !defined(__lzo_inline) # define __lzo_inline /*empty*/ #endif #if !defined(__lzo_forceinline) # define __lzo_forceinline /*empty*/ #endif #if !defined(__lzo_noinline) # define __lzo_noinline /*empty*/ #endif #if (LZO_CFG_PGO) # undef __acc_likely # undef __acc_unlikely # undef __lzo_likely # undef __lzo_unlikely # define __acc_likely(e) (e) # define __acc_unlikely(e) (e) # define __lzo_likely(e) (e) # define __lzo_unlikely(e) (e) #endif #if 1 # define LZO_BYTE(x) ((unsigned char) (x)) #else # define LZO_BYTE(x) ((unsigned char) ((x) & 0xff)) #endif #define LZO_MAX(a,b) ((a) >= (b) ? (a) : (b)) #define LZO_MIN(a,b) ((a) <= (b) ? (a) : (b)) #define LZO_MAX3(a,b,c) ((a) >= (b) ? LZO_MAX(a,c) : LZO_MAX(b,c)) #define LZO_MIN3(a,b,c) ((a) <= (b) ? LZO_MIN(a,c) : LZO_MIN(b,c)) #define lzo_sizeof(type) ((lzo_uint) (sizeof(type))) #define LZO_HIGH(array) ((lzo_uint) (sizeof(array)/sizeof(*(array)))) #define LZO_SIZE(bits) (1u << (bits)) #define LZO_MASK(bits) (LZO_SIZE(bits) - 1) #define LZO_LSIZE(bits) (1ul << (bits)) #define LZO_LMASK(bits) (LZO_LSIZE(bits) - 1) #define LZO_USIZE(bits) ((lzo_uint) 1 << (bits)) #define LZO_UMASK(bits) (LZO_USIZE(bits) - 1) #if !defined(DMUL) #if 0 # define DMUL(a,b) ((lzo_xint) ((lzo_uint32)(a) * (lzo_uint32)(b))) #else # define DMUL(a,b) ((lzo_xint) ((a) * (b))) #endif #endif #if 1 && !(LZO_CFG_NO_UNALIGNED) #if 1 && (LZO_ARCH_AMD64 || LZO_ARCH_I386 || LZO_ARCH_POWERPC) # if (LZO_SIZEOF_SHORT == 2) # define LZO_UNALIGNED_OK_2 1 # endif # if (LZO_SIZEOF_INT == 4) # define LZO_UNALIGNED_OK_4 1 # endif #endif #endif #if defined(LZO_UNALIGNED_OK_2) LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(short) == 2) #endif #if defined(LZO_UNALIGNED_OK_4) LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint32) == 4) #elif defined(LZO_ALIGNED_OK_4) LZO_COMPILE_TIME_ASSERT_HEADER(sizeof(lzo_uint32) == 4) #endif #undef COPY4 #if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) # if 1 && defined(ACC_UA_COPY32) # define COPY4(d,s) ACC_UA_COPY32(d,s) # else # define COPY4(d,s) (* (__lzo_ua_volatile lzo_uint32p)(__lzo_ua_volatile lzo_voidp)(d) = * (__lzo_ua_volatile const lzo_uint32p)(__lzo_ua_volatile const lzo_voidp)(s)) # endif #endif #define MEMCPY8_DS(dest,src,len) \ lzo_memcpy(dest,src,len); dest += len; src += len #define BZERO8_PTR(s,l,n) \ lzo_memset((lzo_voidp)(s),0,(lzo_uint)(l)*(n)) #define MEMCPY_DS(dest,src,len) \ do *dest++ = *src++; while (--len > 0) LZO_EXTERN(const lzo_bytep) lzo_copyright(void); #ifndef __LZO_PTR_H #define __LZO_PTR_H 1 #ifdef __cplusplus extern "C" { #endif #if !defined(lzo_uintptr_t) # if (__LZO_MMODEL_HUGE) # define lzo_uintptr_t unsigned long # else # define lzo_uintptr_t acc_uintptr_t # ifdef __ACC_INTPTR_T_IS_POINTER # define __LZO_UINTPTR_T_IS_POINTER 1 # endif # endif #endif #if (LZO_ARCH_I086) #define PTR(a) ((lzo_bytep) (a)) #define PTR_ALIGNED_4(a) ((ACC_PTR_FP_OFF(a) & 3) == 0) #define PTR_ALIGNED2_4(a,b) (((ACC_PTR_FP_OFF(a) | ACC_PTR_FP_OFF(b)) & 3) == 0) #elif (LZO_MM_PVP) #define PTR(a) ((lzo_bytep) (a)) #define PTR_ALIGNED_8(a) ((((lzo_uintptr_t)(a)) >> 61) == 0) #define PTR_ALIGNED2_8(a,b) ((((lzo_uintptr_t)(a)|(lzo_uintptr_t)(b)) >> 61) == 0) #else #define PTR(a) ((lzo_uintptr_t) (a)) #define PTR_LINEAR(a) PTR(a) #define PTR_ALIGNED_4(a) ((PTR_LINEAR(a) & 3) == 0) #define PTR_ALIGNED_8(a) ((PTR_LINEAR(a) & 7) == 0) #define PTR_ALIGNED2_4(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 3) == 0) #define PTR_ALIGNED2_8(a,b) (((PTR_LINEAR(a) | PTR_LINEAR(b)) & 7) == 0) #endif #define PTR_LT(a,b) (PTR(a) < PTR(b)) #define PTR_GE(a,b) (PTR(a) >= PTR(b)) #define PTR_DIFF(a,b) (PTR(a) - PTR(b)) #define pd(a,b) ((lzo_uint) ((a)-(b))) LZO_EXTERN(lzo_uintptr_t) __lzo_ptr_linear(const lzo_voidp ptr); typedef union { char a_char; unsigned char a_uchar; short a_short; unsigned short a_ushort; int a_int; unsigned int a_uint; long a_long; unsigned long a_ulong; lzo_int a_lzo_int; lzo_uint a_lzo_uint; lzo_int32 a_lzo_int32; lzo_uint32 a_lzo_uint32; ptrdiff_t a_ptrdiff_t; lzo_uintptr_t a_lzo_uintptr_t; lzo_voidp a_lzo_voidp; void * a_void_p; lzo_bytep a_lzo_bytep; lzo_bytepp a_lzo_bytepp; lzo_uintp a_lzo_uintp; lzo_uint * a_lzo_uint_p; lzo_uint32p a_lzo_uint32p; lzo_uint32 * a_lzo_uint32_p; unsigned char * a_uchar_p; char * a_char_p; } lzo_full_align_t; #ifdef __cplusplus } #endif #endif #define LZO_DETERMINISTIC 1 #define LZO_DICT_USE_PTR 1 #if 0 && (LZO_ARCH_I086) # undef LZO_DICT_USE_PTR #endif #if (LZO_DICT_USE_PTR) # define lzo_dict_t const lzo_bytep # define lzo_dict_p lzo_dict_t __LZO_MMODEL * #else # define lzo_dict_t lzo_uint # define lzo_dict_p lzo_dict_t __LZO_MMODEL * #endif #endif #if !defined(MINILZO_CFG_SKIP_LZO_PTR) LZO_PUBLIC(lzo_uintptr_t) __lzo_ptr_linear(const lzo_voidp ptr) { lzo_uintptr_t p; #if (LZO_ARCH_I086) p = (((lzo_uintptr_t)(ACC_PTR_FP_SEG(ptr))) << (16 - ACC_MM_AHSHIFT)) + (ACC_PTR_FP_OFF(ptr)); #elif (LZO_MM_PVP) p = (lzo_uintptr_t) (ptr); p = (p << 3) | (p >> 61); #else p = (lzo_uintptr_t) PTR_LINEAR(ptr); #endif return p; } LZO_PUBLIC(unsigned) __lzo_align_gap(const lzo_voidp ptr, lzo_uint size) { #if defined(__LZO_UINTPTR_T_IS_POINTER) size_t n = (size_t) ptr; n = (((n + size - 1) / size) * size) - n; #else lzo_uintptr_t p, n; p = __lzo_ptr_linear(ptr); n = (((p + size - 1) / size) * size) - p; #endif assert(size > 0); assert((long)n >= 0); assert(n <= size); return (unsigned)n; } #endif #if !defined(MINILZO_CFG_SKIP_LZO_UTIL) /* If you use the LZO library in a product, I would appreciate that you * keep this copyright string in the executable of your product. */ static const char __lzo_copyright[] = #if !defined(__LZO_IN_MINLZO) LZO_VERSION_STRING; #else "\r\n\n" "LZO data compression library.\n" "$Copyright: LZO Copyright (C) 1996-2010 Markus Franz Xaver Johannes Oberhumer\n" "\n" "http://www.oberhumer.com $\n\n" "$Id: LZO version: v" LZO_VERSION_STRING ", " LZO_VERSION_DATE " $\n" "$Info: " LZO_INFO_STRING " $\n"; #endif LZO_PUBLIC(const lzo_bytep) lzo_copyright(void) { #if (LZO_OS_DOS16 && LZO_CC_TURBOC) return (lzo_voidp) __lzo_copyright; #else return (const lzo_bytep) __lzo_copyright; #endif } LZO_PUBLIC(unsigned) lzo_version(void) { return LZO_VERSION; } LZO_PUBLIC(const char *) lzo_version_string(void) { return LZO_VERSION_STRING; } LZO_PUBLIC(const char *) lzo_version_date(void) { return LZO_VERSION_DATE; } LZO_PUBLIC(const lzo_charp) _lzo_version_string(void) { return LZO_VERSION_STRING; } LZO_PUBLIC(const lzo_charp) _lzo_version_date(void) { return LZO_VERSION_DATE; } #define LZO_BASE 65521u #define LZO_NMAX 5552 #define LZO_DO1(buf,i) s1 += buf[i]; s2 += s1 #define LZO_DO2(buf,i) LZO_DO1(buf,i); LZO_DO1(buf,i+1); #define LZO_DO4(buf,i) LZO_DO2(buf,i); LZO_DO2(buf,i+2); #define LZO_DO8(buf,i) LZO_DO4(buf,i); LZO_DO4(buf,i+4); #define LZO_DO16(buf,i) LZO_DO8(buf,i); LZO_DO8(buf,i+8); LZO_PUBLIC(lzo_uint32) lzo_adler32(lzo_uint32 adler, const lzo_bytep buf, lzo_uint len) { lzo_uint32 s1 = adler & 0xffff; lzo_uint32 s2 = (adler >> 16) & 0xffff; unsigned k; if (buf == NULL) return 1; while (len > 0) { k = len < LZO_NMAX ? (unsigned) len : LZO_NMAX; len -= k; if (k >= 16) do { LZO_DO16(buf,0); buf += 16; k -= 16; } while (k >= 16); if (k != 0) do { s1 += *buf++; s2 += s1; } while (--k > 0); s1 %= LZO_BASE; s2 %= LZO_BASE; } return (s2 << 16) | s1; } #undef LZO_DO1 #undef LZO_DO2 #undef LZO_DO4 #undef LZO_DO8 #undef LZO_DO16 #endif #if !defined(MINILZO_CFG_SKIP_LZO_STRING) #undef lzo_memcmp #undef lzo_memcpy #undef lzo_memmove #undef lzo_memset #if !defined(__LZO_MMODEL_HUGE) # undef LZO_HAVE_MM_HUGE_PTR #endif #define lzo_hsize_t lzo_uint #define lzo_hvoid_p lzo_voidp #define lzo_hbyte_p lzo_bytep #define LZOLIB_PUBLIC(r,f) LZO_PUBLIC(r) f #define lzo_hmemcmp lzo_memcmp #define lzo_hmemcpy lzo_memcpy #define lzo_hmemmove lzo_memmove #define lzo_hmemset lzo_memset #define __LZOLIB_HMEMCPY_CH_INCLUDED 1 #if !defined(LZOLIB_PUBLIC) # define LZOLIB_PUBLIC(r,f) r __LZOLIB_FUNCNAME(f) #endif LZOLIB_PUBLIC(int, lzo_hmemcmp) (const lzo_hvoid_p s1, const lzo_hvoid_p s2, lzo_hsize_t len) { #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCMP) const lzo_hbyte_p p1 = (const lzo_hbyte_p) s1; const lzo_hbyte_p p2 = (const lzo_hbyte_p) s2; if __lzo_likely(len > 0) do { int d = *p1 - *p2; if (d != 0) return d; p1++; p2++; } while __lzo_likely(--len > 0); return 0; #else return memcmp(s1, s2, len); #endif } LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemcpy) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len) { #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMCPY) lzo_hbyte_p p1 = (lzo_hbyte_p) dest; const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; if (!(len > 0) || p1 == p2) return dest; do *p1++ = *p2++; while __lzo_likely(--len > 0); return dest; #else return memcpy(dest, src, len); #endif } LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemmove) (lzo_hvoid_p dest, const lzo_hvoid_p src, lzo_hsize_t len) { #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMMOVE) lzo_hbyte_p p1 = (lzo_hbyte_p) dest; const lzo_hbyte_p p2 = (const lzo_hbyte_p) src; if (!(len > 0) || p1 == p2) return dest; if (p1 < p2) { do *p1++ = *p2++; while __lzo_likely(--len > 0); } else { p1 += len; p2 += len; do *--p1 = *--p2; while __lzo_likely(--len > 0); } return dest; #else return memmove(dest, src, len); #endif } LZOLIB_PUBLIC(lzo_hvoid_p, lzo_hmemset) (lzo_hvoid_p s, int c, lzo_hsize_t len) { #if (LZO_HAVE_MM_HUGE_PTR) || !(HAVE_MEMSET) lzo_hbyte_p p = (lzo_hbyte_p) s; if __lzo_likely(len > 0) do *p++ = (unsigned char) c; while __lzo_likely(--len > 0); return s; #else return memset(s, c, len); #endif } #undef LZOLIB_PUBLIC #endif #if !defined(MINILZO_CFG_SKIP_LZO_INIT) #if !defined(__LZO_IN_MINILZO) #define ACC_WANT_ACC_CHK_CH 1 #undef ACCCHK_ASSERT ACCCHK_ASSERT_IS_SIGNED_T(lzo_int) ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint) ACCCHK_ASSERT_IS_SIGNED_T(lzo_int32) ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uint32) ACCCHK_ASSERT((LZO_UINT32_C(1) << (int)(8*sizeof(LZO_UINT32_C(1))-1)) > 0) ACCCHK_ASSERT(sizeof(lzo_uint32) >= 4) #if !defined(__LZO_UINTPTR_T_IS_POINTER) ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_uintptr_t) #endif ACCCHK_ASSERT(sizeof(lzo_uintptr_t) >= sizeof(lzo_voidp)) ACCCHK_ASSERT_IS_UNSIGNED_T(lzo_xint) ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint32)) ACCCHK_ASSERT(sizeof(lzo_xint) >= sizeof(lzo_uint)) ACCCHK_ASSERT(sizeof(lzo_xint) == sizeof(lzo_uint32) || sizeof(lzo_xint) == sizeof(lzo_uint)) #endif #undef ACCCHK_ASSERT #if 0 #define u2p(ptr,off) ((lzo_voidp) (((lzo_bytep)(lzo_voidp)(ptr)) + (off))) #else static __lzo_noinline lzo_voidp u2p(lzo_voidp ptr, lzo_uint off) { return (lzo_voidp) ((lzo_bytep) ptr + off); } #endif LZO_PUBLIC(int) _lzo_config_check(void) { lzo_bool r = 1; union { lzo_xint a[2]; unsigned char b[2*sizeof(lzo_xint)]; unsigned short x[2]; lzo_uint32 y[2]; lzo_uint z[2]; } u; lzo_voidp p; u.a[0] = u.a[1] = 0; p = u2p(&u, 0); r &= ((* (lzo_bytep) p) == 0); #if !defined(LZO_CFG_NO_CONFIG_CHECK) #if defined(LZO_ABI_BIG_ENDIAN) u.a[0] = u.a[1] = 0; u.b[sizeof(lzo_uint) - 1] = 128; p = u2p(&u, 0); r &= ((* (lzo_uintp) p) == 128); #endif #if defined(LZO_ABI_LITTLE_ENDIAN) u.a[0] = u.a[1] = 0; u.b[0] = 128; p = u2p(&u, 0); r &= ((* (lzo_uintp) p) == 128); #endif #if defined(LZO_UNALIGNED_OK_2) u.a[0] = u.a[1] = 0; u.b[0] = 1; u.b[sizeof(unsigned short) + 1] = 2; p = u2p(&u, 1); r &= ((* (lzo_ushortp) p) == 0); #endif #if defined(LZO_UNALIGNED_OK_4) u.a[0] = u.a[1] = 0; u.b[0] = 3; u.b[sizeof(lzo_uint32) + 1] = 4; p = u2p(&u, 1); r &= ((* (lzo_uint32p) p) == 0); #endif #endif return r == 1 ? LZO_E_OK : LZO_E_ERROR; } LZO_PUBLIC(int) __lzo_init_v2(unsigned v, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9) { int r; #if defined(__LZO_IN_MINILZO) #elif (LZO_CC_MSC && ((_MSC_VER) < 700)) #else #define ACC_WANT_ACC_CHK_CH 1 #undef ACCCHK_ASSERT #define ACCCHK_ASSERT(expr) LZO_COMPILE_TIME_ASSERT(expr) #endif #undef ACCCHK_ASSERT if (v == 0) return LZO_E_ERROR; r = (s1 == -1 || s1 == (int) sizeof(short)) && (s2 == -1 || s2 == (int) sizeof(int)) && (s3 == -1 || s3 == (int) sizeof(long)) && (s4 == -1 || s4 == (int) sizeof(lzo_uint32)) && (s5 == -1 || s5 == (int) sizeof(lzo_uint)) && (s6 == -1 || s6 == (int) lzo_sizeof_dict_t) && (s7 == -1 || s7 == (int) sizeof(char *)) && (s8 == -1 || s8 == (int) sizeof(lzo_voidp)) && (s9 == -1 || s9 == (int) sizeof(lzo_callback_t)); if (!r) return LZO_E_ERROR; r = _lzo_config_check(); if (r != LZO_E_OK) return r; return r; } #if !defined(__LZO_IN_MINILZO) #if (LZO_OS_WIN16 && LZO_CC_WATCOMC) && defined(__SW_BD) #if 0 BOOL FAR PASCAL LibMain ( HANDLE hInstance, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine ) #else int __far __pascal LibMain ( int a, short b, short c, long d ) #endif { LZO_UNUSED(a); LZO_UNUSED(b); LZO_UNUSED(c); LZO_UNUSED(d); return 1; } #endif #endif #endif #define LZO1X 1 #define LZO_EOF_CODE 1 #define M2_MAX_OFFSET 0x0800 #if !defined(MINILZO_CFG_SKIP_LZO1X_1_COMPRESS) #define LZO_NEED_DICT_H 1 #define D_BITS 14 #define D_INDEX1(d,p) d = DM(DMUL(0x21,DX3(p,5,5,6)) >> 5) #define D_INDEX2(d,p) d = (d & (D_MASK & 0x7ff)) ^ (D_HIGH | 0x1f) #ifndef __LZO_CONFIG1X_H #define __LZO_CONFIG1X_H 1 #if !defined(LZO1X) && !defined(LZO1Y) && !defined(LZO1Z) # define LZO1X 1 #endif #if !defined(__LZO_IN_MINILZO) #include "lzo/lzo1x.h" #endif #ifndef LZO_EOF_CODE #define LZO_EOF_CODE 1 #endif #undef LZO_DETERMINISTIC #define M1_MAX_OFFSET 0x0400 #ifndef M2_MAX_OFFSET #define M2_MAX_OFFSET 0x0800 #endif #define M3_MAX_OFFSET 0x4000 #define M4_MAX_OFFSET 0xbfff #define MX_MAX_OFFSET (M1_MAX_OFFSET + M2_MAX_OFFSET) #define M1_MIN_LEN 2 #define M1_MAX_LEN 2 #define M2_MIN_LEN 3 #ifndef M2_MAX_LEN #define M2_MAX_LEN 8 #endif #define M3_MIN_LEN 3 #define M3_MAX_LEN 33 #define M4_MIN_LEN 3 #define M4_MAX_LEN 9 #define M1_MARKER 0 #define M2_MARKER 64 #define M3_MARKER 32 #define M4_MARKER 16 #ifndef MIN_LOOKAHEAD #define MIN_LOOKAHEAD (M2_MAX_LEN + 1) #endif #if defined(LZO_NEED_DICT_H) #ifndef LZO_HASH #define LZO_HASH LZO_HASH_LZO_INCREMENTAL_B #endif #define DL_MIN_LEN M2_MIN_LEN #ifndef __LZO_DICT_H #define __LZO_DICT_H 1 #ifdef __cplusplus extern "C" { #endif #if !defined(D_BITS) && defined(DBITS) # define D_BITS DBITS #endif #if !defined(D_BITS) # error "D_BITS is not defined" #endif #if (D_BITS < 16) # define D_SIZE LZO_SIZE(D_BITS) # define D_MASK LZO_MASK(D_BITS) #else # define D_SIZE LZO_USIZE(D_BITS) # define D_MASK LZO_UMASK(D_BITS) #endif #define D_HIGH ((D_MASK >> 1) + 1) #if !defined(DD_BITS) # define DD_BITS 0 #endif #define DD_SIZE LZO_SIZE(DD_BITS) #define DD_MASK LZO_MASK(DD_BITS) #if !defined(DL_BITS) # define DL_BITS (D_BITS - DD_BITS) #endif #if (DL_BITS < 16) # define DL_SIZE LZO_SIZE(DL_BITS) # define DL_MASK LZO_MASK(DL_BITS) #else # define DL_SIZE LZO_USIZE(DL_BITS) # define DL_MASK LZO_UMASK(DL_BITS) #endif #if (D_BITS != DL_BITS + DD_BITS) # error "D_BITS does not match" #endif #if (D_BITS < 6 || D_BITS > 18) # error "invalid D_BITS" #endif #if (DL_BITS < 6 || DL_BITS > 20) # error "invalid DL_BITS" #endif #if (DD_BITS < 0 || DD_BITS > 6) # error "invalid DD_BITS" #endif #if !defined(DL_MIN_LEN) # define DL_MIN_LEN 3 #endif #if !defined(DL_SHIFT) # define DL_SHIFT ((DL_BITS + (DL_MIN_LEN - 1)) / DL_MIN_LEN) #endif #define LZO_HASH_GZIP 1 #define LZO_HASH_GZIP_INCREMENTAL 2 #define LZO_HASH_LZO_INCREMENTAL_A 3 #define LZO_HASH_LZO_INCREMENTAL_B 4 #if !defined(LZO_HASH) # error "choose a hashing strategy" #endif #undef DM #undef DX #if (DL_MIN_LEN == 3) # define _DV2_A(p,shift1,shift2) \ (((( (lzo_xint)((p)[0]) << shift1) ^ (p)[1]) << shift2) ^ (p)[2]) # define _DV2_B(p,shift1,shift2) \ (((( (lzo_xint)((p)[2]) << shift1) ^ (p)[1]) << shift2) ^ (p)[0]) # define _DV3_B(p,shift1,shift2,shift3) \ ((_DV2_B((p)+1,shift1,shift2) << (shift3)) ^ (p)[0]) #elif (DL_MIN_LEN == 2) # define _DV2_A(p,shift1,shift2) \ (( (lzo_xint)(p[0]) << shift1) ^ p[1]) # define _DV2_B(p,shift1,shift2) \ (( (lzo_xint)(p[1]) << shift1) ^ p[2]) #else # error "invalid DL_MIN_LEN" #endif #define _DV_A(p,shift) _DV2_A(p,shift,shift) #define _DV_B(p,shift) _DV2_B(p,shift,shift) #define DA2(p,s1,s2) \ (((((lzo_xint)((p)[2]) << (s2)) + (p)[1]) << (s1)) + (p)[0]) #define DS2(p,s1,s2) \ (((((lzo_xint)((p)[2]) << (s2)) - (p)[1]) << (s1)) - (p)[0]) #define DX2(p,s1,s2) \ (((((lzo_xint)((p)[2]) << (s2)) ^ (p)[1]) << (s1)) ^ (p)[0]) #define DA3(p,s1,s2,s3) ((DA2((p)+1,s2,s3) << (s1)) + (p)[0]) #define DS3(p,s1,s2,s3) ((DS2((p)+1,s2,s3) << (s1)) - (p)[0]) #define DX3(p,s1,s2,s3) ((DX2((p)+1,s2,s3) << (s1)) ^ (p)[0]) #define DMS(v,s) ((lzo_uint) (((v) & (D_MASK >> (s))) << (s))) #define DM(v) DMS(v,0) #if (LZO_HASH == LZO_HASH_GZIP) # define _DINDEX(dv,p) (_DV_A((p),DL_SHIFT)) #elif (LZO_HASH == LZO_HASH_GZIP_INCREMENTAL) # define __LZO_HASH_INCREMENTAL 1 # define DVAL_FIRST(dv,p) dv = _DV_A((p),DL_SHIFT) # define DVAL_NEXT(dv,p) dv = (((dv) << DL_SHIFT) ^ p[2]) # define _DINDEX(dv,p) (dv) # define DVAL_LOOKAHEAD DL_MIN_LEN #elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_A) # define __LZO_HASH_INCREMENTAL 1 # define DVAL_FIRST(dv,p) dv = _DV_A((p),5) # define DVAL_NEXT(dv,p) \ dv ^= (lzo_xint)(p[-1]) << (2*5); dv = (((dv) << 5) ^ p[2]) # define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) # define DVAL_LOOKAHEAD DL_MIN_LEN #elif (LZO_HASH == LZO_HASH_LZO_INCREMENTAL_B) # define __LZO_HASH_INCREMENTAL 1 # define DVAL_FIRST(dv,p) dv = _DV_B((p),5) # define DVAL_NEXT(dv,p) \ dv ^= p[-1]; dv = (((dv) >> 5) ^ ((lzo_xint)(p[2]) << (2*5))) # define _DINDEX(dv,p) ((DMUL(0x9f5f,dv)) >> 5) # define DVAL_LOOKAHEAD DL_MIN_LEN #else # error "choose a hashing strategy" #endif #ifndef DINDEX #define DINDEX(dv,p) ((lzo_uint)((_DINDEX(dv,p)) & DL_MASK) << DD_BITS) #endif #if !defined(DINDEX1) && defined(D_INDEX1) #define DINDEX1 D_INDEX1 #endif #if !defined(DINDEX2) && defined(D_INDEX2) #define DINDEX2 D_INDEX2 #endif #if !defined(__LZO_HASH_INCREMENTAL) # define DVAL_FIRST(dv,p) ((void) 0) # define DVAL_NEXT(dv,p) ((void) 0) # define DVAL_LOOKAHEAD 0 #endif #if !defined(DVAL_ASSERT) #if defined(__LZO_HASH_INCREMENTAL) && !defined(NDEBUG) #if (LZO_CC_CLANG || (LZO_CC_GNUC >= 0x020700ul) || LZO_CC_LLVM) static void __attribute__((__unused__)) #else static void #endif DVAL_ASSERT(lzo_xint dv, const lzo_bytep p) { lzo_xint df; DVAL_FIRST(df,(p)); assert(DINDEX(dv,p) == DINDEX(df,p)); } #else # define DVAL_ASSERT(dv,p) ((void) 0) #endif #endif #if defined(LZO_DICT_USE_PTR) # define DENTRY(p,in) (p) # define GINDEX(m_pos,m_off,dict,dindex,in) m_pos = dict[dindex] #else # define DENTRY(p,in) ((lzo_uint) ((p)-(in))) # define GINDEX(m_pos,m_off,dict,dindex,in) m_off = dict[dindex] #endif #if (DD_BITS == 0) # define UPDATE_D(dict,drun,dv,p,in) dict[ DINDEX(dv,p) ] = DENTRY(p,in) # define UPDATE_I(dict,drun,index,p,in) dict[index] = DENTRY(p,in) # define UPDATE_P(ptr,drun,p,in) (ptr)[0] = DENTRY(p,in) #else # define UPDATE_D(dict,drun,dv,p,in) \ dict[ DINDEX(dv,p) + drun++ ] = DENTRY(p,in); drun &= DD_MASK # define UPDATE_I(dict,drun,index,p,in) \ dict[ (index) + drun++ ] = DENTRY(p,in); drun &= DD_MASK # define UPDATE_P(ptr,drun,p,in) \ (ptr) [ drun++ ] = DENTRY(p,in); drun &= DD_MASK #endif #if defined(LZO_DICT_USE_PTR) #define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ (m_pos == NULL || (m_off = pd(ip, m_pos)) > max_offset) #define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ (BOUNDS_CHECKING_OFF_IN_EXPR(( \ m_pos = ip - (lzo_uint) PTR_DIFF(ip,m_pos), \ PTR_LT(m_pos,in) || \ (m_off = (lzo_uint) PTR_DIFF(ip,m_pos)) == 0 || \ m_off > max_offset ))) #else #define LZO_CHECK_MPOS_DET(m_pos,m_off,in,ip,max_offset) \ (m_off == 0 || \ ((m_off = pd(ip, in) - m_off) > max_offset) || \ (m_pos = (ip) - (m_off), 0) ) #define LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,max_offset) \ (pd(ip, in) <= m_off || \ ((m_off = pd(ip, in) - m_off) > max_offset) || \ (m_pos = (ip) - (m_off), 0) ) #endif #if defined(LZO_DETERMINISTIC) # define LZO_CHECK_MPOS LZO_CHECK_MPOS_DET #else # define LZO_CHECK_MPOS LZO_CHECK_MPOS_NON_DET #endif #ifdef __cplusplus } #endif #endif #endif #endif #define do_compress _lzo1x_1_do_compress #define DO_COMPRESS lzo1x_1_compress #if 1 && defined(DO_COMPRESS) && !defined(do_compress) # define do_compress LZO_CPP_ECONCAT2(DO_COMPRESS,_core) #endif static __lzo_noinline lzo_uint do_compress ( const lzo_bytep in , lzo_uint in_len, lzo_bytep out, lzo_uintp out_len, lzo_voidp wrkmem ) { register const lzo_bytep ip; lzo_bytep op; const lzo_bytep const in_end = in + in_len; const lzo_bytep const ip_end = in + in_len - M2_MAX_LEN - 5; const lzo_bytep ii; lzo_dict_p const dict = (lzo_dict_p) wrkmem; op = out; ip = in; ii = ip; ip += 4; for (;;) { register const lzo_bytep m_pos; LZO_DEFINE_UNINITIALIZED_VAR(lzo_uint, m_off, 0); lzo_uint m_len; lzo_uint dindex; DINDEX1(dindex,ip); GINDEX(m_pos,m_off,dict,dindex,in); if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) goto literal; #if 1 if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) goto try_match; DINDEX2(dindex,ip); #endif GINDEX(m_pos,m_off,dict,dindex,in); if (LZO_CHECK_MPOS_NON_DET(m_pos,m_off,in,ip,M4_MAX_OFFSET)) goto literal; if (m_off <= M2_MAX_OFFSET || m_pos[3] == ip[3]) goto try_match; goto literal; try_match: #if 1 && defined(LZO_UNALIGNED_OK_2) if (* (const lzo_ushortp) (const lzo_voidp) m_pos != * (const lzo_ushortp) (const lzo_voidp) ip) #else if (m_pos[0] != ip[0] || m_pos[1] != ip[1]) #endif { } else { if __lzo_likely(m_pos[2] == ip[2]) { #if 0 if (m_off <= M2_MAX_OFFSET) goto match; if (lit <= 3) goto match; if (lit == 3) { assert(op - 2 > out); op[-2] |= LZO_BYTE(3); *op++ = *ii++; *op++ = *ii++; *op++ = *ii++; goto code_match; } if (m_pos[3] == ip[3]) #endif goto match; } else { #if 0 #if 0 if (m_off <= M1_MAX_OFFSET && lit > 0 && lit <= 3) #else if (m_off <= M1_MAX_OFFSET && lit == 3) #endif { register lzo_uint t; t = lit; assert(op - 2 > out); op[-2] |= LZO_BYTE(t); do *op++ = *ii++; while (--t > 0); assert(ii == ip); m_off -= 1; *op++ = LZO_BYTE(M1_MARKER | ((m_off & 3) << 2)); *op++ = LZO_BYTE(m_off >> 2); ip += 2; goto match_done; } #endif } } literal: UPDATE_I(dict,0,dindex,ip,in); ++ip; if __lzo_unlikely(ip >= ip_end) break; continue; match: UPDATE_I(dict,0,dindex,ip,in); if (pd(ip,ii) > 0) { register lzo_uint t = pd(ip,ii); if (t <= 3) { assert(op - 2 > out); op[-2] |= LZO_BYTE(t); } else if (t <= 18) *op++ = LZO_BYTE(t - 3); else { register lzo_uint tt = t - 18; *op++ = 0; while (tt > 255) { tt -= 255; *op++ = 0; } assert(tt > 0); *op++ = LZO_BYTE(tt); } do *op++ = *ii++; while (--t > 0); } assert(ii == ip); ip += 3; if (m_pos[3] != *ip++ || m_pos[4] != *ip++ || m_pos[5] != *ip++ || m_pos[6] != *ip++ || m_pos[7] != *ip++ || m_pos[8] != *ip++ #ifdef LZO1Y || m_pos[ 9] != *ip++ || m_pos[10] != *ip++ || m_pos[11] != *ip++ || m_pos[12] != *ip++ || m_pos[13] != *ip++ || m_pos[14] != *ip++ #endif ) { --ip; m_len = pd(ip, ii); assert(m_len >= 3); assert(m_len <= M2_MAX_LEN); if (m_off <= M2_MAX_OFFSET) { m_off -= 1; #if defined(LZO1X) *op++ = LZO_BYTE(((m_len - 1) << 5) | ((m_off & 7) << 2)); *op++ = LZO_BYTE(m_off >> 3); #elif defined(LZO1Y) *op++ = LZO_BYTE(((m_len + 1) << 4) | ((m_off & 3) << 2)); *op++ = LZO_BYTE(m_off >> 2); #endif } else if (m_off <= M3_MAX_OFFSET) { m_off -= 1; *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); goto m3_m4_offset; } else #if defined(LZO1X) { m_off -= 0x4000; assert(m_off > 0); assert(m_off <= 0x7fff); *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11) | (m_len - 2)); goto m3_m4_offset; } #elif defined(LZO1Y) goto m4_match; #endif } else { { const lzo_bytep end = in_end; const lzo_bytep m = m_pos + M2_MAX_LEN + 1; while (ip < end && *m == *ip) m++, ip++; m_len = pd(ip, ii); } assert(m_len > M2_MAX_LEN); if (m_off <= M3_MAX_OFFSET) { m_off -= 1; if (m_len <= 33) *op++ = LZO_BYTE(M3_MARKER | (m_len - 2)); else { m_len -= 33; *op++ = M3_MARKER | 0; goto m3_m4_len; } } else { #if defined(LZO1Y) m4_match: #endif m_off -= 0x4000; assert(m_off > 0); assert(m_off <= 0x7fff); if (m_len <= M4_MAX_LEN) *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11) | (m_len - 2)); else { m_len -= M4_MAX_LEN; *op++ = LZO_BYTE(M4_MARKER | ((m_off & 0x4000) >> 11)); m3_m4_len: while (m_len > 255) { m_len -= 255; *op++ = 0; } assert(m_len > 0); *op++ = LZO_BYTE(m_len); } } m3_m4_offset: *op++ = LZO_BYTE((m_off & 63) << 2); *op++ = LZO_BYTE(m_off >> 6); } #if 0 match_done: #endif ii = ip; if __lzo_unlikely(ip >= ip_end) break; } *out_len = pd(op, out); return pd(in_end,ii); } LZO_PUBLIC(int) DO_COMPRESS ( const lzo_bytep in , lzo_uint in_len, lzo_bytep out, lzo_uintp out_len, lzo_voidp wrkmem ) { lzo_bytep op = out; lzo_uint t; if __lzo_unlikely(in_len <= M2_MAX_LEN + 5) t = in_len; else { t = do_compress(in,in_len,op,out_len,wrkmem); op += *out_len; } if (t > 0) { const lzo_bytep ii = in + in_len - t; if (op == out && t <= 238) *op++ = LZO_BYTE(17 + t); else if (t <= 3) op[-2] |= LZO_BYTE(t); else if (t <= 18) *op++ = LZO_BYTE(t - 3); else { lzo_uint tt = t - 18; *op++ = 0; while (tt > 255) { tt -= 255; *op++ = 0; } assert(tt > 0); *op++ = LZO_BYTE(tt); } do *op++ = *ii++; while (--t > 0); } *op++ = M4_MARKER | 1; *op++ = 0; *op++ = 0; *out_len = pd(op, out); return LZO_E_OK; } #endif #undef do_compress #undef DO_COMPRESS #undef LZO_HASH #undef LZO_TEST_OVERRUN #undef DO_DECOMPRESS #define DO_DECOMPRESS lzo1x_decompress #if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS) #if defined(LZO_TEST_OVERRUN) # if !defined(LZO_TEST_OVERRUN_INPUT) # define LZO_TEST_OVERRUN_INPUT 2 # endif # if !defined(LZO_TEST_OVERRUN_OUTPUT) # define LZO_TEST_OVERRUN_OUTPUT 2 # endif # if !defined(LZO_TEST_OVERRUN_LOOKBEHIND) # define LZO_TEST_OVERRUN_LOOKBEHIND 1 # endif #endif #undef TEST_IP #undef TEST_OP #undef TEST_LB #undef TEST_LBO #undef NEED_IP #undef NEED_OP #undef HAVE_TEST_IP #undef HAVE_TEST_OP #undef HAVE_NEED_IP #undef HAVE_NEED_OP #undef HAVE_ANY_IP #undef HAVE_ANY_OP #if defined(LZO_TEST_OVERRUN_INPUT) # if (LZO_TEST_OVERRUN_INPUT >= 1) # define TEST_IP (ip < ip_end) # endif # if (LZO_TEST_OVERRUN_INPUT >= 2) # define NEED_IP(x) \ if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun # endif #endif #if defined(LZO_TEST_OVERRUN_OUTPUT) # if (LZO_TEST_OVERRUN_OUTPUT >= 1) # define TEST_OP (op <= op_end) # endif # if (LZO_TEST_OVERRUN_OUTPUT >= 2) # undef TEST_OP # define NEED_OP(x) \ if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun # endif #endif #if defined(LZO_TEST_OVERRUN_LOOKBEHIND) # define TEST_LB(m_pos) if (m_pos < out || m_pos >= op) goto lookbehind_overrun # define TEST_LBO(m_pos,o) if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun #else # define TEST_LB(m_pos) ((void) 0) # define TEST_LBO(m_pos,o) ((void) 0) #endif #if !defined(LZO_EOF_CODE) && !defined(TEST_IP) # define TEST_IP (ip < ip_end) #endif #if defined(TEST_IP) # define HAVE_TEST_IP 1 #else # define TEST_IP 1 #endif #if defined(TEST_OP) # define HAVE_TEST_OP 1 #else # define TEST_OP 1 #endif #if defined(NEED_IP) # define HAVE_NEED_IP 1 #else # define NEED_IP(x) ((void) 0) #endif #if defined(NEED_OP) # define HAVE_NEED_OP 1 #else # define NEED_OP(x) ((void) 0) #endif #if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) # define HAVE_ANY_IP 1 #endif #if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) # define HAVE_ANY_OP 1 #endif #if defined(DO_DECOMPRESS) LZO_PUBLIC(int) DO_DECOMPRESS ( const lzo_bytep in , lzo_uint in_len, lzo_bytep out, lzo_uintp out_len, lzo_voidp wrkmem ) #endif { register lzo_bytep op; register const lzo_bytep ip; register lzo_uint t; #if defined(COPY_DICT) lzo_uint m_off; const lzo_bytep dict_end; #else register const lzo_bytep m_pos; #endif const lzo_bytep const ip_end = in + in_len; #if defined(HAVE_ANY_OP) lzo_bytep const op_end = out + *out_len; #endif #if defined(LZO1Z) lzo_uint last_m_off = 0; #endif LZO_UNUSED(wrkmem); #if defined(COPY_DICT) if (dict) { if (dict_len > M4_MAX_OFFSET) { dict += dict_len - M4_MAX_OFFSET; dict_len = M4_MAX_OFFSET; } dict_end = dict + dict_len; } else { dict_len = 0; dict_end = NULL; } #endif *out_len = 0; op = out; ip = in; if (*ip > 17) { t = *ip++ - 17; if (t < 4) goto match_next; assert(t > 0); NEED_OP(t); NEED_IP(t+1); do *op++ = *ip++; while (--t > 0); goto first_literal_run; } while (TEST_IP && TEST_OP) { t = *ip++; if (t >= 16) goto match; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 15 + *ip++; } assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); #if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) if (PTR_ALIGNED2_4(op,ip)) { #endif COPY4(op,ip); op += 4; ip += 4; if (--t > 0) { if (t >= 4) { do { COPY4(op,ip); op += 4; ip += 4; t -= 4; } while (t >= 4); if (t > 0) do *op++ = *ip++; while (--t > 0); } else do *op++ = *ip++; while (--t > 0); } #if !defined(LZO_UNALIGNED_OK_4) } else #endif #endif #if !defined(LZO_UNALIGNED_OK_4) { *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; do *op++ = *ip++; while (--t > 0); } #endif first_literal_run: t = *ip++; if (t >= 16) goto match; #if defined(COPY_DICT) #if defined(LZO1Z) m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); last_m_off = m_off; #else m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); #endif NEED_OP(3); t = 3; COPY_DICT(t,m_off) #else #if defined(LZO1Z) t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); m_pos = op - t; last_m_off = t; #else m_pos = op - (1 + M2_MAX_OFFSET); m_pos -= t >> 2; m_pos -= *ip++ << 2; #endif TEST_LB(m_pos); NEED_OP(3); *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; #endif goto match_done; do { match: if (t >= 64) { #if defined(COPY_DICT) #if defined(LZO1X) m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); t = (t >> 5) - 1; #elif defined(LZO1Y) m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); t = (t >> 4) - 3; #elif defined(LZO1Z) m_off = t & 0x1f; if (m_off >= 0x1c) m_off = last_m_off; else { m_off = 1 + (m_off << 6) + (*ip++ >> 2); last_m_off = m_off; } t = (t >> 5) - 1; #endif #else #if defined(LZO1X) m_pos = op - 1; m_pos -= (t >> 2) & 7; m_pos -= *ip++ << 3; t = (t >> 5) - 1; #elif defined(LZO1Y) m_pos = op - 1; m_pos -= (t >> 2) & 3; m_pos -= *ip++ << 2; t = (t >> 4) - 3; #elif defined(LZO1Z) { lzo_uint off = t & 0x1f; m_pos = op; if (off >= 0x1c) { assert(last_m_off > 0); m_pos -= last_m_off; } else { off = 1 + (off << 6) + (*ip++ >> 2); m_pos -= off; last_m_off = off; } } t = (t >> 5) - 1; #endif TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); goto copy_match; #endif } else if (t >= 32) { t &= 31; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 31 + *ip++; } #if defined(COPY_DICT) #if defined(LZO1Z) m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); last_m_off = m_off; #else m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); #endif #else #if defined(LZO1Z) { lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); m_pos = op - off; last_m_off = off; } #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) m_pos = op - 1; m_pos -= (* (const lzo_ushortp) (const lzo_voidp) ip) >> 2; #else m_pos = op - 1; m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif #endif ip += 2; } else if (t >= 16) { #if defined(COPY_DICT) m_off = (t & 8) << 11; #else m_pos = op; m_pos -= (t & 8) << 11; #endif t &= 7; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 7 + *ip++; } #if defined(COPY_DICT) #if defined(LZO1Z) m_off += (ip[0] << 6) + (ip[1] >> 2); #else m_off += (ip[0] >> 2) + (ip[1] << 6); #endif ip += 2; if (m_off == 0) goto eof_found; m_off += 0x4000; #if defined(LZO1Z) last_m_off = m_off; #endif #else #if defined(LZO1Z) m_pos -= (ip[0] << 6) + (ip[1] >> 2); #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) m_pos -= (* (const lzo_ushortp) (const lzo_voidp) ip) >> 2; #else m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif ip += 2; if (m_pos == op) goto eof_found; m_pos -= 0x4000; #if defined(LZO1Z) last_m_off = pd((const lzo_bytep)op, m_pos); #endif #endif } else { #if defined(COPY_DICT) #if defined(LZO1Z) m_off = 1 + (t << 6) + (*ip++ >> 2); last_m_off = m_off; #else m_off = 1 + (t >> 2) + (*ip++ << 2); #endif NEED_OP(2); t = 2; COPY_DICT(t,m_off) #else #if defined(LZO1Z) t = 1 + (t << 6) + (*ip++ >> 2); m_pos = op - t; last_m_off = t; #else m_pos = op - 1; m_pos -= t >> 2; m_pos -= *ip++ << 2; #endif TEST_LB(m_pos); NEED_OP(2); *op++ = *m_pos++; *op++ = *m_pos; #endif goto match_done; } #if defined(COPY_DICT) NEED_OP(t+3-1); t += 3-1; COPY_DICT(t,m_off) #else TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); #if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) { assert((op - m_pos) >= 4); #else if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) { #endif COPY4(op,m_pos); op += 4; m_pos += 4; t -= 4 - (3 - 1); do { COPY4(op,m_pos); op += 4; m_pos += 4; t -= 4; } while (t >= 4); if (t > 0) do *op++ = *m_pos++; while (--t > 0); } else #endif { copy_match: *op++ = *m_pos++; *op++ = *m_pos++; do *op++ = *m_pos++; while (--t > 0); } #endif match_done: #if defined(LZO1Z) t = ip[-1] & 3; #else t = ip[-2] & 3; #endif if (t == 0) break; match_next: assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); #if 0 do *op++ = *ip++; while (--t > 0); #else *op++ = *ip++; if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } #endif t = *ip++; } while (TEST_IP && TEST_OP); } #if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) *out_len = pd(op, out); return LZO_E_EOF_NOT_FOUND; #endif eof_found: assert(t == 1); *out_len = pd(op, out); return (ip == ip_end ? LZO_E_OK : (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); #if defined(HAVE_NEED_IP) input_overrun: *out_len = pd(op, out); return LZO_E_INPUT_OVERRUN; #endif #if defined(HAVE_NEED_OP) output_overrun: *out_len = pd(op, out); return LZO_E_OUTPUT_OVERRUN; #endif #if defined(LZO_TEST_OVERRUN_LOOKBEHIND) lookbehind_overrun: *out_len = pd(op, out); return LZO_E_LOOKBEHIND_OVERRUN; #endif } #endif #define LZO_TEST_OVERRUN 1 #undef DO_DECOMPRESS #define DO_DECOMPRESS lzo1x_decompress_safe #if !defined(MINILZO_CFG_SKIP_LZO1X_DECOMPRESS_SAFE) #if defined(LZO_TEST_OVERRUN) # if !defined(LZO_TEST_OVERRUN_INPUT) # define LZO_TEST_OVERRUN_INPUT 2 # endif # if !defined(LZO_TEST_OVERRUN_OUTPUT) # define LZO_TEST_OVERRUN_OUTPUT 2 # endif # if !defined(LZO_TEST_OVERRUN_LOOKBEHIND) # define LZO_TEST_OVERRUN_LOOKBEHIND 1 # endif #endif #undef TEST_IP #undef TEST_OP #undef TEST_LB #undef TEST_LBO #undef NEED_IP #undef NEED_OP #undef HAVE_TEST_IP #undef HAVE_TEST_OP #undef HAVE_NEED_IP #undef HAVE_NEED_OP #undef HAVE_ANY_IP #undef HAVE_ANY_OP #if defined(LZO_TEST_OVERRUN_INPUT) # if (LZO_TEST_OVERRUN_INPUT >= 1) # define TEST_IP (ip < ip_end) # endif # if (LZO_TEST_OVERRUN_INPUT >= 2) # define NEED_IP(x) \ if ((lzo_uint)(ip_end - ip) < (lzo_uint)(x)) goto input_overrun # endif #endif #if defined(LZO_TEST_OVERRUN_OUTPUT) # if (LZO_TEST_OVERRUN_OUTPUT >= 1) # define TEST_OP (op <= op_end) # endif # if (LZO_TEST_OVERRUN_OUTPUT >= 2) # undef TEST_OP # define NEED_OP(x) \ if ((lzo_uint)(op_end - op) < (lzo_uint)(x)) goto output_overrun # endif #endif #if defined(LZO_TEST_OVERRUN_LOOKBEHIND) # define TEST_LB(m_pos) if (m_pos < out || m_pos >= op) goto lookbehind_overrun # define TEST_LBO(m_pos,o) if (m_pos < out || m_pos >= op - (o)) goto lookbehind_overrun #else # define TEST_LB(m_pos) ((void) 0) # define TEST_LBO(m_pos,o) ((void) 0) #endif #if !defined(LZO_EOF_CODE) && !defined(TEST_IP) # define TEST_IP (ip < ip_end) #endif #if defined(TEST_IP) # define HAVE_TEST_IP 1 #else # define TEST_IP 1 #endif #if defined(TEST_OP) # define HAVE_TEST_OP 1 #else # define TEST_OP 1 #endif #if defined(NEED_IP) # define HAVE_NEED_IP 1 #else # define NEED_IP(x) ((void) 0) #endif #if defined(NEED_OP) # define HAVE_NEED_OP 1 #else # define NEED_OP(x) ((void) 0) #endif #if defined(HAVE_TEST_IP) || defined(HAVE_NEED_IP) # define HAVE_ANY_IP 1 #endif #if defined(HAVE_TEST_OP) || defined(HAVE_NEED_OP) # define HAVE_ANY_OP 1 #endif #if defined(DO_DECOMPRESS) LZO_PUBLIC(int) DO_DECOMPRESS ( const lzo_bytep in , lzo_uint in_len, lzo_bytep out, lzo_uintp out_len, lzo_voidp wrkmem ) #endif { register lzo_bytep op; register const lzo_bytep ip; register lzo_uint t; #if defined(COPY_DICT) lzo_uint m_off; const lzo_bytep dict_end; #else register const lzo_bytep m_pos; #endif const lzo_bytep const ip_end = in + in_len; #if defined(HAVE_ANY_OP) lzo_bytep const op_end = out + *out_len; #endif #if defined(LZO1Z) lzo_uint last_m_off = 0; #endif LZO_UNUSED(wrkmem); #if defined(COPY_DICT) if (dict) { if (dict_len > M4_MAX_OFFSET) { dict += dict_len - M4_MAX_OFFSET; dict_len = M4_MAX_OFFSET; } dict_end = dict + dict_len; } else { dict_len = 0; dict_end = NULL; } #endif *out_len = 0; op = out; ip = in; if (*ip > 17) { t = *ip++ - 17; if (t < 4) goto match_next; assert(t > 0); NEED_OP(t); NEED_IP(t+1); do *op++ = *ip++; while (--t > 0); goto first_literal_run; } while (TEST_IP && TEST_OP) { t = *ip++; if (t >= 16) goto match; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 15 + *ip++; } assert(t > 0); NEED_OP(t+3); NEED_IP(t+4); #if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) if (PTR_ALIGNED2_4(op,ip)) { #endif COPY4(op,ip); op += 4; ip += 4; if (--t > 0) { if (t >= 4) { do { COPY4(op,ip); op += 4; ip += 4; t -= 4; } while (t >= 4); if (t > 0) do *op++ = *ip++; while (--t > 0); } else do *op++ = *ip++; while (--t > 0); } #if !defined(LZO_UNALIGNED_OK_4) } else #endif #endif #if !defined(LZO_UNALIGNED_OK_4) { *op++ = *ip++; *op++ = *ip++; *op++ = *ip++; do *op++ = *ip++; while (--t > 0); } #endif first_literal_run: t = *ip++; if (t >= 16) goto match; #if defined(COPY_DICT) #if defined(LZO1Z) m_off = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); last_m_off = m_off; #else m_off = (1 + M2_MAX_OFFSET) + (t >> 2) + (*ip++ << 2); #endif NEED_OP(3); t = 3; COPY_DICT(t,m_off) #else #if defined(LZO1Z) t = (1 + M2_MAX_OFFSET) + (t << 6) + (*ip++ >> 2); m_pos = op - t; last_m_off = t; #else m_pos = op - (1 + M2_MAX_OFFSET); m_pos -= t >> 2; m_pos -= *ip++ << 2; #endif TEST_LB(m_pos); NEED_OP(3); *op++ = *m_pos++; *op++ = *m_pos++; *op++ = *m_pos; #endif goto match_done; do { match: if (t >= 64) { #if defined(COPY_DICT) #if defined(LZO1X) m_off = 1 + ((t >> 2) & 7) + (*ip++ << 3); t = (t >> 5) - 1; #elif defined(LZO1Y) m_off = 1 + ((t >> 2) & 3) + (*ip++ << 2); t = (t >> 4) - 3; #elif defined(LZO1Z) m_off = t & 0x1f; if (m_off >= 0x1c) m_off = last_m_off; else { m_off = 1 + (m_off << 6) + (*ip++ >> 2); last_m_off = m_off; } t = (t >> 5) - 1; #endif #else #if defined(LZO1X) m_pos = op - 1; m_pos -= (t >> 2) & 7; m_pos -= *ip++ << 3; t = (t >> 5) - 1; #elif defined(LZO1Y) m_pos = op - 1; m_pos -= (t >> 2) & 3; m_pos -= *ip++ << 2; t = (t >> 4) - 3; #elif defined(LZO1Z) { lzo_uint off = t & 0x1f; m_pos = op; if (off >= 0x1c) { assert(last_m_off > 0); m_pos -= last_m_off; } else { off = 1 + (off << 6) + (*ip++ >> 2); m_pos -= off; last_m_off = off; } } t = (t >> 5) - 1; #endif TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); goto copy_match; #endif } else if (t >= 32) { t &= 31; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 31 + *ip++; } #if defined(COPY_DICT) #if defined(LZO1Z) m_off = 1 + (ip[0] << 6) + (ip[1] >> 2); last_m_off = m_off; #else m_off = 1 + (ip[0] >> 2) + (ip[1] << 6); #endif #else #if defined(LZO1Z) { lzo_uint off = 1 + (ip[0] << 6) + (ip[1] >> 2); m_pos = op - off; last_m_off = off; } #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) m_pos = op - 1; m_pos -= (* (const lzo_ushortp) (const lzo_voidp) ip) >> 2; #else m_pos = op - 1; m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif #endif ip += 2; } else if (t >= 16) { #if defined(COPY_DICT) m_off = (t & 8) << 11; #else m_pos = op; m_pos -= (t & 8) << 11; #endif t &= 7; if (t == 0) { NEED_IP(1); while (*ip == 0) { t += 255; ip++; NEED_IP(1); } t += 7 + *ip++; } #if defined(COPY_DICT) #if defined(LZO1Z) m_off += (ip[0] << 6) + (ip[1] >> 2); #else m_off += (ip[0] >> 2) + (ip[1] << 6); #endif ip += 2; if (m_off == 0) goto eof_found; m_off += 0x4000; #if defined(LZO1Z) last_m_off = m_off; #endif #else #if defined(LZO1Z) m_pos -= (ip[0] << 6) + (ip[1] >> 2); #elif defined(LZO_UNALIGNED_OK_2) && defined(LZO_ABI_LITTLE_ENDIAN) m_pos -= (* (const lzo_ushortp) (const lzo_voidp) ip) >> 2; #else m_pos -= (ip[0] >> 2) + (ip[1] << 6); #endif ip += 2; if (m_pos == op) goto eof_found; m_pos -= 0x4000; #if defined(LZO1Z) last_m_off = pd((const lzo_bytep)op, m_pos); #endif #endif } else { #if defined(COPY_DICT) #if defined(LZO1Z) m_off = 1 + (t << 6) + (*ip++ >> 2); last_m_off = m_off; #else m_off = 1 + (t >> 2) + (*ip++ << 2); #endif NEED_OP(2); t = 2; COPY_DICT(t,m_off) #else #if defined(LZO1Z) t = 1 + (t << 6) + (*ip++ >> 2); m_pos = op - t; last_m_off = t; #else m_pos = op - 1; m_pos -= t >> 2; m_pos -= *ip++ << 2; #endif TEST_LB(m_pos); NEED_OP(2); *op++ = *m_pos++; *op++ = *m_pos; #endif goto match_done; } #if defined(COPY_DICT) NEED_OP(t+3-1); t += 3-1; COPY_DICT(t,m_off) #else TEST_LB(m_pos); assert(t > 0); NEED_OP(t+3-1); #if defined(LZO_UNALIGNED_OK_4) || defined(LZO_ALIGNED_OK_4) #if !defined(LZO_UNALIGNED_OK_4) if (t >= 2 * 4 - (3 - 1) && PTR_ALIGNED2_4(op,m_pos)) { assert((op - m_pos) >= 4); #else if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) { #endif COPY4(op,m_pos); op += 4; m_pos += 4; t -= 4 - (3 - 1); do { COPY4(op,m_pos); op += 4; m_pos += 4; t -= 4; } while (t >= 4); if (t > 0) do *op++ = *m_pos++; while (--t > 0); } else #endif { copy_match: *op++ = *m_pos++; *op++ = *m_pos++; do *op++ = *m_pos++; while (--t > 0); } #endif match_done: #if defined(LZO1Z) t = ip[-1] & 3; #else t = ip[-2] & 3; #endif if (t == 0) break; match_next: assert(t > 0); assert(t < 4); NEED_OP(t); NEED_IP(t+1); #if 0 do *op++ = *ip++; while (--t > 0); #else *op++ = *ip++; if (t > 1) { *op++ = *ip++; if (t > 2) { *op++ = *ip++; } } #endif t = *ip++; } while (TEST_IP && TEST_OP); } #if defined(HAVE_TEST_IP) || defined(HAVE_TEST_OP) *out_len = pd(op, out); return LZO_E_EOF_NOT_FOUND; #endif eof_found: assert(t == 1); *out_len = pd(op, out); return (ip == ip_end ? LZO_E_OK : (ip < ip_end ? LZO_E_INPUT_NOT_CONSUMED : LZO_E_INPUT_OVERRUN)); #if defined(HAVE_NEED_IP) input_overrun: *out_len = pd(op, out); return LZO_E_INPUT_OVERRUN; #endif #if defined(HAVE_NEED_OP) output_overrun: *out_len = pd(op, out); return LZO_E_OUTPUT_OVERRUN; #endif #if defined(LZO_TEST_OVERRUN_LOOKBEHIND) lookbehind_overrun: *out_len = pd(op, out); return LZO_E_LOOKBEHIND_OVERRUN; #endif } #endif /***** End of minilzo.c *****/ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/minilzo.h000066400000000000000000000070371171526373700263450ustar00rootroot00000000000000/* minilzo.h -- mini subset of the LZO real-time data compression library This file is part of the LZO real-time data compression library. Copyright (C) 2010 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2009 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer All Rights Reserved. The LZO library 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. The LZO library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the LZO library; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Markus F.X.J. Oberhumer http://www.oberhumer.com/opensource/lzo/ */ /* * NOTE: * the full LZO package can be found at * http://www.oberhumer.com/opensource/lzo/ */ #ifndef __MINILZO_H #define __MINILZO_H 1 #define MINILZO_VERSION 0x2040 #ifdef __LZOCONF_H # error "you cannot use both LZO and miniLZO" #endif #undef LZO_HAVE_CONFIG_H #include "lzoconf.h" #if !defined(LZO_VERSION) || (LZO_VERSION != MINILZO_VERSION) # error "version mismatch in header files" #endif #ifdef __cplusplus extern "C" { #endif /*********************************************************************** // ************************************************************************/ /* Memory required for the wrkmem parameter. * When the required size is 0, you can also pass a NULL pointer. */ #define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS #define LZO1X_1_MEM_COMPRESS ((lzo_uint32) (16384L * lzo_sizeof_dict_t)) #define LZO1X_MEM_DECOMPRESS (0) /* compression */ LZO_EXTERN(int) lzo1x_1_compress ( const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem ); /* decompression */ LZO_EXTERN(int) lzo1x_decompress ( const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem /* NOT USED */ ); /* safe decompression with overrun testing */ LZO_EXTERN(int) lzo1x_decompress_safe ( const lzo_bytep src, lzo_uint src_len, lzo_bytep dst, lzo_uintp dst_len, lzo_voidp wrkmem /* NOT USED */ ); #ifdef __cplusplus } /* extern "C" */ #endif #endif /* already included */ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/vncauth.c000066400000000000000000000104411171526373700263200ustar00rootroot00000000000000/* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * vncauth.c - Functions for VNC password management and authentication. */ #ifdef __STRICT_ANSI__ #define _BSD_SOURCE #define _POSIX_SOURCE #endif #ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H #include #endif #include #include #include #include #include "d3des.h" #include #include #ifdef LIBVNCSERVER_HAVE_SYS_STAT_H #include #endif #include #ifdef WIN32 #define srandom srand #define random rand #else #include #endif /* libvncclient does not need this */ #ifndef rfbEncryptBytes /* * We use a fixed key to store passwords, since we assume that our local * file system is secure but nonetheless don't want to store passwords * as plaintext. */ static unsigned char fixedkey[8] = {23,82,107,6,35,78,88,7}; /* * Encrypt a password and store it in a file. Returns 0 if successful, * 1 if the file could not be written. */ int rfbEncryptAndStorePasswd(char *passwd, char *fname) { FILE *fp; unsigned int i; unsigned char encryptedPasswd[8]; if ((fp = fopen(fname,"w")) == NULL) return 1; /* windows security sux */ #ifndef WIN32 fchmod(fileno(fp), S_IRUSR|S_IWUSR); #endif /* pad password with nulls */ for (i = 0; i < 8; i++) { if (i < strlen(passwd)) { encryptedPasswd[i] = passwd[i]; } else { encryptedPasswd[i] = 0; } } /* Do encryption in-place - this way we overwrite our copy of the plaintext password */ rfbDesKey(fixedkey, EN0); rfbDes(encryptedPasswd, encryptedPasswd); for (i = 0; i < 8; i++) { putc(encryptedPasswd[i], fp); } fclose(fp); return 0; } /* * Decrypt a password from a file. Returns a pointer to a newly allocated * string containing the password or a null pointer if the password could * not be retrieved for some reason. */ char * rfbDecryptPasswdFromFile(char *fname) { FILE *fp; int i, ch; unsigned char *passwd = (unsigned char *)malloc(9); if ((fp = fopen(fname,"r")) == NULL) { free(passwd); return NULL; } for (i = 0; i < 8; i++) { ch = getc(fp); if (ch == EOF) { fclose(fp); free(passwd); return NULL; } passwd[i] = ch; } fclose(fp); rfbDesKey(fixedkey, DE1); rfbDes(passwd, passwd); passwd[8] = 0; return (char *)passwd; } /* * Generate CHALLENGESIZE random bytes for use in challenge-response * authentication. */ void rfbRandomBytes(unsigned char *bytes) { int i; static rfbBool s_srandom_called = FALSE; if (!s_srandom_called) { srandom((unsigned int)time(NULL) ^ (unsigned int)getpid()); s_srandom_called = TRUE; } for (i = 0; i < CHALLENGESIZE; i++) { bytes[i] = (unsigned char)(random() & 255); } } #endif /* * Encrypt CHALLENGESIZE bytes in memory using a password. */ void rfbEncryptBytes(unsigned char *bytes, char *passwd) { unsigned char key[8]; unsigned int i; /* key is simply password padded with nulls */ for (i = 0; i < 8; i++) { if (i < strlen(passwd)) { key[i] = passwd[i]; } else { key[i] = 0; } } rfbDesKey(key, EN0); for (i = 0; i < CHALLENGESIZE; i += 8) { rfbDes(bytes+i, bytes+i); } } void rfbEncryptBytes2(unsigned char *where, const int length, unsigned char *key) { int i, j; rfbDesKey(key, EN0); for (i = 0; i< 8; i++) where[i] ^= key[i]; rfbDes(where, where); for (i = 8; i < length; i += 8) { for (j = 0; j < 8; j++) where[i + j] ^= where[i + j - 8]; rfbDes(where + i, where + i); } } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/common/zywrletemplate.c000066400000000000000000000563241171526373700277520ustar00rootroot00000000000000 /******************************************************************** * * * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE. * * * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE. * * PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * * * * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006 * * BY Hitachi Systems & Services, Ltd. * * (Noriaki Yamazaki, Research & Developement Center) * * * * ******************************************************************** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the Hitachi Systems & Services, Ltd. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ********************************************************************/ /* Change Log: V0.02 : 2008/02/04 : Fix mis encode/decode when width != scanline (Thanks Johannes Schindelin, author of LibVNC Server/Client) V0.01 : 2007/02/06 : Initial release */ /* #define ZYWRLE_ENCODE */ /* #define ZYWRLE_DECODE */ #define ZYWRLE_QUANTIZE /* [References] PLHarr: Senecal, J. G., P. Lindstrom, M. A. Duchaineau, and K. I. Joy, "An Improved N-Bit to N-Bit Reversible Haar-Like Transform," Pacific Graphics 2004, October 2004, pp. 371-380. EZW: Shapiro, JM: Embedded Image Coding Using Zerotrees of Wavelet Coefficients, IEEE Trans. Signal. Process., Vol.41, pp.3445-3462 (1993). */ /* Template Macro stuffs. */ #undef ZYWRLE_ANALYZE #undef ZYWRLE_SYNTHESIZE #define ZYWRLE_ANALYZE __RFB_CONCAT3E(zywrleAnalyze,BPP,END_FIX) #define ZYWRLE_SYNTHESIZE __RFB_CONCAT3E(zywrleSynthesize,BPP,END_FIX) #define ZYWRLE_RGBYUV __RFB_CONCAT3E(zywrleRGBYUV,BPP,END_FIX) #define ZYWRLE_YUVRGB __RFB_CONCAT3E(zywrleYUVRGB,BPP,END_FIX) #define ZYWRLE_YMASK __RFB_CONCAT2E(ZYWRLE_YMASK,BPP) #define ZYWRLE_UVMASK __RFB_CONCAT2E(ZYWRLE_UVMASK,BPP) #define ZYWRLE_LOAD_PIXEL __RFB_CONCAT2E(ZYWRLE_LOAD_PIXEL,BPP) #define ZYWRLE_SAVE_PIXEL __RFB_CONCAT2E(ZYWRLE_SAVE_PIXEL,BPP) /* Packing/Unpacking pixel stuffs. Endian conversion stuffs. */ #undef S_0 #undef S_1 #undef L_0 #undef L_1 #undef L_2 #if ZYWRLE_ENDIAN == ENDIAN_BIG # define S_0 1 # define S_1 0 # define L_0 3 # define L_1 2 # define L_2 1 #else # define S_0 0 # define S_1 1 # define L_0 0 # define L_1 1 # define L_2 2 #endif /* Load/Save pixel stuffs. */ #define ZYWRLE_YMASK15 0xFFFFFFF8 #define ZYWRLE_UVMASK15 0xFFFFFFF8 #define ZYWRLE_LOAD_PIXEL15(pSrc,R,G,B) { \ R = (((unsigned char*)pSrc)[S_1]<< 1)& 0xF8; \ G = ((((unsigned char*)pSrc)[S_1]<< 6)|(((unsigned char*)pSrc)[S_0]>> 2))& 0xF8; \ B = (((unsigned char*)pSrc)[S_0]<< 3)& 0xF8; \ } #define ZYWRLE_SAVE_PIXEL15(pDst,R,G,B) { \ R &= 0xF8; \ G &= 0xF8; \ B &= 0xF8; \ ((unsigned char*)pDst)[S_1] = (unsigned char)( (R>>1)|(G>>6) ); \ ((unsigned char*)pDst)[S_0] = (unsigned char)(((B>>3)|(G<<2))& 0xFF); \ } #define ZYWRLE_YMASK16 0xFFFFFFFC #define ZYWRLE_UVMASK16 0xFFFFFFF8 #define ZYWRLE_LOAD_PIXEL16(pSrc,R,G,B) { \ R = ((unsigned char*)pSrc)[S_1] & 0xF8; \ G = ((((unsigned char*)pSrc)[S_1]<< 5)|(((unsigned char*)pSrc)[S_0]>> 3))& 0xFC; \ B = (((unsigned char*)pSrc)[S_0]<< 3)& 0xF8; \ } #define ZYWRLE_SAVE_PIXEL16(pDst,R,G,B) { \ R &= 0xF8; \ G &= 0xFC; \ B &= 0xF8; \ ((unsigned char*)pDst)[S_1] = (unsigned char)( R |(G>>5) ); \ ((unsigned char*)pDst)[S_0] = (unsigned char)(((B>>3)|(G<<3))& 0xFF); \ } #define ZYWRLE_YMASK32 0xFFFFFFFF #define ZYWRLE_UVMASK32 0xFFFFFFFF #define ZYWRLE_LOAD_PIXEL32(pSrc,R,G,B) { \ R = ((unsigned char*)pSrc)[L_2]; \ G = ((unsigned char*)pSrc)[L_1]; \ B = ((unsigned char*)pSrc)[L_0]; \ } #define ZYWRLE_SAVE_PIXEL32(pDst,R,G,B) { \ ((unsigned char*)pDst)[L_2] = (unsigned char)R; \ ((unsigned char*)pDst)[L_1] = (unsigned char)G; \ ((unsigned char*)pDst)[L_0] = (unsigned char)B; \ } #ifndef ZYWRLE_ONCE #define ZYWRLE_ONCE #ifdef WIN32 #define InlineX __inline #else #define InlineX inline #endif #ifdef ZYWRLE_ENCODE /* Tables for Coefficients filtering. */ # ifndef ZYWRLE_QUANTIZE /* Type A:lower bit omitting of EZW style. */ const static unsigned int zywrleParam[3][3]={ {0x0000F000,0x00000000,0x00000000}, {0x0000C000,0x00F0F0F0,0x00000000}, {0x0000C000,0x00C0C0C0,0x00F0F0F0}, /* {0x0000FF00,0x00000000,0x00000000}, {0x0000FF00,0x00FFFFFF,0x00000000}, {0x0000FF00,0x00FFFFFF,0x00FFFFFF}, */ }; # else /* Type B:Non liner quantization filter. */ static const signed char zywrleConv[4][256]={ { /* bi=5, bo=5 r=0.0:PSNR=24.849 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* bi=5, bo=5 r=2.0:PSNR=74.031 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 56, 56, 56, 56, 56, 56, 56, 56, 64, 64, 64, 64, 64, 64, 64, 64, 72, 72, 72, 72, 72, 72, 72, 72, 80, 80, 80, 80, 80, 80, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 96, 96, 96, 96, 96, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 112, 112, 112, 112, 112, 112, 112, 112, 112, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -112, -112, -112, -112, -112, -112, -112, -112, -112, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -96, -96, -96, -96, -96, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -80, -80, -80, -80, -80, -80, -72, -72, -72, -72, -72, -72, -72, -72, -64, -64, -64, -64, -64, -64, -64, -64, -56, -56, -56, -56, -56, -56, -56, -56, -56, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, -32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* bi=5, bo=4 r=2.0:PSNR=64.441 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 104, 112, 112, 112, 112, 112, 112, 112, 112, 112, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 0, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -120, -112, -112, -112, -112, -112, -112, -112, -112, -112, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -104, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -80, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -64, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, { /* bi=5, bo=2 r=2.0:PSNR=43.175 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 0, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, } }; const static signed char* zywrleParam[3][3][3]={ {{zywrleConv[0],zywrleConv[2],zywrleConv[0]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]}}, {{zywrleConv[0],zywrleConv[3],zywrleConv[0]},{zywrleConv[1],zywrleConv[1],zywrleConv[1]},{zywrleConv[0],zywrleConv[0],zywrleConv[0]}}, {{zywrleConv[0],zywrleConv[3],zywrleConv[0]},{zywrleConv[2],zywrleConv[2],zywrleConv[2]},{zywrleConv[1],zywrleConv[1],zywrleConv[1]}}, }; # endif #endif static InlineX void Harr(signed char* pX0, signed char* pX1) { /* Piecewise-Linear Harr(PLHarr) */ int X0 = (int)*pX0, X1 = (int)*pX1; int orgX0 = X0, orgX1 = X1; if ((X0 ^ X1) & 0x80) { /* differ sign */ X1 += X0; if (((X1^orgX1)&0x80)==0) { /* |X1| > |X0| */ X0 -= X1; /* H = -B */ } } else { /* same sign */ X0 -= X1; if (((X0 ^ orgX0) & 0x80) == 0) { /* |X0| > |X1| */ X1 += X0; /* L = A */ } } *pX0 = (signed char)X1; *pX1 = (signed char)X0; } /* 1D-Wavelet transform. In coefficients array, the famous 'pyramid' decomposition is well used. 1D Model: |L0L0L0L0|L0L0L0L0|H0H0H0H0|H0H0H0H0| : level 0 |L1L1L1L1|H1H1H1H1|H0H0H0H0|H0H0H0H0| : level 1 But this method needs line buffer because H/L is different position from X0/X1. So, I used 'interleave' decomposition instead of it. 1D Model: |L0H0L0H0|L0H0L0H0|L0H0L0H0|L0H0L0H0| : level 0 |L1H0H1H0|L1H0H1H0|L1H0H1H0|L1H0H1H0| : level 1 In this method, H/L and X0/X1 is always same position. This lead us to more speed and less memory. Of cause, the result of both method is quite same because it's only difference that coefficient position. */ static InlineX void WaveletLevel(int* data, int size, int l, int SkipPixel) { int s, ofs; signed char* pX0; signed char* end; pX0 = (signed char*)data; s = (8<>(l+1))*s; s -= 2; ofs = (4<>1; if (r & 0x02) pH += (s>>1)*width; for (y = 0; y < height / s; y++) { for (x = 0; x < width / s; x++) { /* these are same following code. pH[x] = pH[x] / (~pM[x]+1) * (~pM[x]+1); ( round pH[x] with pM[x] bit ) '&' operator isn't 'round' but is 'floor'. So, we must offset when pH[x] is negative. */ if (((signed char*)pH)[0] & 0x80) ((signed char*)pH)[0] += ~((signed char*)pM)[0]; if (((signed char*)pH)[1] & 0x80) ((signed char*)pH)[1] += ~((signed char*)pM)[1]; if (((signed char*)pH)[2] & 0x80) ((signed char*)pH)[2] += ~((signed char*)pM)[2]; *pH &= *pM; pH += s; } pH += (s-1)*width; } } } # else /* Type B:Non liner quantization filter. Coefficients have Gaussian curve and smaller value which is large part of coefficients isn't more important than larger value. So, I use filter of Non liner quantize/dequantize table. In general, Non liner quantize formula is explained as following. y=f(x) = sign(x)*round( ((abs(x)/(2^7))^ r )* 2^(bo-1) )*2^(8-bo) x=f-1(y) = sign(y)*round( ((abs(y)/(2^7))^(1/r))* 2^(bi-1) )*2^(8-bi) ( r:power coefficient bi:effective MSB in input bo:effective MSB in output ) r < 1.0 : Smaller value is more important than larger value. r > 1.0 : Larger value is more important than smaller value. r = 1.0 : Liner quantization which is same with EZW style. r = 0.75 is famous non liner quantization used in MP3 audio codec. In contrast to audio data, larger value is important in wavelet coefficients. So, I select r = 2.0 table( quantize is x^2, dequantize sqrt(x) ). As compared with EZW style liner quantization, this filter tended to be more sharp edge and be more compression rate but be more blocking noise and be less quality. Especially, the surface of graphic objects has distinguishable noise in middle quality mode. We need only quantized-dequantized(filtered) value rather than quantized value itself because all values are packed or palette-lized in later ZRLE section. This lead us not to need to modify client decoder when we change the filtering procedure in future. Client only decodes coefficients given by encoder. */ static InlineX void FilterWaveletSquare(int* pBuf, int width, int height, int level, int l) { int r, s; int x, y; int* pH; const signed char** pM; pM = zywrleParam[level-1][l]; s = 2<>1; if (r & 0x02) pH += (s>>1)*width; for (y = 0; y < height / s; y++) { for (x = 0; x < width / s; x++) { ((signed char*)pH)[0] = pM[0][((unsigned char*)pH)[0]]; ((signed char*)pH)[1] = pM[1][((unsigned char*)pH)[1]]; ((signed char*)pH)[2] = pM[2][((unsigned char*)pH)[2]]; pH += s; } pH += (s-1)*width; } } } # endif static InlineX void Wavelet(int* pBuf, int width, int height, int level) { int l, s; int* pTop; int* pEnd; for (l = 0; l < level; l++) { pTop = pBuf; pEnd = pBuf+height*width; s = width<= 0; l--) { pTop = pBuf; pEnd = pBuf+width; s = 1< YUV conversion stuffs. YUV coversion is explained as following formula in strict meaning: Y = 0.299R + 0.587G + 0.114B ( 0<=Y<=255) U = -0.169R - 0.331G + 0.500B (-128<=U<=127) V = 0.500R - 0.419G - 0.081B (-128<=V<=127) I use simple conversion RCT(reversible color transform) which is described in JPEG-2000 specification. Y = (R + 2G + B)/4 ( 0<=Y<=255) U = B-G (-256<=U<=255) V = R-G (-256<=V<=255) */ #define ROUND(x) (((x)<0)?0:(((x)>255)?255:(x))) /* RCT is N-bit RGB to N-bit Y and N+1-bit UV. For make Same N-bit, UV is lossy. More exact PLHarr, we reduce to odd range(-127<=x<=127). */ #define ZYWRLE_RGBYUV1(R,G,B,Y,U,V,ymask,uvmask) { \ Y = (R+(G<<1)+B)>>2; \ U = B-G; \ V = R-G; \ Y -= 128; \ U >>= 1; \ V >>= 1; \ Y &= ymask; \ U &= uvmask; \ V &= uvmask; \ if (Y == -128) \ Y += (0xFFFFFFFF-ymask+1); \ if (U == -128) \ U += (0xFFFFFFFF-uvmask+1); \ if (V == -128) \ V += (0xFFFFFFFF-uvmask+1); \ } #define ZYWRLE_YUVRGB1(R,G,B,Y,U,V) { \ Y += 128; \ U <<= 1; \ V <<= 1; \ G = Y-((U+V)>>2); \ B = U+G; \ R = V+G; \ G = ROUND(G); \ B = ROUND(B); \ R = ROUND(R); \ } /* coefficient packing/unpacking stuffs. Wavelet transform makes 4 sub coefficient image from 1 original image. model with pyramid decomposition: +------+------+ | | | | L | Hx | | | | +------+------+ | | | | H | Hxy | | | | +------+------+ So, we must transfer each sub images individually in strict meaning. But at least ZRLE meaning, following one decompositon image is same as avobe individual sub image. I use this format. (Strictly saying, transfer order is reverse(Hxy->Hy->Hx->L) for simplified procedure for any wavelet level.) +------+------+ | L | +------+------+ | Hx | +------+------+ | Hy | +------+------+ | Hxy | +------+------+ */ #define INC_PTR(data) \ data++; \ if( data-pData >= (w+uw) ){ \ data += scanline-(w+uw); \ pData = data; \ } #define ZYWRLE_TRANSFER_COEFF(pBuf,data,r,w,h,scanline,level,TRANS) \ pH = pBuf; \ s = 2<>1; \ if (r & 0x02) \ pH += (s>>1)*w; \ pEnd = pH+h*w; \ while (pH < pEnd) { \ pLine = pH+w; \ while (pH < pLine) { \ TRANS \ INC_PTR(data) \ pH += s; \ } \ pH += (s-1)*w; \ } #define ZYWRLE_PACK_COEFF(pBuf,data,r,width,height,scanline,level) \ ZYWRLE_TRANSFER_COEFF(pBuf,data,r,width,height,scanline,level,ZYWRLE_LOAD_COEFF(pH,R,G,B);ZYWRLE_SAVE_PIXEL(data,R,G,B);) #define ZYWRLE_UNPACK_COEFF(pBuf,data,r,width,height,scanline,level) \ ZYWRLE_TRANSFER_COEFF(pBuf,data,r,width,height,scanline,level,ZYWRLE_LOAD_PIXEL(data,R,G,B);ZYWRLE_SAVE_COEFF(pH,R,G,B);) #define ZYWRLE_SAVE_UNALIGN(data,TRANS) \ pTop = pBuf+w*h; \ pEnd = pBuf + (w+uw)*(h+uh); \ while (pTop < pEnd) { \ TRANS \ INC_PTR(data) \ pTop++; \ } #define ZYWRLE_LOAD_UNALIGN(data,TRANS) \ pTop = pBuf+w*h; \ if (uw) { \ pData= data + w; \ pEnd = (int*)(pData+ h*scanline); \ while (pData < (PIXEL_T*)pEnd) { \ pLine = (int*)(pData + uw); \ while (pData < (PIXEL_T*)pLine) { \ TRANS \ pData++; \ pTop++; \ } \ pData += scanline-uw; \ } \ } \ if (uh) { \ pData= data + h*scanline; \ pEnd = (int*)(pData+ uh*scanline); \ while (pData < (PIXEL_T*)pEnd) { \ pLine = (int*)(pData + w); \ while (pData < (PIXEL_T*)pLine) { \ TRANS \ pData++; \ pTop++; \ } \ pData += scanline-w; \ } \ } \ if (uw && uh) { \ pData= data + w+ h*scanline; \ pEnd = (int*)(pData+ uh*scanline); \ while (pData < (PIXEL_T*)pEnd) { \ pLine = (int*)(pData + uw); \ while (pData < (PIXEL_T*)pLine) { \ TRANS \ pData++; \ pTop++; \ } \ pData += scanline-uw; \ } \ } static InlineX void zywrleCalcSize(int* pW, int* pH, int level) { *pW &= ~((1<buffer, hdr.nSubrects * (4 + (BPP / 8)))) return FALSE; ptr = (uint8_t *)client->buffer; for (i = 0; i < hdr.nSubrects; i++) { pix = *(CARDBPP *)ptr; ptr += BPP/8; x = *ptr++; y = *ptr++; w = *ptr++; h = *ptr++; FillRectangle(client, rx+x, ry+y, w, h, pix); } return TRUE; } #undef CARDBPP FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/cursor.c000066400000000000000000000122541171526373700273550ustar00rootroot00000000000000/* * Copyright (C) 2001,2002 Constantin Kaplinsky. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * cursor.c - code to support cursor shape updates (XCursor and * RichCursor preudo-encodings). */ #include #define OPER_SAVE 0 #define OPER_RESTORE 1 #define RGB24_TO_PIXEL(bpp,r,g,b) \ ((((uint##bpp##_t)(r) & 0xFF) * client->format.redMax + 127) / 255 \ << client->format.redShift | \ (((uint##bpp##_t)(g) & 0xFF) * client->format.greenMax + 127) / 255 \ << client->format.greenShift | \ (((uint##bpp##_t)(b) & 0xFF) * client->format.blueMax + 127) / 255 \ << client->format.blueShift) /********************************************************************* * HandleCursorShape(). Support for XCursor and RichCursor shape * updates. We emulate cursor operating on the frame buffer (that is * why we call it "software cursor"). ********************************************************************/ rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc) { int bytesPerPixel; size_t bytesPerRow, bytesMaskData; rfbXCursorColors rgb; uint32_t colors[2]; char *buf; uint8_t *ptr; int x, y, b; bytesPerPixel = client->format.bitsPerPixel / 8; bytesPerRow = (width + 7) / 8; bytesMaskData = bytesPerRow * height; if (width * height == 0) return TRUE; /* Allocate memory for pixel data and temporary mask data. */ if(client->rcSource) free(client->rcSource); client->rcSource = malloc(width * height * bytesPerPixel); if (client->rcSource == NULL) return FALSE; buf = malloc(bytesMaskData); if (buf == NULL) { free(client->rcSource); client->rcSource = NULL; return FALSE; } /* Read and decode cursor pixel data, depending on the encoding type. */ if (enc == rfbEncodingXCursor) { /* Read and convert background and foreground colors. */ if (!ReadFromRFBServer(client, (char *)&rgb, sz_rfbXCursorColors)) { free(client->rcSource); client->rcSource = NULL; free(buf); return FALSE; } colors[0] = RGB24_TO_PIXEL(32, rgb.backRed, rgb.backGreen, rgb.backBlue); colors[1] = RGB24_TO_PIXEL(32, rgb.foreRed, rgb.foreGreen, rgb.foreBlue); /* Read 1bpp pixel data into a temporary buffer. */ if (!ReadFromRFBServer(client, buf, bytesMaskData)) { free(client->rcSource); client->rcSource = NULL; free(buf); return FALSE; } /* Convert 1bpp data to byte-wide color indices. */ ptr = client->rcSource; for (y = 0; y < height; y++) { for (x = 0; x < width / 8; x++) { for (b = 7; b >= 0; b--) { *ptr = buf[y * bytesPerRow + x] >> b & 1; ptr += bytesPerPixel; } } for (b = 7; b > 7 - width % 8; b--) { *ptr = buf[y * bytesPerRow + x] >> b & 1; ptr += bytesPerPixel; } } /* Convert indices into the actual pixel values. */ switch (bytesPerPixel) { case 1: for (x = 0; x < width * height; x++) client->rcSource[x] = (uint8_t)colors[client->rcSource[x]]; break; case 2: for (x = 0; x < width * height; x++) ((uint16_t *)client->rcSource)[x] = (uint16_t)colors[client->rcSource[x * 2]]; break; case 4: for (x = 0; x < width * height; x++) ((uint32_t *)client->rcSource)[x] = colors[client->rcSource[x * 4]]; break; } } else { /* enc == rfbEncodingRichCursor */ if (!ReadFromRFBServer(client, (char *)client->rcSource, width * height * bytesPerPixel)) { free(client->rcSource); client->rcSource = NULL; free(buf); return FALSE; } } /* Read and decode mask data. */ if (!ReadFromRFBServer(client, buf, bytesMaskData)) { free(client->rcSource); client->rcSource = NULL; free(buf); return FALSE; } client->rcMask = malloc(width * height); if (client->rcMask == NULL) { free(client->rcSource); client->rcSource = NULL; free(buf); return FALSE; } ptr = client->rcMask; for (y = 0; y < height; y++) { for (x = 0; x < width / 8; x++) { for (b = 7; b >= 0; b--) { *ptr++ = buf[y * bytesPerRow + x] >> b & 1; } } for (b = 7; b > 7 - width % 8; b--) { *ptr++ = buf[y * bytesPerRow + x] >> b & 1; } } if (client->GotCursorShape != NULL) { client->GotCursorShape(client, xhot, yhot, width, height, bytesPerPixel); } free(buf); return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/hextile.c000066400000000000000000000064201171526373700275000ustar00rootroot00000000000000/* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * hextile.c - handle hextile encoding. * * This file shouldn't be compiled directly. It is included multiple times by * rfbproto.c, each time with a different definition of the macro BPP. For * each value of BPP, this file defines a function which handles a hextile * encoded rectangle with BPP bits per pixel. */ #define HandleHextileBPP CONCAT2E(HandleHextile,BPP) #define CARDBPP CONCAT3E(uint,BPP,_t) static rfbBool HandleHextileBPP (rfbClient* client, int rx, int ry, int rw, int rh) { CARDBPP bg, fg; int i; uint8_t *ptr; int x, y, w, h; int sx, sy, sw, sh; uint8_t subencoding; uint8_t nSubrects; for (y = ry; y < ry+rh; y += 16) { for (x = rx; x < rx+rw; x += 16) { w = h = 16; if (rx+rw - x < 16) w = rx+rw - x; if (ry+rh - y < 16) h = ry+rh - y; if (!ReadFromRFBServer(client, (char *)&subencoding, 1)) return FALSE; if (subencoding & rfbHextileRaw) { if (!ReadFromRFBServer(client, client->buffer, w * h * (BPP / 8))) return FALSE; CopyRectangle(client, (uint8_t *)client->buffer, x, y, w, h); continue; } if (subencoding & rfbHextileBackgroundSpecified) if (!ReadFromRFBServer(client, (char *)&bg, sizeof(bg))) return FALSE; FillRectangle(client, x, y, w, h, bg); if (subencoding & rfbHextileForegroundSpecified) if (!ReadFromRFBServer(client, (char *)&fg, sizeof(fg))) return FALSE; if (!(subencoding & rfbHextileAnySubrects)) { continue; } if (!ReadFromRFBServer(client, (char *)&nSubrects, 1)) return FALSE; ptr = (uint8_t*)client->buffer; if (subencoding & rfbHextileSubrectsColoured) { if (!ReadFromRFBServer(client, client->buffer, nSubrects * (2 + (BPP / 8)))) return FALSE; for (i = 0; i < nSubrects; i++) { #if BPP==8 GET_PIXEL8(fg, ptr); #elif BPP==16 GET_PIXEL16(fg, ptr); #elif BPP==32 GET_PIXEL32(fg, ptr); #else #error "Invalid BPP" #endif sx = rfbHextileExtractX(*ptr); sy = rfbHextileExtractY(*ptr); ptr++; sw = rfbHextileExtractW(*ptr); sh = rfbHextileExtractH(*ptr); ptr++; FillRectangle(client, x+sx, y+sy, sw, sh, fg); } } else { if (!ReadFromRFBServer(client, client->buffer, nSubrects * 2)) return FALSE; for (i = 0; i < nSubrects; i++) { sx = rfbHextileExtractX(*ptr); sy = rfbHextileExtractY(*ptr); ptr++; sw = rfbHextileExtractW(*ptr); sh = rfbHextileExtractH(*ptr); ptr++; FillRectangle(client, x+sx, y+sy, sw, sh, fg); } } } } return TRUE; } #undef CARDBPP FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/listen.c000066400000000000000000000100651171526373700273340ustar00rootroot00000000000000/* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * listen.c - listen for incoming connections */ #ifdef __STRICT_ANSI__ #define _BSD_SOURCE #endif #include #include #ifdef __MINGW32__ #define close closesocket #include #undef max #else #include #include #endif #include #include /* * listenForIncomingConnections() - listen for incoming connections from * servers, and fork a new process to deal with each connection. */ void listenForIncomingConnections(rfbClient* client) { #ifdef __MINGW32__ /* FIXME */ rfbClientErr("listenForIncomingConnections on MinGW32 NOT IMPLEMENTED\n"); return; #else int listenSocket; fd_set fds; client->listenSpecified = TRUE; listenSocket = ListenAtTcpPort(client->listenPort); if ((listenSocket < 0)) return; rfbClientLog("%s -listen: Listening on port %d\n", client->programName,client->listenPort); rfbClientLog("%s -listen: Command line errors are not reported until " "a connection comes in.\n", client->programName); while (TRUE) { /* reap any zombies */ int status, pid; while ((pid= wait3(&status, WNOHANG, (struct rusage *)0))>0); /* TODO: callback for discard any events (like X11 events) */ FD_ZERO(&fds); FD_SET(listenSocket, &fds); select(listenSocket+1, &fds, NULL, NULL, NULL); if (FD_ISSET(listenSocket, &fds)) { client->sock = AcceptTcpConnection(listenSocket); if (client->sock < 0) return; if (!SetNonBlocking(client->sock)) return; /* Now fork off a new process to deal with it... */ switch (fork()) { case -1: rfbClientErr("fork\n"); return; case 0: /* child - return to caller */ close(listenSocket); return; default: /* parent - go round and listen again */ close(client->sock); break; } } } #endif } /* * listenForIncomingConnectionsNoFork() - listen for incoming connections * from servers, but DON'T fork, instead just wait timeout microseconds. * If timeout is negative, block indefinitly. * Returns 1 on success (there was an incoming connection on the listen socket * and we accepted it successfully), -1 on error, 0 on timeout. */ int listenForIncomingConnectionsNoFork(rfbClient* client, int timeout) { fd_set fds; struct timeval to; int r; to.tv_sec= timeout / 1000000; to.tv_usec= timeout % 1000000; client->listenSpecified = TRUE; if (client->listenSock < 0) { client->listenSock = ListenAtTcpPort(client->listenPort); if (client->listenSock < 0) return -1; rfbClientLog("%s -listennofork: Listening on port %d\n", client->programName,client->listenPort); rfbClientLog("%s -listennofork: Command line errors are not reported until " "a connection comes in.\n", client->programName); } FD_ZERO(&fds); FD_SET(client->listenSock, &fds); if (timeout < 0) r = select(client->listenSock+1, &fds, NULL, NULL, NULL); else r = select(client->listenSock+1, &fds, NULL, NULL, &to); if (r > 0) { client->sock = AcceptTcpConnection(client->listenSock); if (client->sock < 0) return -1; if (!SetNonBlocking(client->sock)) return -1; close(client->listenSock); return r; } /* r is now either 0 (timeout) or -1 (error) */ return r; } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/rfbproto.c000066400000000000000000002121051171526373700276720ustar00rootroot00000000000000/* * Copyright (C) 2000-2002 Constantin Kaplinsky. All Rights Reserved. * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * rfbproto.c - functions to deal with client side of RFB protocol. */ #ifdef __STRICT_ANSI__ #define _BSD_SOURCE #define _POSIX_SOURCE #endif #ifndef WIN32 #include #include #include #include #endif #include #include #ifdef LIBVNCSERVER_HAVE_LIBZ #include #ifdef __CHECKER__ #undef Z_NULL #define Z_NULL NULL #endif #endif #ifdef LIBVNCSERVER_HAVE_LIBJPEG #ifdef _RPCNDR_H /* This Windows header typedefs 'boolean', jpeglib has to know */ #define HAVE_BOOLEAN #endif #include #endif #include #include #ifdef LIBVNCSERVER_WITH_CLIENT_GCRYPT #ifdef WIN32 #undef SOCKET #undef socklen_t #endif #include #endif #include "minilzo.h" #include "tls.h" /* * rfbClientLog prints a time-stamped message to the log file (stderr). */ rfbBool rfbEnableClientLogging=TRUE; static void rfbDefaultClientLog(const char *format, ...) { va_list args; char buf[256]; time_t log_clock; if(!rfbEnableClientLogging) return; va_start(args, format); time(&log_clock); strftime(buf, 255, "%d/%m/%Y %X ", localtime(&log_clock)); fprintf(stderr, "%s", buf); vfprintf(stderr, format, args); fflush(stderr); va_end(args); } rfbClientLogProc rfbClientLog=rfbDefaultClientLog; rfbClientLogProc rfbClientErr=rfbDefaultClientLog; /* extensions */ rfbClientProtocolExtension* rfbClientExtensions = NULL; void rfbClientRegisterExtension(rfbClientProtocolExtension* e) { e->next = rfbClientExtensions; rfbClientExtensions = e; } /* client data */ void rfbClientSetClientData(rfbClient* client, void* tag, void* data) { rfbClientData* clientData = client->clientData; while(clientData && clientData->tag != tag) clientData = clientData->next; if(clientData == NULL) { clientData = calloc(sizeof(rfbClientData), 1); clientData->next = client->clientData; client->clientData = clientData; clientData->tag = tag; } clientData->data = data; } void* rfbClientGetClientData(rfbClient* client, void* tag) { rfbClientData* clientData = client->clientData; while(clientData) { if(clientData->tag == tag) return clientData->data; clientData = clientData->next; } return NULL; } /* messages */ static void FillRectangle(rfbClient* client, int x, int y, int w, int h, uint32_t colour) { int i,j; #define FILL_RECT(BPP) \ for(j=y*client->width;j<(y+h)*client->width;j+=client->width) \ for(i=x;iframeBuffer)[j+i]=colour; switch(client->format.bitsPerPixel) { case 8: FILL_RECT(8); break; case 16: FILL_RECT(16); break; case 32: FILL_RECT(32); break; default: rfbClientLog("Unsupported bitsPerPixel: %d\n",client->format.bitsPerPixel); } } static void CopyRectangle(rfbClient* client, uint8_t* buffer, int x, int y, int w, int h) { int j; #define COPY_RECT(BPP) \ { \ int rs = w * BPP / 8, rs2 = client->width * BPP / 8; \ for (j = ((x * (BPP / 8)) + (y * rs2)); j < (y + h) * rs2; j += rs2) { \ memcpy(client->frameBuffer + j, buffer, rs); \ buffer += rs; \ } \ } switch(client->format.bitsPerPixel) { case 8: COPY_RECT(8); break; case 16: COPY_RECT(16); break; case 32: COPY_RECT(32); break; default: rfbClientLog("Unsupported bitsPerPixel: %d\n",client->format.bitsPerPixel); } } /* TODO: test */ static void CopyRectangleFromRectangle(rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y) { int i,j; #define COPY_RECT_FROM_RECT(BPP) \ { \ uint##BPP##_t* _buffer=((uint##BPP##_t*)client->frameBuffer)+(src_y-dest_y)*client->width+src_x-dest_x; \ if (dest_y < src_y) { \ for(j = dest_y*client->width; j < (dest_y+h)*client->width; j += client->width) { \ if (dest_x < src_x) { \ for(i = dest_x; i < dest_x+w; i++) { \ ((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \ } \ } else { \ for(i = dest_x+w-1; i >= dest_x; i--) { \ ((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \ } \ } \ } \ } else { \ for(j = (dest_y+h-1)*client->width; j >= dest_y*client->width; j-=client->width) { \ if (dest_x < src_x) { \ for(i = dest_x; i < dest_x+w; i++) { \ ((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \ } \ } else { \ for(i = dest_x+w-1; i >= dest_x; i--) { \ ((uint##BPP##_t*)client->frameBuffer)[j+i]=_buffer[j+i]; \ } \ } \ } \ } \ } switch(client->format.bitsPerPixel) { case 8: COPY_RECT_FROM_RECT(8); break; case 16: COPY_RECT_FROM_RECT(16); break; case 32: COPY_RECT_FROM_RECT(32); break; default: rfbClientLog("Unsupported bitsPerPixel: %d\n",client->format.bitsPerPixel); } } static rfbBool HandleRRE8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleRRE16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleRRE32(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleCoRRE8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleCoRRE16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleCoRRE32(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleHextile8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleHextile16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleHextile32(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltra8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltra16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltra32(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltraZip8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltraZip16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleUltraZip32(rfbClient* client, int rx, int ry, int rw, int rh); #ifdef LIBVNCSERVER_HAVE_LIBZ static rfbBool HandleZlib8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZlib16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZlib32(rfbClient* client, int rx, int ry, int rw, int rh); #ifdef LIBVNCSERVER_HAVE_LIBJPEG static rfbBool HandleTight8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleTight16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleTight32(rfbClient* client, int rx, int ry, int rw, int rh); static long ReadCompactLen (rfbClient* client); static void JpegInitSource(j_decompress_ptr cinfo); static boolean JpegFillInputBuffer(j_decompress_ptr cinfo); static void JpegSkipInputData(j_decompress_ptr cinfo, long num_bytes); static void JpegTermSource(j_decompress_ptr cinfo); static void JpegSetSrcManager(j_decompress_ptr cinfo, uint8_t *compressedData, int compressedLen); #endif static rfbBool HandleZRLE8(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE15(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE16(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE24(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE24Up(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE24Down(rfbClient* client, int rx, int ry, int rw, int rh); static rfbBool HandleZRLE32(rfbClient* client, int rx, int ry, int rw, int rh); #endif /* * Server Capability Functions */ rfbBool SupportsClient2Server(rfbClient* client, int messageType) { return (client->supportedMessages.client2server[((messageType & 0xFF)/8)] & (1<<(messageType % 8)) ? TRUE : FALSE); } rfbBool SupportsServer2Client(rfbClient* client, int messageType) { return (client->supportedMessages.server2client[((messageType & 0xFF)/8)] & (1<<(messageType % 8)) ? TRUE : FALSE); } void SetClient2Server(rfbClient* client, int messageType) { client->supportedMessages.client2server[((messageType & 0xFF)/8)] |= (1<<(messageType % 8)); } void SetServer2Client(rfbClient* client, int messageType) { client->supportedMessages.server2client[((messageType & 0xFF)/8)] |= (1<<(messageType % 8)); } void ClearClient2Server(rfbClient* client, int messageType) { client->supportedMessages.client2server[((messageType & 0xFF)/8)] &= (!(1<<(messageType % 8))); } void ClearServer2Client(rfbClient* client, int messageType) { client->supportedMessages.server2client[((messageType & 0xFF)/8)] &= (!(1<<(messageType % 8))); } void DefaultSupportedMessages(rfbClient* client) { memset((char *)&client->supportedMessages,0,sizeof(client->supportedMessages)); /* Default client supported messages (universal RFB 3.3 protocol) */ SetClient2Server(client, rfbSetPixelFormat); /* SetClient2Server(client, rfbFixColourMapEntries); Not currently supported */ SetClient2Server(client, rfbSetEncodings); SetClient2Server(client, rfbFramebufferUpdateRequest); SetClient2Server(client, rfbKeyEvent); SetClient2Server(client, rfbPointerEvent); SetClient2Server(client, rfbClientCutText); /* technically, we only care what we can *send* to the server * but, we set Server2Client Just in case it ever becomes useful */ SetServer2Client(client, rfbFramebufferUpdate); SetServer2Client(client, rfbSetColourMapEntries); SetServer2Client(client, rfbBell); SetServer2Client(client, rfbServerCutText); } void DefaultSupportedMessagesUltraVNC(rfbClient* client) { DefaultSupportedMessages(client); SetClient2Server(client, rfbFileTransfer); SetClient2Server(client, rfbSetScale); SetClient2Server(client, rfbSetServerInput); SetClient2Server(client, rfbSetSW); SetClient2Server(client, rfbTextChat); SetClient2Server(client, rfbPalmVNCSetScaleFactor); /* technically, we only care what we can *send* to the server */ SetServer2Client(client, rfbResizeFrameBuffer); SetServer2Client(client, rfbPalmVNCReSizeFrameBuffer); SetServer2Client(client, rfbFileTransfer); SetServer2Client(client, rfbTextChat); } void DefaultSupportedMessagesTightVNC(rfbClient* client) { DefaultSupportedMessages(client); SetClient2Server(client, rfbFileTransfer); SetClient2Server(client, rfbSetServerInput); SetClient2Server(client, rfbSetSW); /* SetClient2Server(client, rfbTextChat); */ /* technically, we only care what we can *send* to the server */ SetServer2Client(client, rfbFileTransfer); SetServer2Client(client, rfbTextChat); } #ifndef WIN32 static rfbBool IsUnixSocket(const char *name) { struct stat sb; if(stat(name, &sb) == 0 && (sb.st_mode & S_IFMT) == S_IFSOCK) return TRUE; return FALSE; } #endif /* * ConnectToRFBServer. */ rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port) { if (client->serverPort==-1) { /* serverHost is a file recorded by vncrec. */ const char* magic="vncLog0.0"; char buffer[10]; rfbVNCRec* rec = (rfbVNCRec*)malloc(sizeof(rfbVNCRec)); client->vncRec = rec; rec->file = fopen(client->serverHost,"rb"); rec->tv.tv_sec = 0; rec->readTimestamp = FALSE; rec->doNotSleep = FALSE; if (!rec->file) { rfbClientLog("Could not open %s.\n",client->serverHost); return FALSE; } setbuf(rec->file,NULL); fread(buffer,1,strlen(magic),rec->file); if (strncmp(buffer,magic,strlen(magic))) { rfbClientLog("File %s was not recorded by vncrec.\n",client->serverHost); fclose(rec->file); return FALSE; } client->sock = -1; return TRUE; } #ifndef WIN32 if(IsUnixSocket(hostname)) /* serverHost is a UNIX socket. */ client->sock = ConnectClientToUnixSock(hostname); else #endif { #ifdef LIBVNCSERVER_IPv6 client->sock = ConnectClientToTcpAddr6(hostname, port); if (client->sock == -1) #endif { unsigned int host; /* serverHost is a hostname */ if (!StringToIPAddr(hostname, &host)) { rfbClientLog("Couldn't convert '%s' to host address\n", hostname); return FALSE; } client->sock = ConnectClientToTcpAddr(host, port); } } if (client->sock < 0) { rfbClientLog("Unable to connect to VNC server\n"); return FALSE; } if(client->QoS_DSCP && !SetDSCP(client->sock, client->QoS_DSCP)) return FALSE; return SetNonBlocking(client->sock); } /* * ConnectToRFBRepeater. */ rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort) { rfbProtocolVersionMsg pv; int major,minor; char tmphost[250]; #ifdef LIBVNCSERVER_IPv6 client->sock = ConnectClientToTcpAddr6(repeaterHost, repeaterPort); if (client->sock == -1) #endif { unsigned int host; if (!StringToIPAddr(repeaterHost, &host)) { rfbClientLog("Couldn't convert '%s' to host address\n", repeaterHost); return FALSE; } client->sock = ConnectClientToTcpAddr(host, repeaterPort); } if (client->sock < 0) { rfbClientLog("Unable to connect to VNC repeater\n"); return FALSE; } if (!SetNonBlocking(client->sock)) return FALSE; if (!ReadFromRFBServer(client, pv, sz_rfbProtocolVersionMsg)) return FALSE; pv[sz_rfbProtocolVersionMsg] = 0; /* UltraVNC repeater always report version 000.000 to identify itself */ if (sscanf(pv,rfbProtocolVersionFormat,&major,&minor) != 2 || major != 0 || minor != 0) { rfbClientLog("Not a valid VNC repeater (%s)\n",pv); return FALSE; } rfbClientLog("Connected to VNC repeater, using protocol version %d.%d\n", major, minor); snprintf(tmphost, sizeof(tmphost), "%s:%d", destHost, destPort); if (!WriteToRFBServer(client, tmphost, sizeof(tmphost))) return FALSE; return TRUE; } extern void rfbClientEncryptBytes(unsigned char* bytes, char* passwd); extern void rfbClientEncryptBytes2(unsigned char *where, const int length, unsigned char *key); rfbBool rfbHandleAuthResult(rfbClient* client) { uint32_t authResult=0, reasonLen=0; char *reason=NULL; if (!ReadFromRFBServer(client, (char *)&authResult, 4)) return FALSE; authResult = rfbClientSwap32IfLE(authResult); switch (authResult) { case rfbVncAuthOK: rfbClientLog("VNC authentication succeeded\n"); return TRUE; break; case rfbVncAuthFailed: if (client->major==3 && client->minor>7) { /* we have an error following */ if (!ReadFromRFBServer(client, (char *)&reasonLen, 4)) return FALSE; reasonLen = rfbClientSwap32IfLE(reasonLen); reason = malloc(reasonLen+1); if (!ReadFromRFBServer(client, reason, reasonLen)) { free(reason); return FALSE; } reason[reasonLen]=0; rfbClientLog("VNC connection failed: %s\n",reason); free(reason); return FALSE; } rfbClientLog("VNC authentication failed\n"); return FALSE; case rfbVncAuthTooMany: rfbClientLog("VNC authentication failed - too many tries\n"); return FALSE; } rfbClientLog("Unknown VNC authentication result: %d\n", (int)authResult); return FALSE; } static void ReadReason(rfbClient* client) { uint32_t reasonLen; char *reason; /* we have an error following */ if (!ReadFromRFBServer(client, (char *)&reasonLen, 4)) return; reasonLen = rfbClientSwap32IfLE(reasonLen); reason = malloc(reasonLen+1); if (!ReadFromRFBServer(client, reason, reasonLen)) { free(reason); return; } reason[reasonLen]=0; rfbClientLog("VNC connection failed: %s\n",reason); free(reason); } static rfbBool ReadSupportedSecurityType(rfbClient* client, uint32_t *result, rfbBool subAuth) { uint8_t count=0; uint8_t loop=0; uint8_t flag=0; uint8_t tAuth[256]; char buf1[500],buf2[10]; uint32_t authScheme; if (!ReadFromRFBServer(client, (char *)&count, 1)) return FALSE; if (count==0) { rfbClientLog("List of security types is ZERO, expecting an error to follow\n"); ReadReason(client); return FALSE; } rfbClientLog("We have %d security types to read\n", count); authScheme=0; /* now, we have a list of available security types to read ( uint8_t[] ) */ for (loop=0;loopGetCredential) || (!subAuth && (tAuth[loop]==rfbTLS || (tAuth[loop]==rfbVeNCrypt && client->GetCredential)))) { if (!subAuth && client->clientAuthSchemes) { int i; for (i=0;client->clientAuthSchemes[i];i++) { if (client->clientAuthSchemes[i]==(uint32_t)tAuth[loop]) { flag++; authScheme=tAuth[loop]; break; } } } else { flag++; authScheme=tAuth[loop]; } if (flag) { rfbClientLog("Selecting security type %d (%d/%d in the list)\n", authScheme, loop, count); /* send back a single byte indicating which security type to use */ if (!WriteToRFBServer(client, (char *)&tAuth[loop], 1)) return FALSE; } } } if (authScheme==0) { memset(buf1, 0, sizeof(buf1)); for (loop=0;loop=sizeof(buf1)-1) break; snprintf(buf2, sizeof(buf2), (loop>0 ? ", %d" : "%d"), (int)tAuth[loop]); strncat(buf1, buf2, sizeof(buf1)-strlen(buf1)-1); } rfbClientLog("Unknown authentication scheme from VNC server: %s\n", buf1); return FALSE; } *result = authScheme; return TRUE; } static rfbBool HandleVncAuth(rfbClient *client) { uint8_t challenge[CHALLENGESIZE]; char *passwd=NULL; int i; if (!ReadFromRFBServer(client, (char *)challenge, CHALLENGESIZE)) return FALSE; if (client->serverPort!=-1) { /* if not playing a vncrec file */ if (client->GetPassword) passwd = client->GetPassword(client); if ((!passwd) || (strlen(passwd) == 0)) { rfbClientLog("Reading password failed\n"); return FALSE; } if (strlen(passwd) > 8) { passwd[8] = '\0'; } rfbClientEncryptBytes(challenge, passwd); /* Lose the password from memory */ for (i = strlen(passwd); i >= 0; i--) { passwd[i] = '\0'; } free(passwd); if (!WriteToRFBServer(client, (char *)challenge, CHALLENGESIZE)) return FALSE; } /* Handle the SecurityResult message */ if (!rfbHandleAuthResult(client)) return FALSE; return TRUE; } static void FreeUserCredential(rfbCredential *cred) { if (cred->userCredential.username) free(cred->userCredential.username); if (cred->userCredential.password) free(cred->userCredential.password); free(cred); } static rfbBool HandlePlainAuth(rfbClient *client) { uint32_t ulen, ulensw; uint32_t plen, plensw; rfbCredential *cred; if (!client->GetCredential) { rfbClientLog("GetCredential callback is not set.\n"); return FALSE; } cred = client->GetCredential(client, rfbCredentialTypeUser); if (!cred) { rfbClientLog("Reading credential failed\n"); return FALSE; } ulen = (cred->userCredential.username ? strlen(cred->userCredential.username) : 0); ulensw = rfbClientSwap32IfLE(ulen); plen = (cred->userCredential.password ? strlen(cred->userCredential.password) : 0); plensw = rfbClientSwap32IfLE(plen); if (!WriteToRFBServer(client, (char *)&ulensw, 4) || !WriteToRFBServer(client, (char *)&plensw, 4)) { FreeUserCredential(cred); return FALSE; } if (ulen > 0) { if (!WriteToRFBServer(client, cred->userCredential.username, ulen)) { FreeUserCredential(cred); return FALSE; } } if (plen > 0) { if (!WriteToRFBServer(client, cred->userCredential.password, plen)) { FreeUserCredential(cred); return FALSE; } } FreeUserCredential(cred); /* Handle the SecurityResult message */ if (!rfbHandleAuthResult(client)) return FALSE; return TRUE; } /* Simple 64bit big integer arithmetic implementation */ /* (x + y) % m, works even if (x + y) > 64bit */ #define rfbAddM64(x,y,m) ((x+y)%m+(x+y0;x>>=1) { if (x&1) r=rfbAddM64(r,y,m); y=rfbAddM64(y,y,m); } return r; } /* (x ^ y) % m */ static uint64_t rfbPowM64(uint64_t b, uint64_t e, uint64_t m) { uint64_t r; for(r=1;e>0;e>>=1) { if(e&1) r=rfbMulM64(r,b,m); b=rfbMulM64(b,b,m); } return r; } static rfbBool HandleMSLogonAuth(rfbClient *client) { uint64_t gen, mod, resp, priv, pub, key; uint8_t username[256], password[64]; rfbCredential *cred; if (!ReadFromRFBServer(client, (char *)&gen, 8)) return FALSE; if (!ReadFromRFBServer(client, (char *)&mod, 8)) return FALSE; if (!ReadFromRFBServer(client, (char *)&resp, 8)) return FALSE; gen = rfbClientSwap64IfLE(gen); mod = rfbClientSwap64IfLE(mod); resp = rfbClientSwap64IfLE(resp); if (!client->GetCredential) { rfbClientLog("GetCredential callback is not set.\n"); return FALSE; } rfbClientLog("WARNING! MSLogon security type has very low password encryption! "\ "Use it only with SSH tunnel or trusted network.\n"); cred = client->GetCredential(client, rfbCredentialTypeUser); if (!cred) { rfbClientLog("Reading credential failed\n"); return FALSE; } memset(username, 0, sizeof(username)); strncpy((char *)username, cred->userCredential.username, sizeof(username)); memset(password, 0, sizeof(password)); strncpy((char *)password, cred->userCredential.password, sizeof(password)); FreeUserCredential(cred); srand(time(NULL)); priv = ((uint64_t)rand())<<32; priv |= (uint64_t)rand(); pub = rfbPowM64(gen, priv, mod); key = rfbPowM64(resp, priv, mod); pub = rfbClientSwap64IfLE(pub); key = rfbClientSwap64IfLE(key); rfbClientEncryptBytes2(username, sizeof(username), (unsigned char *)&key); rfbClientEncryptBytes2(password, sizeof(password), (unsigned char *)&key); if (!WriteToRFBServer(client, (char *)&pub, 8)) return FALSE; if (!WriteToRFBServer(client, (char *)username, sizeof(username))) return FALSE; if (!WriteToRFBServer(client, (char *)password, sizeof(password))) return FALSE; /* Handle the SecurityResult message */ if (!rfbHandleAuthResult(client)) return FALSE; return TRUE; } #ifdef LIBVNCSERVER_WITH_CLIENT_GCRYPT static rfbBool rfbMpiToBytes(const gcry_mpi_t value, uint8_t *result, size_t size) { gcry_error_t error; size_t len; int i; error = gcry_mpi_print(GCRYMPI_FMT_USG, result, size, &len, value); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_mpi_print error: %s\n", gcry_strerror(error)); return FALSE; } for (i=size-1;i>(int)size-1-(int)len;--i) result[i] = result[i-size+len]; for (;i>=0;--i) result[i] = 0; return TRUE; } static rfbBool HandleARDAuth(rfbClient *client) { uint8_t gen[2], len[2]; size_t keylen; uint8_t *mod = NULL, *resp, *pub, *key, *shared; gcry_mpi_t genmpi = NULL, modmpi = NULL, respmpi = NULL; gcry_mpi_t privmpi = NULL, pubmpi = NULL, keympi = NULL; gcry_md_hd_t md5 = NULL; gcry_cipher_hd_t aes = NULL; gcry_error_t error; uint8_t userpass[128], ciphertext[128]; int passwordLen, usernameLen; rfbCredential *cred = NULL; rfbBool result = FALSE; while (1) { if (!ReadFromRFBServer(client, (char *)gen, 2)) break; if (!ReadFromRFBServer(client, (char *)len, 2)) break; if (!client->GetCredential) { rfbClientLog("GetCredential callback is not set.\n"); break; } cred = client->GetCredential(client, rfbCredentialTypeUser); if (!cred) { rfbClientLog("Reading credential failed\n"); break; } keylen = 256*len[0]+len[1]; mod = (uint8_t*)malloc(keylen*4); if (!mod) { rfbClientLog("malloc out of memory\n"); break; } resp = mod+keylen; pub = resp+keylen; key = pub+keylen; if (!ReadFromRFBServer(client, (char *)mod, keylen)) break; if (!ReadFromRFBServer(client, (char *)resp, keylen)) break; error = gcry_mpi_scan(&genmpi, GCRYMPI_FMT_USG, gen, 2, NULL); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_mpi_scan error: %s\n", gcry_strerror(error)); break; } error = gcry_mpi_scan(&modmpi, GCRYMPI_FMT_USG, mod, keylen, NULL); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_mpi_scan error: %s\n", gcry_strerror(error)); break; } error = gcry_mpi_scan(&respmpi, GCRYMPI_FMT_USG, resp, keylen, NULL); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_mpi_scan error: %s\n", gcry_strerror(error)); break; } privmpi = gcry_mpi_new(keylen); if (!privmpi) { rfbClientLog("gcry_mpi_new out of memory\n"); break; } gcry_mpi_randomize(privmpi, (keylen/8)*8, GCRY_STRONG_RANDOM); pubmpi = gcry_mpi_new(keylen); if (!pubmpi) { rfbClientLog("gcry_mpi_new out of memory\n"); break; } gcry_mpi_powm(pubmpi, genmpi, privmpi, modmpi); keympi = gcry_mpi_new(keylen); if (!keympi) { rfbClientLog("gcry_mpi_new out of memory\n"); break; } gcry_mpi_powm(keympi, respmpi, privmpi, modmpi); if (!rfbMpiToBytes(pubmpi, pub, keylen)) break; if (!rfbMpiToBytes(keympi, key, keylen)) break; error = gcry_md_open(&md5, GCRY_MD_MD5, 0); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_md_open error: %s\n", gcry_strerror(error)); break; } gcry_md_write(md5, key, keylen); error = gcry_md_final(md5); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_md_final error: %s\n", gcry_strerror(error)); break; } shared = gcry_md_read(md5, GCRY_MD_MD5); passwordLen = strlen(cred->userCredential.password)+1; usernameLen = strlen(cred->userCredential.username)+1; if (passwordLen > sizeof(userpass)/2) passwordLen = sizeof(userpass)/2; if (usernameLen > sizeof(userpass)/2) usernameLen = sizeof(userpass)/2; gcry_randomize(userpass, sizeof(userpass), GCRY_STRONG_RANDOM); memcpy(userpass, cred->userCredential.username, usernameLen); memcpy(userpass+sizeof(userpass)/2, cred->userCredential.password, passwordLen); error = gcry_cipher_open(&aes, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_ECB, 0); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_cipher_open error: %s\n", gcry_strerror(error)); break; } error = gcry_cipher_setkey(aes, shared, 16); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_cipher_setkey error: %s\n", gcry_strerror(error)); break; } error = gcry_cipher_encrypt(aes, ciphertext, sizeof(ciphertext), userpass, sizeof(userpass)); if (gcry_err_code(error) != GPG_ERR_NO_ERROR) { rfbClientLog("gcry_cipher_encrypt error: %s\n", gcry_strerror(error)); break; } if (!WriteToRFBServer(client, (char *)ciphertext, sizeof(ciphertext))) break; if (!WriteToRFBServer(client, (char *)pub, keylen)) break; /* Handle the SecurityResult message */ if (!rfbHandleAuthResult(client)) break; result = TRUE; break; } if (cred) FreeUserCredential(cred); if (mod) free(mod); if (genmpi) gcry_mpi_release(genmpi); if (modmpi) gcry_mpi_release(modmpi); if (respmpi) gcry_mpi_release(respmpi); if (privmpi) gcry_mpi_release(privmpi); if (pubmpi) gcry_mpi_release(pubmpi); if (keympi) gcry_mpi_release(keympi); if (md5) gcry_md_close(md5); if (aes) gcry_cipher_close(aes); return result; } #endif /* * SetClientAuthSchemes. */ void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size) { int i; if (client->clientAuthSchemes) { free(client->clientAuthSchemes); client->clientAuthSchemes = NULL; } if (authSchemes) { if (size<0) { /* If size<0 we assume the passed-in list is also 0-terminate, so we * calculate the size here */ for (size=0;authSchemes[size];size++) ; } client->clientAuthSchemes = (uint32_t*)malloc(sizeof(uint32_t)*(size+1)); for (i=0;iclientAuthSchemes[i] = authSchemes[i]; client->clientAuthSchemes[size] = 0; } } /* * InitialiseRFBConnection. */ rfbBool InitialiseRFBConnection(rfbClient* client) { rfbProtocolVersionMsg pv; int major,minor; uint32_t authScheme; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS uint32_t subAuthScheme; #endif rfbClientInitMsg ci; /* if the connection is immediately closed, don't report anything, so that pmw's monitor can make test connections */ if (client->listenSpecified) errorMessageOnReadFailure = FALSE; if (!ReadFromRFBServer(client, pv, sz_rfbProtocolVersionMsg)) return FALSE; pv[sz_rfbProtocolVersionMsg]=0; errorMessageOnReadFailure = TRUE; pv[sz_rfbProtocolVersionMsg] = 0; if (sscanf(pv,rfbProtocolVersionFormat,&major,&minor) != 2) { rfbClientLog("Not a valid VNC server (%s)\n",pv); return FALSE; } DefaultSupportedMessages(client); client->major = major; client->minor = minor; /* fall back to viewer supported version */ if ((major==rfbProtocolMajorVersion) && (minor>rfbProtocolMinorVersion)) client->minor = rfbProtocolMinorVersion; /* UltraVNC uses minor codes 4 and 6 for the server */ if (major==3 && (minor==4 || minor==6)) { rfbClientLog("UltraVNC server detected, enabling UltraVNC specific messages\n",pv); DefaultSupportedMessagesUltraVNC(client); } /* TightVNC uses minor codes 5 for the server */ if (major==3 && minor==5) { rfbClientLog("TightVNC server detected, enabling TightVNC specific messages\n",pv); DefaultSupportedMessagesTightVNC(client); } /* we do not support > RFB3.8 */ if ((major==3 && minor>8) || major>3) { client->major=3; client->minor=8; } rfbClientLog("VNC server supports protocol version %d.%d (viewer %d.%d)\n", major, minor, rfbProtocolMajorVersion, rfbProtocolMinorVersion); sprintf(pv,rfbProtocolVersionFormat,client->major,client->minor); if (!WriteToRFBServer(client, pv, sz_rfbProtocolVersionMsg)) return FALSE; /* 3.7 and onwards sends a # of security types first */ if (client->major==3 && client->minor > 6) { if (!ReadSupportedSecurityType(client, &authScheme, FALSE)) return FALSE; } else { if (!ReadFromRFBServer(client, (char *)&authScheme, 4)) return FALSE; authScheme = rfbClientSwap32IfLE(authScheme); } rfbClientLog("Selected Security Scheme %d\n", authScheme); client->authScheme = authScheme; switch (authScheme) { case rfbConnFailed: ReadReason(client); return FALSE; case rfbNoAuth: rfbClientLog("No authentication needed\n"); /* 3.8 and upwards sends a Security Result for rfbNoAuth */ if ((client->major==3 && client->minor > 7) || client->major>3) if (!rfbHandleAuthResult(client)) return FALSE; break; case rfbVncAuth: if (!HandleVncAuth(client)) return FALSE; break; case rfbMSLogon: if (!HandleMSLogonAuth(client)) return FALSE; break; case rfbARD: #ifndef LIBVNCSERVER_WITH_CLIENT_GCRYPT rfbClientLog("GCrypt support was not compiled in\n"); return FALSE; #else if (!HandleARDAuth(client)) return FALSE; #endif break; case rfbTLS: #ifndef LIBVNCSERVER_WITH_CLIENT_TLS rfbClientLog("TLS support was not compiled in\n"); return FALSE; #else if (!HandleAnonTLSAuth(client)) return FALSE; /* After the TLS session is established, sub auth types are expected. * Note that all following reading/writing are through the TLS session from here. */ if (!ReadSupportedSecurityType(client, &subAuthScheme, TRUE)) return FALSE; client->subAuthScheme = subAuthScheme; switch (subAuthScheme) { case rfbConnFailed: ReadReason(client); return FALSE; case rfbNoAuth: rfbClientLog("No sub authentication needed\n"); /* 3.8 and upwards sends a Security Result for rfbNoAuth */ if ((client->major==3 && client->minor > 7) || client->major>3) if (!rfbHandleAuthResult(client)) return FALSE; break; case rfbVncAuth: if (!HandleVncAuth(client)) return FALSE; break; default: rfbClientLog("Unknown sub authentication scheme from VNC server: %d\n", (int)subAuthScheme); return FALSE; } #endif break; case rfbVeNCrypt: #ifndef LIBVNCSERVER_WITH_CLIENT_TLS rfbClientLog("TLS support was not compiled in\n"); return FALSE; #else if (!HandleVeNCryptAuth(client)) return FALSE; switch (client->subAuthScheme) { case rfbVeNCryptTLSNone: case rfbVeNCryptX509None: rfbClientLog("No sub authentication needed\n"); if (!rfbHandleAuthResult(client)) return FALSE; break; case rfbVeNCryptTLSVNC: case rfbVeNCryptX509VNC: if (!HandleVncAuth(client)) return FALSE; break; case rfbVeNCryptTLSPlain: case rfbVeNCryptX509Plain: if (!HandlePlainAuth(client)) return FALSE; break; default: rfbClientLog("Unknown sub authentication scheme from VNC server: %d\n", client->subAuthScheme); return FALSE; } #endif break; default: rfbClientLog("Unknown authentication scheme from VNC server: %d\n", (int)authScheme); return FALSE; } ci.shared = (client->appData.shareDesktop ? 1 : 0); if (!WriteToRFBServer(client, (char *)&ci, sz_rfbClientInitMsg)) return FALSE; if (!ReadFromRFBServer(client, (char *)&client->si, sz_rfbServerInitMsg)) return FALSE; client->si.framebufferWidth = rfbClientSwap16IfLE(client->si.framebufferWidth); client->si.framebufferHeight = rfbClientSwap16IfLE(client->si.framebufferHeight); client->si.format.redMax = rfbClientSwap16IfLE(client->si.format.redMax); client->si.format.greenMax = rfbClientSwap16IfLE(client->si.format.greenMax); client->si.format.blueMax = rfbClientSwap16IfLE(client->si.format.blueMax); client->si.nameLength = rfbClientSwap32IfLE(client->si.nameLength); client->desktopName = malloc(client->si.nameLength + 1); if (!client->desktopName) { rfbClientLog("Error allocating memory for desktop name, %lu bytes\n", (unsigned long)client->si.nameLength); return FALSE; } if (!ReadFromRFBServer(client, client->desktopName, client->si.nameLength)) return FALSE; client->desktopName[client->si.nameLength] = 0; rfbClientLog("Desktop name \"%s\"\n",client->desktopName); rfbClientLog("Connected to VNC server, using protocol version %d.%d\n", client->major, client->minor); rfbClientLog("VNC server default format:\n"); PrintPixelFormat(&client->si.format); return TRUE; } /* * SetFormatAndEncodings. */ rfbBool SetFormatAndEncodings(rfbClient* client) { rfbSetPixelFormatMsg spf; char buf[sz_rfbSetEncodingsMsg + MAX_ENCODINGS * 4]; rfbSetEncodingsMsg *se = (rfbSetEncodingsMsg *)buf; uint32_t *encs = (uint32_t *)(&buf[sz_rfbSetEncodingsMsg]); int len = 0; rfbBool requestCompressLevel = FALSE; rfbBool requestQualityLevel = FALSE; rfbBool requestLastRectEncoding = FALSE; rfbClientProtocolExtension* e; if (!SupportsClient2Server(client, rfbSetPixelFormat)) return TRUE; spf.type = rfbSetPixelFormat; spf.format = client->format; spf.format.redMax = rfbClientSwap16IfLE(spf.format.redMax); spf.format.greenMax = rfbClientSwap16IfLE(spf.format.greenMax); spf.format.blueMax = rfbClientSwap16IfLE(spf.format.blueMax); if (!WriteToRFBServer(client, (char *)&spf, sz_rfbSetPixelFormatMsg)) return FALSE; if (!SupportsClient2Server(client, rfbSetEncodings)) return TRUE; se->type = rfbSetEncodings; se->nEncodings = 0; if (client->appData.encodingsString) { const char *encStr = client->appData.encodingsString; int encStrLen; do { const char *nextEncStr = strchr(encStr, ' '); if (nextEncStr) { encStrLen = nextEncStr - encStr; nextEncStr++; } else { encStrLen = strlen(encStr); } if (strncasecmp(encStr,"raw",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRaw); } else if (strncasecmp(encStr,"copyrect",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingCopyRect); #ifdef LIBVNCSERVER_HAVE_LIBZ #ifdef LIBVNCSERVER_HAVE_LIBJPEG } else if (strncasecmp(encStr,"tight",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingTight); requestLastRectEncoding = TRUE; if (client->appData.compressLevel >= 0 && client->appData.compressLevel <= 9) requestCompressLevel = TRUE; if (client->appData.enableJPEG) requestQualityLevel = TRUE; #endif #endif } else if (strncasecmp(encStr,"hextile",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingHextile); #ifdef LIBVNCSERVER_HAVE_LIBZ } else if (strncasecmp(encStr,"zlib",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZlib); if (client->appData.compressLevel >= 0 && client->appData.compressLevel <= 9) requestCompressLevel = TRUE; } else if (strncasecmp(encStr,"zlibhex",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZlibHex); if (client->appData.compressLevel >= 0 && client->appData.compressLevel <= 9) requestCompressLevel = TRUE; } else if (strncasecmp(encStr,"zrle",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZRLE); } else if (strncasecmp(encStr,"zywrle",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZYWRLE); requestQualityLevel = TRUE; #endif } else if ((strncasecmp(encStr,"ultra",encStrLen) == 0) || (strncasecmp(encStr,"ultrazip",encStrLen) == 0)) { /* There are 2 encodings used in 'ultra' */ encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingUltra); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingUltraZip); } else if (strncasecmp(encStr,"corre",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingCoRRE); } else if (strncasecmp(encStr,"rre",encStrLen) == 0) { encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRRE); } else { rfbClientLog("Unknown encoding '%.*s'\n",encStrLen,encStr); } encStr = nextEncStr; } while (encStr && se->nEncodings < MAX_ENCODINGS); if (se->nEncodings < MAX_ENCODINGS && requestCompressLevel) { encs[se->nEncodings++] = rfbClientSwap32IfLE(client->appData.compressLevel + rfbEncodingCompressLevel0); } if (se->nEncodings < MAX_ENCODINGS && requestQualityLevel) { if (client->appData.qualityLevel < 0 || client->appData.qualityLevel > 9) client->appData.qualityLevel = 5; encs[se->nEncodings++] = rfbClientSwap32IfLE(client->appData.qualityLevel + rfbEncodingQualityLevel0); } } else { if (SameMachine(client->sock)) { /* TODO: if (!tunnelSpecified) { */ rfbClientLog("Same machine: preferring raw encoding\n"); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRaw); /* } else { rfbClientLog("Tunneling active: preferring tight encoding\n"); } */ } encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingCopyRect); #ifdef LIBVNCSERVER_HAVE_LIBZ #ifdef LIBVNCSERVER_HAVE_LIBJPEG encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingTight); requestLastRectEncoding = TRUE; #endif #endif encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingHextile); #ifdef LIBVNCSERVER_HAVE_LIBZ encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZlib); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZRLE); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingZYWRLE); #endif encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingUltra); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingUltraZip); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingCoRRE); encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRRE); if (client->appData.compressLevel >= 0 && client->appData.compressLevel <= 9) { encs[se->nEncodings++] = rfbClientSwap32IfLE(client->appData.compressLevel + rfbEncodingCompressLevel0); } else /* if (!tunnelSpecified) */ { /* If -tunnel option was provided, we assume that server machine is not in the local network so we use default compression level for tight encoding instead of fast compression. Thus we are requesting level 1 compression only if tunneling is not used. */ encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingCompressLevel1); } if (client->appData.enableJPEG) { if (client->appData.qualityLevel < 0 || client->appData.qualityLevel > 9) client->appData.qualityLevel = 5; encs[se->nEncodings++] = rfbClientSwap32IfLE(client->appData.qualityLevel + rfbEncodingQualityLevel0); } } /* Remote Cursor Support (local to viewer) */ if (client->appData.useRemoteCursor) { if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingXCursor); if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRichCursor); if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingPointerPos); } /* Keyboard State Encodings */ if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingKeyboardLedState); /* New Frame Buffer Size */ if (se->nEncodings < MAX_ENCODINGS && client->canHandleNewFBSize) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingNewFBSize); /* Last Rect */ if (se->nEncodings < MAX_ENCODINGS && requestLastRectEncoding) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingLastRect); /* Server Capabilities */ if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingSupportedMessages); if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingSupportedEncodings); if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingServerIdentity); /* xvp */ if (se->nEncodings < MAX_ENCODINGS) encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingXvp); /* client extensions */ for(e = rfbClientExtensions; e; e = e->next) if(e->encodings) { int* enc; for(enc = e->encodings; *enc; enc++) encs[se->nEncodings++] = rfbClientSwap32IfLE(*enc); } len = sz_rfbSetEncodingsMsg + se->nEncodings * 4; se->nEncodings = rfbClientSwap16IfLE(se->nEncodings); if (!WriteToRFBServer(client, buf, len)) return FALSE; return TRUE; } /* * SendIncrementalFramebufferUpdateRequest. */ rfbBool SendIncrementalFramebufferUpdateRequest(rfbClient* client) { return SendFramebufferUpdateRequest(client, client->updateRect.x, client->updateRect.y, client->updateRect.w, client->updateRect.h, TRUE); } /* * SendFramebufferUpdateRequest. */ rfbBool SendFramebufferUpdateRequest(rfbClient* client, int x, int y, int w, int h, rfbBool incremental) { rfbFramebufferUpdateRequestMsg fur; if (!SupportsClient2Server(client, rfbFramebufferUpdateRequest)) return TRUE; fur.type = rfbFramebufferUpdateRequest; fur.incremental = incremental ? 1 : 0; fur.x = rfbClientSwap16IfLE(x); fur.y = rfbClientSwap16IfLE(y); fur.w = rfbClientSwap16IfLE(w); fur.h = rfbClientSwap16IfLE(h); if (!WriteToRFBServer(client, (char *)&fur, sz_rfbFramebufferUpdateRequestMsg)) return FALSE; return TRUE; } /* * SendScaleSetting. */ rfbBool SendScaleSetting(rfbClient* client,int scaleSetting) { rfbSetScaleMsg ssm; ssm.scale = scaleSetting; ssm.pad = 0; /* favor UltraVNC SetScale if both are supported */ if (SupportsClient2Server(client, rfbSetScale)) { ssm.type = rfbSetScale; if (!WriteToRFBServer(client, (char *)&ssm, sz_rfbSetScaleMsg)) return FALSE; } if (SupportsClient2Server(client, rfbPalmVNCSetScaleFactor)) { ssm.type = rfbPalmVNCSetScaleFactor; if (!WriteToRFBServer(client, (char *)&ssm, sz_rfbSetScaleMsg)) return FALSE; } return TRUE; } /* * TextChatFunctions (UltraVNC) * Extremely bandwidth friendly method of communicating with a user * (Think HelpDesk type applications) */ rfbBool TextChatSend(rfbClient* client, char *text) { rfbTextChatMsg chat; int count = strlen(text); if (!SupportsClient2Server(client, rfbTextChat)) return TRUE; chat.type = rfbTextChat; chat.pad1 = 0; chat.pad2 = 0; chat.length = (uint32_t)count; chat.length = rfbClientSwap32IfLE(chat.length); if (!WriteToRFBServer(client, (char *)&chat, sz_rfbTextChatMsg)) return FALSE; if (count>0) { if (!WriteToRFBServer(client, text, count)) return FALSE; } return TRUE; } rfbBool TextChatOpen(rfbClient* client) { rfbTextChatMsg chat; if (!SupportsClient2Server(client, rfbTextChat)) return TRUE; chat.type = rfbTextChat; chat.pad1 = 0; chat.pad2 = 0; chat.length = rfbClientSwap32IfLE(rfbTextChatOpen); return (WriteToRFBServer(client, (char *)&chat, sz_rfbTextChatMsg) ? TRUE : FALSE); } rfbBool TextChatClose(rfbClient* client) { rfbTextChatMsg chat; if (!SupportsClient2Server(client, rfbTextChat)) return TRUE; chat.type = rfbTextChat; chat.pad1 = 0; chat.pad2 = 0; chat.length = rfbClientSwap32IfLE(rfbTextChatClose); return (WriteToRFBServer(client, (char *)&chat, sz_rfbTextChatMsg) ? TRUE : FALSE); } rfbBool TextChatFinish(rfbClient* client) { rfbTextChatMsg chat; if (!SupportsClient2Server(client, rfbTextChat)) return TRUE; chat.type = rfbTextChat; chat.pad1 = 0; chat.pad2 = 0; chat.length = rfbClientSwap32IfLE(rfbTextChatFinished); return (WriteToRFBServer(client, (char *)&chat, sz_rfbTextChatMsg) ? TRUE : FALSE); } /* * UltraVNC Server Input Disable * Apparently, the remote client can *prevent* the local user from interacting with the display * I would think this is extremely helpful when used in a HelpDesk situation */ rfbBool PermitServerInput(rfbClient* client, int enabled) { rfbSetServerInputMsg msg; if (!SupportsClient2Server(client, rfbSetServerInput)) return TRUE; /* enabled==1, then server input from local keyboard is disabled */ msg.type = rfbSetServerInput; msg.status = (enabled ? 1 : 0); msg.pad = 0; return (WriteToRFBServer(client, (char *)&msg, sz_rfbSetServerInputMsg) ? TRUE : FALSE); } /* * send xvp client message * A client supporting the xvp extension sends this to request that the server initiate * a clean shutdown, clean reboot or abrupt reset of the system whose framebuffer the * client is displaying. * * only version 1 is defined in the protocol specs * * possible values for code are: * rfbXvp_Shutdown * rfbXvp_Reboot * rfbXvp_Reset */ rfbBool SendXvpMsg(rfbClient* client, uint8_t version, uint8_t code) { rfbXvpMsg xvp; if (!SupportsClient2Server(client, rfbXvp)) return TRUE; xvp.type = rfbXvp; xvp.pad = 0; xvp.version = version; xvp.code = code; if (!WriteToRFBServer(client, (char *)&xvp, sz_rfbXvpMsg)) return FALSE; return TRUE; } /* * SendPointerEvent. */ rfbBool SendPointerEvent(rfbClient* client,int x, int y, int buttonMask) { rfbPointerEventMsg pe; if (!SupportsClient2Server(client, rfbPointerEvent)) return TRUE; pe.type = rfbPointerEvent; pe.buttonMask = buttonMask; if (x < 0) x = 0; if (y < 0) y = 0; pe.x = rfbClientSwap16IfLE(x); pe.y = rfbClientSwap16IfLE(y); return WriteToRFBServer(client, (char *)&pe, sz_rfbPointerEventMsg); } /* * SendKeyEvent. */ rfbBool SendKeyEvent(rfbClient* client, uint32_t key, rfbBool down) { rfbKeyEventMsg ke; if (!SupportsClient2Server(client, rfbKeyEvent)) return TRUE; ke.type = rfbKeyEvent; ke.down = down ? 1 : 0; ke.key = rfbClientSwap32IfLE(key); return WriteToRFBServer(client, (char *)&ke, sz_rfbKeyEventMsg); } /* * SendClientCutText. */ rfbBool SendClientCutText(rfbClient* client, char *str, int len) { rfbClientCutTextMsg cct; if (!SupportsClient2Server(client, rfbClientCutText)) return TRUE; cct.type = rfbClientCutText; cct.length = rfbClientSwap32IfLE(len); return (WriteToRFBServer(client, (char *)&cct, sz_rfbClientCutTextMsg) && WriteToRFBServer(client, str, len)); } /* * HandleRFBServerMessage. */ rfbBool HandleRFBServerMessage(rfbClient* client) { rfbServerToClientMsg msg; if (client->serverPort==-1) client->vncRec->readTimestamp = TRUE; if (!ReadFromRFBServer(client, (char *)&msg, 1)) return FALSE; switch (msg.type) { case rfbSetColourMapEntries: { /* TODO: int i; uint16_t rgb[3]; XColor xc; if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbSetColourMapEntriesMsg - 1)) return FALSE; msg.scme.firstColour = rfbClientSwap16IfLE(msg.scme.firstColour); msg.scme.nColours = rfbClientSwap16IfLE(msg.scme.nColours); for (i = 0; i < msg.scme.nColours; i++) { if (!ReadFromRFBServer(client, (char *)rgb, 6)) return FALSE; xc.pixel = msg.scme.firstColour + i; xc.red = rfbClientSwap16IfLE(rgb[0]); xc.green = rfbClientSwap16IfLE(rgb[1]); xc.blue = rfbClientSwap16IfLE(rgb[2]); xc.flags = DoRed|DoGreen|DoBlue; XStoreColor(dpy, cmap, &xc); } */ break; } case rfbFramebufferUpdate: { rfbFramebufferUpdateRectHeader rect; int linesToRead; int bytesPerLine; int i; if (!ReadFromRFBServer(client, ((char *)&msg.fu) + 1, sz_rfbFramebufferUpdateMsg - 1)) return FALSE; msg.fu.nRects = rfbClientSwap16IfLE(msg.fu.nRects); for (i = 0; i < msg.fu.nRects; i++) { if (!ReadFromRFBServer(client, (char *)&rect, sz_rfbFramebufferUpdateRectHeader)) return FALSE; rect.encoding = rfbClientSwap32IfLE(rect.encoding); if (rect.encoding == rfbEncodingLastRect) break; rect.r.x = rfbClientSwap16IfLE(rect.r.x); rect.r.y = rfbClientSwap16IfLE(rect.r.y); rect.r.w = rfbClientSwap16IfLE(rect.r.w); rect.r.h = rfbClientSwap16IfLE(rect.r.h); if (rect.encoding == rfbEncodingXCursor || rect.encoding == rfbEncodingRichCursor) { if (!HandleCursorShape(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h, rect.encoding)) { return FALSE; } continue; } if (rect.encoding == rfbEncodingPointerPos) { if (!client->HandleCursorPos(client,rect.r.x, rect.r.y)) { return FALSE; } continue; } if (rect.encoding == rfbEncodingKeyboardLedState) { /* OK! We have received a keyboard state message!!! */ client->KeyboardLedStateEnabled = 1; if (client->HandleKeyboardLedState!=NULL) client->HandleKeyboardLedState(client, rect.r.x, 0); /* stash it for the future */ client->CurrentKeyboardLedState = rect.r.x; continue; } if (rect.encoding == rfbEncodingNewFBSize) { client->width = rect.r.w; client->height = rect.r.h; client->updateRect.x = client->updateRect.y = 0; client->updateRect.w = client->width; client->updateRect.h = client->height; client->MallocFrameBuffer(client); SendFramebufferUpdateRequest(client, 0, 0, rect.r.w, rect.r.h, FALSE); rfbClientLog("Got new framebuffer size: %dx%d\n", rect.r.w, rect.r.h); continue; } /* rect.r.w=byte count */ if (rect.encoding == rfbEncodingSupportedMessages) { int loop; if (!ReadFromRFBServer(client, (char *)&client->supportedMessages, sz_rfbSupportedMessages)) return FALSE; /* msgs is two sets of bit flags of supported messages client2server[] and server2client[] */ /* currently ignored by this library */ rfbClientLog("client2server supported messages (bit flags)\n"); for (loop=0;loop<32;loop+=8) rfbClientLog("%02X: %04x %04x %04x %04x - %04x %04x %04x %04x\n", loop, client->supportedMessages.client2server[loop], client->supportedMessages.client2server[loop+1], client->supportedMessages.client2server[loop+2], client->supportedMessages.client2server[loop+3], client->supportedMessages.client2server[loop+4], client->supportedMessages.client2server[loop+5], client->supportedMessages.client2server[loop+6], client->supportedMessages.client2server[loop+7]); rfbClientLog("server2client supported messages (bit flags)\n"); for (loop=0;loop<32;loop+=8) rfbClientLog("%02X: %04x %04x %04x %04x - %04x %04x %04x %04x\n", loop, client->supportedMessages.server2client[loop], client->supportedMessages.server2client[loop+1], client->supportedMessages.server2client[loop+2], client->supportedMessages.server2client[loop+3], client->supportedMessages.server2client[loop+4], client->supportedMessages.server2client[loop+5], client->supportedMessages.server2client[loop+6], client->supportedMessages.server2client[loop+7]); continue; } /* rect.r.w=byte count, rect.r.h=# of encodings */ if (rect.encoding == rfbEncodingSupportedEncodings) { char *buffer; buffer = malloc(rect.r.w); if (!ReadFromRFBServer(client, buffer, rect.r.w)) { free(buffer); return FALSE; } /* buffer now contains rect.r.h # of uint32_t encodings that the server supports */ /* currently ignored by this library */ free(buffer); continue; } /* rect.r.w=byte count */ if (rect.encoding == rfbEncodingServerIdentity) { char *buffer; buffer = malloc(rect.r.w+1); if (!ReadFromRFBServer(client, buffer, rect.r.w)) { free(buffer); return FALSE; } buffer[rect.r.w]=0; /* null terminate, just in case */ rfbClientLog("Connected to Server \"%s\"\n", buffer); free(buffer); continue; } /* rfbEncodingUltraZip is a collection of subrects. x = # of subrects, and h is always 0 */ if (rect.encoding != rfbEncodingUltraZip) { if ((rect.r.x + rect.r.w > client->width) || (rect.r.y + rect.r.h > client->height)) { rfbClientLog("Rect too large: %dx%d at (%d, %d)\n", rect.r.w, rect.r.h, rect.r.x, rect.r.y); return FALSE; } /* UltraVNC with scaling, will send rectangles with a zero W or H * if ((rect.encoding != rfbEncodingTight) && (rect.r.h * rect.r.w == 0)) { rfbClientLog("Zero size rect - ignoring (encoding=%d (0x%08x) %dx, %dy, %dw, %dh)\n", rect.encoding, rect.encoding, rect.r.x, rect.r.y, rect.r.w, rect.r.h); continue; } */ /* If RichCursor encoding is used, we should prevent collisions between framebuffer updates and cursor drawing operations. */ client->SoftCursorLockArea(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h); } switch (rect.encoding) { case rfbEncodingRaw: { int y=rect.r.y, h=rect.r.h; bytesPerLine = rect.r.w * client->format.bitsPerPixel / 8; linesToRead = RFB_BUFFER_SIZE / bytesPerLine; while (h > 0) { if (linesToRead > h) linesToRead = h; if (!ReadFromRFBServer(client, client->buffer,bytesPerLine * linesToRead)) return FALSE; CopyRectangle(client, (uint8_t *)client->buffer, rect.r.x, y, rect.r.w,linesToRead); h -= linesToRead; y += linesToRead; } } break; case rfbEncodingCopyRect: { rfbCopyRect cr; if (!ReadFromRFBServer(client, (char *)&cr, sz_rfbCopyRect)) return FALSE; cr.srcX = rfbClientSwap16IfLE(cr.srcX); cr.srcY = rfbClientSwap16IfLE(cr.srcY); /* If RichCursor encoding is used, we should extend our "cursor lock area" (previously set to destination rectangle) to the source rectangle as well. */ client->SoftCursorLockArea(client, cr.srcX, cr.srcY, rect.r.w, rect.r.h); if (client->GotCopyRect != NULL) { client->GotCopyRect(client, cr.srcX, cr.srcY, rect.r.w, rect.r.h, rect.r.x, rect.r.y); } else CopyRectangleFromRectangle(client, cr.srcX, cr.srcY, rect.r.w, rect.r.h, rect.r.x, rect.r.y); break; } case rfbEncodingRRE: { switch (client->format.bitsPerPixel) { case 8: if (!HandleRRE8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleRRE16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleRRE32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } case rfbEncodingCoRRE: { switch (client->format.bitsPerPixel) { case 8: if (!HandleCoRRE8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleCoRRE16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleCoRRE32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } case rfbEncodingHextile: { switch (client->format.bitsPerPixel) { case 8: if (!HandleHextile8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleHextile16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleHextile32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } case rfbEncodingUltra: { switch (client->format.bitsPerPixel) { case 8: if (!HandleUltra8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleUltra16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleUltra32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } case rfbEncodingUltraZip: { switch (client->format.bitsPerPixel) { case 8: if (!HandleUltraZip8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleUltraZip16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleUltraZip32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } #ifdef LIBVNCSERVER_HAVE_LIBZ case rfbEncodingZlib: { switch (client->format.bitsPerPixel) { case 8: if (!HandleZlib8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleZlib16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleZlib32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } #ifdef LIBVNCSERVER_HAVE_LIBJPEG case rfbEncodingTight: { switch (client->format.bitsPerPixel) { case 8: if (!HandleTight8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (!HandleTight16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 32: if (!HandleTight32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } break; } #endif case rfbEncodingZRLE: /* Fail safe for ZYWRLE unsupport VNC server. */ client->appData.qualityLevel = 9; /* fall through */ case rfbEncodingZYWRLE: { switch (client->format.bitsPerPixel) { case 8: if (!HandleZRLE8(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; case 16: if (client->si.format.greenMax > 0x1F) { if (!HandleZRLE16(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; } else { if (!HandleZRLE15(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; } break; case 32: { uint32_t maxColor=(client->format.redMax<format.redShift)| (client->format.greenMax<format.greenShift)| (client->format.blueMax<format.blueShift); if ((client->format.bigEndian && (maxColor&0xff)==0) || (!client->format.bigEndian && (maxColor&0xff000000)==0)) { if (!HandleZRLE24(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; } else if (!client->format.bigEndian && (maxColor&0xff)==0) { if (!HandleZRLE24Up(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; } else if (client->format.bigEndian && (maxColor&0xff000000)==0) { if (!HandleZRLE24Down(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; } else if (!HandleZRLE32(client, rect.r.x,rect.r.y,rect.r.w,rect.r.h)) return FALSE; break; } } break; } #endif default: { rfbBool handled = FALSE; rfbClientProtocolExtension* e; for(e = rfbClientExtensions; !handled && e; e = e->next) if(e->handleEncoding && e->handleEncoding(client, &rect)) handled = TRUE; if(!handled) { rfbClientLog("Unknown rect encoding %d\n", (int)rect.encoding); return FALSE; } } } /* Now we may discard "soft cursor locks". */ client->SoftCursorUnlockScreen(client); client->GotFrameBufferUpdate(client, rect.r.x, rect.r.y, rect.r.w, rect.r.h); } if (!SendIncrementalFramebufferUpdateRequest(client)) return FALSE; if (client->FinishedFrameBufferUpdate) client->FinishedFrameBufferUpdate(client); break; } case rfbBell: { client->Bell(client); break; } case rfbServerCutText: { char *buffer; if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbServerCutTextMsg - 1)) return FALSE; msg.sct.length = rfbClientSwap32IfLE(msg.sct.length); buffer = malloc(msg.sct.length+1); if (!ReadFromRFBServer(client, buffer, msg.sct.length)) return FALSE; buffer[msg.sct.length] = 0; if (client->GotXCutText) client->GotXCutText(client, buffer, msg.sct.length); free(buffer); break; } case rfbTextChat: { char *buffer=NULL; if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbTextChatMsg- 1)) return FALSE; msg.tc.length = rfbClientSwap32IfLE(msg.sct.length); switch(msg.tc.length) { case rfbTextChatOpen: rfbClientLog("Received TextChat Open\n"); if (client->HandleTextChat!=NULL) client->HandleTextChat(client, (int)rfbTextChatOpen, NULL); break; case rfbTextChatClose: rfbClientLog("Received TextChat Close\n"); if (client->HandleTextChat!=NULL) client->HandleTextChat(client, (int)rfbTextChatClose, NULL); break; case rfbTextChatFinished: rfbClientLog("Received TextChat Finished\n"); if (client->HandleTextChat!=NULL) client->HandleTextChat(client, (int)rfbTextChatFinished, NULL); break; default: buffer=malloc(msg.tc.length+1); if (!ReadFromRFBServer(client, buffer, msg.tc.length)) { free(buffer); return FALSE; } /* Null Terminate */ buffer[msg.tc.length]=0; rfbClientLog("Received TextChat \"%s\"\n", buffer); if (client->HandleTextChat!=NULL) client->HandleTextChat(client, (int)msg.tc.length, buffer); free(buffer); break; } break; } case rfbXvp: { if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbXvpMsg -1)) return FALSE; SetClient2Server(client, rfbXvp); /* technically, we only care what we can *send* to the server * but, we set Server2Client Just in case it ever becomes useful */ SetServer2Client(client, rfbXvp); if(client->HandleXvpMsg) client->HandleXvpMsg(client, msg.xvp.version, msg.xvp.code); break; } case rfbResizeFrameBuffer: { if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbResizeFrameBufferMsg -1)) return FALSE; client->width = rfbClientSwap16IfLE(msg.rsfb.framebufferWidth); client->height = rfbClientSwap16IfLE(msg.rsfb.framebufferHeigth); client->updateRect.x = client->updateRect.y = 0; client->updateRect.w = client->width; client->updateRect.h = client->height; client->MallocFrameBuffer(client); SendFramebufferUpdateRequest(client, 0, 0, client->width, client->height, FALSE); rfbClientLog("Got new framebuffer size: %dx%d\n", client->width, client->height); break; } case rfbPalmVNCReSizeFrameBuffer: { if (!ReadFromRFBServer(client, ((char *)&msg) + 1, sz_rfbPalmVNCReSizeFrameBufferMsg -1)) return FALSE; client->width = rfbClientSwap16IfLE(msg.prsfb.buffer_w); client->height = rfbClientSwap16IfLE(msg.prsfb.buffer_h); client->updateRect.x = client->updateRect.y = 0; client->updateRect.w = client->width; client->updateRect.h = client->height; client->MallocFrameBuffer(client); SendFramebufferUpdateRequest(client, 0, 0, client->width, client->height, FALSE); rfbClientLog("Got new framebuffer size: %dx%d\n", client->width, client->height); break; } default: { rfbBool handled = FALSE; rfbClientProtocolExtension* e; for(e = rfbClientExtensions; !handled && e; e = e->next) if(e->handleMessage && e->handleMessage(client, &msg)) handled = TRUE; if(!handled) { char buffer[256]; rfbClientLog("Unknown message type %d from VNC server\n",msg.type); ReadFromRFBServer(client, buffer, 256); return FALSE; } } } return TRUE; } #define GET_PIXEL8(pix, ptr) ((pix) = *(ptr)++) #define GET_PIXEL16(pix, ptr) (((uint8_t*)&(pix))[0] = *(ptr)++, \ ((uint8_t*)&(pix))[1] = *(ptr)++) #define GET_PIXEL32(pix, ptr) (((uint8_t*)&(pix))[0] = *(ptr)++, \ ((uint8_t*)&(pix))[1] = *(ptr)++, \ ((uint8_t*)&(pix))[2] = *(ptr)++, \ ((uint8_t*)&(pix))[3] = *(ptr)++) /* CONCAT2 concatenates its two arguments. CONCAT2E does the same but also expands its arguments if they are macros */ #define CONCAT2(a,b) a##b #define CONCAT2E(a,b) CONCAT2(a,b) #define CONCAT3(a,b,c) a##b##c #define CONCAT3E(a,b,c) CONCAT3(a,b,c) #define BPP 8 #include "rre.c" #include "corre.c" #include "hextile.c" #include "ultra.c" #include "zlib.c" #include "tight.c" #include "zrle.c" #undef BPP #define BPP 16 #include "rre.c" #include "corre.c" #include "hextile.c" #include "ultra.c" #include "zlib.c" #include "tight.c" #include "zrle.c" #define REALBPP 15 #include "zrle.c" #undef BPP #define BPP 32 #include "rre.c" #include "corre.c" #include "hextile.c" #include "ultra.c" #include "zlib.c" #include "tight.c" #include "zrle.c" #define REALBPP 24 #include "zrle.c" #define REALBPP 24 #define UNCOMP 8 #include "zrle.c" #define REALBPP 24 #define UNCOMP -8 #include "zrle.c" #undef BPP /* * PrintPixelFormat. */ void PrintPixelFormat(rfbPixelFormat *format) { if (format->bitsPerPixel == 1) { rfbClientLog(" Single bit per pixel.\n"); rfbClientLog( " %s significant bit in each byte is leftmost on the screen.\n", (format->bigEndian ? "Most" : "Least")); } else { rfbClientLog(" %d bits per pixel.\n",format->bitsPerPixel); if (format->bitsPerPixel != 8) { rfbClientLog(" %s significant byte first in each pixel.\n", (format->bigEndian ? "Most" : "Least")); } if (format->trueColour) { rfbClientLog(" TRUE colour: max red %d green %d blue %d" ", shift red %d green %d blue %d\n", format->redMax, format->greenMax, format->blueMax, format->redShift, format->greenShift, format->blueShift); } else { rfbClientLog(" Colour map (not true colour).\n"); } } } /* avoid name clashes with LibVNCServer */ #define rfbEncryptBytes rfbClientEncryptBytes #define rfbEncryptBytes2 rfbClientEncryptBytes2 #define rfbDes rfbClientDes #define rfbDesKey rfbClientDesKey #define rfbUseKey rfbClientUseKey #define rfbCPKey rfbClientCPKey #include "vncauth.c" #include "d3des.c" FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/rre.c000066400000000000000000000041531171526373700266270ustar00rootroot00000000000000/* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * rre.c - handle RRE encoding. * * This file shouldn't be compiled directly. It is included multiple times by * rfbproto.c, each time with a different definition of the macro BPP. For * each value of BPP, this file defines a function which handles an RRE * encoded rectangle with BPP bits per pixel. */ #define HandleRREBPP CONCAT2E(HandleRRE,BPP) #define CARDBPP CONCAT3E(uint,BPP,_t) static rfbBool HandleRREBPP (rfbClient* client, int rx, int ry, int rw, int rh) { rfbRREHeader hdr; int i; CARDBPP pix; rfbRectangle subrect; if (!ReadFromRFBServer(client, (char *)&hdr, sz_rfbRREHeader)) return FALSE; hdr.nSubrects = rfbClientSwap32IfLE(hdr.nSubrects); if (!ReadFromRFBServer(client, (char *)&pix, sizeof(pix))) return FALSE; FillRectangle(client, rx, ry, rw, rh, pix); for (i = 0; i < hdr.nSubrects; i++) { if (!ReadFromRFBServer(client, (char *)&pix, sizeof(pix))) return FALSE; if (!ReadFromRFBServer(client, (char *)&subrect, sz_rfbRectangle)) return FALSE; subrect.x = rfbClientSwap16IfLE(subrect.x); subrect.y = rfbClientSwap16IfLE(subrect.y); subrect.w = rfbClientSwap16IfLE(subrect.w); subrect.h = rfbClientSwap16IfLE(subrect.h); FillRectangle(client, rx+subrect.x, ry+subrect.y, subrect.w, subrect.h, pix); } return TRUE; } #undef CARDBPP FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/sockets.c000066400000000000000000000362131171526373700275140ustar00rootroot00000000000000/* * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * sockets.c - functions to deal with sockets. */ #ifdef __STRICT_ANSI__ #define _BSD_SOURCE #endif #include #include #include #include #include #ifdef WIN32 #undef SOCKET #include #define EWOULDBLOCK WSAEWOULDBLOCK #define close closesocket #define read(sock,buf,len) recv(sock,buf,len,0) #define write(sock,buf,len) send(sock,buf,len,0) #define socklen_t int #ifdef LIBVNCSERVER_HAVE_WS2TCPIP_H #undef socklen_t #include #endif #else #include #include #include #include #include #include #endif #include "tls.h" void PrintInHex(char *buf, int len); rfbBool errorMessageOnReadFailure = TRUE; /* * ReadFromRFBServer is called whenever we want to read some data from the RFB * server. It is non-trivial for two reasons: * * 1. For efficiency it performs some intelligent buffering, avoiding invoking * the read() system call too often. For small chunks of data, it simply * copies the data out of an internal buffer. For large amounts of data it * reads directly into the buffer provided by the caller. * * 2. Whenever read() would block, it invokes the Xt event dispatching * mechanism to process X events. In fact, this is the only place these * events are processed, as there is no XtAppMainLoop in the program. */ rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n) { #undef DEBUG_READ_EXACT #ifdef DEBUG_READ_EXACT char* oout=out; int nn=n; rfbClientLog("ReadFromRFBServer %d bytes\n",n); #endif if (client->serverPort==-1) { /* vncrec playing */ rfbVNCRec* rec = client->vncRec; struct timeval tv; if (rec->readTimestamp) { rec->readTimestamp = FALSE; if (!fread(&tv,sizeof(struct timeval),1,rec->file)) return FALSE; tv.tv_sec = rfbClientSwap32IfLE (tv.tv_sec); tv.tv_usec = rfbClientSwap32IfLE (tv.tv_usec); if (rec->tv.tv_sec!=0 && !rec->doNotSleep) { struct timeval diff; diff.tv_sec = tv.tv_sec - rec->tv.tv_sec; diff.tv_usec = tv.tv_usec - rec->tv.tv_usec; if(diff.tv_usec<0) { diff.tv_sec--; diff.tv_usec+=1000000; } #ifndef __MINGW32__ sleep (diff.tv_sec); usleep (diff.tv_usec); #else Sleep (diff.tv_sec * 1000 + diff.tv_usec/1000); #endif } rec->tv=tv; } return (fread(out,1,n,rec->file)<0?FALSE:TRUE); } if (n <= client->buffered) { memcpy(out, client->bufoutptr, n); client->bufoutptr += n; client->buffered -= n; #ifdef DEBUG_READ_EXACT goto hexdump; #endif return TRUE; } memcpy(out, client->bufoutptr, client->buffered); out += client->buffered; n -= client->buffered; client->bufoutptr = client->buf; client->buffered = 0; if (n <= RFB_BUF_SIZE) { while (client->buffered < n) { int i; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS if (client->tlsSession) { i = ReadFromTLS(client, client->buf + client->buffered, RFB_BUF_SIZE - client->buffered); } else { #endif i = read(client->sock, client->buf + client->buffered, RFB_BUF_SIZE - client->buffered); #ifdef LIBVNCSERVER_WITH_CLIENT_TLS } #endif if (i <= 0) { if (i < 0) { #ifdef WIN32 errno=WSAGetLastError(); #endif if (errno == EWOULDBLOCK || errno == EAGAIN) { /* TODO: ProcessXtEvents(); */ WaitForMessage(client, 100000); i = 0; } else { rfbClientErr("read (%d: %s)\n",errno,strerror(errno)); return FALSE; } } else { if (errorMessageOnReadFailure) { rfbClientLog("VNC server closed connection\n"); } return FALSE; } } client->buffered += i; } memcpy(out, client->bufoutptr, n); client->bufoutptr += n; client->buffered -= n; } else { while (n > 0) { int i; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS if (client->tlsSession) { i = ReadFromTLS(client, out, n); } else { #endif i = read(client->sock, out, n); #ifdef LIBVNCSERVER_WITH_CLIENT_TLS } #endif if (i <= 0) { if (i < 0) { #ifdef WIN32 errno=WSAGetLastError(); #endif if (errno == EWOULDBLOCK || errno == EAGAIN) { /* TODO: ProcessXtEvents(); */ WaitForMessage(client, 100000); i = 0; } else { rfbClientErr("read (%s)\n",strerror(errno)); return FALSE; } } else { if (errorMessageOnReadFailure) { rfbClientLog("VNC server closed connection\n"); } return FALSE; } } out += i; n -= i; } } #ifdef DEBUG_READ_EXACT hexdump: { int ii; for(ii=0;iiserverPort==-1) return TRUE; /* vncrec playing */ #ifdef LIBVNCSERVER_WITH_CLIENT_TLS if (client->tlsSession) { /* WriteToTLS() will guarantee either everything is written, or error/eof returns */ i = WriteToTLS(client, buf, n); if (i <= 0) return FALSE; return TRUE; } #endif while (i < n) { j = write(client->sock, buf + i, (n - i)); if (j <= 0) { if (j < 0) { #ifdef WIN32 errno=WSAGetLastError(); #endif if (errno == EWOULDBLOCK || #ifdef LIBVNCSERVER_ENOENT_WORKAROUND errno == ENOENT || #endif errno == EAGAIN) { FD_ZERO(&fds); FD_SET(client->sock,&fds); if (select(client->sock+1, NULL, &fds, NULL, NULL) <= 0) { rfbClientErr("select\n"); return FALSE; } j = 0; } else { rfbClientErr("write\n"); return FALSE; } } else { rfbClientLog("write failed\n"); return FALSE; } } i += j; } return TRUE; } static int initSockets() { #ifdef WIN32 WSADATA trash; static rfbBool WSAinitted=FALSE; if(!WSAinitted) { int i=WSAStartup(MAKEWORD(2,0),&trash); if(i!=0) { rfbClientErr("Couldn't init Windows Sockets\n"); return 0; } WSAinitted=TRUE; } #endif return 1; } /* * ConnectToTcpAddr connects to the given TCP port. */ int ConnectClientToTcpAddr(unsigned int host, int port) { int sock; struct sockaddr_in addr; int one = 1; if (!initSockets()) return -1; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = host; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { #ifdef WIN32 errno=WSAGetLastError(); #endif rfbClientErr("ConnectToTcpAddr: socket (%s)\n",strerror(errno)); return -1; } if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { rfbClientErr("ConnectToTcpAddr: connect\n"); close(sock); return -1; } if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { rfbClientErr("ConnectToTcpAddr: setsockopt\n"); close(sock); return -1; } return sock; } int ConnectClientToTcpAddr6(const char *hostname, int port) { #ifdef LIBVNCSERVER_IPv6 int sock; int n; struct addrinfo hints, *res, *ressave; char port_s[10]; int one = 1; if (!initSockets()) return -1; snprintf(port_s, 10, "%d", port); memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if ((n = getaddrinfo(hostname, port_s, &hints, &res))) { rfbClientErr("ConnectClientToTcpAddr6: getaddrinfo (%s)\n", gai_strerror(n)); return -1; } ressave = res; sock = -1; while (res) { sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol); if (sock >= 0) { if (connect(sock, res->ai_addr, res->ai_addrlen) == 0) break; close(sock); sock = -1; } res = res->ai_next; } freeaddrinfo(ressave); if (sock == -1) { rfbClientErr("ConnectClientToTcpAddr6: connect\n"); return -1; } if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { rfbClientErr("ConnectToTcpAddr: setsockopt\n"); close(sock); return -1; } return sock; #else rfbClientErr("ConnectClientToTcpAddr6: IPv6 disabled\n"); return -1; #endif } int ConnectClientToUnixSock(const char *sockFile) { #ifdef WIN32 rfbClientErr("Windows doesn't support UNIX sockets\n"); return -1; #else int sock; struct sockaddr_un addr; addr.sun_family = AF_UNIX; strcpy(addr.sun_path, sockFile); sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock < 0) { rfbClientErr("ConnectToUnixSock: socket (%s)\n",strerror(errno)); return -1; } if (connect(sock, (struct sockaddr *)&addr, sizeof(addr.sun_family) + strlen(addr.sun_path)) < 0) { rfbClientErr("ConnectToUnixSock: connect\n"); close(sock); return -1; } return sock; #endif } /* * FindFreeTcpPort tries to find unused TCP port in the range * (TUNNEL_PORT_OFFSET, TUNNEL_PORT_OFFSET + 99]. Returns 0 on failure. */ int FindFreeTcpPort(void) { int sock, port; struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); if (!initSockets()) return -1; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { rfbClientErr(": FindFreeTcpPort: socket\n"); return 0; } for (port = TUNNEL_PORT_OFFSET + 99; port > TUNNEL_PORT_OFFSET; port--) { addr.sin_port = htons((unsigned short)port); if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == 0) { close(sock); return port; } } close(sock); return 0; } /* * ListenAtTcpPort starts listening at the given TCP port. */ int ListenAtTcpPort(int port) { int sock; struct sockaddr_in addr; int one = 1; addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = htonl(INADDR_ANY); if (!initSockets()) return -1; sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { rfbClientErr("ListenAtTcpPort: socket\n"); return -1; } if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *)&one, sizeof(one)) < 0) { rfbClientErr("ListenAtTcpPort: setsockopt\n"); close(sock); return -1; } if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { rfbClientErr("ListenAtTcpPort: bind\n"); close(sock); return -1; } if (listen(sock, 5) < 0) { rfbClientErr("ListenAtTcpPort: listen\n"); close(sock); return -1; } return sock; } /* * AcceptTcpConnection accepts a TCP connection. */ int AcceptTcpConnection(int listenSock) { int sock; struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int one = 1; sock = accept(listenSock, (struct sockaddr *) &addr, &addrlen); if (sock < 0) { rfbClientErr("AcceptTcpConnection: accept\n"); return -1; } if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { rfbClientErr("AcceptTcpConnection: setsockopt\n"); close(sock); return -1; } return sock; } /* * SetNonBlocking sets a socket into non-blocking mode. */ rfbBool SetNonBlocking(int sock) { #ifdef WIN32 unsigned long block=1; if(ioctlsocket(sock, FIONBIO, &block) == SOCKET_ERROR) { errno=WSAGetLastError(); #else int flags = fcntl(sock, F_GETFL); if(flags < 0 || fcntl(sock, F_SETFL, flags | O_NONBLOCK) < 0) { #endif rfbClientErr("Setting socket to non-blocking failed: %s\n",strerror(errno)); return FALSE; } return TRUE; } /* * SetDSCP sets a socket's IP QoS parameters aka Differentiated Services Code Point field */ rfbBool SetDSCP(int sock, int dscp) { #ifdef WIN32 rfbClientErr("Setting of QoS IP DSCP not implemented for Windows\n"); return TRUE; #else int level, cmd; struct sockaddr addr; socklen_t addrlen = sizeof(addr); if(getsockname(sock, &addr, &addrlen) != 0) { rfbClientErr("Setting socket QoS failed while getting socket address: %s\n",strerror(errno)); return FALSE; } switch(addr.sa_family) { #if defined LIBVNCSERVER_IPv6 && defined IPV6_TCLASS case AF_INET6: level = IPPROTO_IPV6; cmd = IPV6_TCLASS; break; #endif case AF_INET: level = IPPROTO_IP; cmd = IP_TOS; break; default: rfbClientErr("Setting socket QoS failed: Not bound to IP address"); return FALSE; } if(setsockopt(sock, level, cmd, (void*)&dscp, sizeof(dscp)) != 0) { rfbClientErr("Setting socket QoS failed: %s\n", strerror(errno)); return FALSE; } return TRUE; #endif } /* * StringToIPAddr - convert a host string to an IP address. */ rfbBool StringToIPAddr(const char *str, unsigned int *addr) { struct hostent *hp; if (strcmp(str,"") == 0) { *addr = htonl(INADDR_LOOPBACK); /* local */ return TRUE; } *addr = inet_addr(str); if (*addr != -1) return TRUE; if (!initSockets()) return -1; hp = gethostbyname(str); if (hp) { *addr = *(unsigned int *)hp->h_addr; return TRUE; } return FALSE; } /* * Test if the other end of a socket is on the same machine. */ rfbBool SameMachine(int sock) { struct sockaddr_in peeraddr, myaddr; socklen_t addrlen = sizeof(struct sockaddr_in); getpeername(sock, (struct sockaddr *)&peeraddr, &addrlen); getsockname(sock, (struct sockaddr *)&myaddr, &addrlen); return (peeraddr.sin_addr.s_addr == myaddr.sin_addr.s_addr); } /* * Print out the contents of a packet for debugging. */ void PrintInHex(char *buf, int len) { int i, j; char c, str[17]; str[16] = 0; rfbClientLog("ReadExact: "); for (i = 0; i < len; i++) { if ((i % 16 == 0) && (i != 0)) { rfbClientLog(" "); } c = buf[i]; str[i % 16] = (((c > 31) && (c < 127)) ? c : '.'); rfbClientLog("%02x ",(unsigned char)c); if ((i % 4) == 3) rfbClientLog(" "); if ((i % 16) == 15) { rfbClientLog("%s\n",str); } } if ((i % 16) != 0) { for (j = i % 16; j < 16; j++) { rfbClientLog(" "); if ((j % 4) == 3) rfbClientLog(" "); } str[i % 16] = 0; rfbClientLog("%s\n",str); } fflush(stderr); } int WaitForMessage(rfbClient* client,unsigned int usecs) { fd_set fds; struct timeval timeout; int num; if (client->serverPort==-1) /* playing back vncrec file */ return 1; timeout.tv_sec=(usecs/1000000); timeout.tv_usec=(usecs%1000000); FD_ZERO(&fds); FD_SET(client->sock,&fds); num=select(client->sock+1, &fds, NULL, NULL, &timeout); if(num<0) { #ifdef WIN32 errno=WSAGetLastError(); #endif rfbClientLog("Waiting for message failed: %d (%s)\n",errno,strerror(errno)); } return num; } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/tight.c000066400000000000000000000461621171526373700271640ustar00rootroot00000000000000/* * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifdef LIBVNCSERVER_HAVE_LIBZ #ifdef LIBVNCSERVER_HAVE_LIBJPEG /* * tight.c - handle ``tight'' encoding. * * This file shouldn't be compiled directly. It is included multiple * times by rfbproto.c, each time with a different definition of the * macro BPP. For each value of BPP, this file defines a function * which handles a tight-encoded rectangle with BPP bits per pixel. * */ #define TIGHT_MIN_TO_COMPRESS 12 #define CARDBPP CONCAT3E(uint,BPP,_t) #define filterPtrBPP CONCAT2E(filterPtr,BPP) #define HandleTightBPP CONCAT2E(HandleTight,BPP) #define InitFilterCopyBPP CONCAT2E(InitFilterCopy,BPP) #define InitFilterPaletteBPP CONCAT2E(InitFilterPalette,BPP) #define InitFilterGradientBPP CONCAT2E(InitFilterGradient,BPP) #define FilterCopyBPP CONCAT2E(FilterCopy,BPP) #define FilterPaletteBPP CONCAT2E(FilterPalette,BPP) #define FilterGradientBPP CONCAT2E(FilterGradient,BPP) #if BPP != 8 #define DecompressJpegRectBPP CONCAT2E(DecompressJpegRect,BPP) #endif #ifndef RGB_TO_PIXEL #define RGB_TO_PIXEL(bpp,r,g,b) \ (((CARD##bpp)(r) & client->format.redMax) << client->format.redShift | \ ((CARD##bpp)(g) & client->format.greenMax) << client->format.greenShift | \ ((CARD##bpp)(b) & client->format.blueMax) << client->format.blueShift) #define RGB24_TO_PIXEL(bpp,r,g,b) \ ((((CARD##bpp)(r) & 0xFF) * client->format.redMax + 127) / 255 \ << client->format.redShift | \ (((CARD##bpp)(g) & 0xFF) * client->format.greenMax + 127) / 255 \ << client->format.greenShift | \ (((CARD##bpp)(b) & 0xFF) * client->format.blueMax + 127) / 255 \ << client->format.blueShift) #define RGB24_TO_PIXEL32(r,g,b) \ (((uint32_t)(r) & 0xFF) << client->format.redShift | \ ((uint32_t)(g) & 0xFF) << client->format.greenShift | \ ((uint32_t)(b) & 0xFF) << client->format.blueShift) #endif /* Type declarations */ typedef void (*filterPtrBPP)(rfbClient* client, int, CARDBPP *); /* Prototypes */ static int InitFilterCopyBPP (rfbClient* client, int rw, int rh); static int InitFilterPaletteBPP (rfbClient* client, int rw, int rh); static int InitFilterGradientBPP (rfbClient* client, int rw, int rh); static void FilterCopyBPP (rfbClient* client, int numRows, CARDBPP *destBuffer); static void FilterPaletteBPP (rfbClient* client, int numRows, CARDBPP *destBuffer); static void FilterGradientBPP (rfbClient* client, int numRows, CARDBPP *destBuffer); #if BPP != 8 static rfbBool DecompressJpegRectBPP(rfbClient* client, int x, int y, int w, int h); #endif /* Definitions */ static rfbBool HandleTightBPP (rfbClient* client, int rx, int ry, int rw, int rh) { CARDBPP fill_colour; uint8_t comp_ctl; uint8_t filter_id; filterPtrBPP filterFn; z_streamp zs; char *buffer2; int err, stream_id, compressedLen, bitsPixel; int bufferSize, rowSize, numRows, portionLen, rowsProcessed, extraBytes; if (!ReadFromRFBServer(client, (char *)&comp_ctl, 1)) return FALSE; /* Flush zlib streams if we are told by the server to do so. */ for (stream_id = 0; stream_id < 4; stream_id++) { if ((comp_ctl & 1) && client->zlibStreamActive[stream_id]) { if (inflateEnd (&client->zlibStream[stream_id]) != Z_OK && client->zlibStream[stream_id].msg != NULL) rfbClientLog("inflateEnd: %s\n", client->zlibStream[stream_id].msg); client->zlibStreamActive[stream_id] = FALSE; } comp_ctl >>= 1; } /* Handle solid rectangles. */ if (comp_ctl == rfbTightFill) { #if BPP == 32 if (client->format.depth == 24 && client->format.redMax == 0xFF && client->format.greenMax == 0xFF && client->format.blueMax == 0xFF) { if (!ReadFromRFBServer(client, client->buffer, 3)) return FALSE; fill_colour = RGB24_TO_PIXEL32(client->buffer[0], client->buffer[1], client->buffer[2]); } else { if (!ReadFromRFBServer(client, (char*)&fill_colour, sizeof(fill_colour))) return FALSE; } #else if (!ReadFromRFBServer(client, (char*)&fill_colour, sizeof(fill_colour))) return FALSE; #endif FillRectangle(client, rx, ry, rw, rh, fill_colour); return TRUE; } #if BPP == 8 if (comp_ctl == rfbTightJpeg) { rfbClientLog("Tight encoding: JPEG is not supported in 8 bpp mode.\n"); return FALSE; } #else if (comp_ctl == rfbTightJpeg) { return DecompressJpegRectBPP(client, rx, ry, rw, rh); } #endif /* Quit on unsupported subencoding value. */ if (comp_ctl > rfbTightMaxSubencoding) { rfbClientLog("Tight encoding: bad subencoding value received.\n"); return FALSE; } /* * Here primary compression mode handling begins. * Data was processed with optional filter + zlib compression. */ /* First, we should identify a filter to use. */ if ((comp_ctl & rfbTightExplicitFilter) != 0) { if (!ReadFromRFBServer(client, (char*)&filter_id, 1)) return FALSE; switch (filter_id) { case rfbTightFilterCopy: filterFn = FilterCopyBPP; bitsPixel = InitFilterCopyBPP(client, rw, rh); break; case rfbTightFilterPalette: filterFn = FilterPaletteBPP; bitsPixel = InitFilterPaletteBPP(client, rw, rh); break; case rfbTightFilterGradient: filterFn = FilterGradientBPP; bitsPixel = InitFilterGradientBPP(client, rw, rh); break; default: rfbClientLog("Tight encoding: unknown filter code received.\n"); return FALSE; } } else { filterFn = FilterCopyBPP; bitsPixel = InitFilterCopyBPP(client, rw, rh); } if (bitsPixel == 0) { rfbClientLog("Tight encoding: error receiving palette.\n"); return FALSE; } /* Determine if the data should be decompressed or just copied. */ rowSize = (rw * bitsPixel + 7) / 8; if (rh * rowSize < TIGHT_MIN_TO_COMPRESS) { if (!ReadFromRFBServer(client, (char*)client->buffer, rh * rowSize)) return FALSE; buffer2 = &client->buffer[TIGHT_MIN_TO_COMPRESS * 4]; filterFn(client, rh, (CARDBPP *)buffer2); CopyRectangle(client, (uint8_t *)buffer2, rx, ry, rw, rh); return TRUE; } /* Read the length (1..3 bytes) of compressed data following. */ compressedLen = (int)ReadCompactLen(client); if (compressedLen <= 0) { rfbClientLog("Incorrect data received from the server.\n"); return FALSE; } /* Now let's initialize compression stream if needed. */ stream_id = comp_ctl & 0x03; zs = &client->zlibStream[stream_id]; if (!client->zlibStreamActive[stream_id]) { zs->zalloc = Z_NULL; zs->zfree = Z_NULL; zs->opaque = Z_NULL; err = inflateInit(zs); if (err != Z_OK) { if (zs->msg != NULL) rfbClientLog("InflateInit error: %s.\n", zs->msg); return FALSE; } client->zlibStreamActive[stream_id] = TRUE; } /* Read, decode and draw actual pixel data in a loop. */ bufferSize = RFB_BUFFER_SIZE * bitsPixel / (bitsPixel + BPP) & 0xFFFFFFFC; buffer2 = &client->buffer[bufferSize]; if (rowSize > bufferSize) { /* Should be impossible when RFB_BUFFER_SIZE >= 16384 */ rfbClientLog("Internal error: incorrect buffer size.\n"); return FALSE; } rowsProcessed = 0; extraBytes = 0; while (compressedLen > 0) { if (compressedLen > ZLIB_BUFFER_SIZE) portionLen = ZLIB_BUFFER_SIZE; else portionLen = compressedLen; if (!ReadFromRFBServer(client, (char*)client->zlib_buffer, portionLen)) return FALSE; compressedLen -= portionLen; zs->next_in = (Bytef *)client->zlib_buffer; zs->avail_in = portionLen; do { zs->next_out = (Bytef *)&client->buffer[extraBytes]; zs->avail_out = bufferSize - extraBytes; err = inflate(zs, Z_SYNC_FLUSH); if (err == Z_BUF_ERROR) /* Input exhausted -- no problem. */ break; if (err != Z_OK && err != Z_STREAM_END) { if (zs->msg != NULL) { rfbClientLog("Inflate error: %s.\n", zs->msg); } else { rfbClientLog("Inflate error: %d.\n", err); } return FALSE; } numRows = (bufferSize - zs->avail_out) / rowSize; filterFn(client, numRows, (CARDBPP *)buffer2); extraBytes = bufferSize - zs->avail_out - numRows * rowSize; if (extraBytes > 0) memcpy(client->buffer, &client->buffer[numRows * rowSize], extraBytes); CopyRectangle(client, (uint8_t *)buffer2, rx, ry+rowsProcessed, rw, numRows); rowsProcessed += numRows; } while (zs->avail_out == 0); } if (rowsProcessed != rh) { rfbClientLog("Incorrect number of scan lines after decompression.\n"); return FALSE; } return TRUE; } /*---------------------------------------------------------------------------- * * Filter stuff. * */ static int InitFilterCopyBPP (rfbClient* client, int rw, int rh) { client->rectWidth = rw; #if BPP == 32 if (client->format.depth == 24 && client->format.redMax == 0xFF && client->format.greenMax == 0xFF && client->format.blueMax == 0xFF) { client->cutZeros = TRUE; return 24; } else { client->cutZeros = FALSE; } #endif return BPP; } static void FilterCopyBPP (rfbClient* client, int numRows, CARDBPP *dst) { #if BPP == 32 int x, y; if (client->cutZeros) { for (y = 0; y < numRows; y++) { for (x = 0; x < client->rectWidth; x++) { dst[y*client->rectWidth+x] = RGB24_TO_PIXEL32(client->buffer[(y*client->rectWidth+x)*3], client->buffer[(y*client->rectWidth+x)*3+1], client->buffer[(y*client->rectWidth+x)*3+2]); } } return; } #endif memcpy (dst, client->buffer, numRows * client->rectWidth * (BPP / 8)); } static int InitFilterGradientBPP (rfbClient* client, int rw, int rh) { int bits; bits = InitFilterCopyBPP(client, rw, rh); if (client->cutZeros) memset(client->tightPrevRow, 0, rw * 3); else memset(client->tightPrevRow, 0, rw * 3 * sizeof(uint16_t)); return bits; } #if BPP == 32 static void FilterGradient24 (rfbClient* client, int numRows, uint32_t *dst) { int x, y, c; uint8_t thisRow[2048*3]; uint8_t pix[3]; int est[3]; for (y = 0; y < numRows; y++) { /* First pixel in a row */ for (c = 0; c < 3; c++) { pix[c] = client->tightPrevRow[c] + client->buffer[y*client->rectWidth*3+c]; thisRow[c] = pix[c]; } dst[y*client->rectWidth] = RGB24_TO_PIXEL32(pix[0], pix[1], pix[2]); /* Remaining pixels of a row */ for (x = 1; x < client->rectWidth; x++) { for (c = 0; c < 3; c++) { est[c] = (int)client->tightPrevRow[x*3+c] + (int)pix[c] - (int)client->tightPrevRow[(x-1)*3+c]; if (est[c] > 0xFF) { est[c] = 0xFF; } else if (est[c] < 0x00) { est[c] = 0x00; } pix[c] = (uint8_t)est[c] + client->buffer[(y*client->rectWidth+x)*3+c]; thisRow[x*3+c] = pix[c]; } dst[y*client->rectWidth+x] = RGB24_TO_PIXEL32(pix[0], pix[1], pix[2]); } memcpy(client->tightPrevRow, thisRow, client->rectWidth * 3); } } #endif static void FilterGradientBPP (rfbClient* client, int numRows, CARDBPP *dst) { int x, y, c; CARDBPP *src = (CARDBPP *)client->buffer; uint16_t *thatRow = (uint16_t *)client->tightPrevRow; uint16_t thisRow[2048*3]; uint16_t pix[3]; uint16_t max[3]; int shift[3]; int est[3]; #if BPP == 32 if (client->cutZeros) { FilterGradient24(client, numRows, dst); return; } #endif max[0] = client->format.redMax; max[1] = client->format.greenMax; max[2] = client->format.blueMax; shift[0] = client->format.redShift; shift[1] = client->format.greenShift; shift[2] = client->format.blueShift; for (y = 0; y < numRows; y++) { /* First pixel in a row */ for (c = 0; c < 3; c++) { pix[c] = (uint16_t)(((src[y*client->rectWidth] >> shift[c]) + thatRow[c]) & max[c]); thisRow[c] = pix[c]; } dst[y*client->rectWidth] = RGB_TO_PIXEL(BPP, pix[0], pix[1], pix[2]); /* Remaining pixels of a row */ for (x = 1; x < client->rectWidth; x++) { for (c = 0; c < 3; c++) { est[c] = (int)thatRow[x*3+c] + (int)pix[c] - (int)thatRow[(x-1)*3+c]; if (est[c] > (int)max[c]) { est[c] = (int)max[c]; } else if (est[c] < 0) { est[c] = 0; } pix[c] = (uint16_t)(((src[y*client->rectWidth+x] >> shift[c]) + est[c]) & max[c]); thisRow[x*3+c] = pix[c]; } dst[y*client->rectWidth+x] = RGB_TO_PIXEL(BPP, pix[0], pix[1], pix[2]); } memcpy(thatRow, thisRow, client->rectWidth * 3 * sizeof(uint16_t)); } } static int InitFilterPaletteBPP (rfbClient* client, int rw, int rh) { uint8_t numColors; #if BPP == 32 int i; CARDBPP *palette = (CARDBPP *)client->tightPalette; #endif client->rectWidth = rw; if (!ReadFromRFBServer(client, (char*)&numColors, 1)) return 0; client->rectColors = (int)numColors; if (++client->rectColors < 2) return 0; #if BPP == 32 if (client->format.depth == 24 && client->format.redMax == 0xFF && client->format.greenMax == 0xFF && client->format.blueMax == 0xFF) { if (!ReadFromRFBServer(client, (char*)&client->tightPalette, client->rectColors * 3)) return 0; for (i = client->rectColors - 1; i >= 0; i--) { palette[i] = RGB24_TO_PIXEL32(client->tightPalette[i*3], client->tightPalette[i*3+1], client->tightPalette[i*3+2]); } return (client->rectColors == 2) ? 1 : 8; } #endif if (!ReadFromRFBServer(client, (char*)&client->tightPalette, client->rectColors * (BPP / 8))) return 0; return (client->rectColors == 2) ? 1 : 8; } static void FilterPaletteBPP (rfbClient* client, int numRows, CARDBPP *dst) { int x, y, b, w; uint8_t *src = (uint8_t *)client->buffer; CARDBPP *palette = (CARDBPP *)client->tightPalette; if (client->rectColors == 2) { w = (client->rectWidth + 7) / 8; for (y = 0; y < numRows; y++) { for (x = 0; x < client->rectWidth / 8; x++) { for (b = 7; b >= 0; b--) dst[y*client->rectWidth+x*8+7-b] = palette[src[y*w+x] >> b & 1]; } for (b = 7; b >= 8 - client->rectWidth % 8; b--) { dst[y*client->rectWidth+x*8+7-b] = palette[src[y*w+x] >> b & 1]; } } } else { for (y = 0; y < numRows; y++) for (x = 0; x < client->rectWidth; x++) dst[y*client->rectWidth+x] = palette[(int)src[y*client->rectWidth+x]]; } } #if BPP != 8 /*---------------------------------------------------------------------------- * * JPEG decompression. * */ static rfbBool DecompressJpegRectBPP(rfbClient* client, int x, int y, int w, int h) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; int compressedLen; uint8_t *compressedData; CARDBPP *pixelPtr; JSAMPROW rowPointer[1]; int dx, dy; compressedLen = (int)ReadCompactLen(client); if (compressedLen <= 0) { rfbClientLog("Incorrect data received from the server.\n"); return FALSE; } compressedData = malloc(compressedLen); if (compressedData == NULL) { rfbClientLog("Memory allocation error.\n"); return FALSE; } if (!ReadFromRFBServer(client, (char*)compressedData, compressedLen)) { free(compressedData); return FALSE; } cinfo.err = jpeg_std_error(&jerr); cinfo.client_data = client; jpeg_create_decompress(&cinfo); JpegSetSrcManager(&cinfo, compressedData, compressedLen); jpeg_read_header(&cinfo, TRUE); cinfo.out_color_space = JCS_RGB; jpeg_start_decompress(&cinfo); if (cinfo.output_width != w || cinfo.output_height != h || cinfo.output_components != 3) { rfbClientLog("Tight Encoding: Wrong JPEG data received.\n"); jpeg_destroy_decompress(&cinfo); free(compressedData); return FALSE; } rowPointer[0] = (JSAMPROW)client->buffer; dy = 0; while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, rowPointer, 1); if (client->jpegError) { break; } pixelPtr = (CARDBPP *)&client->buffer[RFB_BUFFER_SIZE / 2]; for (dx = 0; dx < w; dx++) { *pixelPtr++ = RGB24_TO_PIXEL(BPP, client->buffer[dx*3], client->buffer[dx*3+1], client->buffer[dx*3+2]); } CopyRectangle(client, (uint8_t *)&client->buffer[RFB_BUFFER_SIZE / 2], x, y + dy, w, 1); dy++; } if (!client->jpegError) jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); free(compressedData); return !client->jpegError; } #else static long ReadCompactLen (rfbClient* client) { long len; uint8_t b; if (!ReadFromRFBServer(client, (char *)&b, 1)) return -1; len = (int)b & 0x7F; if (b & 0x80) { if (!ReadFromRFBServer(client, (char *)&b, 1)) return -1; len |= ((int)b & 0x7F) << 7; if (b & 0x80) { if (!ReadFromRFBServer(client, (char *)&b, 1)) return -1; len |= ((int)b & 0xFF) << 14; } } return len; } /* * JPEG source manager functions for JPEG decompression in Tight decoder. */ static void JpegInitSource(j_decompress_ptr cinfo) { rfbClient* client=(rfbClient*)cinfo->client_data; client->jpegError = FALSE; } static boolean JpegFillInputBuffer(j_decompress_ptr cinfo) { rfbClient* client=(rfbClient*)cinfo->client_data; client->jpegError = TRUE; client->jpegSrcManager->bytes_in_buffer = client->jpegBufferLen; client->jpegSrcManager->next_input_byte = (JOCTET *)client->jpegBufferPtr; return TRUE; } static void JpegSkipInputData(j_decompress_ptr cinfo, long num_bytes) { rfbClient* client=(rfbClient*)cinfo->client_data; if (num_bytes < 0 || num_bytes > client->jpegSrcManager->bytes_in_buffer) { client->jpegError = TRUE; client->jpegSrcManager->bytes_in_buffer = client->jpegBufferLen; client->jpegSrcManager->next_input_byte = (JOCTET *)client->jpegBufferPtr; } else { client->jpegSrcManager->next_input_byte += (size_t) num_bytes; client->jpegSrcManager->bytes_in_buffer -= (size_t) num_bytes; } } static void JpegTermSource(j_decompress_ptr cinfo) { /* nothing to do here. */ } static void JpegSetSrcManager(j_decompress_ptr cinfo, uint8_t *compressedData, int compressedLen) { rfbClient* client=(rfbClient*)cinfo->client_data; client->jpegBufferPtr = compressedData; client->jpegBufferLen = (size_t)compressedLen; if(client->jpegSrcManager == NULL) client->jpegSrcManager = malloc(sizeof(struct jpeg_source_mgr)); client->jpegSrcManager->init_source = JpegInitSource; client->jpegSrcManager->fill_input_buffer = JpegFillInputBuffer; client->jpegSrcManager->skip_input_data = JpegSkipInputData; client->jpegSrcManager->resync_to_restart = jpeg_resync_to_restart; client->jpegSrcManager->term_source = JpegTermSource; client->jpegSrcManager->next_input_byte = (JOCTET*)client->jpegBufferPtr; client->jpegSrcManager->bytes_in_buffer = client->jpegBufferLen; cinfo->src = client->jpegSrcManager; } #endif #undef CARDBPP /* LIBVNCSERVER_HAVE_LIBZ and LIBVNCSERVER_HAVE_LIBJPEG */ #endif #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/tls.c000066400000000000000000000337161171526373700266500ustar00rootroot00000000000000/* * Copyright (C) 2009 Vic Lee. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #include #include #ifdef WIN32 #undef SOCKET #include /* for Sleep() */ #define sleep(X) Sleep(1000*X) /* MinGW32 has no sleep() */ #include #define read(sock,buf,len) recv(sock,buf,len,0) #define write(sock,buf,len) send(sock,buf,len,0) #endif #include "tls.h" #ifdef LIBVNCSERVER_WITH_CLIENT_TLS static const int rfbCertTypePriority[] = { GNUTLS_CRT_X509, 0 }; static const int rfbProtoPriority[]= { GNUTLS_TLS1_1, GNUTLS_TLS1_0, GNUTLS_SSL3, 0 }; static const int rfbKXPriority[] = {GNUTLS_KX_DHE_DSS, GNUTLS_KX_RSA, GNUTLS_KX_DHE_RSA, GNUTLS_KX_SRP, 0}; static const int rfbKXAnon[] = {GNUTLS_KX_ANON_DH, 0}; #define DH_BITS 1024 static gnutls_dh_params_t rfbDHParams; static rfbBool rfbTLSInitialized = FALSE; static rfbBool InitializeTLS(void) { int ret; if (rfbTLSInitialized) return TRUE; if ((ret = gnutls_global_init()) < 0 || (ret = gnutls_dh_params_init(&rfbDHParams)) < 0 || (ret = gnutls_dh_params_generate2(rfbDHParams, DH_BITS)) < 0) { rfbClientLog("Failed to initialized GnuTLS: %s.\n", gnutls_strerror(ret)); return FALSE; } rfbClientLog("GnuTLS initialized.\n"); rfbTLSInitialized = TRUE; return TRUE; } /* * On Windows, translate WSAGetLastError() to errno values as GNU TLS does it * internally too. This is necessary because send() and recv() on Windows * don't set errno when they fail but GNUTLS expects a proper errno value. * * Use gnutls_transport_set_global_errno() like the GNU TLS documentation * suggests to avoid problems with different errno variables when GNU TLS and * libvncclient are linked to different versions of msvcrt.dll. */ #ifdef WIN32 static void WSAtoTLSErrno() { switch(WSAGetLastError()) { case WSAEWOULDBLOCK: gnutls_transport_set_global_errno(EAGAIN); break; case WSAEINTR: gnutls_transport_set_global_errno(EINTR); break; default: gnutls_transport_set_global_errno(EIO); break; } } #endif static ssize_t PushTLS(gnutls_transport_ptr_t transport, const void *data, size_t len) { rfbClient *client = (rfbClient*)transport; int ret; while (1) { ret = write(client->sock, data, len); if (ret < 0) { #ifdef WIN32 WSAtoTLSErrno(); #endif if (errno == EINTR) continue; return -1; } return ret; } } static ssize_t PullTLS(gnutls_transport_ptr_t transport, void *data, size_t len) { rfbClient *client = (rfbClient*)transport; int ret; while (1) { ret = read(client->sock, data, len); if (ret < 0) { #ifdef WIN32 WSAtoTLSErrno(); #endif if (errno == EINTR) continue; return -1; } return ret; } } static rfbBool InitializeTLSSession(rfbClient* client, rfbBool anonTLS) { int ret; if (client->tlsSession) return TRUE; if ((ret = gnutls_init(&client->tlsSession, GNUTLS_CLIENT)) < 0) { rfbClientLog("Failed to initialized TLS session: %s.\n", gnutls_strerror(ret)); return FALSE; } if ((ret = gnutls_set_default_priority(client->tlsSession)) < 0 || (ret = gnutls_kx_set_priority(client->tlsSession, anonTLS ? rfbKXAnon : rfbKXPriority)) < 0 || (ret = gnutls_certificate_type_set_priority(client->tlsSession, rfbCertTypePriority)) < 0 || (ret = gnutls_protocol_set_priority(client->tlsSession, rfbProtoPriority)) < 0) { rfbClientLog("Warning: Failed to set TLS priority: %s.\n", gnutls_strerror(ret)); } gnutls_transport_set_ptr(client->tlsSession, (gnutls_transport_ptr_t)client); gnutls_transport_set_push_function(client->tlsSession, PushTLS); gnutls_transport_set_pull_function(client->tlsSession, PullTLS); rfbClientLog("TLS session initialized.\n"); return TRUE; } static rfbBool SetTLSAnonCredential(rfbClient* client) { gnutls_anon_client_credentials anonCred; int ret; if ((ret = gnutls_anon_allocate_client_credentials(&anonCred)) < 0 || (ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_ANON, anonCred)) < 0) { FreeTLS(client); rfbClientLog("Failed to create anonymous credentials: %s", gnutls_strerror(ret)); return FALSE; } rfbClientLog("TLS anonymous credential created.\n"); return TRUE; } static rfbBool HandshakeTLS(rfbClient* client) { int timeout = 15; int ret; while (timeout > 0 && (ret = gnutls_handshake(client->tlsSession)) < 0) { if (!gnutls_error_is_fatal(ret)) { rfbClientLog("TLS handshake blocking.\n"); sleep(1); timeout--; continue; } rfbClientLog("TLS handshake failed: %s.\n", gnutls_strerror(ret)); FreeTLS(client); return FALSE; } if (timeout <= 0) { rfbClientLog("TLS handshake timeout.\n"); FreeTLS(client); return FALSE; } rfbClientLog("TLS handshake done.\n"); return TRUE; } /* VeNCrypt sub auth. 1 byte auth count, followed by count * 4 byte integers */ static rfbBool ReadVeNCryptSecurityType(rfbClient* client, uint32_t *result) { uint8_t count=0; uint8_t loop=0; uint8_t flag=0; uint32_t tAuth[256], t; char buf1[500],buf2[10]; uint32_t authScheme; if (!ReadFromRFBServer(client, (char *)&count, 1)) return FALSE; if (count==0) { rfbClientLog("List of security types is ZERO. Giving up.\n"); return FALSE; } if (count>sizeof(tAuth)) { rfbClientLog("%d security types are too many; maximum is %d\n", count, sizeof(tAuth)); return FALSE; } rfbClientLog("We have %d security types to read\n", count); authScheme=0; /* now, we have a list of available security types to read ( uint8_t[] ) */ for (loop=0;loop=sizeof(buf1)-1) break; snprintf(buf2, sizeof(buf2), (loop>0 ? ", %d" : "%d"), (int)tAuth[loop]); strncat(buf1, buf2, sizeof(buf1)-strlen(buf1)-1); } rfbClientLog("Unknown VeNCrypt authentication scheme from VNC server: %s\n", buf1); return FALSE; } *result = authScheme; return TRUE; } static void FreeX509Credential(rfbCredential *cred) { if (cred->x509Credential.x509CACertFile) free(cred->x509Credential.x509CACertFile); if (cred->x509Credential.x509CACrlFile) free(cred->x509Credential.x509CACrlFile); if (cred->x509Credential.x509ClientCertFile) free(cred->x509Credential.x509ClientCertFile); if (cred->x509Credential.x509ClientKeyFile) free(cred->x509Credential.x509ClientKeyFile); free(cred); } static gnutls_certificate_credentials_t CreateX509CertCredential(rfbCredential *cred) { gnutls_certificate_credentials_t x509_cred; int ret; if (!cred->x509Credential.x509CACertFile) { rfbClientLog("No CA certificate provided.\n"); return NULL; } if ((ret = gnutls_certificate_allocate_credentials(&x509_cred)) < 0) { rfbClientLog("Cannot allocate credentials: %s.\n", gnutls_strerror(ret)); return NULL; } if ((ret = gnutls_certificate_set_x509_trust_file(x509_cred, cred->x509Credential.x509CACertFile, GNUTLS_X509_FMT_PEM)) < 0) { rfbClientLog("Cannot load CA credentials: %s.\n", gnutls_strerror(ret)); gnutls_certificate_free_credentials (x509_cred); return NULL; } if (cred->x509Credential.x509ClientCertFile && cred->x509Credential.x509ClientKeyFile) { if ((ret = gnutls_certificate_set_x509_key_file(x509_cred, cred->x509Credential.x509ClientCertFile, cred->x509Credential.x509ClientKeyFile, GNUTLS_X509_FMT_PEM)) < 0) { rfbClientLog("Cannot load client certificate or key: %s.\n", gnutls_strerror(ret)); gnutls_certificate_free_credentials (x509_cred); return NULL; } } else { rfbClientLog("No client certificate or key provided.\n"); } if (cred->x509Credential.x509CACrlFile) { if ((ret = gnutls_certificate_set_x509_crl_file(x509_cred, cred->x509Credential.x509CACrlFile, GNUTLS_X509_FMT_PEM)) < 0) { rfbClientLog("Cannot load CRL: %s.\n", gnutls_strerror(ret)); gnutls_certificate_free_credentials (x509_cred); return NULL; } } else { rfbClientLog("No CRL provided.\n"); } gnutls_certificate_set_dh_params (x509_cred, rfbDHParams); return x509_cred; } #endif rfbBool HandleAnonTLSAuth(rfbClient* client) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS if (!InitializeTLS() || !InitializeTLSSession(client, TRUE)) return FALSE; if (!SetTLSAnonCredential(client)) return FALSE; if (!HandshakeTLS(client)) return FALSE; return TRUE; #else rfbClientLog("TLS is not supported.\n"); return FALSE; #endif } rfbBool HandleVeNCryptAuth(rfbClient* client) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS uint8_t major, minor, status; uint32_t authScheme; rfbBool anonTLS; gnutls_certificate_credentials_t x509_cred = NULL; int ret; if (!InitializeTLS()) return FALSE; /* Read VeNCrypt version */ if (!ReadFromRFBServer(client, (char *)&major, 1) || !ReadFromRFBServer(client, (char *)&minor, 1)) { return FALSE; } rfbClientLog("Got VeNCrypt version %d.%d from server.\n", (int)major, (int)minor); if (major != 0 && minor != 2) { rfbClientLog("Unsupported VeNCrypt version.\n"); return FALSE; } if (!WriteToRFBServer(client, (char *)&major, 1) || !WriteToRFBServer(client, (char *)&minor, 1) || !ReadFromRFBServer(client, (char *)&status, 1)) { return FALSE; } if (status != 0) { rfbClientLog("Server refused VeNCrypt version %d.%d.\n", (int)major, (int)minor); return FALSE; } if (!ReadVeNCryptSecurityType(client, &authScheme)) return FALSE; if (!ReadFromRFBServer(client, (char *)&status, 1) || status != 1) { rfbClientLog("Server refused VeNCrypt authentication %d (%d).\n", authScheme, (int)status); return FALSE; } client->subAuthScheme = authScheme; /* Some VeNCrypt security types are anonymous TLS, others are X509 */ switch (authScheme) { case rfbVeNCryptTLSNone: case rfbVeNCryptTLSVNC: case rfbVeNCryptTLSPlain: anonTLS = TRUE; break; default: anonTLS = FALSE; break; } /* Get X509 Credentials if it's not anonymous */ if (!anonTLS) { rfbCredential *cred; if (!client->GetCredential) { rfbClientLog("GetCredential callback is not set.\n"); return FALSE; } cred = client->GetCredential(client, rfbCredentialTypeX509); if (!cred) { rfbClientLog("Reading credential failed\n"); return FALSE; } x509_cred = CreateX509CertCredential(cred); FreeX509Credential(cred); if (!x509_cred) return FALSE; } /* Start up the TLS session */ if (!InitializeTLSSession(client, anonTLS)) return FALSE; if (anonTLS) { if (!SetTLSAnonCredential(client)) return FALSE; } else { if ((ret = gnutls_credentials_set(client->tlsSession, GNUTLS_CRD_CERTIFICATE, x509_cred)) < 0) { rfbClientLog("Cannot set x509 credential: %s.\n", gnutls_strerror(ret)); FreeTLS(client); return FALSE; } } if (!HandshakeTLS(client)) return FALSE; /* TODO: validate certificate */ /* We are done here. The caller should continue with client->subAuthScheme * to do actual sub authentication. */ return TRUE; #else rfbClientLog("TLS is not supported.\n"); return FALSE; #endif } int ReadFromTLS(rfbClient* client, char *out, unsigned int n) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS ssize_t ret; ret = gnutls_record_recv(client->tlsSession, out, n); if (ret >= 0) return ret; if (ret == GNUTLS_E_REHANDSHAKE || ret == GNUTLS_E_AGAIN) { errno = EAGAIN; } else { rfbClientLog("Error reading from TLS: %s.\n", gnutls_strerror(ret)); errno = EINTR; } return -1; #else rfbClientLog("TLS is not supported.\n"); errno = EINTR; return -1; #endif } int WriteToTLS(rfbClient* client, char *buf, unsigned int n) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS unsigned int offset = 0; ssize_t ret; while (offset < n) { ret = gnutls_record_send(client->tlsSession, buf+offset, (size_t)(n-offset)); if (ret == 0) continue; if (ret < 0) { if (ret == GNUTLS_E_AGAIN || ret == GNUTLS_E_INTERRUPTED) continue; rfbClientLog("Error writing to TLS: %s.\n", gnutls_strerror(ret)); return -1; } offset += (unsigned int)ret; } return offset; #else rfbClientLog("TLS is not supported.\n"); errno = EINTR; return -1; #endif } void FreeTLS(rfbClient* client) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS if (client->tlsSession) { gnutls_deinit(client->tlsSession); client->tlsSession = NULL; } #endif } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/tls.h000066400000000000000000000034701171526373700266470ustar00rootroot00000000000000#ifndef TLS_H #define TLS_H /* * Copyright (C) 2009 Vic Lee. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* Handle Anonymous TLS Authentication (18) with the server. * After authentication, client->tlsSession will be set. */ rfbBool HandleAnonTLSAuth(rfbClient* client); /* Handle VeNCrypt Authentication (19) with the server. * The callback function GetX509Credential will be called. * After authentication, client->tlsSession will be set. */ rfbBool HandleVeNCryptAuth(rfbClient* client); /* Read desired bytes from TLS session. * It's a wrapper function over gnutls_record_recv() and return values * are same as read(), that is, >0 for actual bytes read, 0 for EOF, * or EAGAIN, EINTR. * This should be a non-blocking call. Blocking is handled in sockets.c. */ int ReadFromTLS(rfbClient* client, char *out, unsigned int n); /* Write desired bytes to TLS session. * It's a wrapper function over gnutls_record_send() and it will be * blocking call, until all bytes are written or error returned. */ int WriteToTLS(rfbClient* client, char *buf, unsigned int n); /* Free TLS resources */ void FreeTLS(rfbClient* client); #endif /* TLS_H */ FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/ultra.c000066400000000000000000000156051171526373700271720ustar00rootroot00000000000000/* * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * ultrazip.c - handle ultrazip encoding. * * This file shouldn't be compiled directly. It is included multiple times by * rfbproto.c, each time with a different definition of the macro BPP. For * each value of BPP, this file defines a function which handles an zlib * encoded rectangle with BPP bits per pixel. */ #define HandleUltraZipBPP CONCAT2E(HandleUltraZip,BPP) #define HandleUltraBPP CONCAT2E(HandleUltra,BPP) #define CARDBPP CONCAT3E(uint,BPP,_t) static rfbBool HandleUltraBPP (rfbClient* client, int rx, int ry, int rw, int rh) { rfbZlibHeader hdr; int toRead=0; int inflateResult=0; lzo_uint uncompressedBytes = (( rw * rh ) * ( BPP / 8 )); if (!ReadFromRFBServer(client, (char *)&hdr, sz_rfbZlibHeader)) return FALSE; toRead = rfbClientSwap32IfLE(hdr.nBytes); if (toRead==0) return TRUE; if (uncompressedBytes==0) { rfbClientLog("ultra error: rectangle has 0 uncomressed bytes ((%dw * %dh) * (%d / 8))\n", rw, rh, BPP); return FALSE; } /* First make sure we have a large enough raw buffer to hold the * decompressed data. In practice, with a fixed BPP, fixed frame * buffer size and the first update containing the entire frame * buffer, this buffer allocation should only happen once, on the * first update. */ if ( client->raw_buffer_size < (int)uncompressedBytes) { if ( client->raw_buffer != NULL ) { free( client->raw_buffer ); } client->raw_buffer_size = uncompressedBytes; /* buffer needs to be aligned on 4-byte boundaries */ if ((client->raw_buffer_size % 4)!=0) client->raw_buffer_size += (4-(client->raw_buffer_size % 4)); client->raw_buffer = (char*) malloc( client->raw_buffer_size ); } /* allocate enough space to store the incoming compressed packet */ if ( client->ultra_buffer_size < toRead ) { if ( client->ultra_buffer != NULL ) { free( client->ultra_buffer ); } client->ultra_buffer_size = toRead; /* buffer needs to be aligned on 4-byte boundaries */ if ((client->ultra_buffer_size % 4)!=0) client->ultra_buffer_size += (4-(client->ultra_buffer_size % 4)); client->ultra_buffer = (char*) malloc( client->ultra_buffer_size ); } /* Fill the buffer, obtaining data from the server. */ if (!ReadFromRFBServer(client, client->ultra_buffer, toRead)) return FALSE; /* uncompress the data */ uncompressedBytes = client->raw_buffer_size; inflateResult = lzo1x_decompress( (lzo_byte *)client->ultra_buffer, toRead, (lzo_byte *)client->raw_buffer, (lzo_uintp) &uncompressedBytes, NULL); if ((rw * rh * (BPP / 8)) != uncompressedBytes) rfbClientLog("Ultra decompressed too little (%d < %d)", (rw * rh * (BPP / 8)), uncompressedBytes); /* Put the uncompressed contents of the update on the screen. */ if ( inflateResult == LZO_E_OK ) { CopyRectangle(client, (unsigned char *)client->raw_buffer, rx, ry, rw, rh); } else { rfbClientLog("ultra decompress returned error: %d\n", inflateResult); return FALSE; } return TRUE; } /* UltraZip is like rre in that it is composed of subrects */ static rfbBool HandleUltraZipBPP (rfbClient* client, int rx, int ry, int rw, int rh) { rfbZlibHeader hdr; int i=0; int toRead=0; int inflateResult=0; unsigned char *ptr=NULL; lzo_uint uncompressedBytes = ry + (rw * 65535); unsigned int numCacheRects = rx; if (!ReadFromRFBServer(client, (char *)&hdr, sz_rfbZlibHeader)) return FALSE; toRead = rfbClientSwap32IfLE(hdr.nBytes); if (toRead==0) return TRUE; if (uncompressedBytes==0) { rfbClientLog("ultrazip error: rectangle has 0 uncomressed bytes (%dy + (%dw * 65535)) (%d rectangles)\n", ry, rw, rx); return FALSE; } /* First make sure we have a large enough raw buffer to hold the * decompressed data. In practice, with a fixed BPP, fixed frame * buffer size and the first update containing the entire frame * buffer, this buffer allocation should only happen once, on the * first update. */ if ( client->raw_buffer_size < (int)(uncompressedBytes + 500)) { if ( client->raw_buffer != NULL ) { free( client->raw_buffer ); } client->raw_buffer_size = uncompressedBytes + 500; /* buffer needs to be aligned on 4-byte boundaries */ if ((client->raw_buffer_size % 4)!=0) client->raw_buffer_size += (4-(client->raw_buffer_size % 4)); client->raw_buffer = (char*) malloc( client->raw_buffer_size ); } /* allocate enough space to store the incoming compressed packet */ if ( client->ultra_buffer_size < toRead ) { if ( client->ultra_buffer != NULL ) { free( client->ultra_buffer ); } client->ultra_buffer_size = toRead; client->ultra_buffer = (char*) malloc( client->ultra_buffer_size ); } /* Fill the buffer, obtaining data from the server. */ if (!ReadFromRFBServer(client, client->ultra_buffer, toRead)) return FALSE; /* uncompress the data */ uncompressedBytes = client->raw_buffer_size; inflateResult = lzo1x_decompress( (lzo_byte *)client->ultra_buffer, toRead, (lzo_byte *)client->raw_buffer, &uncompressedBytes, NULL); if ( inflateResult != LZO_E_OK ) { rfbClientLog("ultra decompress returned error: %d\n", inflateResult); return FALSE; } /* Put the uncompressed contents of the update on the screen. */ ptr = (unsigned char *)client->raw_buffer; for (i=0; i #include #include #include #include #include "tls.h" static void Dummy(rfbClient* client) { } static rfbBool DummyPoint(rfbClient* client, int x, int y) { return TRUE; } static void DummyRect(rfbClient* client, int x, int y, int w, int h) { } #ifdef __MINGW32__ static char* NoPassword(rfbClient* client) { return strdup(""); } #undef SOCKET #include #define close closesocket #else #include #include #endif static char* ReadPassword(rfbClient* client) { #ifdef __MINGW32__ /* FIXME */ rfbClientErr("ReadPassword on MinGW32 NOT IMPLEMENTED\n"); return NoPassword(client); #else int i; char* p=malloc(9); struct termios save,noecho; p[0]=0; if(tcgetattr(fileno(stdin),&save)!=0) return p; noecho=save; noecho.c_lflag &= ~ECHO; if(tcsetattr(fileno(stdin),TCSAFLUSH,&noecho)!=0) return p; fprintf(stderr,"Password: "); i=0; while(1) { int c=fgetc(stdin); if(c=='\n') break; if(i<8) { p[i]=c; i++; p[i]=0; } } tcsetattr(fileno(stdin),TCSAFLUSH,&save); return p; #endif } static rfbBool MallocFrameBuffer(rfbClient* client) { if(client->frameBuffer) free(client->frameBuffer); client->frameBuffer=malloc(client->width*client->height*client->format.bitsPerPixel/8); return client->frameBuffer?TRUE:FALSE; } static void initAppData(AppData* data) { data->shareDesktop=TRUE; data->viewOnly=FALSE; data->encodingsString="tight zrle ultra copyrect hextile zlib corre rre raw"; data->useBGR233=FALSE; data->nColours=0; data->forceOwnCmap=FALSE; data->forceTrueColour=FALSE; data->requestedDepth=0; data->compressLevel=3; data->qualityLevel=5; #ifdef LIBVNCSERVER_HAVE_LIBJPEG data->enableJPEG=TRUE; #else data->enableJPEG=FALSE; #endif data->useRemoteCursor=FALSE; } rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel, int bytesPerPixel) { rfbClient* client=(rfbClient*)calloc(sizeof(rfbClient),1); if(!client) { rfbClientErr("Couldn't allocate client structure!\n"); return NULL; } initAppData(&client->appData); client->endianTest = 1; client->programName=""; client->serverHost=strdup(""); client->serverPort=5900; client->destHost = NULL; client->destPort = 5900; client->CurrentKeyboardLedState = 0; client->HandleKeyboardLedState = (HandleKeyboardLedStateProc)DummyPoint; /* default: use complete frame buffer */ client->updateRect.x = -1; client->format.bitsPerPixel = bytesPerPixel*8; client->format.depth = bitsPerSample*samplesPerPixel; client->appData.requestedDepth=client->format.depth; client->format.bigEndian = *(char *)&client->endianTest?FALSE:TRUE; client->format.trueColour = TRUE; if (client->format.bitsPerPixel == 8) { client->format.redMax = 7; client->format.greenMax = 7; client->format.blueMax = 3; client->format.redShift = 0; client->format.greenShift = 3; client->format.blueShift = 6; } else { client->format.redMax = (1 << bitsPerSample) - 1; client->format.greenMax = (1 << bitsPerSample) - 1; client->format.blueMax = (1 << bitsPerSample) - 1; if(!client->format.bigEndian) { client->format.redShift = 0; client->format.greenShift = bitsPerSample; client->format.blueShift = bitsPerSample * 2; } else { if(client->format.bitsPerPixel==8*3) { client->format.redShift = bitsPerSample*2; client->format.greenShift = bitsPerSample*1; client->format.blueShift = 0; } else { client->format.redShift = bitsPerSample*3; client->format.greenShift = bitsPerSample*2; client->format.blueShift = bitsPerSample; } } } client->bufoutptr=client->buf; client->buffered=0; #ifdef LIBVNCSERVER_HAVE_LIBZ client->raw_buffer_size = -1; client->decompStreamInited = FALSE; #ifdef LIBVNCSERVER_HAVE_LIBJPEG memset(client->zlibStreamActive,0,sizeof(rfbBool)*4); client->jpegSrcManager = NULL; #endif #endif client->HandleCursorPos = DummyPoint; client->SoftCursorLockArea = DummyRect; client->SoftCursorUnlockScreen = Dummy; client->GotFrameBufferUpdate = DummyRect; client->FinishedFrameBufferUpdate = NULL; client->GetPassword = ReadPassword; client->MallocFrameBuffer = MallocFrameBuffer; client->Bell = Dummy; client->CurrentKeyboardLedState = 0; client->HandleKeyboardLedState = (HandleKeyboardLedStateProc)DummyPoint; client->QoS_DSCP = 0; client->authScheme = 0; client->subAuthScheme = 0; client->GetCredential = NULL; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS client->tlsSession = NULL; #endif client->sock = -1; client->listenSock = -1; client->clientAuthSchemes = NULL; return client; } static rfbBool rfbInitConnection(rfbClient* client) { /* Unless we accepted an incoming connection, make a TCP connection to the given VNC server */ if (!client->listenSpecified) { if (!client->serverHost) return FALSE; if (client->destHost) { if (!ConnectToRFBRepeater(client,client->serverHost,client->serverPort,client->destHost,client->destPort)) return FALSE; } else { if (!ConnectToRFBServer(client,client->serverHost,client->serverPort)) return FALSE; } } /* Initialise the VNC connection, including reading the password */ if (!InitialiseRFBConnection(client)) return FALSE; client->width=client->si.framebufferWidth; client->height=client->si.framebufferHeight; client->MallocFrameBuffer(client); if (!SetFormatAndEncodings(client)) return FALSE; if (client->updateRect.x < 0) { client->updateRect.x = client->updateRect.y = 0; client->updateRect.w = client->width; client->updateRect.h = client->height; } if (client->appData.scaleSetting>1) { if (!SendScaleSetting(client, client->appData.scaleSetting)) return FALSE; if (!SendFramebufferUpdateRequest(client, client->updateRect.x / client->appData.scaleSetting, client->updateRect.y / client->appData.scaleSetting, client->updateRect.w / client->appData.scaleSetting, client->updateRect.h / client->appData.scaleSetting, FALSE)) return FALSE; } else { if (!SendFramebufferUpdateRequest(client, client->updateRect.x, client->updateRect.y, client->updateRect.w, client->updateRect.h, FALSE)) return FALSE; } return TRUE; } rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv) { int i,j; if(argv && argc && *argc) { if(client->programName==0) client->programName=argv[0]; for (i = 1; i < *argc; i++) { j = i; if (strcmp(argv[i], "-listen") == 0) { listenForIncomingConnections(client); break; } else if (strcmp(argv[i], "-listennofork") == 0) { listenForIncomingConnectionsNoFork(client, -1); break; } else if (strcmp(argv[i], "-play") == 0) { client->serverPort = -1; j++; } else if (i+1<*argc && strcmp(argv[i], "-encodings") == 0) { client->appData.encodingsString = argv[i+1]; j+=2; } else if (i+1<*argc && strcmp(argv[i], "-compress") == 0) { client->appData.compressLevel = atoi(argv[i+1]); j+=2; } else if (i+1<*argc && strcmp(argv[i], "-quality") == 0) { client->appData.qualityLevel = atoi(argv[i+1]); j+=2; } else if (i+1<*argc && strcmp(argv[i], "-scale") == 0) { client->appData.scaleSetting = atoi(argv[i+1]); j+=2; } else if (i+1<*argc && strcmp(argv[i], "-qosdscp") == 0) { client->QoS_DSCP = atoi(argv[i+1]); j+=2; } else if (i+1<*argc && strcmp(argv[i], "-repeaterdest") == 0) { char* colon=strchr(argv[i+1],':'); if(client->destHost) free(client->destHost); client->destPort = 5900; client->destHost = strdup(argv[i+1]); if(colon) { client->destHost[(int)(colon-argv[i+1])] = '\0'; client->destPort = atoi(colon+1); } j+=2; } else { char* colon=strchr(argv[i],':'); if(client->serverHost) free(client->serverHost); if(colon) { client->serverHost = strdup(argv[i]); client->serverHost[(int)(colon-argv[i])] = '\0'; client->serverPort = atoi(colon+1); } else { client->serverHost = strdup(argv[i]); } if(client->serverPort >= 0 && client->serverPort < 5900) client->serverPort += 5900; } /* purge arguments */ if (j>i) { *argc-=j-i; memmove(argv+i,argv+j,(*argc-i)*sizeof(char*)); i--; } } } if(!rfbInitConnection(client)) { rfbClientCleanup(client); return FALSE; } return TRUE; } void rfbClientCleanup(rfbClient* client) { #ifdef LIBVNCSERVER_HAVE_LIBZ #ifdef LIBVNCSERVER_HAVE_LIBJPEG int i; for ( i = 0; i < 4; i++ ) { if (client->zlibStreamActive[i] == TRUE ) { if (inflateEnd (&client->zlibStream[i]) != Z_OK && client->zlibStream[i].msg != NULL) rfbClientLog("inflateEnd: %s\n", client->zlibStream[i].msg); } } if ( client->decompStreamInited == TRUE ) { if (inflateEnd (&client->decompStream) != Z_OK && client->decompStream.msg != NULL) rfbClientLog("inflateEnd: %s\n", client->decompStream.msg ); } if (client->jpegSrcManager) free(client->jpegSrcManager); #endif #endif #ifdef LIBVNCSERVER_WITH_CLIENT_TLS FreeTLS(client); #endif if (client->sock >= 0) close(client->sock); if (client->listenSock >= 0) close(client->listenSock); free(client->desktopName); free(client->serverHost); if (client->destHost) free(client->destHost); if (client->clientAuthSchemes) free(client->clientAuthSchemes); free(client); } FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/zlib.c000066400000000000000000000112531171526373700267760ustar00rootroot00000000000000/* * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifdef LIBVNCSERVER_HAVE_LIBZ /* * zlib.c - handle zlib encoding. * * This file shouldn't be compiled directly. It is included multiple times by * rfbproto.c, each time with a different definition of the macro BPP. For * each value of BPP, this file defines a function which handles an zlib * encoded rectangle with BPP bits per pixel. */ #define HandleZlibBPP CONCAT2E(HandleZlib,BPP) #define CARDBPP CONCAT3E(uint,BPP,_t) static rfbBool HandleZlibBPP (rfbClient* client, int rx, int ry, int rw, int rh) { rfbZlibHeader hdr; int remaining; int inflateResult; int toRead; /* First make sure we have a large enough raw buffer to hold the * decompressed data. In practice, with a fixed BPP, fixed frame * buffer size and the first update containing the entire frame * buffer, this buffer allocation should only happen once, on the * first update. */ if ( client->raw_buffer_size < (( rw * rh ) * ( BPP / 8 ))) { if ( client->raw_buffer != NULL ) { free( client->raw_buffer ); } client->raw_buffer_size = (( rw * rh ) * ( BPP / 8 )); client->raw_buffer = (char*) malloc( client->raw_buffer_size ); } if (!ReadFromRFBServer(client, (char *)&hdr, sz_rfbZlibHeader)) return FALSE; remaining = rfbClientSwap32IfLE(hdr.nBytes); /* Need to initialize the decompressor state. */ client->decompStream.next_in = ( Bytef * )client->buffer; client->decompStream.avail_in = 0; client->decompStream.next_out = ( Bytef * )client->raw_buffer; client->decompStream.avail_out = client->raw_buffer_size; client->decompStream.data_type = Z_BINARY; /* Initialize the decompression stream structures on the first invocation. */ if ( client->decompStreamInited == FALSE ) { inflateResult = inflateInit( &client->decompStream ); if ( inflateResult != Z_OK ) { rfbClientLog( "inflateInit returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } client->decompStreamInited = TRUE; } inflateResult = Z_OK; /* Process buffer full of data until no more to process, or * some type of inflater error, or Z_STREAM_END. */ while (( remaining > 0 ) && ( inflateResult == Z_OK )) { if ( remaining > RFB_BUFFER_SIZE ) { toRead = RFB_BUFFER_SIZE; } else { toRead = remaining; } /* Fill the buffer, obtaining data from the server. */ if (!ReadFromRFBServer(client, client->buffer,toRead)) return FALSE; client->decompStream.next_in = ( Bytef * )client->buffer; client->decompStream.avail_in = toRead; /* Need to uncompress buffer full. */ inflateResult = inflate( &client->decompStream, Z_SYNC_FLUSH ); /* We never supply a dictionary for compression. */ if ( inflateResult == Z_NEED_DICT ) { rfbClientLog("zlib inflate needs a dictionary!\n"); return FALSE; } if ( inflateResult < 0 ) { rfbClientLog( "zlib inflate returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } /* Result buffer allocated to be at least large enough. We should * never run out of space! */ if (( client->decompStream.avail_in > 0 ) && ( client->decompStream.avail_out <= 0 )) { rfbClientLog("zlib inflate ran out of space!\n"); return FALSE; } remaining -= toRead; } /* while ( remaining > 0 ) */ if ( inflateResult == Z_OK ) { /* Put the uncompressed contents of the update on the screen. */ CopyRectangle(client, (uint8_t *)client->raw_buffer, rx, ry, rw, rh); } else { rfbClientLog( "zlib inflate returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } return TRUE; } #undef CARDBPP #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/libvncclient/zrle.c000066400000000000000000000246401171526373700270160ustar00rootroot00000000000000/* * Copyright (C) 2005 Johannes E. Schindelin. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #ifdef LIBVNCSERVER_HAVE_LIBZ /* * zrle.c - handle zrle encoding. * * This file shouldn't be compiled directly. It is included multiple times by * rfbproto.c, each time with a different definition of the macro BPP. For * each value of BPP, this file defines a function which handles an zrle * encoded rectangle with BPP bits per pixel. */ #ifndef REALBPP #define REALBPP BPP #endif #if !defined(UNCOMP) || UNCOMP==0 #define HandleZRLE CONCAT2E(HandleZRLE,REALBPP) #define HandleZRLETile CONCAT2E(HandleZRLETile,REALBPP) #elif UNCOMP>0 #define HandleZRLE CONCAT3E(HandleZRLE,REALBPP,Down) #define HandleZRLETile CONCAT3E(HandleZRLETile,REALBPP,Down) #else #define HandleZRLE CONCAT3E(HandleZRLE,REALBPP,Up) #define HandleZRLETile CONCAT3E(HandleZRLETile,REALBPP,Up) #endif #define CARDBPP CONCAT3E(uint,BPP,_t) #define CARDREALBPP CONCAT3E(uint,REALBPP,_t) #define ENDIAN_LITTLE 0 #define ENDIAN_BIG 1 #define ENDIAN_NO 2 #define ZYWRLE_ENDIAN ENDIAN_LITTLE #undef END_FIX #if ZYWRLE_ENDIAN == ENDIAN_LITTLE # define END_FIX LE #elif ZYWRLE_ENDIAN == ENDIAN_BIG # define END_FIX BE #else # define END_FIX NE #endif #define __RFB_CONCAT3E(a,b,c) CONCAT3E(a,b,c) #define __RFB_CONCAT2E(a,b) CONCAT2E(a,b) #undef CPIXEL #if REALBPP != BPP #if UNCOMP == 0 #define CPIXEL REALBPP #elif UNCOMP>0 #define CPIXEL CONCAT2E(REALBPP,Down) #else #define CPIXEL CONCAT2E(REALBPP,Up) #endif #endif #define PIXEL_T __RFB_CONCAT3E(uint,BPP,_t) #if BPP!=8 #define ZYWRLE_DECODE 1 #include "zywrletemplate.c" #endif #undef CPIXEL static int HandleZRLETile(rfbClient* client, uint8_t* buffer,size_t buffer_length, int x,int y,int w,int h); static rfbBool HandleZRLE (rfbClient* client, int rx, int ry, int rw, int rh) { rfbZRLEHeader header; int remaining; int inflateResult; int toRead; int min_buffer_size = rw * rh * (REALBPP / 8) * 2; /* First make sure we have a large enough raw buffer to hold the * decompressed data. In practice, with a fixed REALBPP, fixed frame * buffer size and the first update containing the entire frame * buffer, this buffer allocation should only happen once, on the * first update. */ if ( client->raw_buffer_size < min_buffer_size) { if ( client->raw_buffer != NULL ) { free( client->raw_buffer ); } client->raw_buffer_size = min_buffer_size; client->raw_buffer = (char*) malloc( client->raw_buffer_size ); } if (!ReadFromRFBServer(client, (char *)&header, sz_rfbZRLEHeader)) return FALSE; remaining = rfbClientSwap32IfLE(header.length); /* Need to initialize the decompressor state. */ client->decompStream.next_in = ( Bytef * )client->buffer; client->decompStream.avail_in = 0; client->decompStream.next_out = ( Bytef * )client->raw_buffer; client->decompStream.avail_out = client->raw_buffer_size; client->decompStream.data_type = Z_BINARY; /* Initialize the decompression stream structures on the first invocation. */ if ( client->decompStreamInited == FALSE ) { inflateResult = inflateInit( &client->decompStream ); if ( inflateResult != Z_OK ) { rfbClientLog( "inflateInit returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } client->decompStreamInited = TRUE; } inflateResult = Z_OK; /* Process buffer full of data until no more to process, or * some type of inflater error, or Z_STREAM_END. */ while (( remaining > 0 ) && ( inflateResult == Z_OK )) { if ( remaining > RFB_BUFFER_SIZE ) { toRead = RFB_BUFFER_SIZE; } else { toRead = remaining; } /* Fill the buffer, obtaining data from the server. */ if (!ReadFromRFBServer(client, client->buffer,toRead)) return FALSE; client->decompStream.next_in = ( Bytef * )client->buffer; client->decompStream.avail_in = toRead; /* Need to uncompress buffer full. */ inflateResult = inflate( &client->decompStream, Z_SYNC_FLUSH ); /* We never supply a dictionary for compression. */ if ( inflateResult == Z_NEED_DICT ) { rfbClientLog("zlib inflate needs a dictionary!\n"); return FALSE; } if ( inflateResult < 0 ) { rfbClientLog( "zlib inflate returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } /* Result buffer allocated to be at least large enough. We should * never run out of space! */ if (( client->decompStream.avail_in > 0 ) && ( client->decompStream.avail_out <= 0 )) { rfbClientLog("zlib inflate ran out of space!\n"); return FALSE; } remaining -= toRead; } /* while ( remaining > 0 ) */ if ( inflateResult == Z_OK ) { void* buf=client->raw_buffer; int i,j; remaining = client->raw_buffer_size-client->decompStream.avail_out; for(j=0; jrw)?rw-i:rfbZRLETileWidth; int subHeight=(j+rfbZRLETileHeight>rh)?rh-j:rfbZRLETileHeight; int result=HandleZRLETile(client,buf,remaining,rx+i,ry+j,subWidth,subHeight); if(result<0) { rfbClientLog("ZRLE decoding failed (%d)\n",result); return TRUE; return FALSE; } buf+=result; remaining-=result; } } else { rfbClientLog( "zlib inflate returned error: %d, msg: %s\n", inflateResult, client->decompStream.msg); return FALSE; } return TRUE; } #if REALBPP!=BPP && defined(UNCOMP) && UNCOMP!=0 #if UNCOMP>0 #define UncompressCPixel(pointer) ((*(CARDBPP*)pointer)>>UNCOMP) #else #define UncompressCPixel(pointer) ((*(CARDBPP*)pointer)<<(-(UNCOMP))) #endif #else #define UncompressCPixel(pointer) (*(CARDBPP*)pointer) #endif static int HandleZRLETile(rfbClient* client, uint8_t* buffer,size_t buffer_length, int x,int y,int w,int h) { uint8_t* buffer_copy = buffer; uint8_t* buffer_end = buffer+buffer_length; uint8_t type; #if BPP!=8 uint8_t zywrle_level = (client->appData.qualityLevel & 0x80) ? 0 : (3 - client->appData.qualityLevel / 3); #endif if(buffer_length<1) return -2; type = *buffer; buffer++; { if( type == 0 ) /* raw */ #if BPP!=8 if( zywrle_level > 0 ){ CARDBPP* pFrame = (CARDBPP*)client->frameBuffer + y*client->width+x; int ret; client->appData.qualityLevel |= 0x80; ret = HandleZRLETile(client, buffer, buffer_end-buffer, x, y, w, h); client->appData.qualityLevel &= 0x7F; if( ret < 0 ){ return ret; } ZYWRLE_SYNTHESIZE( pFrame, pFrame, w, h, client->width, zywrle_level, (int*)client->zlib_buffer ); buffer += ret; }else #endif { #if REALBPP!=BPP int i,j; if(1+w*h*REALBPP/8>buffer_length) { rfbClientLog("expected %d bytes, got only %d (%dx%d)\n",1+w*h*REALBPP/8,buffer_length,w,h); return -3; } for(j=y*client->width; j<(y+h)*client->width; j+=client->width) for(i=x; iframeBuffer)[j+i] = UncompressCPixel(buffer); #else CopyRectangle(client, buffer, x, y, w, h); buffer+=w*h*REALBPP/8; #endif } else if( type == 1 ) /* solid */ { CARDBPP color = UncompressCPixel(buffer); if(1+REALBPP/8>buffer_length) return -4; FillRectangle(client, x, y, w, h, color); buffer+=REALBPP/8; } else if( (type >= 2)&&(type <= 127) ) /* packed Palette */ { CARDBPP palette[16]; int i,j,shift, bpp=(type>4?(type>16?8:4):(type>2?2:1)), mask=(1<buffer_length) return -5; /* read palette */ for(i=0; iwidth; j<(y+h)*client->width; j+=client->width) { for(i=x,shift=8-bpp; iframeBuffer)[j+i] = palette[((*buffer)>>shift)&mask]; shift-=bpp; if(shift<0) { shift=8-bpp; buffer++; } } if(shift<8-bpp) buffer++; } } /* case 17 ... 127: not used, but valid */ else if( type == 128 ) /* plain RLE */ { int i=0,j=0; while(jbuffer_end) return -7; color = UncompressCPixel(buffer); buffer+=REALBPP/8; /* read run length */ length=1; while(*buffer==0xff) { if(buffer+1>=buffer_end) return -8; length+=*buffer; buffer++; } length+=*buffer; buffer++; while(j0) { ((CARDBPP*)client->frameBuffer)[(y+j)*client->width+x+i] = color; length--; i++; if(i>=w) { i=0; j++; } } if(length>0) rfbClientLog("Warning: possible ZRLE corruption\n"); } } else if( type == 129 ) /* unused */ { return -8; } else if( type >= 130 ) /* palette RLE */ { CARDBPP palette[128]; int i,j; if(2+(type-128)*REALBPP/8>buffer_length) return -9; /* read palette */ for(i=0; i=buffer_end) return -10; color = palette[(*buffer)&0x7f]; length=1; if(*buffer&0x80) { if(buffer+1>=buffer_end) return -11; buffer++; /* read run length */ while(*buffer==0xff) { if(buffer+1>=buffer_end) return -8; length+=*buffer; buffer++; } length+=*buffer; } buffer++; while(j0) { ((CARDBPP*)client->frameBuffer)[(y+j)*client->width+x+i] = color; length--; i++; if(i>=w) { i=0; j++; } } if(length>0) rfbClientLog("Warning: possible ZRLE corruption\n"); } } } return buffer-buffer_copy; } #undef CARDBPP #undef CARDREALBPP #undef HandleZRLE #undef HandleZRLETile #undef UncompressCPixel #undef REALBPP #endif #undef UNCOMP FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/000077500000000000000000000000001171526373700237655ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/default8x16.h000066400000000000000000000575671171526373700262350ustar00rootroot00000000000000static unsigned char default8x16FontData[4096+1]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0x81,0xa5,0x81,0x81,0xbd,0x99,0x81,0x81,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x7e,0xff,0xdb,0xff,0xff,0xc3,0xe7,0xff,0xff,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x6c,0xfe,0xfe,0xfe,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x38,0x7c,0xfe,0x7c,0x38,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x3c,0x3c,0xe7,0xe7,0xe7,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x3c,0x7e,0xff,0xff,0x7e,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00,0x00,0x00,0x00,0x00, 0xff,0xff,0xff,0xff,0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x1e,0x0e,0x1a,0x32,0x78,0xcc,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x66,0x66,0x66,0x66,0x3c,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x3f,0x33,0x3f,0x30,0x30,0x30,0x30,0x70,0xf0,0xe0,0x00,0x00,0x00,0x00, 0x00,0x00,0x7f,0x63,0x7f,0x63,0x63,0x63,0x63,0x67,0xe7,0xe6,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x18,0x18,0xdb,0x3c,0xe7,0x3c,0xdb,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfe,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00, 0x00,0x02,0x06,0x0e,0x1e,0x3e,0xfe,0x3e,0x1e,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x66,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0x7f,0xdb,0xdb,0xdb,0x7b,0x1b,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00, 0x00,0x7c,0xc6,0x60,0x38,0x6c,0xc6,0xc6,0x6c,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xfe,0xfe,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x7e,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x3c,0x7e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x3c,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x18,0x0c,0xfe,0x0c,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x30,0x60,0xfe,0x60,0x30,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc0,0xc0,0xfe,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x24,0x66,0xff,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x38,0x38,0x7c,0x7c,0xfe,0xfe,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0xfe,0x7c,0x7c,0x38,0x38,0x10,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x3c,0x3c,0x3c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x6c,0x6c,0xfe,0x6c,0x6c,0x6c,0xfe,0x6c,0x6c,0x00,0x00,0x00,0x00, 0x18,0x18,0x7c,0xc6,0xc2,0xc0,0x7c,0x06,0x06,0x86,0xc6,0x7c,0x18,0x18,0x00,0x00, 0x00,0x00,0x00,0x00,0xc2,0xc6,0x0c,0x18,0x30,0x60,0xc6,0x86,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x6c,0x6c,0x38,0x76,0xdc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x0c,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0c,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x18,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x18,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x66,0x3c,0xff,0x3c,0x66,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x02,0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xce,0xde,0xf6,0xe6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0x06,0x0c,0x18,0x30,0x60,0xc0,0xc6,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0x06,0x06,0x3c,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x0c,0x1c,0x3c,0x6c,0xcc,0xfe,0x0c,0x0c,0x0c,0x1e,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xfc,0x06,0x06,0x06,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x60,0xc0,0xc0,0xfc,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0xc6,0x06,0x06,0x0c,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7c,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xc6,0x7e,0x06,0x06,0x06,0x0c,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x06,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x06,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x60,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x60,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0x0c,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xde,0xde,0xde,0xdc,0xc0,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x66,0x66,0x66,0x66,0xfc,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0xf8,0x6c,0x66,0x66,0x66,0x66,0x66,0x66,0x6c,0xf8,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xde,0xc6,0xc6,0x66,0x3a,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0xcc,0xcc,0xcc,0x78,0x00,0x00,0x00,0x00, 0x00,0x00,0xe6,0x66,0x66,0x6c,0x78,0x78,0x6c,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, 0x00,0x00,0xf0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0xe7,0xff,0xff,0xdb,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xd6,0xde,0x7c,0x0c,0x0e,0x00,0x00, 0x00,0x00,0xfc,0x66,0x66,0x66,0x7c,0x6c,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, 0x00,0x00,0x7c,0xc6,0xc6,0x60,0x38,0x0c,0x06,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0xdb,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0xc3,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x3c,0x66,0xc3,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0xff,0xc3,0x86,0x0c,0x18,0x30,0x60,0xc1,0xc3,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x80,0xc0,0xe0,0x70,0x38,0x1c,0x0e,0x06,0x02,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x3c,0x00,0x00,0x00,0x00, 0x10,0x38,0x6c,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00, 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0xe0,0x60,0x60,0x78,0x6c,0x66,0x66,0x66,0x66,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc0,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x0c,0x0c,0x3c,0x6c,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0xcc,0x78,0x00, 0x00,0x00,0xe0,0x60,0x60,0x6c,0x76,0x66,0x66,0x66,0x66,0xe6,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x06,0x06,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3c,0x00, 0x00,0x00,0xe0,0x60,0x60,0x66,0x6c,0x78,0x78,0x6c,0x66,0xe6,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xe6,0xff,0xdb,0xdb,0xdb,0xdb,0xdb,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xf0,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0xcc,0xcc,0xcc,0xcc,0xcc,0x7c,0x0c,0x0c,0x1e,0x00, 0x00,0x00,0x00,0x00,0x00,0xdc,0x76,0x66,0x60,0x60,0x60,0xf0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7c,0xc6,0x60,0x38,0x0c,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x30,0x30,0xfc,0x30,0x30,0x30,0x30,0x36,0x1c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xc3,0x66,0x3c,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0xc3,0xc3,0xdb,0xdb,0xff,0x66,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc3,0x66,0x3c,0x18,0x3c,0x66,0xc3,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0xf8,0x00, 0x00,0x00,0x00,0x00,0x00,0xfe,0xcc,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0e,0x00,0x00,0x00,0x00, 0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x70,0x18,0x18,0x18,0x0e,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xc6,0xfe,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x3c,0x66,0xc2,0xc0,0xc0,0xc0,0xc2,0x66,0x3c,0x0c,0x06,0x7c,0x00,0x00, 0x00,0x00,0xcc,0x00,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x0c,0x18,0x30,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x10,0x38,0x6c,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0xcc,0x00,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x60,0x30,0x18,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x38,0x6c,0x38,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x3c,0x66,0x60,0x60,0x66,0x3c,0x0c,0x06,0x3c,0x00,0x00,0x00, 0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xfe,0xc0,0xc0,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x66,0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x18,0x3c,0x66,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x60,0x30,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0xc6,0x00,0x10,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x38,0x6c,0x38,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x18,0x30,0x60,0x00,0xfe,0x66,0x60,0x7c,0x60,0x60,0x66,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x6e,0x3b,0x1b,0x7e,0xd8,0xdc,0x77,0x00,0x00,0x00,0x00, 0x00,0x00,0x3e,0x6c,0xcc,0xcc,0xfe,0xcc,0xcc,0xcc,0xcc,0xce,0x00,0x00,0x00,0x00, 0x00,0x10,0x38,0x6c,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x60,0x30,0x18,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x30,0x78,0xcc,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x60,0x30,0x18,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0xc6,0x00,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7e,0x06,0x0c,0x78,0x00, 0x00,0xc6,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0xc6,0x00,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x18,0x18,0x7e,0xc3,0xc0,0xc0,0xc0,0xc3,0x7e,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x38,0x6c,0x64,0x60,0xf0,0x60,0x60,0x60,0x60,0xe6,0xfc,0x00,0x00,0x00,0x00, 0x00,0x00,0xc3,0x66,0x3c,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0xfc,0x66,0x66,0x7c,0x62,0x66,0x6f,0x66,0x66,0x66,0xf3,0x00,0x00,0x00,0x00, 0x00,0x0e,0x1b,0x18,0x18,0x18,0x7e,0x18,0x18,0x18,0x18,0x18,0xd8,0x70,0x00,0x00, 0x00,0x18,0x30,0x60,0x00,0x78,0x0c,0x7c,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x0c,0x18,0x30,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3c,0x00,0x00,0x00,0x00, 0x00,0x18,0x30,0x60,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x18,0x30,0x60,0x00,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x76,0xdc,0x00,0xdc,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, 0x76,0xdc,0x00,0xc6,0xe6,0xf6,0xfe,0xde,0xce,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x00,0x3c,0x6c,0x6c,0x3e,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x6c,0x6c,0x38,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x60,0xc0,0xc6,0xc6,0x7c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00, 0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x60,0xce,0x9b,0x06,0x0c,0x1f,0x00,0x00, 0x00,0xc0,0xc0,0xc2,0xc6,0xcc,0x18,0x30,0x66,0xce,0x96,0x3e,0x06,0x06,0x00,0x00, 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x18,0x3c,0x3c,0x3c,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x36,0x6c,0xd8,0x6c,0x36,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xd8,0x6c,0x36,0x6c,0xd8,0x00,0x00,0x00,0x00,0x00,0x00, 0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44,0x11,0x44, 0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa, 0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77,0xdd,0x77, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x00,0x00,0x00,0x00,0x00,0xfe,0x06,0xf6,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0xf6,0x06,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x18,0x18,0x18,0xf8,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x3f,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x37,0x30,0x37,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x36,0x36,0x36,0x36,0xf7,0x00,0xf7,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x18,0x18,0x18,0x18,0x18,0xff,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x18,0x18,0x18,0x18,0x18,0x1f,0x18,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0xff,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, 0x18,0x18,0x18,0x18,0x18,0xff,0x18,0xff,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0xd8,0xd8,0xd8,0xdc,0x76,0x00,0x00,0x00,0x00, 0x00,0x00,0x78,0xcc,0xcc,0xcc,0xd8,0xcc,0xc6,0xc6,0xc6,0xcc,0x00,0x00,0x00,0x00, 0x00,0x00,0xfe,0xc6,0xc6,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xfe,0xc6,0x60,0x30,0x18,0x30,0x60,0xc6,0xfe,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0xd8,0xd8,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7c,0x60,0x60,0xc0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x76,0xdc,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7e,0x18,0x3c,0x66,0x66,0x66,0x3c,0x18,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x38,0x6c,0xc6,0xc6,0xfe,0xc6,0xc6,0x6c,0x38,0x00,0x00,0x00,0x00, 0x00,0x00,0x38,0x6c,0xc6,0xc6,0xc6,0x6c,0x6c,0x6c,0x6c,0xee,0x00,0x00,0x00,0x00, 0x00,0x00,0x1e,0x30,0x18,0x0c,0x3e,0x66,0x66,0x66,0x66,0x3c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x7e,0xdb,0xdb,0xdb,0x7e,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x03,0x06,0x7e,0xdb,0xdb,0xf3,0x7e,0x60,0xc0,0x00,0x00,0x00,0x00, 0x00,0x00,0x1c,0x30,0x60,0x60,0x7c,0x60,0x60,0x60,0x30,0x1c,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7c,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0xc6,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0xfe,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x18,0x18,0x7e,0x18,0x18,0x00,0x00,0xff,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x18,0x0c,0x06,0x0c,0x18,0x30,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x0c,0x18,0x30,0x60,0x30,0x18,0x0c,0x00,0x7e,0x00,0x00,0x00,0x00, 0x00,0x00,0x0e,0x1b,0x1b,0x1b,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18, 0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xd8,0xd8,0xd8,0x70,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x7e,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x76,0xdc,0x00,0x76,0xdc,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x38,0x6c,0x6c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0xec,0x6c,0x6c,0x3c,0x1c,0x00,0x00,0x00,0x00, 0x00,0xd8,0x6c,0x6c,0x6c,0x6c,0x6c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x70,0xd8,0x30,0x60,0xc8,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x7c,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; static int default8x16FontMetaData[256*5+1]={ 0,8,16,0,0,16,8,16,0,0,32,8,16,0,0,48,8,16,0,0,64,8,16,0,0,80,8,16,0,0,96,8,16,0,0,112,8,16,0,0,128,8,16,0,0,144,8,16,0,0,160,8,16,0,0,176,8,16,0,0,192,8,16,0,0,208,8,16,0,0,224,8,16,0,0,240,8,16,0,0,256,8,16,0,0,272,8,16,0,0,288,8,16,0,0,304,8,16,0,0,320,8,16,0,0,336,8,16,0,0,352,8,16,0,0,368,8,16,0,0,384,8,16,0,0,400,8,16,0,0,416,8,16,0,0,432,8,16,0,0,448,8,16,0,0,464,8,16,0,0,480,8,16,0,0,496,8,16,0,0,512,8,16,0,0,528,8,16,0,0,544,8,16,0,0,560,8,16,0,0,576,8,16,0,0,592,8,16,0,0,608,8,16,0,0,624,8,16,0,0,640,8,16,0,0,656,8,16,0,0,672,8,16,0,0,688,8,16,0,0,704,8,16,0,0,720,8,16,0,0,736,8,16,0,0,752,8,16,0,0,768,8,16,0,0,784,8,16,0,0,800,8,16,0,0,816,8,16,0,0,832,8,16,0,0,848,8,16,0,0,864,8,16,0,0,880,8,16,0,0,896,8,16,0,0,912,8,16,0,0,928,8,16,0,0,944,8,16,0,0,960,8,16,0,0,976,8,16,0,0,992,8,16,0,0,1008,8,16,0,0,1024,8,16,0,0,1040,8,16,0,0,1056,8,16,0,0,1072,8,16,0,0,1088,8,16,0,0,1104,8,16,0,0,1120,8,16,0,0,1136,8,16,0,0,1152,8,16,0,0,1168,8,16,0,0,1184,8,16,0,0,1200,8,16,0,0,1216,8,16,0,0,1232,8,16,0,0,1248,8,16,0,0,1264,8,16,0,0,1280,8,16,0,0,1296,8,16,0,0,1312,8,16,0,0,1328,8,16,0,0,1344,8,16,0,0,1360,8,16,0,0,1376,8,16,0,0,1392,8,16,0,0,1408,8,16,0,0,1424,8,16,0,0,1440,8,16,0,0,1456,8,16,0,0,1472,8,16,0,0,1488,8,16,0,0,1504,8,16,0,0,1520,8,16,0,0,1536,8,16,0,0,1552,8,16,0,0,1568,8,16,0,0,1584,8,16,0,0,1600,8,16,0,0,1616,8,16,0,0,1632,8,16,0,0,1648,8,16,0,0,1664,8,16,0,0,1680,8,16,0,0,1696,8,16,0,0,1712,8,16,0,0,1728,8,16,0,0,1744,8,16,0,0,1760,8,16,0,0,1776,8,16,0,0,1792,8,16,0,0,1808,8,16,0,0,1824,8,16,0,0,1840,8,16,0,0,1856,8,16,0,0,1872,8,16,0,0,1888,8,16,0,0,1904,8,16,0,0,1920,8,16,0,0,1936,8,16,0,0,1952,8,16,0,0,1968,8,16,0,0,1984,8,16,0,0,2000,8,16,0,0,2016,8,16,0,0,2032,8,16,0,0,2048,8,16,0,0,2064,8,16,0,0,2080,8,16,0,0,2096,8,16,0,0,2112,8,16,0,0,2128,8,16,0,0,2144,8,16,0,0,2160,8,16,0,0,2176,8,16,0,0,2192,8,16,0,0,2208,8,16,0,0,2224,8,16,0,0,2240,8,16,0,0,2256,8,16,0,0,2272,8,16,0,0,2288,8,16,0,0,2304,8,16,0,0,2320,8,16,0,0,2336,8,16,0,0,2352,8,16,0,0,2368,8,16,0,0,2384,8,16,0,0,2400,8,16,0,0,2416,8,16,0,0,2432,8,16,0,0,2448,8,16,0,0,2464,8,16,0,0,2480,8,16,0,0,2496,8,16,0,0,2512,8,16,0,0,2528,8,16,0,0,2544,8,16,0,0,2560,8,16,0,0,2576,8,16,0,0,2592,8,16,0,0,2608,8,16,0,0,2624,8,16,0,0,2640,8,16,0,0,2656,8,16,0,0,2672,8,16,0,0,2688,8,16,0,0,2704,8,16,0,0,2720,8,16,0,0,2736,8,16,0,0,2752,8,16,0,0,2768,8,16,0,0,2784,8,16,0,0,2800,8,16,0,0,2816,8,16,0,0,2832,8,16,0,0,2848,8,16,0,0,2864,8,16,0,0,2880,8,16,0,0,2896,8,16,0,0,2912,8,16,0,0,2928,8,16,0,0,2944,8,16,0,0,2960,8,16,0,0,2976,8,16,0,0,2992,8,16,0,0,3008,8,16,0,0,3024,8,16,0,0,3040,8,16,0,0,3056,8,16,0,0,3072,8,16,0,0,3088,8,16,0,0,3104,8,16,0,0,3120,8,16,0,0,3136,8,16,0,0,3152,8,16,0,0,3168,8,16,0,0,3184,8,16,0,0,3200,8,16,0,0,3216,8,16,0,0,3232,8,16,0,0,3248,8,16,0,0,3264,8,16,0,0,3280,8,16,0,0,3296,8,16,0,0,3312,8,16,0,0,3328,8,16,0,0,3344,8,16,0,0,3360,8,16,0,0,3376,8,16,0,0,3392,8,16,0,0,3408,8,16,0,0,3424,8,16,0,0,3440,8,16,0,0,3456,8,16,0,0,3472,8,16,0,0,3488,8,16,0,0,3504,8,16,0,0,3520,8,16,0,0,3536,8,16,0,0,3552,8,16,0,0,3568,8,16,0,0,3584,8,16,0,0,3600,8,16,0,0,3616,8,16,0,0,3632,8,16,0,0,3648,8,16,0,0,3664,8,16,0,0,3680,8,16,0,0,3696,8,16,0,0,3712,8,16,0,0,3728,8,16,0,0,3744,8,16,0,0,3760,8,16,0,0,3776,8,16,0,0,3792,8,16,0,0,3808,8,16,0,0,3824,8,16,0,0,3840,8,16,0,0,3856,8,16,0,0,3872,8,16,0,0,3888,8,16,0,0,3904,8,16,0,0,3920,8,16,0,0,3936,8,16,0,0,3952,8,16,0,0,3968,8,16,0,0,3984,8,16,0,0,4000,8,16,0,0,4016,8,16,0,0,4032,8,16,0,0,4048,8,16,0,0,4064,8,16,0,0,4080,8,16,0,0,}; static rfbFontData default8x16Font = { default8x16FontData, default8x16FontMetaData }; FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/keysym.h000066400000000000000000002071071171526373700254660ustar00rootroot00000000000000#ifndef XK_0 /* $XConsortium: keysym.h,v 1.15 94/04/17 20:10:55 rws Exp $ */ /*********************************************************** Copyright (c) 1987 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ /* default keysyms */ #define XK_MISCELLANY #define XK_XKB_KEYS #define XK_LATIN1 #define XK_LATIN2 #define XK_LATIN3 #define XK_LATIN4 #define XK_GREEK /* $TOG: keysymdef.h /main/25 1997/06/21 10:54:51 kaleb $ */ /*********************************************************** Copyright (c) 1987, 1994 X Consortium Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts All Rights Reserved Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Digital not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ #define XK_VoidSymbol 0xFFFFFF /* void symbol */ #ifdef XK_MISCELLANY /* * TTY Functions, cleverly chosen to map to ascii, for convenience of * programming, but could have been arbitrary (at the cost of lookup * tables in client code. */ #define XK_BackSpace 0xFF08 /* back space, back char */ #define XK_Tab 0xFF09 #define XK_Linefeed 0xFF0A /* Linefeed, LF */ #define XK_Clear 0xFF0B #define XK_Return 0xFF0D /* Return, enter */ #define XK_Pause 0xFF13 /* Pause, hold */ #define XK_Scroll_Lock 0xFF14 #define XK_Sys_Req 0xFF15 #define XK_Escape 0xFF1B #define XK_Delete 0xFFFF /* Delete, rubout */ /* International & multi-key character composition */ #define XK_Multi_key 0xFF20 /* Multi-key character compose */ #define XK_SingleCandidate 0xFF3C #define XK_MultipleCandidate 0xFF3D #define XK_PreviousCandidate 0xFF3E /* Japanese keyboard support */ #define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ #define XK_Muhenkan 0xFF22 /* Cancel Conversion */ #define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ #define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ #define XK_Romaji 0xFF24 /* to Romaji */ #define XK_Hiragana 0xFF25 /* to Hiragana */ #define XK_Katakana 0xFF26 /* to Katakana */ #define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ #define XK_Zenkaku 0xFF28 /* to Zenkaku */ #define XK_Hankaku 0xFF29 /* to Hankaku */ #define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ #define XK_Touroku 0xFF2B /* Add to Dictionary */ #define XK_Massyo 0xFF2C /* Delete from Dictionary */ #define XK_Kana_Lock 0xFF2D /* Kana Lock */ #define XK_Kana_Shift 0xFF2E /* Kana Shift */ #define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ #define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ #define XK_Zen_Koho 0xFF3D /* Multiple/All Candidate(s) */ #define XK_Mae_Koho 0xFF3E /* Previous Candidate */ /* 0xFF31 thru 0xFF3F are under XK_KOREAN */ /* Cursor control & motion */ #define XK_Home 0xFF50 #define XK_Left 0xFF51 /* Move left, left arrow */ #define XK_Up 0xFF52 /* Move up, up arrow */ #define XK_Right 0xFF53 /* Move right, right arrow */ #define XK_Down 0xFF54 /* Move down, down arrow */ #define XK_Prior 0xFF55 /* Prior, previous */ #define XK_Page_Up 0xFF55 #define XK_Next 0xFF56 /* Next */ #define XK_Page_Down 0xFF56 #define XK_End 0xFF57 /* EOL */ #define XK_Begin 0xFF58 /* BOL */ /* Misc Functions */ #define XK_Select 0xFF60 /* Select, mark */ #define XK_Print 0xFF61 #define XK_Execute 0xFF62 /* Execute, run, do */ #define XK_Insert 0xFF63 /* Insert, insert here */ #define XK_Undo 0xFF65 /* Undo, oops */ #define XK_Redo 0xFF66 /* redo, again */ #define XK_Menu 0xFF67 #define XK_Find 0xFF68 /* Find, search */ #define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ #define XK_Help 0xFF6A /* Help */ #define XK_Break 0xFF6B #define XK_Mode_switch 0xFF7E /* Character set switch */ #define XK_script_switch 0xFF7E /* Alias for mode_switch */ #define XK_Num_Lock 0xFF7F /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ #define XK_KP_Space 0xFF80 /* space */ #define XK_KP_Tab 0xFF89 #define XK_KP_Enter 0xFF8D /* enter */ #define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ #define XK_KP_F2 0xFF92 #define XK_KP_F3 0xFF93 #define XK_KP_F4 0xFF94 #define XK_KP_Home 0xFF95 #define XK_KP_Left 0xFF96 #define XK_KP_Up 0xFF97 #define XK_KP_Right 0xFF98 #define XK_KP_Down 0xFF99 #define XK_KP_Prior 0xFF9A #define XK_KP_Page_Up 0xFF9A #define XK_KP_Next 0xFF9B #define XK_KP_Page_Down 0xFF9B #define XK_KP_End 0xFF9C #define XK_KP_Begin 0xFF9D #define XK_KP_Insert 0xFF9E #define XK_KP_Delete 0xFF9F #define XK_KP_Equal 0xFFBD /* equals */ #define XK_KP_Multiply 0xFFAA #define XK_KP_Add 0xFFAB #define XK_KP_Separator 0xFFAC /* separator, often comma */ #define XK_KP_Subtract 0xFFAD #define XK_KP_Decimal 0xFFAE #define XK_KP_Divide 0xFFAF #define XK_KP_0 0xFFB0 #define XK_KP_1 0xFFB1 #define XK_KP_2 0xFFB2 #define XK_KP_3 0xFFB3 #define XK_KP_4 0xFFB4 #define XK_KP_5 0xFFB5 #define XK_KP_6 0xFFB6 #define XK_KP_7 0xFFB7 #define XK_KP_8 0xFFB8 #define XK_KP_9 0xFFB9 /* * Auxilliary Functions; note the duplicate definitions for left and right * function keys; Sun keyboards and a few other manufactures have such * function key groups on the left and/or right sides of the keyboard. * We've not found a keyboard with more than 35 function keys total. */ #define XK_F1 0xFFBE #define XK_F2 0xFFBF #define XK_F3 0xFFC0 #define XK_F4 0xFFC1 #define XK_F5 0xFFC2 #define XK_F6 0xFFC3 #define XK_F7 0xFFC4 #define XK_F8 0xFFC5 #define XK_F9 0xFFC6 #define XK_F10 0xFFC7 #define XK_F11 0xFFC8 #define XK_L1 0xFFC8 #define XK_F12 0xFFC9 #define XK_L2 0xFFC9 #define XK_F13 0xFFCA #define XK_L3 0xFFCA #define XK_F14 0xFFCB #define XK_L4 0xFFCB #define XK_F15 0xFFCC #define XK_L5 0xFFCC #define XK_F16 0xFFCD #define XK_L6 0xFFCD #define XK_F17 0xFFCE #define XK_L7 0xFFCE #define XK_F18 0xFFCF #define XK_L8 0xFFCF #define XK_F19 0xFFD0 #define XK_L9 0xFFD0 #define XK_F20 0xFFD1 #define XK_L10 0xFFD1 #define XK_F21 0xFFD2 #define XK_R1 0xFFD2 #define XK_F22 0xFFD3 #define XK_R2 0xFFD3 #define XK_F23 0xFFD4 #define XK_R3 0xFFD4 #define XK_F24 0xFFD5 #define XK_R4 0xFFD5 #define XK_F25 0xFFD6 #define XK_R5 0xFFD6 #define XK_F26 0xFFD7 #define XK_R6 0xFFD7 #define XK_F27 0xFFD8 #define XK_R7 0xFFD8 #define XK_F28 0xFFD9 #define XK_R8 0xFFD9 #define XK_F29 0xFFDA #define XK_R9 0xFFDA #define XK_F30 0xFFDB #define XK_R10 0xFFDB #define XK_F31 0xFFDC #define XK_R11 0xFFDC #define XK_F32 0xFFDD #define XK_R12 0xFFDD #define XK_F33 0xFFDE #define XK_R13 0xFFDE #define XK_F34 0xFFDF #define XK_R14 0xFFDF #define XK_F35 0xFFE0 #define XK_R15 0xFFE0 /* Modifiers */ #define XK_Shift_L 0xFFE1 /* Left shift */ #define XK_Shift_R 0xFFE2 /* Right shift */ #define XK_Control_L 0xFFE3 /* Left control */ #define XK_Control_R 0xFFE4 /* Right control */ #define XK_Caps_Lock 0xFFE5 /* Caps lock */ #define XK_Shift_Lock 0xFFE6 /* Shift lock */ #define XK_Meta_L 0xFFE7 /* Left meta */ #define XK_Meta_R 0xFFE8 /* Right meta */ #define XK_Alt_L 0xFFE9 /* Left alt */ #define XK_Alt_R 0xFFEA /* Right alt */ #define XK_Super_L 0xFFEB /* Left super */ #define XK_Super_R 0xFFEC /* Right super */ #define XK_Hyper_L 0xFFED /* Left hyper */ #define XK_Hyper_R 0xFFEE /* Right hyper */ #endif /* XK_MISCELLANY */ /* * ISO 9995 Function and Modifier Keys * Byte 3 = 0xFE */ #ifdef XK_XKB_KEYS #define XK_ISO_Lock 0xFE01 #define XK_ISO_Level2_Latch 0xFE02 #define XK_ISO_Level3_Shift 0xFE03 #define XK_ISO_Level3_Latch 0xFE04 #define XK_ISO_Level3_Lock 0xFE05 #define XK_ISO_Group_Shift 0xFF7E /* Alias for mode_switch */ #define XK_ISO_Group_Latch 0xFE06 #define XK_ISO_Group_Lock 0xFE07 #define XK_ISO_Next_Group 0xFE08 #define XK_ISO_Next_Group_Lock 0xFE09 #define XK_ISO_Prev_Group 0xFE0A #define XK_ISO_Prev_Group_Lock 0xFE0B #define XK_ISO_First_Group 0xFE0C #define XK_ISO_First_Group_Lock 0xFE0D #define XK_ISO_Last_Group 0xFE0E #define XK_ISO_Last_Group_Lock 0xFE0F #define XK_ISO_Left_Tab 0xFE20 #define XK_ISO_Move_Line_Up 0xFE21 #define XK_ISO_Move_Line_Down 0xFE22 #define XK_ISO_Partial_Line_Up 0xFE23 #define XK_ISO_Partial_Line_Down 0xFE24 #define XK_ISO_Partial_Space_Left 0xFE25 #define XK_ISO_Partial_Space_Right 0xFE26 #define XK_ISO_Set_Margin_Left 0xFE27 #define XK_ISO_Set_Margin_Right 0xFE28 #define XK_ISO_Release_Margin_Left 0xFE29 #define XK_ISO_Release_Margin_Right 0xFE2A #define XK_ISO_Release_Both_Margins 0xFE2B #define XK_ISO_Fast_Cursor_Left 0xFE2C #define XK_ISO_Fast_Cursor_Right 0xFE2D #define XK_ISO_Fast_Cursor_Up 0xFE2E #define XK_ISO_Fast_Cursor_Down 0xFE2F #define XK_ISO_Continuous_Underline 0xFE30 #define XK_ISO_Discontinuous_Underline 0xFE31 #define XK_ISO_Emphasize 0xFE32 #define XK_ISO_Center_Object 0xFE33 #define XK_ISO_Enter 0xFE34 #define XK_dead_grave 0xFE50 #define XK_dead_acute 0xFE51 #define XK_dead_circumflex 0xFE52 #define XK_dead_tilde 0xFE53 #define XK_dead_macron 0xFE54 #define XK_dead_breve 0xFE55 #define XK_dead_abovedot 0xFE56 #define XK_dead_diaeresis 0xFE57 #define XK_dead_abovering 0xFE58 #define XK_dead_doubleacute 0xFE59 #define XK_dead_caron 0xFE5A #define XK_dead_cedilla 0xFE5B #define XK_dead_ogonek 0xFE5C #define XK_dead_iota 0xFE5D #define XK_dead_voiced_sound 0xFE5E #define XK_dead_semivoiced_sound 0xFE5F #define XK_dead_belowdot 0xFE60 #define XK_First_Virtual_Screen 0xFED0 #define XK_Prev_Virtual_Screen 0xFED1 #define XK_Next_Virtual_Screen 0xFED2 #define XK_Last_Virtual_Screen 0xFED4 #define XK_Terminate_Server 0xFED5 #define XK_AccessX_Enable 0xFE70 #define XK_AccessX_Feedback_Enable 0xFE71 #define XK_RepeatKeys_Enable 0xFE72 #define XK_SlowKeys_Enable 0xFE73 #define XK_BounceKeys_Enable 0xFE74 #define XK_StickyKeys_Enable 0xFE75 #define XK_MouseKeys_Enable 0xFE76 #define XK_MouseKeys_Accel_Enable 0xFE77 #define XK_Overlay1_Enable 0xFE78 #define XK_Overlay2_Enable 0xFE79 #define XK_AudibleBell_Enable 0xFE7A #define XK_Pointer_Left 0xFEE0 #define XK_Pointer_Right 0xFEE1 #define XK_Pointer_Up 0xFEE2 #define XK_Pointer_Down 0xFEE3 #define XK_Pointer_UpLeft 0xFEE4 #define XK_Pointer_UpRight 0xFEE5 #define XK_Pointer_DownLeft 0xFEE6 #define XK_Pointer_DownRight 0xFEE7 #define XK_Pointer_Button_Dflt 0xFEE8 #define XK_Pointer_Button1 0xFEE9 #define XK_Pointer_Button2 0xFEEA #define XK_Pointer_Button3 0xFEEB #define XK_Pointer_Button4 0xFEEC #define XK_Pointer_Button5 0xFEED #define XK_Pointer_DblClick_Dflt 0xFEEE #define XK_Pointer_DblClick1 0xFEEF #define XK_Pointer_DblClick2 0xFEF0 #define XK_Pointer_DblClick3 0xFEF1 #define XK_Pointer_DblClick4 0xFEF2 #define XK_Pointer_DblClick5 0xFEF3 #define XK_Pointer_Drag_Dflt 0xFEF4 #define XK_Pointer_Drag1 0xFEF5 #define XK_Pointer_Drag2 0xFEF6 #define XK_Pointer_Drag3 0xFEF7 #define XK_Pointer_Drag4 0xFEF8 #define XK_Pointer_Drag5 0xFEFD #define XK_Pointer_EnableKeys 0xFEF9 #define XK_Pointer_Accelerate 0xFEFA #define XK_Pointer_DfltBtnNext 0xFEFB #define XK_Pointer_DfltBtnPrev 0xFEFC #endif /* * 3270 Terminal Keys * Byte 3 = 0xFD */ #ifdef XK_3270 #define XK_3270_Duplicate 0xFD01 #define XK_3270_FieldMark 0xFD02 #define XK_3270_Right2 0xFD03 #define XK_3270_Left2 0xFD04 #define XK_3270_BackTab 0xFD05 #define XK_3270_EraseEOF 0xFD06 #define XK_3270_EraseInput 0xFD07 #define XK_3270_Reset 0xFD08 #define XK_3270_Quit 0xFD09 #define XK_3270_PA1 0xFD0A #define XK_3270_PA2 0xFD0B #define XK_3270_PA3 0xFD0C #define XK_3270_Test 0xFD0D #define XK_3270_Attn 0xFD0E #define XK_3270_CursorBlink 0xFD0F #define XK_3270_AltCursor 0xFD10 #define XK_3270_KeyClick 0xFD11 #define XK_3270_Jump 0xFD12 #define XK_3270_Ident 0xFD13 #define XK_3270_Rule 0xFD14 #define XK_3270_Copy 0xFD15 #define XK_3270_Play 0xFD16 #define XK_3270_Setup 0xFD17 #define XK_3270_Record 0xFD18 #define XK_3270_ChangeScreen 0xFD19 #define XK_3270_DeleteWord 0xFD1A #define XK_3270_ExSelect 0xFD1B #define XK_3270_CursorSelect 0xFD1C #define XK_3270_PrintScreen 0xFD1D #define XK_3270_Enter 0xFD1E #endif /* * Latin 1 * Byte 3 = 0 */ #ifdef XK_LATIN1 #define XK_space 0x020 #define XK_exclam 0x021 #define XK_quotedbl 0x022 #define XK_numbersign 0x023 #define XK_dollar 0x024 #define XK_percent 0x025 #define XK_ampersand 0x026 #define XK_apostrophe 0x027 #define XK_quoteright 0x027 /* deprecated */ #define XK_parenleft 0x028 #define XK_parenright 0x029 #define XK_asterisk 0x02a #define XK_plus 0x02b #define XK_comma 0x02c #define XK_minus 0x02d #define XK_period 0x02e #define XK_slash 0x02f #define XK_0 0x030 #define XK_1 0x031 #define XK_2 0x032 #define XK_3 0x033 #define XK_4 0x034 #define XK_5 0x035 #define XK_6 0x036 #define XK_7 0x037 #define XK_8 0x038 #define XK_9 0x039 #define XK_colon 0x03a #define XK_semicolon 0x03b #define XK_less 0x03c #define XK_equal 0x03d #define XK_greater 0x03e #define XK_question 0x03f #define XK_at 0x040 #define XK_A 0x041 #define XK_B 0x042 #define XK_C 0x043 #define XK_D 0x044 #define XK_E 0x045 #define XK_F 0x046 #define XK_G 0x047 #define XK_H 0x048 #define XK_I 0x049 #define XK_J 0x04a #define XK_K 0x04b #define XK_L 0x04c #define XK_M 0x04d #define XK_N 0x04e #define XK_O 0x04f #define XK_P 0x050 #define XK_Q 0x051 #define XK_R 0x052 #define XK_S 0x053 #define XK_T 0x054 #define XK_U 0x055 #define XK_V 0x056 #define XK_W 0x057 #define XK_X 0x058 #define XK_Y 0x059 #define XK_Z 0x05a #define XK_bracketleft 0x05b #define XK_backslash 0x05c #define XK_bracketright 0x05d #define XK_asciicircum 0x05e #define XK_underscore 0x05f #define XK_grave 0x060 #define XK_quoteleft 0x060 /* deprecated */ #define XK_a 0x061 #define XK_b 0x062 #define XK_c 0x063 #define XK_d 0x064 #define XK_e 0x065 #define XK_f 0x066 #define XK_g 0x067 #define XK_h 0x068 #define XK_i 0x069 #define XK_j 0x06a #define XK_k 0x06b #define XK_l 0x06c #define XK_m 0x06d #define XK_n 0x06e #define XK_o 0x06f #define XK_p 0x070 #define XK_q 0x071 #define XK_r 0x072 #define XK_s 0x073 #define XK_t 0x074 #define XK_u 0x075 #define XK_v 0x076 #define XK_w 0x077 #define XK_x 0x078 #define XK_y 0x079 #define XK_z 0x07a #define XK_braceleft 0x07b #define XK_bar 0x07c #define XK_braceright 0x07d #define XK_asciitilde 0x07e #define XK_nobreakspace 0x0a0 #define XK_exclamdown 0x0a1 #define XK_cent 0x0a2 #define XK_sterling 0x0a3 #define XK_currency 0x0a4 #define XK_yen 0x0a5 #define XK_brokenbar 0x0a6 #define XK_section 0x0a7 #define XK_diaeresis 0x0a8 #define XK_copyright 0x0a9 #define XK_ordfeminine 0x0aa #define XK_guillemotleft 0x0ab /* left angle quotation mark */ #define XK_notsign 0x0ac #define XK_hyphen 0x0ad #define XK_registered 0x0ae #define XK_macron 0x0af #define XK_degree 0x0b0 #define XK_plusminus 0x0b1 #define XK_twosuperior 0x0b2 #define XK_threesuperior 0x0b3 #define XK_acute 0x0b4 #define XK_mu 0x0b5 #define XK_paragraph 0x0b6 #define XK_periodcentered 0x0b7 #define XK_cedilla 0x0b8 #define XK_onesuperior 0x0b9 #define XK_masculine 0x0ba #define XK_guillemotright 0x0bb /* right angle quotation mark */ #define XK_onequarter 0x0bc #define XK_onehalf 0x0bd #define XK_threequarters 0x0be #define XK_questiondown 0x0bf #define XK_Agrave 0x0c0 #define XK_Aacute 0x0c1 #define XK_Acircumflex 0x0c2 #define XK_Atilde 0x0c3 #define XK_Adiaeresis 0x0c4 #define XK_Aring 0x0c5 #define XK_AE 0x0c6 #define XK_Ccedilla 0x0c7 #define XK_Egrave 0x0c8 #define XK_Eacute 0x0c9 #define XK_Ecircumflex 0x0ca #define XK_Ediaeresis 0x0cb #define XK_Igrave 0x0cc #define XK_Iacute 0x0cd #define XK_Icircumflex 0x0ce #define XK_Idiaeresis 0x0cf #define XK_ETH 0x0d0 #define XK_Eth 0x0d0 /* deprecated */ #define XK_Ntilde 0x0d1 #define XK_Ograve 0x0d2 #define XK_Oacute 0x0d3 #define XK_Ocircumflex 0x0d4 #define XK_Otilde 0x0d5 #define XK_Odiaeresis 0x0d6 #define XK_multiply 0x0d7 #define XK_Ooblique 0x0d8 #define XK_Ugrave 0x0d9 #define XK_Uacute 0x0da #define XK_Ucircumflex 0x0db #define XK_Udiaeresis 0x0dc #define XK_Yacute 0x0dd #define XK_THORN 0x0de #define XK_Thorn 0x0de /* deprecated */ #define XK_ssharp 0x0df #define XK_agrave 0x0e0 #define XK_aacute 0x0e1 #define XK_acircumflex 0x0e2 #define XK_atilde 0x0e3 #define XK_adiaeresis 0x0e4 #define XK_aring 0x0e5 #define XK_ae 0x0e6 #define XK_ccedilla 0x0e7 #define XK_egrave 0x0e8 #define XK_eacute 0x0e9 #define XK_ecircumflex 0x0ea #define XK_ediaeresis 0x0eb #define XK_igrave 0x0ec #define XK_iacute 0x0ed #define XK_icircumflex 0x0ee #define XK_idiaeresis 0x0ef #define XK_eth 0x0f0 #define XK_ntilde 0x0f1 #define XK_ograve 0x0f2 #define XK_oacute 0x0f3 #define XK_ocircumflex 0x0f4 #define XK_otilde 0x0f5 #define XK_odiaeresis 0x0f6 #define XK_division 0x0f7 #define XK_oslash 0x0f8 #define XK_ugrave 0x0f9 #define XK_uacute 0x0fa #define XK_ucircumflex 0x0fb #define XK_udiaeresis 0x0fc #define XK_yacute 0x0fd #define XK_thorn 0x0fe #define XK_ydiaeresis 0x0ff #endif /* XK_LATIN1 */ /* * Latin 2 * Byte 3 = 1 */ #ifdef XK_LATIN2 #define XK_Aogonek 0x1a1 #define XK_breve 0x1a2 #define XK_Lstroke 0x1a3 #define XK_Lcaron 0x1a5 #define XK_Sacute 0x1a6 #define XK_Scaron 0x1a9 #define XK_Scedilla 0x1aa #define XK_Tcaron 0x1ab #define XK_Zacute 0x1ac #define XK_Zcaron 0x1ae #define XK_Zabovedot 0x1af #define XK_aogonek 0x1b1 #define XK_ogonek 0x1b2 #define XK_lstroke 0x1b3 #define XK_lcaron 0x1b5 #define XK_sacute 0x1b6 #define XK_caron 0x1b7 #define XK_scaron 0x1b9 #define XK_scedilla 0x1ba #define XK_tcaron 0x1bb #define XK_zacute 0x1bc #define XK_doubleacute 0x1bd #define XK_zcaron 0x1be #define XK_zabovedot 0x1bf #define XK_Racute 0x1c0 #define XK_Abreve 0x1c3 #define XK_Lacute 0x1c5 #define XK_Cacute 0x1c6 #define XK_Ccaron 0x1c8 #define XK_Eogonek 0x1ca #define XK_Ecaron 0x1cc #define XK_Dcaron 0x1cf #define XK_Dstroke 0x1d0 #define XK_Nacute 0x1d1 #define XK_Ncaron 0x1d2 #define XK_Odoubleacute 0x1d5 #define XK_Rcaron 0x1d8 #define XK_Uring 0x1d9 #define XK_Udoubleacute 0x1db #define XK_Tcedilla 0x1de #define XK_racute 0x1e0 #define XK_abreve 0x1e3 #define XK_lacute 0x1e5 #define XK_cacute 0x1e6 #define XK_ccaron 0x1e8 #define XK_eogonek 0x1ea #define XK_ecaron 0x1ec #define XK_dcaron 0x1ef #define XK_dstroke 0x1f0 #define XK_nacute 0x1f1 #define XK_ncaron 0x1f2 #define XK_odoubleacute 0x1f5 #define XK_udoubleacute 0x1fb #define XK_rcaron 0x1f8 #define XK_uring 0x1f9 #define XK_tcedilla 0x1fe #define XK_abovedot 0x1ff #endif /* XK_LATIN2 */ /* * Latin 3 * Byte 3 = 2 */ #ifdef XK_LATIN3 #define XK_Hstroke 0x2a1 #define XK_Hcircumflex 0x2a6 #define XK_Iabovedot 0x2a9 #define XK_Gbreve 0x2ab #define XK_Jcircumflex 0x2ac #define XK_hstroke 0x2b1 #define XK_hcircumflex 0x2b6 #define XK_idotless 0x2b9 #define XK_gbreve 0x2bb #define XK_jcircumflex 0x2bc #define XK_Cabovedot 0x2c5 #define XK_Ccircumflex 0x2c6 #define XK_Gabovedot 0x2d5 #define XK_Gcircumflex 0x2d8 #define XK_Ubreve 0x2dd #define XK_Scircumflex 0x2de #define XK_cabovedot 0x2e5 #define XK_ccircumflex 0x2e6 #define XK_gabovedot 0x2f5 #define XK_gcircumflex 0x2f8 #define XK_ubreve 0x2fd #define XK_scircumflex 0x2fe #endif /* XK_LATIN3 */ /* * Latin 4 * Byte 3 = 3 */ #ifdef XK_LATIN4 #define XK_kra 0x3a2 #define XK_kappa 0x3a2 /* deprecated */ #define XK_Rcedilla 0x3a3 #define XK_Itilde 0x3a5 #define XK_Lcedilla 0x3a6 #define XK_Emacron 0x3aa #define XK_Gcedilla 0x3ab #define XK_Tslash 0x3ac #define XK_rcedilla 0x3b3 #define XK_itilde 0x3b5 #define XK_lcedilla 0x3b6 #define XK_emacron 0x3ba #define XK_gcedilla 0x3bb #define XK_tslash 0x3bc #define XK_ENG 0x3bd #define XK_eng 0x3bf #define XK_Amacron 0x3c0 #define XK_Iogonek 0x3c7 #define XK_Eabovedot 0x3cc #define XK_Imacron 0x3cf #define XK_Ncedilla 0x3d1 #define XK_Omacron 0x3d2 #define XK_Kcedilla 0x3d3 #define XK_Uogonek 0x3d9 #define XK_Utilde 0x3dd #define XK_Umacron 0x3de #define XK_amacron 0x3e0 #define XK_iogonek 0x3e7 #define XK_eabovedot 0x3ec #define XK_imacron 0x3ef #define XK_ncedilla 0x3f1 #define XK_omacron 0x3f2 #define XK_kcedilla 0x3f3 #define XK_uogonek 0x3f9 #define XK_utilde 0x3fd #define XK_umacron 0x3fe #endif /* XK_LATIN4 */ /* * Katakana * Byte 3 = 4 */ #ifdef XK_KATAKANA #define XK_overline 0x47e #define XK_kana_fullstop 0x4a1 #define XK_kana_openingbracket 0x4a2 #define XK_kana_closingbracket 0x4a3 #define XK_kana_comma 0x4a4 #define XK_kana_conjunctive 0x4a5 #define XK_kana_middledot 0x4a5 /* deprecated */ #define XK_kana_WO 0x4a6 #define XK_kana_a 0x4a7 #define XK_kana_i 0x4a8 #define XK_kana_u 0x4a9 #define XK_kana_e 0x4aa #define XK_kana_o 0x4ab #define XK_kana_ya 0x4ac #define XK_kana_yu 0x4ad #define XK_kana_yo 0x4ae #define XK_kana_tsu 0x4af #define XK_kana_tu 0x4af /* deprecated */ #define XK_prolongedsound 0x4b0 #define XK_kana_A 0x4b1 #define XK_kana_I 0x4b2 #define XK_kana_U 0x4b3 #define XK_kana_E 0x4b4 #define XK_kana_O 0x4b5 #define XK_kana_KA 0x4b6 #define XK_kana_KI 0x4b7 #define XK_kana_KU 0x4b8 #define XK_kana_KE 0x4b9 #define XK_kana_KO 0x4ba #define XK_kana_SA 0x4bb #define XK_kana_SHI 0x4bc #define XK_kana_SU 0x4bd #define XK_kana_SE 0x4be #define XK_kana_SO 0x4bf #define XK_kana_TA 0x4c0 #define XK_kana_CHI 0x4c1 #define XK_kana_TI 0x4c1 /* deprecated */ #define XK_kana_TSU 0x4c2 #define XK_kana_TU 0x4c2 /* deprecated */ #define XK_kana_TE 0x4c3 #define XK_kana_TO 0x4c4 #define XK_kana_NA 0x4c5 #define XK_kana_NI 0x4c6 #define XK_kana_NU 0x4c7 #define XK_kana_NE 0x4c8 #define XK_kana_NO 0x4c9 #define XK_kana_HA 0x4ca #define XK_kana_HI 0x4cb #define XK_kana_FU 0x4cc #define XK_kana_HU 0x4cc /* deprecated */ #define XK_kana_HE 0x4cd #define XK_kana_HO 0x4ce #define XK_kana_MA 0x4cf #define XK_kana_MI 0x4d0 #define XK_kana_MU 0x4d1 #define XK_kana_ME 0x4d2 #define XK_kana_MO 0x4d3 #define XK_kana_YA 0x4d4 #define XK_kana_YU 0x4d5 #define XK_kana_YO 0x4d6 #define XK_kana_RA 0x4d7 #define XK_kana_RI 0x4d8 #define XK_kana_RU 0x4d9 #define XK_kana_RE 0x4da #define XK_kana_RO 0x4db #define XK_kana_WA 0x4dc #define XK_kana_N 0x4dd #define XK_voicedsound 0x4de #define XK_semivoicedsound 0x4df #define XK_kana_switch 0xFF7E /* Alias for mode_switch */ #endif /* XK_KATAKANA */ /* * Arabic * Byte 3 = 5 */ #ifdef XK_ARABIC #define XK_Arabic_comma 0x5ac #define XK_Arabic_semicolon 0x5bb #define XK_Arabic_question_mark 0x5bf #define XK_Arabic_hamza 0x5c1 #define XK_Arabic_maddaonalef 0x5c2 #define XK_Arabic_hamzaonalef 0x5c3 #define XK_Arabic_hamzaonwaw 0x5c4 #define XK_Arabic_hamzaunderalef 0x5c5 #define XK_Arabic_hamzaonyeh 0x5c6 #define XK_Arabic_alef 0x5c7 #define XK_Arabic_beh 0x5c8 #define XK_Arabic_tehmarbuta 0x5c9 #define XK_Arabic_teh 0x5ca #define XK_Arabic_theh 0x5cb #define XK_Arabic_jeem 0x5cc #define XK_Arabic_hah 0x5cd #define XK_Arabic_khah 0x5ce #define XK_Arabic_dal 0x5cf #define XK_Arabic_thal 0x5d0 #define XK_Arabic_ra 0x5d1 #define XK_Arabic_zain 0x5d2 #define XK_Arabic_seen 0x5d3 #define XK_Arabic_sheen 0x5d4 #define XK_Arabic_sad 0x5d5 #define XK_Arabic_dad 0x5d6 #define XK_Arabic_tah 0x5d7 #define XK_Arabic_zah 0x5d8 #define XK_Arabic_ain 0x5d9 #define XK_Arabic_ghain 0x5da #define XK_Arabic_tatweel 0x5e0 #define XK_Arabic_feh 0x5e1 #define XK_Arabic_qaf 0x5e2 #define XK_Arabic_kaf 0x5e3 #define XK_Arabic_lam 0x5e4 #define XK_Arabic_meem 0x5e5 #define XK_Arabic_noon 0x5e6 #define XK_Arabic_ha 0x5e7 #define XK_Arabic_heh 0x5e7 /* deprecated */ #define XK_Arabic_waw 0x5e8 #define XK_Arabic_alefmaksura 0x5e9 #define XK_Arabic_yeh 0x5ea #define XK_Arabic_fathatan 0x5eb #define XK_Arabic_dammatan 0x5ec #define XK_Arabic_kasratan 0x5ed #define XK_Arabic_fatha 0x5ee #define XK_Arabic_damma 0x5ef #define XK_Arabic_kasra 0x5f0 #define XK_Arabic_shadda 0x5f1 #define XK_Arabic_sukun 0x5f2 #define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ #endif /* XK_ARABIC */ /* * Cyrillic * Byte 3 = 6 */ #ifdef XK_CYRILLIC #define XK_Serbian_dje 0x6a1 #define XK_Macedonia_gje 0x6a2 #define XK_Cyrillic_io 0x6a3 #define XK_Ukrainian_ie 0x6a4 #define XK_Ukranian_je 0x6a4 /* deprecated */ #define XK_Macedonia_dse 0x6a5 #define XK_Ukrainian_i 0x6a6 #define XK_Ukranian_i 0x6a6 /* deprecated */ #define XK_Ukrainian_yi 0x6a7 #define XK_Ukranian_yi 0x6a7 /* deprecated */ #define XK_Cyrillic_je 0x6a8 #define XK_Serbian_je 0x6a8 /* deprecated */ #define XK_Cyrillic_lje 0x6a9 #define XK_Serbian_lje 0x6a9 /* deprecated */ #define XK_Cyrillic_nje 0x6aa #define XK_Serbian_nje 0x6aa /* deprecated */ #define XK_Serbian_tshe 0x6ab #define XK_Macedonia_kje 0x6ac #define XK_Byelorussian_shortu 0x6ae #define XK_Cyrillic_dzhe 0x6af #define XK_Serbian_dze 0x6af /* deprecated */ #define XK_numerosign 0x6b0 #define XK_Serbian_DJE 0x6b1 #define XK_Macedonia_GJE 0x6b2 #define XK_Cyrillic_IO 0x6b3 #define XK_Ukrainian_IE 0x6b4 #define XK_Ukranian_JE 0x6b4 /* deprecated */ #define XK_Macedonia_DSE 0x6b5 #define XK_Ukrainian_I 0x6b6 #define XK_Ukranian_I 0x6b6 /* deprecated */ #define XK_Ukrainian_YI 0x6b7 #define XK_Ukranian_YI 0x6b7 /* deprecated */ #define XK_Cyrillic_JE 0x6b8 #define XK_Serbian_JE 0x6b8 /* deprecated */ #define XK_Cyrillic_LJE 0x6b9 #define XK_Serbian_LJE 0x6b9 /* deprecated */ #define XK_Cyrillic_NJE 0x6ba #define XK_Serbian_NJE 0x6ba /* deprecated */ #define XK_Serbian_TSHE 0x6bb #define XK_Macedonia_KJE 0x6bc #define XK_Byelorussian_SHORTU 0x6be #define XK_Cyrillic_DZHE 0x6bf #define XK_Serbian_DZE 0x6bf /* deprecated */ #define XK_Cyrillic_yu 0x6c0 #define XK_Cyrillic_a 0x6c1 #define XK_Cyrillic_be 0x6c2 #define XK_Cyrillic_tse 0x6c3 #define XK_Cyrillic_de 0x6c4 #define XK_Cyrillic_ie 0x6c5 #define XK_Cyrillic_ef 0x6c6 #define XK_Cyrillic_ghe 0x6c7 #define XK_Cyrillic_ha 0x6c8 #define XK_Cyrillic_i 0x6c9 #define XK_Cyrillic_shorti 0x6ca #define XK_Cyrillic_ka 0x6cb #define XK_Cyrillic_el 0x6cc #define XK_Cyrillic_em 0x6cd #define XK_Cyrillic_en 0x6ce #define XK_Cyrillic_o 0x6cf #define XK_Cyrillic_pe 0x6d0 #define XK_Cyrillic_ya 0x6d1 #define XK_Cyrillic_er 0x6d2 #define XK_Cyrillic_es 0x6d3 #define XK_Cyrillic_te 0x6d4 #define XK_Cyrillic_u 0x6d5 #define XK_Cyrillic_zhe 0x6d6 #define XK_Cyrillic_ve 0x6d7 #define XK_Cyrillic_softsign 0x6d8 #define XK_Cyrillic_yeru 0x6d9 #define XK_Cyrillic_ze 0x6da #define XK_Cyrillic_sha 0x6db #define XK_Cyrillic_e 0x6dc #define XK_Cyrillic_shcha 0x6dd #define XK_Cyrillic_che 0x6de #define XK_Cyrillic_hardsign 0x6df #define XK_Cyrillic_YU 0x6e0 #define XK_Cyrillic_A 0x6e1 #define XK_Cyrillic_BE 0x6e2 #define XK_Cyrillic_TSE 0x6e3 #define XK_Cyrillic_DE 0x6e4 #define XK_Cyrillic_IE 0x6e5 #define XK_Cyrillic_EF 0x6e6 #define XK_Cyrillic_GHE 0x6e7 #define XK_Cyrillic_HA 0x6e8 #define XK_Cyrillic_I 0x6e9 #define XK_Cyrillic_SHORTI 0x6ea #define XK_Cyrillic_KA 0x6eb #define XK_Cyrillic_EL 0x6ec #define XK_Cyrillic_EM 0x6ed #define XK_Cyrillic_EN 0x6ee #define XK_Cyrillic_O 0x6ef #define XK_Cyrillic_PE 0x6f0 #define XK_Cyrillic_YA 0x6f1 #define XK_Cyrillic_ER 0x6f2 #define XK_Cyrillic_ES 0x6f3 #define XK_Cyrillic_TE 0x6f4 #define XK_Cyrillic_U 0x6f5 #define XK_Cyrillic_ZHE 0x6f6 #define XK_Cyrillic_VE 0x6f7 #define XK_Cyrillic_SOFTSIGN 0x6f8 #define XK_Cyrillic_YERU 0x6f9 #define XK_Cyrillic_ZE 0x6fa #define XK_Cyrillic_SHA 0x6fb #define XK_Cyrillic_E 0x6fc #define XK_Cyrillic_SHCHA 0x6fd #define XK_Cyrillic_CHE 0x6fe #define XK_Cyrillic_HARDSIGN 0x6ff #endif /* XK_CYRILLIC */ /* * Greek * Byte 3 = 7 */ #ifdef XK_GREEK #define XK_Greek_ALPHAaccent 0x7a1 #define XK_Greek_EPSILONaccent 0x7a2 #define XK_Greek_ETAaccent 0x7a3 #define XK_Greek_IOTAaccent 0x7a4 #define XK_Greek_IOTAdieresis 0x7a5 #define XK_Greek_OMICRONaccent 0x7a7 #define XK_Greek_UPSILONaccent 0x7a8 #define XK_Greek_UPSILONdieresis 0x7a9 #define XK_Greek_OMEGAaccent 0x7ab #define XK_Greek_accentdieresis 0x7ae #define XK_Greek_horizbar 0x7af #define XK_Greek_alphaaccent 0x7b1 #define XK_Greek_epsilonaccent 0x7b2 #define XK_Greek_etaaccent 0x7b3 #define XK_Greek_iotaaccent 0x7b4 #define XK_Greek_iotadieresis 0x7b5 #define XK_Greek_iotaaccentdieresis 0x7b6 #define XK_Greek_omicronaccent 0x7b7 #define XK_Greek_upsilonaccent 0x7b8 #define XK_Greek_upsilondieresis 0x7b9 #define XK_Greek_upsilonaccentdieresis 0x7ba #define XK_Greek_omegaaccent 0x7bb #define XK_Greek_ALPHA 0x7c1 #define XK_Greek_BETA 0x7c2 #define XK_Greek_GAMMA 0x7c3 #define XK_Greek_DELTA 0x7c4 #define XK_Greek_EPSILON 0x7c5 #define XK_Greek_ZETA 0x7c6 #define XK_Greek_ETA 0x7c7 #define XK_Greek_THETA 0x7c8 #define XK_Greek_IOTA 0x7c9 #define XK_Greek_KAPPA 0x7ca #define XK_Greek_LAMDA 0x7cb #define XK_Greek_LAMBDA 0x7cb #define XK_Greek_MU 0x7cc #define XK_Greek_NU 0x7cd #define XK_Greek_XI 0x7ce #define XK_Greek_OMICRON 0x7cf #define XK_Greek_PI 0x7d0 #define XK_Greek_RHO 0x7d1 #define XK_Greek_SIGMA 0x7d2 #define XK_Greek_TAU 0x7d4 #define XK_Greek_UPSILON 0x7d5 #define XK_Greek_PHI 0x7d6 #define XK_Greek_CHI 0x7d7 #define XK_Greek_PSI 0x7d8 #define XK_Greek_OMEGA 0x7d9 #define XK_Greek_alpha 0x7e1 #define XK_Greek_beta 0x7e2 #define XK_Greek_gamma 0x7e3 #define XK_Greek_delta 0x7e4 #define XK_Greek_epsilon 0x7e5 #define XK_Greek_zeta 0x7e6 #define XK_Greek_eta 0x7e7 #define XK_Greek_theta 0x7e8 #define XK_Greek_iota 0x7e9 #define XK_Greek_kappa 0x7ea #define XK_Greek_lamda 0x7eb #define XK_Greek_lambda 0x7eb #define XK_Greek_mu 0x7ec #define XK_Greek_nu 0x7ed #define XK_Greek_xi 0x7ee #define XK_Greek_omicron 0x7ef #define XK_Greek_pi 0x7f0 #define XK_Greek_rho 0x7f1 #define XK_Greek_sigma 0x7f2 #define XK_Greek_finalsmallsigma 0x7f3 #define XK_Greek_tau 0x7f4 #define XK_Greek_upsilon 0x7f5 #define XK_Greek_phi 0x7f6 #define XK_Greek_chi 0x7f7 #define XK_Greek_psi 0x7f8 #define XK_Greek_omega 0x7f9 #define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ #endif /* XK_GREEK */ /* * Technical * Byte 3 = 8 */ #ifdef XK_TECHNICAL #define XK_leftradical 0x8a1 #define XK_topleftradical 0x8a2 #define XK_horizconnector 0x8a3 #define XK_topintegral 0x8a4 #define XK_botintegral 0x8a5 #define XK_vertconnector 0x8a6 #define XK_topleftsqbracket 0x8a7 #define XK_botleftsqbracket 0x8a8 #define XK_toprightsqbracket 0x8a9 #define XK_botrightsqbracket 0x8aa #define XK_topleftparens 0x8ab #define XK_botleftparens 0x8ac #define XK_toprightparens 0x8ad #define XK_botrightparens 0x8ae #define XK_leftmiddlecurlybrace 0x8af #define XK_rightmiddlecurlybrace 0x8b0 #define XK_topleftsummation 0x8b1 #define XK_botleftsummation 0x8b2 #define XK_topvertsummationconnector 0x8b3 #define XK_botvertsummationconnector 0x8b4 #define XK_toprightsummation 0x8b5 #define XK_botrightsummation 0x8b6 #define XK_rightmiddlesummation 0x8b7 #define XK_lessthanequal 0x8bc #define XK_notequal 0x8bd #define XK_greaterthanequal 0x8be #define XK_integral 0x8bf #define XK_therefore 0x8c0 #define XK_variation 0x8c1 #define XK_infinity 0x8c2 #define XK_nabla 0x8c5 #define XK_approximate 0x8c8 #define XK_similarequal 0x8c9 #define XK_ifonlyif 0x8cd #define XK_implies 0x8ce #define XK_identical 0x8cf #define XK_radical 0x8d6 #define XK_includedin 0x8da #define XK_includes 0x8db #define XK_intersection 0x8dc #define XK_union 0x8dd #define XK_logicaland 0x8de #define XK_logicalor 0x8df #define XK_partialderivative 0x8ef #define XK_function 0x8f6 #define XK_leftarrow 0x8fb #define XK_uparrow 0x8fc #define XK_rightarrow 0x8fd #define XK_downarrow 0x8fe #endif /* XK_TECHNICAL */ /* * Special * Byte 3 = 9 */ #ifdef XK_SPECIAL #define XK_blank 0x9df #define XK_soliddiamond 0x9e0 #define XK_checkerboard 0x9e1 #define XK_ht 0x9e2 #define XK_ff 0x9e3 #define XK_cr 0x9e4 #define XK_lf 0x9e5 #define XK_nl 0x9e8 #define XK_vt 0x9e9 #define XK_lowrightcorner 0x9ea #define XK_uprightcorner 0x9eb #define XK_upleftcorner 0x9ec #define XK_lowleftcorner 0x9ed #define XK_crossinglines 0x9ee #define XK_horizlinescan1 0x9ef #define XK_horizlinescan3 0x9f0 #define XK_horizlinescan5 0x9f1 #define XK_horizlinescan7 0x9f2 #define XK_horizlinescan9 0x9f3 #define XK_leftt 0x9f4 #define XK_rightt 0x9f5 #define XK_bott 0x9f6 #define XK_topt 0x9f7 #define XK_vertbar 0x9f8 #endif /* XK_SPECIAL */ /* * Publishing * Byte 3 = a */ #ifdef XK_PUBLISHING #define XK_emspace 0xaa1 #define XK_enspace 0xaa2 #define XK_em3space 0xaa3 #define XK_em4space 0xaa4 #define XK_digitspace 0xaa5 #define XK_punctspace 0xaa6 #define XK_thinspace 0xaa7 #define XK_hairspace 0xaa8 #define XK_emdash 0xaa9 #define XK_endash 0xaaa #define XK_signifblank 0xaac #define XK_ellipsis 0xaae #define XK_doubbaselinedot 0xaaf #define XK_onethird 0xab0 #define XK_twothirds 0xab1 #define XK_onefifth 0xab2 #define XK_twofifths 0xab3 #define XK_threefifths 0xab4 #define XK_fourfifths 0xab5 #define XK_onesixth 0xab6 #define XK_fivesixths 0xab7 #define XK_careof 0xab8 #define XK_figdash 0xabb #define XK_leftanglebracket 0xabc #define XK_decimalpoint 0xabd #define XK_rightanglebracket 0xabe #define XK_marker 0xabf #define XK_oneeighth 0xac3 #define XK_threeeighths 0xac4 #define XK_fiveeighths 0xac5 #define XK_seveneighths 0xac6 #define XK_trademark 0xac9 #define XK_signaturemark 0xaca #define XK_trademarkincircle 0xacb #define XK_leftopentriangle 0xacc #define XK_rightopentriangle 0xacd #define XK_emopencircle 0xace #define XK_emopenrectangle 0xacf #define XK_leftsinglequotemark 0xad0 #define XK_rightsinglequotemark 0xad1 #define XK_leftdoublequotemark 0xad2 #define XK_rightdoublequotemark 0xad3 #define XK_prescription 0xad4 #define XK_minutes 0xad6 #define XK_seconds 0xad7 #define XK_latincross 0xad9 #define XK_hexagram 0xada #define XK_filledrectbullet 0xadb #define XK_filledlefttribullet 0xadc #define XK_filledrighttribullet 0xadd #define XK_emfilledcircle 0xade #define XK_emfilledrect 0xadf #define XK_enopencircbullet 0xae0 #define XK_enopensquarebullet 0xae1 #define XK_openrectbullet 0xae2 #define XK_opentribulletup 0xae3 #define XK_opentribulletdown 0xae4 #define XK_openstar 0xae5 #define XK_enfilledcircbullet 0xae6 #define XK_enfilledsqbullet 0xae7 #define XK_filledtribulletup 0xae8 #define XK_filledtribulletdown 0xae9 #define XK_leftpointer 0xaea #define XK_rightpointer 0xaeb #define XK_club 0xaec #define XK_diamond 0xaed #define XK_heart 0xaee #define XK_maltesecross 0xaf0 #define XK_dagger 0xaf1 #define XK_doubledagger 0xaf2 #define XK_checkmark 0xaf3 #define XK_ballotcross 0xaf4 #define XK_musicalsharp 0xaf5 #define XK_musicalflat 0xaf6 #define XK_malesymbol 0xaf7 #define XK_femalesymbol 0xaf8 #define XK_telephone 0xaf9 #define XK_telephonerecorder 0xafa #define XK_phonographcopyright 0xafb #define XK_caret 0xafc #define XK_singlelowquotemark 0xafd #define XK_doublelowquotemark 0xafe #define XK_cursor 0xaff #endif /* XK_PUBLISHING */ /* * APL * Byte 3 = b */ #ifdef XK_APL #define XK_leftcaret 0xba3 #define XK_rightcaret 0xba6 #define XK_downcaret 0xba8 #define XK_upcaret 0xba9 #define XK_overbar 0xbc0 #define XK_downtack 0xbc2 #define XK_upshoe 0xbc3 #define XK_downstile 0xbc4 #define XK_underbar 0xbc6 #define XK_jot 0xbca #define XK_quad 0xbcc #define XK_uptack 0xbce #define XK_circle 0xbcf #define XK_upstile 0xbd3 #define XK_downshoe 0xbd6 #define XK_rightshoe 0xbd8 #define XK_leftshoe 0xbda #define XK_lefttack 0xbdc #define XK_righttack 0xbfc #endif /* XK_APL */ /* * Hebrew * Byte 3 = c */ #ifdef XK_HEBREW #define XK_hebrew_doublelowline 0xcdf #define XK_hebrew_aleph 0xce0 #define XK_hebrew_bet 0xce1 #define XK_hebrew_beth 0xce1 /* deprecated */ #define XK_hebrew_gimel 0xce2 #define XK_hebrew_gimmel 0xce2 /* deprecated */ #define XK_hebrew_dalet 0xce3 #define XK_hebrew_daleth 0xce3 /* deprecated */ #define XK_hebrew_he 0xce4 #define XK_hebrew_waw 0xce5 #define XK_hebrew_zain 0xce6 #define XK_hebrew_zayin 0xce6 /* deprecated */ #define XK_hebrew_chet 0xce7 #define XK_hebrew_het 0xce7 /* deprecated */ #define XK_hebrew_tet 0xce8 #define XK_hebrew_teth 0xce8 /* deprecated */ #define XK_hebrew_yod 0xce9 #define XK_hebrew_finalkaph 0xcea #define XK_hebrew_kaph 0xceb #define XK_hebrew_lamed 0xcec #define XK_hebrew_finalmem 0xced #define XK_hebrew_mem 0xcee #define XK_hebrew_finalnun 0xcef #define XK_hebrew_nun 0xcf0 #define XK_hebrew_samech 0xcf1 #define XK_hebrew_samekh 0xcf1 /* deprecated */ #define XK_hebrew_ayin 0xcf2 #define XK_hebrew_finalpe 0xcf3 #define XK_hebrew_pe 0xcf4 #define XK_hebrew_finalzade 0xcf5 #define XK_hebrew_finalzadi 0xcf5 /* deprecated */ #define XK_hebrew_zade 0xcf6 #define XK_hebrew_zadi 0xcf6 /* deprecated */ #define XK_hebrew_qoph 0xcf7 #define XK_hebrew_kuf 0xcf7 /* deprecated */ #define XK_hebrew_resh 0xcf8 #define XK_hebrew_shin 0xcf9 #define XK_hebrew_taw 0xcfa #define XK_hebrew_taf 0xcfa /* deprecated */ #define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ #endif /* XK_HEBREW */ /* * Thai * Byte 3 = d */ #ifdef XK_THAI #define XK_Thai_kokai 0xda1 #define XK_Thai_khokhai 0xda2 #define XK_Thai_khokhuat 0xda3 #define XK_Thai_khokhwai 0xda4 #define XK_Thai_khokhon 0xda5 #define XK_Thai_khorakhang 0xda6 #define XK_Thai_ngongu 0xda7 #define XK_Thai_chochan 0xda8 #define XK_Thai_choching 0xda9 #define XK_Thai_chochang 0xdaa #define XK_Thai_soso 0xdab #define XK_Thai_chochoe 0xdac #define XK_Thai_yoying 0xdad #define XK_Thai_dochada 0xdae #define XK_Thai_topatak 0xdaf #define XK_Thai_thothan 0xdb0 #define XK_Thai_thonangmontho 0xdb1 #define XK_Thai_thophuthao 0xdb2 #define XK_Thai_nonen 0xdb3 #define XK_Thai_dodek 0xdb4 #define XK_Thai_totao 0xdb5 #define XK_Thai_thothung 0xdb6 #define XK_Thai_thothahan 0xdb7 #define XK_Thai_thothong 0xdb8 #define XK_Thai_nonu 0xdb9 #define XK_Thai_bobaimai 0xdba #define XK_Thai_popla 0xdbb #define XK_Thai_phophung 0xdbc #define XK_Thai_fofa 0xdbd #define XK_Thai_phophan 0xdbe #define XK_Thai_fofan 0xdbf #define XK_Thai_phosamphao 0xdc0 #define XK_Thai_moma 0xdc1 #define XK_Thai_yoyak 0xdc2 #define XK_Thai_rorua 0xdc3 #define XK_Thai_ru 0xdc4 #define XK_Thai_loling 0xdc5 #define XK_Thai_lu 0xdc6 #define XK_Thai_wowaen 0xdc7 #define XK_Thai_sosala 0xdc8 #define XK_Thai_sorusi 0xdc9 #define XK_Thai_sosua 0xdca #define XK_Thai_hohip 0xdcb #define XK_Thai_lochula 0xdcc #define XK_Thai_oang 0xdcd #define XK_Thai_honokhuk 0xdce #define XK_Thai_paiyannoi 0xdcf #define XK_Thai_saraa 0xdd0 #define XK_Thai_maihanakat 0xdd1 #define XK_Thai_saraaa 0xdd2 #define XK_Thai_saraam 0xdd3 #define XK_Thai_sarai 0xdd4 #define XK_Thai_saraii 0xdd5 #define XK_Thai_saraue 0xdd6 #define XK_Thai_sarauee 0xdd7 #define XK_Thai_sarau 0xdd8 #define XK_Thai_sarauu 0xdd9 #define XK_Thai_phinthu 0xdda #define XK_Thai_maihanakat_maitho 0xdde #define XK_Thai_baht 0xddf #define XK_Thai_sarae 0xde0 #define XK_Thai_saraae 0xde1 #define XK_Thai_sarao 0xde2 #define XK_Thai_saraaimaimuan 0xde3 #define XK_Thai_saraaimaimalai 0xde4 #define XK_Thai_lakkhangyao 0xde5 #define XK_Thai_maiyamok 0xde6 #define XK_Thai_maitaikhu 0xde7 #define XK_Thai_maiek 0xde8 #define XK_Thai_maitho 0xde9 #define XK_Thai_maitri 0xdea #define XK_Thai_maichattawa 0xdeb #define XK_Thai_thanthakhat 0xdec #define XK_Thai_nikhahit 0xded #define XK_Thai_leksun 0xdf0 #define XK_Thai_leknung 0xdf1 #define XK_Thai_leksong 0xdf2 #define XK_Thai_leksam 0xdf3 #define XK_Thai_leksi 0xdf4 #define XK_Thai_lekha 0xdf5 #define XK_Thai_lekhok 0xdf6 #define XK_Thai_lekchet 0xdf7 #define XK_Thai_lekpaet 0xdf8 #define XK_Thai_lekkao 0xdf9 #endif /* XK_THAI */ /* * Korean * Byte 3 = e */ #ifdef XK_KOREAN #define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ #define XK_Hangul_Start 0xff32 /* Hangul start */ #define XK_Hangul_End 0xff33 /* Hangul end, English start */ #define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ #define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ #define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ #define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ #define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ #define XK_Hangul_Banja 0xff39 /* Banja mode */ #define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ #define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ #define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ #define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ #define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ #define XK_Hangul_Special 0xff3f /* Special symbols */ #define XK_Hangul_switch 0xFF7E /* Alias for mode_switch */ /* Hangul Consonant Characters */ #define XK_Hangul_Kiyeog 0xea1 #define XK_Hangul_SsangKiyeog 0xea2 #define XK_Hangul_KiyeogSios 0xea3 #define XK_Hangul_Nieun 0xea4 #define XK_Hangul_NieunJieuj 0xea5 #define XK_Hangul_NieunHieuh 0xea6 #define XK_Hangul_Dikeud 0xea7 #define XK_Hangul_SsangDikeud 0xea8 #define XK_Hangul_Rieul 0xea9 #define XK_Hangul_RieulKiyeog 0xeaa #define XK_Hangul_RieulMieum 0xeab #define XK_Hangul_RieulPieub 0xeac #define XK_Hangul_RieulSios 0xead #define XK_Hangul_RieulTieut 0xeae #define XK_Hangul_RieulPhieuf 0xeaf #define XK_Hangul_RieulHieuh 0xeb0 #define XK_Hangul_Mieum 0xeb1 #define XK_Hangul_Pieub 0xeb2 #define XK_Hangul_SsangPieub 0xeb3 #define XK_Hangul_PieubSios 0xeb4 #define XK_Hangul_Sios 0xeb5 #define XK_Hangul_SsangSios 0xeb6 #define XK_Hangul_Ieung 0xeb7 #define XK_Hangul_Jieuj 0xeb8 #define XK_Hangul_SsangJieuj 0xeb9 #define XK_Hangul_Cieuc 0xeba #define XK_Hangul_Khieuq 0xebb #define XK_Hangul_Tieut 0xebc #define XK_Hangul_Phieuf 0xebd #define XK_Hangul_Hieuh 0xebe /* Hangul Vowel Characters */ #define XK_Hangul_A 0xebf #define XK_Hangul_AE 0xec0 #define XK_Hangul_YA 0xec1 #define XK_Hangul_YAE 0xec2 #define XK_Hangul_EO 0xec3 #define XK_Hangul_E 0xec4 #define XK_Hangul_YEO 0xec5 #define XK_Hangul_YE 0xec6 #define XK_Hangul_O 0xec7 #define XK_Hangul_WA 0xec8 #define XK_Hangul_WAE 0xec9 #define XK_Hangul_OE 0xeca #define XK_Hangul_YO 0xecb #define XK_Hangul_U 0xecc #define XK_Hangul_WEO 0xecd #define XK_Hangul_WE 0xece #define XK_Hangul_WI 0xecf #define XK_Hangul_YU 0xed0 #define XK_Hangul_EU 0xed1 #define XK_Hangul_YI 0xed2 #define XK_Hangul_I 0xed3 /* Hangul syllable-final (JongSeong) Characters */ #define XK_Hangul_J_Kiyeog 0xed4 #define XK_Hangul_J_SsangKiyeog 0xed5 #define XK_Hangul_J_KiyeogSios 0xed6 #define XK_Hangul_J_Nieun 0xed7 #define XK_Hangul_J_NieunJieuj 0xed8 #define XK_Hangul_J_NieunHieuh 0xed9 #define XK_Hangul_J_Dikeud 0xeda #define XK_Hangul_J_Rieul 0xedb #define XK_Hangul_J_RieulKiyeog 0xedc #define XK_Hangul_J_RieulMieum 0xedd #define XK_Hangul_J_RieulPieub 0xede #define XK_Hangul_J_RieulSios 0xedf #define XK_Hangul_J_RieulTieut 0xee0 #define XK_Hangul_J_RieulPhieuf 0xee1 #define XK_Hangul_J_RieulHieuh 0xee2 #define XK_Hangul_J_Mieum 0xee3 #define XK_Hangul_J_Pieub 0xee4 #define XK_Hangul_J_PieubSios 0xee5 #define XK_Hangul_J_Sios 0xee6 #define XK_Hangul_J_SsangSios 0xee7 #define XK_Hangul_J_Ieung 0xee8 #define XK_Hangul_J_Jieuj 0xee9 #define XK_Hangul_J_Cieuc 0xeea #define XK_Hangul_J_Khieuq 0xeeb #define XK_Hangul_J_Tieut 0xeec #define XK_Hangul_J_Phieuf 0xeed #define XK_Hangul_J_Hieuh 0xeee /* Ancient Hangul Consonant Characters */ #define XK_Hangul_RieulYeorinHieuh 0xeef #define XK_Hangul_SunkyeongeumMieum 0xef0 #define XK_Hangul_SunkyeongeumPieub 0xef1 #define XK_Hangul_PanSios 0xef2 #define XK_Hangul_KkogjiDalrinIeung 0xef3 #define XK_Hangul_SunkyeongeumPhieuf 0xef4 #define XK_Hangul_YeorinHieuh 0xef5 /* Ancient Hangul Vowel Characters */ #define XK_Hangul_AraeA 0xef6 #define XK_Hangul_AraeAE 0xef7 /* Ancient Hangul syllable-final (JongSeong) Characters */ #define XK_Hangul_J_PanSios 0xef8 #define XK_Hangul_J_KkogjiDalrinIeung 0xef9 #define XK_Hangul_J_YeorinHieuh 0xefa /* Korean currency symbol */ #define XK_Korean_Won 0xeff #endif /* XK_KOREAN */ /* Euro currency symbol */ #define XK_EuroSign 0x20ac #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfb.h000066400000000000000000001301361171526373700247130ustar00rootroot00000000000000#ifndef RFB_H #define RFB_H /** * @defgroup libvncserver_api LibVNCServer API Reference * @{ */ /** * @file rfb.h */ /* * Copyright (C) 2005 Rohit Kumar , * Johannes E. Schindelin * Copyright (C) 2002 RealVNC Ltd. * OSXvnc Copyright (C) 2001 Dan McGuirk . * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge. * All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ #if(defined __cplusplus) extern "C" { #endif #include #include #include #include #ifdef LIBVNCSERVER_HAVE_SYS_TYPES_H #include #endif #ifdef __MINGW32__ #undef SOCKET #include #endif #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD #include #if 0 /* debugging */ #define LOCK(mutex) (rfbLog("%s:%d LOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_lock(&(mutex))) #define UNLOCK(mutex) (rfbLog("%s:%d UNLOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_unlock(&(mutex))) #define MUTEX(mutex) pthread_mutex_t (mutex) #define INIT_MUTEX(mutex) (rfbLog("%s:%d INIT_MUTEX(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)), pthread_mutex_init(&(mutex),NULL)) #define TINI_MUTEX(mutex) (rfbLog("%s:%d TINI_MUTEX(%s)\n",__FILE__,__LINE__,#mutex), pthread_mutex_destroy(&(mutex))) #define TSIGNAL(cond) (rfbLog("%s:%d TSIGNAL(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_signal(&(cond))) #define WAIT(cond,mutex) (rfbLog("%s:%d WAIT(%s,%s)\n",__FILE__,__LINE__,#cond,#mutex), pthread_cond_wait(&(cond),&(mutex))) #define COND(cond) pthread_cond_t (cond) #define INIT_COND(cond) (rfbLog("%s:%d INIT_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_init(&(cond),NULL)) #define TINI_COND(cond) (rfbLog("%s:%d TINI_COND(%s)\n",__FILE__,__LINE__,#cond), pthread_cond_destroy(&(cond))) #define IF_PTHREADS(x) x #else #if !NONETWORK #define LOCK(mutex) pthread_mutex_lock(&(mutex)); #define UNLOCK(mutex) pthread_mutex_unlock(&(mutex)); #endif #define MUTEX(mutex) pthread_mutex_t (mutex) #define INIT_MUTEX(mutex) pthread_mutex_init(&(mutex),NULL) #define TINI_MUTEX(mutex) pthread_mutex_destroy(&(mutex)) #define TSIGNAL(cond) pthread_cond_signal(&(cond)) #define WAIT(cond,mutex) pthread_cond_wait(&(cond),&(mutex)) #define COND(cond) pthread_cond_t (cond) #define INIT_COND(cond) pthread_cond_init(&(cond),NULL) #define TINI_COND(cond) pthread_cond_destroy(&(cond)) #define IF_PTHREADS(x) x #endif #else #define LOCK(mutex) #define UNLOCK(mutex) #define MUTEX(mutex) #define INIT_MUTEX(mutex) #define TINI_MUTEX(mutex) #define TSIGNAL(cond) #define WAIT(cond,mutex) this_is_unsupported #define COND(cond) #define INIT_COND(cond) #define TINI_COND(cond) #define IF_PTHREADS(x) #endif /* end of stuff for autoconf */ /* if you use pthreads, but don't define LIBVNCSERVER_HAVE_LIBPTHREAD, the structs get all mixed up. So this gives a linker error reminding you to compile the library and your application (at least the parts including rfb.h) with the same support for pthreads. */ #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD #ifdef LIBVNCSERVER_HAVE_LIBZ #define rfbInitServer rfbInitServerWithPthreadsAndZRLE #else #define rfbInitServer rfbInitServerWithPthreadsButWithoutZRLE #endif #else #ifdef LIBVNCSERVER_HAVE_LIBZ #define rfbInitServer rfbInitServerWithoutPthreadsButWithZRLE #else #define rfbInitServer rfbInitServerWithoutPthreadsAndZRLE #endif #endif struct _rfbClientRec; struct _rfbScreenInfo; struct rfbCursor; enum rfbNewClientAction { RFB_CLIENT_ACCEPT, RFB_CLIENT_ON_HOLD, RFB_CLIENT_REFUSE }; enum rfbSocketState { RFB_SOCKET_INIT, RFB_SOCKET_READY, RFB_SOCKET_SHUTDOWN }; typedef void (*rfbKbdAddEventProcPtr) (rfbBool down, rfbKeySym keySym, struct _rfbClientRec* cl); typedef void (*rfbKbdReleaseAllKeysProcPtr) (struct _rfbClientRec* cl); typedef void (*rfbPtrAddEventProcPtr) (int buttonMask, int x, int y, struct _rfbClientRec* cl); typedef void (*rfbSetXCutTextProcPtr) (char* str,int len, struct _rfbClientRec* cl); typedef struct rfbCursor* (*rfbGetCursorProcPtr) (struct _rfbClientRec* pScreen); typedef rfbBool (*rfbSetTranslateFunctionProcPtr)(struct _rfbClientRec* cl); typedef rfbBool (*rfbPasswordCheckProcPtr)(struct _rfbClientRec* cl,const char* encryptedPassWord,int len); typedef enum rfbNewClientAction (*rfbNewClientHookPtr)(struct _rfbClientRec* cl); typedef void (*rfbDisplayHookPtr)(struct _rfbClientRec* cl); typedef void (*rfbDisplayFinishedHookPtr)(struct _rfbClientRec* cl, int result); /** support the capability to view the caps/num/scroll states of the X server */ typedef int (*rfbGetKeyboardLedStateHookPtr)(struct _rfbScreenInfo* screen); typedef rfbBool (*rfbXvpHookPtr)(struct _rfbClientRec* cl, uint8_t, uint8_t); /** * If x==1 and y==1 then set the whole display * else find the window underneath x and y and set the framebuffer to the dimensions * of that window */ typedef void (*rfbSetSingleWindowProcPtr) (struct _rfbClientRec* cl, int x, int y); /** * Status determines if the X11 server permits input from the local user * status==0 or 1 */ typedef void (*rfbSetServerInputProcPtr) (struct _rfbClientRec* cl, int status); /** * Permit the server to allow or deny filetransfers. This is defaulted to deny * It is called when a client initiates a connection to determine if it is permitted. */ typedef int (*rfbFileTransferPermitted) (struct _rfbClientRec* cl); /** Handle the textchat messages */ typedef void (*rfbSetTextChat) (struct _rfbClientRec* cl, int length, char *string); typedef struct { uint32_t count; rfbBool is16; /**< is the data format short? */ union { uint8_t* bytes; uint16_t* shorts; } data; /**< there have to be count*3 entries */ } rfbColourMap; /** * Security handling (RFB protocol version 3.7) */ typedef struct _rfbSecurity { uint8_t type; void (*handler)(struct _rfbClientRec* cl); struct _rfbSecurity* next; } rfbSecurityHandler; /** * Protocol extension handling. */ typedef struct _rfbProtocolExtension { /** returns FALSE if extension should be deactivated for client. if newClient == NULL, it is always deactivated. */ rfbBool (*newClient)(struct _rfbClientRec* client, void** data); /** returns FALSE if extension should be deactivated for client. if init == NULL, it stays activated. */ rfbBool (*init)(struct _rfbClientRec* client, void* data); /** if pseudoEncodings is not NULL, it contains a 0 terminated list of the pseudo encodings handled by this extension. */ int *pseudoEncodings; /** returns TRUE if that pseudo encoding is handled by the extension. encodingNumber==0 means "reset encodings". */ rfbBool (*enablePseudoEncoding)(struct _rfbClientRec* client, void** data, int encodingNumber); /** returns TRUE if message was handled */ rfbBool (*handleMessage)(struct _rfbClientRec* client, void* data, const rfbClientToServerMsg* message); void (*close)(struct _rfbClientRec* client, void* data); void (*usage)(void); /** processArguments returns the number of handled arguments */ int (*processArgument)(int argc, char *argv[]); struct _rfbProtocolExtension* next; } rfbProtocolExtension; typedef struct _rfbExtensionData { rfbProtocolExtension* extension; void* data; struct _rfbExtensionData* next; } rfbExtensionData; /** * Per-screen (framebuffer) structure. There can be as many as you wish, * each serving different clients. However, you have to call * rfbProcessEvents for each of these. */ typedef struct _rfbScreenInfo { /** this structure has children that are scaled versions of this screen */ struct _rfbScreenInfo *scaledScreenNext; int scaledScreenRefCount; int width; int paddedWidthInBytes; int height; int depth; int bitsPerPixel; int sizeInBytes; rfbPixel blackPixel; rfbPixel whitePixel; /** * some screen specific data can be put into a struct where screenData * points to. You need this if you have more than one screen at the * same time while using the same functions. */ void* screenData; /* additions by libvncserver */ rfbPixelFormat serverFormat; rfbColourMap colourMap; /**< set this if rfbServerFormat.trueColour==FALSE */ const char* desktopName; char thisHost[255]; rfbBool autoPort; int port; SOCKET listenSock; int maxSock; int maxFd; #ifdef __MINGW32__ struct fd_set allFds; #else fd_set allFds; #endif enum rfbSocketState socketState; SOCKET inetdSock; rfbBool inetdInitDone; int udpPort; SOCKET udpSock; struct _rfbClientRec* udpClient; rfbBool udpSockConnected; struct sockaddr_in udpRemoteAddr; int maxClientWait; /* http stuff */ rfbBool httpInitDone; rfbBool httpEnableProxyConnect; int httpPort; char* httpDir; SOCKET httpListenSock; SOCKET httpSock; rfbPasswordCheckProcPtr passwordCheck; void* authPasswdData; /** If rfbAuthPasswdData is given a list, this is the first view only password. */ int authPasswdFirstViewOnly; /** send only this many rectangles in one update */ int maxRectsPerUpdate; /** this is the amount of milliseconds to wait at least before sending * an update. */ int deferUpdateTime; #ifdef TODELETE char* screen; #endif rfbBool alwaysShared; rfbBool neverShared; rfbBool dontDisconnect; struct _rfbClientRec* clientHead; struct _rfbClientRec* pointerClient; /**< "Mutex" for pointer events */ /* cursor */ int cursorX, cursorY,underCursorBufferLen; char* underCursorBuffer; rfbBool dontConvertRichCursorToXCursor; struct rfbCursor* cursor; /** * the frameBuffer has to be supplied by the serving process. * The buffer will not be freed by */ char* frameBuffer; rfbKbdAddEventProcPtr kbdAddEvent; rfbKbdReleaseAllKeysProcPtr kbdReleaseAllKeys; rfbPtrAddEventProcPtr ptrAddEvent; rfbSetXCutTextProcPtr setXCutText; rfbGetCursorProcPtr getCursorPtr; rfbSetTranslateFunctionProcPtr setTranslateFunction; rfbSetSingleWindowProcPtr setSingleWindow; rfbSetServerInputProcPtr setServerInput; rfbFileTransferPermitted getFileTransferPermission; rfbSetTextChat setTextChat; /** newClientHook is called just after a new client is created */ rfbNewClientHookPtr newClientHook; /** displayHook is called just before a frame buffer update */ rfbDisplayHookPtr displayHook; /** These hooks are called to pass keyboard state back to the client */ rfbGetKeyboardLedStateHookPtr getKeyboardLedStateHook; #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD MUTEX(cursorMutex); rfbBool backgroundLoop; #endif /** if TRUE, an ignoring signal handler is installed for SIGPIPE */ rfbBool ignoreSIGPIPE; /** if not zero, only a slice of this height is processed every time * an update should be sent. This should make working on a slow * link more interactive. */ int progressiveSliceHeight; in_addr_t listenInterface; int deferPtrUpdateTime; /** handle as many input events as possible (default off) */ rfbBool handleEventsEagerly; /** rfbEncodingServerIdentity */ char *versionString; /** What does the server tell the new clients which version it supports */ int protocolMajorVersion; int protocolMinorVersion; /** command line authorization of file transfers */ rfbBool permitFileTransfer; /** displayFinishedHook is called just after a frame buffer update */ rfbDisplayFinishedHookPtr displayFinishedHook; /** xvpHook is called to handle an xvp client message */ rfbXvpHookPtr xvpHook; } rfbScreenInfo, *rfbScreenInfoPtr; /** * rfbTranslateFnType is the type of translation functions. */ typedef void (*rfbTranslateFnType)(char *table, rfbPixelFormat *in, rfbPixelFormat *out, char *iptr, char *optr, int bytesBetweenInputLines, int width, int height); /* region stuff */ struct sraRegion; typedef struct sraRegion* sraRegionPtr; /* * Per-client structure. */ typedef void (*ClientGoneHookPtr)(struct _rfbClientRec* cl); typedef struct _rfbFileTransferData { int fd; int compressionEnabled; int fileSize; int numPackets; int receiving; int sending; } rfbFileTransferData; typedef struct _rfbStatList { uint32_t type; uint32_t sentCount; uint32_t bytesSent; uint32_t bytesSentIfRaw; uint32_t rcvdCount; uint32_t bytesRcvd; uint32_t bytesRcvdIfRaw; struct _rfbStatList *Next; } rfbStatList; typedef struct _rfbClientRec { /** back pointer to the screen */ rfbScreenInfoPtr screen; /** points to a scaled version of the screen buffer in cl->scaledScreenList */ rfbScreenInfoPtr scaledScreen; /** how did the client tell us it wanted the screen changed? Ultra style or palm style? */ rfbBool PalmVNC; /** private data. You should put any application client specific data * into a struct and let clientData point to it. Don't forget to * free the struct via clientGoneHook! * * This is useful if the IO functions have to behave client specific. */ void* clientData; ClientGoneHookPtr clientGoneHook; SOCKET sock; char *host; /* RFB protocol minor version number */ int protocolMajorVersion; int protocolMinorVersion; #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD pthread_t client_thread; #endif /** Possible client states: */ enum { RFB_PROTOCOL_VERSION, /**< establishing protocol version */ RFB_SECURITY_TYPE, /**< negotiating security (RFB v.3.7) */ RFB_AUTHENTICATION, /**< authenticating */ RFB_INITIALISATION, /**< sending initialisation messages */ RFB_NORMAL /**< normal protocol messages */ } state; rfbBool reverseConnection; rfbBool onHold; rfbBool readyForSetColourMapEntries; rfbBool useCopyRect; int preferredEncoding; int correMaxWidth, correMaxHeight; rfbBool viewOnly; /* The following member is only used during VNC authentication */ uint8_t authChallenge[CHALLENGESIZE]; /* The following members represent the update needed to get the client's framebuffer from its present state to the current state of our framebuffer. If the client does not accept CopyRect encoding then the update is simply represented as the region of the screen which has been modified (modifiedRegion). If the client does accept CopyRect encoding, then the update consists of two parts. First we have a single copy from one region of the screen to another (the destination of the copy is copyRegion), and second we have the region of the screen which has been modified in some other way (modifiedRegion). Although the copy is of a single region, this region may have many rectangles. When sending an update, the copyRegion is always sent before the modifiedRegion. This is because the modifiedRegion may overlap parts of the screen which are in the source of the copy. In fact during normal processing, the modifiedRegion may even overlap the destination copyRegion. Just before an update is sent we remove from the copyRegion anything in the modifiedRegion. */ sraRegionPtr copyRegion; /**< the destination region of the copy */ int copyDX, copyDY; /**< the translation by which the copy happens */ sraRegionPtr modifiedRegion; /** As part of the FramebufferUpdateRequest, a client can express interest in a subrectangle of the whole framebuffer. This is stored in the requestedRegion member. In the normal case this is the whole framebuffer if the client is ready, empty if it's not. */ sraRegionPtr requestedRegion; /** The following member represents the state of the "deferred update" timer - when the framebuffer is modified and the client is ready, in most cases it is more efficient to defer sending the update by a few milliseconds so that several changes to the framebuffer can be combined into a single update. */ struct timeval startDeferring; struct timeval startPtrDeferring; int lastPtrX; int lastPtrY; int lastPtrButtons; /** translateFn points to the translation function which is used to copy and translate a rectangle from the framebuffer to an output buffer. */ rfbTranslateFnType translateFn; char *translateLookupTable; rfbPixelFormat format; /** * UPDATE_BUF_SIZE must be big enough to send at least one whole line of the * framebuffer. So for a max screen width of say 2K with 32-bit pixels this * means 8K minimum. */ #define UPDATE_BUF_SIZE 30000 char updateBuf[UPDATE_BUF_SIZE]; int ublen; /* statistics */ struct _rfbStatList *statEncList; struct _rfbStatList *statMsgList; int rawBytesEquivalent; int bytesSent; #ifdef LIBVNCSERVER_HAVE_LIBZ /* zlib encoding -- necessary compression state info per client */ struct z_stream_s compStream; rfbBool compStreamInited; uint32_t zlibCompressLevel; /** the quality level is also used by ZYWRLE */ int tightQualityLevel; #ifdef LIBVNCSERVER_HAVE_LIBJPEG /* tight encoding -- preserve zlib streams' state for each client */ z_stream zsStruct[4]; rfbBool zsActive[4]; int zsLevel[4]; int tightCompressLevel; #endif #endif /* Ultra Encoding support */ rfbBool compStreamInitedLZO; char *lzoWrkMem; rfbFileTransferData fileTransfer; int lastKeyboardLedState; /**< keep track of last value so we can send *change* events */ rfbBool enableSupportedMessages; /**< client supports SupportedMessages encoding */ rfbBool enableSupportedEncodings; /**< client supports SupportedEncodings encoding */ rfbBool enableServerIdentity; /**< client supports ServerIdentity encoding */ rfbBool enableKeyboardLedState; /**< client supports KeyboardState encoding */ rfbBool enableLastRectEncoding; /**< client supports LastRect encoding */ rfbBool enableCursorShapeUpdates; /**< client supports cursor shape updates */ rfbBool enableCursorPosUpdates; /**< client supports cursor position updates */ rfbBool useRichCursorEncoding; /**< rfbEncodingRichCursor is preferred */ rfbBool cursorWasChanged; /**< cursor shape update should be sent */ rfbBool cursorWasMoved; /**< cursor position update should be sent */ int cursorX,cursorY; /**< the coordinates of the cursor, if enableCursorShapeUpdates = FALSE */ rfbBool useNewFBSize; /**< client supports NewFBSize encoding */ rfbBool newFBSizePending; /**< framebuffer size was changed */ struct _rfbClientRec *prev; struct _rfbClientRec *next; #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD /** whenever a client is referenced, the refCount has to be incremented and afterwards decremented, so that the client is not cleaned up while being referenced. Use the functions rfbIncrClientRef(cl) and rfbDecrClientRef(cl); */ int refCount; MUTEX(refCountMutex); COND(deleteCond); MUTEX(outputMutex); MUTEX(updateMutex); COND(updateCond); #endif #ifdef LIBVNCSERVER_HAVE_LIBZ void* zrleData; int zywrleLevel; int zywrleBuf[rfbZRLETileWidth * rfbZRLETileHeight]; #endif /** if progressive updating is on, this variable holds the current * y coordinate of the progressive slice. */ int progressiveSliceY; rfbExtensionData* extensions; /** for threaded zrle */ char *zrleBeforeBuf; void *paletteHelper; /** for thread safety for rfbSendFBUpdate() */ #ifdef LIBVNCSERVER_HAVE_LIBPTHREAD #define LIBVNCSERVER_SEND_MUTEX MUTEX(sendMutex); #endif /* buffers to hold pixel data before and after encoding. per-client for thread safety */ char *beforeEncBuf; int beforeEncBufSize; char *afterEncBuf; int afterEncBufSize; int afterEncBufLen; } rfbClientRec, *rfbClientPtr; /** * This macro is used to test whether there is a framebuffer update needing to * be sent to the client. */ #define FB_UPDATE_PENDING(cl) \ (((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) || \ (((cl)->enableCursorShapeUpdates == FALSE && \ ((cl)->cursorX != (cl)->screen->cursorX || \ (cl)->cursorY != (cl)->screen->cursorY))) || \ ((cl)->useNewFBSize && (cl)->newFBSizePending) || \ ((cl)->enableCursorPosUpdates && (cl)->cursorWasMoved) || \ !sraRgnEmpty((cl)->copyRegion) || !sraRgnEmpty((cl)->modifiedRegion)) /* * Macros for endian swapping. */ #define Swap16(s) ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) #define Swap24(l) ((((l) & 0xff) << 16) | (((l) >> 16) & 0xff) | \ (((l) & 0x00ff00))) #define Swap32(l) (((l) >> 24) | \ (((l) & 0x00ff0000) >> 8) | \ (((l) & 0x0000ff00) << 8) | \ ((l) << 24)) extern char rfbEndianTest; #define Swap16IfLE(s) (rfbEndianTest ? Swap16(s) : (s)) #define Swap24IfLE(l) (rfbEndianTest ? Swap24(l) : (l)) #define Swap32IfLE(l) (rfbEndianTest ? Swap32(l) : (l)) /* UltraVNC uses some windows structures unmodified, so the viewer expects LittleEndian Data */ #define Swap16IfBE(s) (rfbEndianTest ? (s) : Swap16(s)) #define Swap24IfBE(l) (rfbEndianTest ? (l) : Swap24(l)) #define Swap32IfBE(l) (rfbEndianTest ? (l) : Swap32(l)) /* sockets.c */ extern int rfbMaxClientWait; extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen); extern void rfbShutdownSockets(rfbScreenInfoPtr rfbScreen); extern void rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen); extern void rfbCloseClient(rfbClientPtr cl); extern int rfbReadExact(rfbClientPtr cl, char *buf, int len); extern int rfbReadExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout); extern int rfbWriteExact(rfbClientPtr cl, const char *buf, int len); extern int rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec); extern int rfbConnect(rfbScreenInfoPtr rfbScreen, char* host, int port); extern int rfbConnectToTcpAddr(char* host, int port); extern int rfbListenOnTCPPort(int port, in_addr_t iface); extern int rfbListenOnUDPPort(int port, in_addr_t iface); extern int rfbStringToAddr(char* string,in_addr_t* addr); extern rfbBool rfbSetNonBlocking(int sock); /* rfbserver.c */ /* Routines to iterate over the client list in a thread-safe way. Only a single iterator can be in use at a time process-wide. */ typedef struct rfbClientIterator *rfbClientIteratorPtr; extern void rfbClientListInit(rfbScreenInfoPtr rfbScreen); extern rfbClientIteratorPtr rfbGetClientIterator(rfbScreenInfoPtr rfbScreen); extern rfbClientPtr rfbClientIteratorNext(rfbClientIteratorPtr iterator); extern void rfbReleaseClientIterator(rfbClientIteratorPtr iterator); extern void rfbIncrClientRef(rfbClientPtr cl); extern void rfbDecrClientRef(rfbClientPtr cl); extern void rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,int sock); extern rfbClientPtr rfbNewClient(rfbScreenInfoPtr rfbScreen,int sock); extern rfbClientPtr rfbNewUDPClient(rfbScreenInfoPtr rfbScreen); extern rfbClientPtr rfbReverseConnection(rfbScreenInfoPtr rfbScreen,char *host, int port); extern void rfbClientConnectionGone(rfbClientPtr cl); extern void rfbProcessClientMessage(rfbClientPtr cl); extern void rfbClientConnFailed(rfbClientPtr cl, char *reason); extern void rfbNewUDPConnection(rfbScreenInfoPtr rfbScreen,int sock); extern void rfbProcessUDPInput(rfbScreenInfoPtr rfbScreen); extern rfbBool rfbSendFramebufferUpdate(rfbClientPtr cl, sraRegionPtr updateRegion); extern rfbBool rfbSendRectEncodingRaw(rfbClientPtr cl, int x,int y,int w,int h); extern rfbBool rfbSendUpdateBuf(rfbClientPtr cl); extern void rfbSendServerCutText(rfbScreenInfoPtr rfbScreen,char *str, int len); extern rfbBool rfbSendCopyRegion(rfbClientPtr cl,sraRegionPtr reg,int dx,int dy); extern rfbBool rfbSendLastRectMarker(rfbClientPtr cl); extern rfbBool rfbSendNewFBSize(rfbClientPtr cl, int w, int h); extern rfbBool rfbSendSetColourMapEntries(rfbClientPtr cl, int firstColour, int nColours); extern void rfbSendBell(rfbScreenInfoPtr rfbScreen); extern char *rfbProcessFileTransferReadBuffer(rfbClientPtr cl, uint32_t length); extern rfbBool rfbSendFileTransferChunk(rfbClientPtr cl); extern rfbBool rfbSendDirContent(rfbClientPtr cl, int length, char *buffer); extern rfbBool rfbSendFileTransferMessage(rfbClientPtr cl, uint8_t contentType, uint8_t contentParam, uint32_t size, uint32_t length, char *buffer); extern char *rfbProcessFileTransferReadBuffer(rfbClientPtr cl, uint32_t length); extern rfbBool rfbProcessFileTransfer(rfbClientPtr cl, uint8_t contentType, uint8_t contentParam, uint32_t size, uint32_t length); void rfbGotXCutText(rfbScreenInfoPtr rfbScreen, char *str, int len); /* translate.c */ extern rfbBool rfbEconomicTranslate; extern void rfbTranslateNone(char *table, rfbPixelFormat *in, rfbPixelFormat *out, char *iptr, char *optr, int bytesBetweenInputLines, int width, int height); extern rfbBool rfbSetTranslateFunction(rfbClientPtr cl); extern rfbBool rfbSetClientColourMap(rfbClientPtr cl, int firstColour, int nColours); extern void rfbSetClientColourMaps(rfbScreenInfoPtr rfbScreen, int firstColour, int nColours); /* httpd.c */ extern void rfbHttpInitSockets(rfbScreenInfoPtr rfbScreen); extern void rfbHttpShutdownSockets(rfbScreenInfoPtr rfbScreen); extern void rfbHttpCheckFds(rfbScreenInfoPtr rfbScreen); /* auth.c */ extern void rfbAuthNewClient(rfbClientPtr cl); extern void rfbProcessClientSecurityType(rfbClientPtr cl); extern void rfbAuthProcessClientMessage(rfbClientPtr cl); extern void rfbRegisterSecurityHandler(rfbSecurityHandler* handler); extern void rfbUnregisterSecurityHandler(rfbSecurityHandler* handler); /* rre.c */ extern rfbBool rfbSendRectEncodingRRE(rfbClientPtr cl, int x,int y,int w,int h); /* corre.c */ extern rfbBool rfbSendRectEncodingCoRRE(rfbClientPtr cl, int x,int y,int w,int h); /* hextile.c */ extern rfbBool rfbSendRectEncodingHextile(rfbClientPtr cl, int x, int y, int w, int h); /* ultra.c */ /* Set maximum ultra rectangle size in pixels. Always allow at least * two scan lines. */ #define ULTRA_MAX_RECT_SIZE (128*256) #define ULTRA_MAX_SIZE(min) ((( min * 2 ) > ULTRA_MAX_RECT_SIZE ) ? \ ( min * 2 ) : ULTRA_MAX_RECT_SIZE ) extern rfbBool rfbSendRectEncodingUltra(rfbClientPtr cl, int x,int y,int w,int h); #ifdef LIBVNCSERVER_HAVE_LIBZ /* zlib.c */ /** Minimum zlib rectangle size in bytes. Anything smaller will * not compress well due to overhead. */ #define VNC_ENCODE_ZLIB_MIN_COMP_SIZE (17) /* Set maximum zlib rectangle size in pixels. Always allow at least * two scan lines. */ #define ZLIB_MAX_RECT_SIZE (128*256) #define ZLIB_MAX_SIZE(min) ((( min * 2 ) > ZLIB_MAX_RECT_SIZE ) ? \ ( min * 2 ) : ZLIB_MAX_RECT_SIZE ) extern rfbBool rfbSendRectEncodingZlib(rfbClientPtr cl, int x, int y, int w, int h); #ifdef LIBVNCSERVER_HAVE_LIBJPEG /* tight.c */ #define TIGHT_DEFAULT_COMPRESSION 6 extern rfbBool rfbTightDisableGradient; extern int rfbNumCodedRectsTight(rfbClientPtr cl, int x,int y,int w,int h); extern rfbBool rfbSendRectEncodingTight(rfbClientPtr cl, int x,int y,int w,int h); #endif #endif /* cursor.c */ typedef struct rfbCursor { /** set this to true if LibVNCServer has to free this cursor */ rfbBool cleanup, cleanupSource, cleanupMask, cleanupRichSource; unsigned char *source; /**< points to bits */ unsigned char *mask; /**< points to bits */ unsigned short width, height, xhot, yhot; /**< metrics */ unsigned short foreRed, foreGreen, foreBlue; /**< device-independent colour */ unsigned short backRed, backGreen, backBlue; /**< device-independent colour */ unsigned char *richSource; /**< source bytes for a rich cursor */ unsigned char *alphaSource; /**< source for alpha blending info */ rfbBool alphaPreMultiplied; /**< if richSource already has alpha applied */ } rfbCursor, *rfbCursorPtr; extern unsigned char rfbReverseByte[0x100]; extern rfbBool rfbSendCursorShape(rfbClientPtr cl/*, rfbScreenInfoPtr pScreen*/); extern rfbBool rfbSendCursorPos(rfbClientPtr cl); extern void rfbConvertLSBCursorBitmapOrMask(int width,int height,unsigned char* bitmap); extern rfbCursorPtr rfbMakeXCursor(int width,int height,char* cursorString,char* maskString); extern char* rfbMakeMaskForXCursor(int width,int height,char* cursorString); extern char* rfbMakeMaskFromAlphaSource(int width,int height,unsigned char* alphaSource); extern void rfbMakeXCursorFromRichCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor); extern void rfbMakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor); extern void rfbFreeCursor(rfbCursorPtr cursor); extern void rfbSetCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr c); /** cursor handling for the pointer */ extern void rfbDefaultPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl); /* zrle.c */ #ifdef LIBVNCSERVER_HAVE_LIBZ extern rfbBool rfbSendRectEncodingZRLE(rfbClientPtr cl, int x, int y, int w,int h); #endif /* stats.c */ extern void rfbResetStats(rfbClientPtr cl); extern void rfbPrintStats(rfbClientPtr cl); /* font.c */ typedef struct rfbFontData { unsigned char* data; /** metaData is a 256*5 array: for each character (offset,width,height,x,y) */ int* metaData; } rfbFontData,* rfbFontDataPtr; int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,rfbPixel colour); void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,rfbPixel colour); /** if colour==backColour, background is transparent */ int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour); void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,int x1,int y1,int x2,int y2,rfbPixel colour,rfbPixel backColour); int rfbWidthOfString(rfbFontDataPtr font,const char* string); int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c); void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2); /** this returns the smallest box enclosing any character of font. */ void rfbWholeFontBBox(rfbFontDataPtr font,int *x1, int *y1, int *x2, int *y2); /** dynamically load a linux console font (4096 bytes, 256 glyphs a 8x16 */ rfbFontDataPtr rfbLoadConsoleFont(char *filename); /** free a dynamically loaded font */ void rfbFreeFont(rfbFontDataPtr font); /* draw.c */ void rfbFillRect(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col); void rfbDrawPixel(rfbScreenInfoPtr s,int x,int y,rfbPixel col); void rfbDrawLine(rfbScreenInfoPtr s,int x1,int y1,int x2,int y2,rfbPixel col); /* selbox.c */ /** this opens a modal select box. list is an array of strings, the end marked with a NULL. It returns the index in the list or -1 if cancelled or something else wasn't kosher. */ typedef void (*SelectionChangedHookPtr)(int _index); extern int rfbSelectBox(rfbScreenInfoPtr rfbScreen, rfbFontDataPtr font, char** list, int x1, int y1, int x2, int y2, rfbPixel foreColour, rfbPixel backColour, int border,SelectionChangedHookPtr selChangedHook); /* cargs.c */ extern void rfbUsage(void); extern void rfbPurgeArguments(int* argc,int* position,int count,char *argv[]); extern rfbBool rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[]); extern rfbBool rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[]); /* main.c */ extern void rfbLogEnable(int enabled); typedef void (*rfbLogProc)(const char *format, ...); extern rfbLogProc rfbLog, rfbErr; extern void rfbLogPerror(const char *str); void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy); void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy); void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy); void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy); void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2); void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion); void rfbDoNothingWithClient(rfbClientPtr cl); enum rfbNewClientAction defaultNewClientHook(rfbClientPtr cl); void rfbRegisterProtocolExtension(rfbProtocolExtension* extension); void rfbUnregisterProtocolExtension(rfbProtocolExtension* extension); struct _rfbProtocolExtension* rfbGetExtensionIterator(); void rfbReleaseExtensionIterator(); rfbBool rfbEnableExtension(rfbClientPtr cl, rfbProtocolExtension* extension, void* data); rfbBool rfbDisableExtension(rfbClientPtr cl, rfbProtocolExtension* extension); void* rfbGetExtensionClientData(rfbClientPtr cl, rfbProtocolExtension* extension); /** to check against plain passwords */ rfbBool rfbCheckPasswordByList(rfbClientPtr cl,const char* response,int len); /* functions to make a vnc server */ extern rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv, int width,int height,int bitsPerSample,int samplesPerPixel, int bytesPerPixel); extern void rfbInitServer(rfbScreenInfoPtr rfbScreen); extern void rfbShutdownServer(rfbScreenInfoPtr rfbScreen,rfbBool disconnectClients); extern void rfbNewFramebuffer(rfbScreenInfoPtr rfbScreen,char *framebuffer, int width,int height, int bitsPerSample,int samplesPerPixel, int bytesPerPixel); extern void rfbScreenCleanup(rfbScreenInfoPtr screenInfo); extern void rfbSetServerVersionIdentity(rfbScreenInfoPtr screen, char *fmt, ...); /* functions to accept/refuse a client that has been put on hold by a NewClientHookPtr function. Must not be called in other situations. */ extern void rfbStartOnHoldClient(rfbClientPtr cl); extern void rfbRefuseOnHoldClient(rfbClientPtr cl); /* call one of these two functions to service the vnc clients. usec are the microseconds the select on the fds waits. if you are using the event loop, set this to some value > 0, so the server doesn't get a high load just by listening. rfbProcessEvents() returns TRUE if an update was pending. */ extern void rfbRunEventLoop(rfbScreenInfoPtr screenInfo, long usec, rfbBool runInBackground); extern rfbBool rfbProcessEvents(rfbScreenInfoPtr screenInfo,long usec); extern rfbBool rfbIsActive(rfbScreenInfoPtr screenInfo); /* TightVNC file transfer extension */ void rfbRegisterTightVNCFileTransferExtension(); void rfbUnregisterTightVNCFileTransferExtension(); /* Statistics */ extern char *messageNameServer2Client(uint32_t type, char *buf, int len); extern char *messageNameClient2Server(uint32_t type, char *buf, int len); extern char *encodingName(uint32_t enc, char *buf, int len); extern rfbStatList *rfbStatLookupEncoding(rfbClientPtr cl, uint32_t type); extern rfbStatList *rfbStatLookupMessage(rfbClientPtr cl, uint32_t type); /* Each call to rfbStatRecord* adds one to the rect count for that type */ extern void rfbStatRecordEncodingSent(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw); extern void rfbStatRecordEncodingSentAdd(rfbClientPtr cl, uint32_t type, int byteCount); /* Specifically for tight encoding */ extern void rfbStatRecordEncodingRcvd(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw); extern void rfbStatRecordMessageSent(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw); extern void rfbStatRecordMessageRcvd(rfbClientPtr cl, uint32_t type, int byteCount, int byteIfRaw); extern void rfbResetStats(rfbClientPtr cl); extern void rfbPrintStats(rfbClientPtr cl); extern int rfbStatGetSentBytes(rfbClientPtr cl); extern int rfbStatGetSentBytesIfRaw(rfbClientPtr cl); extern int rfbStatGetRcvdBytes(rfbClientPtr cl); extern int rfbStatGetRcvdBytesIfRaw(rfbClientPtr cl); extern int rfbStatGetMessageCountSent(rfbClientPtr cl, uint32_t type); extern int rfbStatGetMessageCountRcvd(rfbClientPtr cl, uint32_t type); extern int rfbStatGetEncodingCountSent(rfbClientPtr cl, uint32_t type); extern int rfbStatGetEncodingCountRcvd(rfbClientPtr cl, uint32_t type); /** Set which version you want to advertise 3.3, 3.6, 3.7 and 3.8 are currently supported*/ extern void rfbSetProtocolVersion(rfbScreenInfoPtr rfbScreen, int major_, int minor_); /** send a TextChat message to a client */ extern rfbBool rfbSendTextChatMessage(rfbClientPtr cl, uint32_t length, char *buffer); #if(defined __cplusplus) } #endif /** * @} */ /** @page libvncserver_doc LibVNCServer Documentation @section create_server Creating a server instance To make a server, you just have to initialise a server structure using the function rfbGetScreen(), like @code rfbScreenInfoPtr screen = rfbGetScreen(argc,argv,screenwidth,screenheight,8,3,bpp); @endcode where byte per pixel should be 1, 2 or 4. If performance doesn't matter, you may try bpp=3 (internally one cannot use native data types in this case; if you want to use this, look at pnmshow24.c). You then can set hooks and io functions (see @ref making_it_interactive) or other options (see @ref server_options). And you allocate the frame buffer like this: @code screen->frameBuffer = (char*)malloc(screenwidth*screenheight*bpp); @endcode After that, you initialize the server, like @code rfbInitServer(screen); @endcode You can use a blocking event loop, a background (pthread based) event loop, or implement your own using the rfbProcessEvents() function. @subsection server_options Optional Server Features These options have to be set between rfbGetScreen() and rfbInitServer(). If you already have a socket to talk to, just set rfbScreenInfo::inetdSock (originally this is for inetd handling, but why not use it for your purpose?). To also start an HTTP server (running on port 5800+display_number), you have to set rfbScreenInfo::httpDir to a directory containing vncviewer.jar and index.vnc (like the included "classes" directory). @section making_it_interactive Making it interactive Whenever you draw something, you have to call @code rfbMarkRectAsModified(screen,x1,y1,x2,y2). @endcode This tells LibVNCServer to send updates to all connected clients. There exist the following IO functions as members of rfbScreen: rfbScreenInfo::kbdAddEvent(), rfbScreenInfo::kbdReleaseAllKeys(), rfbScreenInfo::ptrAddEvent() and rfbScreenInfo::setXCutText() rfbScreenInfo::kbdAddEvent() is called when a key is pressed. rfbScreenInfo::kbdReleaseAllKeys() is not called at all (maybe in the future). rfbScreenInfo::ptrAddEvent() is called when the mouse moves or a button is pressed. WARNING: if you want to have proper cursor handling, call rfbDefaultPtrAddEvent() in your own function. This sets the coordinates of the cursor. rfbScreenInfo::setXCutText() is called when the selection changes. There are only two hooks: rfbScreenInfo::newClientHook() is called when a new client has connected. rfbScreenInfo::displayHook() is called just before a frame buffer update is sent. You can also override the following methods: rfbScreenInfo::getCursorPtr() This could be used to make an animated cursor (if you really want ...) rfbScreenInfo::setTranslateFunction() If you insist on colour maps or something more obscure, you have to implement this. Default is a trueColour mapping. @section cursor_handling Cursor handling The screen holds a pointer rfbScreenInfo::cursor to the current cursor. Whenever you set it, remember that any dynamically created cursor (like return value from rfbMakeXCursor()) is not free'd! The rfbCursor structure consists mainly of a mask and a source. The rfbCursor::mask describes, which pixels are drawn for the cursor (a cursor needn't be rectangular). The rfbCursor::source describes, which colour those pixels should have. The standard is an XCursor: a cursor with a foreground and a background colour (stored in backRed,backGreen,backBlue and the same for foreground in a range from 0-0xffff). Therefore, the arrays "mask" and "source" contain pixels as single bits stored in bytes in MSB order. The rows are padded, such that each row begins with a new byte (i.e. a 10x4 cursor's mask has 2x4 bytes, because 2 bytes are needed to hold 10 bits). It is however very easy to make a cursor like this: @code char* cur=" " " xx " " x " " "; char* mask="xxxx" "xxxx" "xxxx" "xxx "; rfbCursorPtr c=rfbMakeXCursor(4,4,cur,mask); @endcode You can even set rfbCursor::mask to NULL in this call and LibVNCServer will calculate a mask for you (dynamically, so you have to free it yourself). There is also an array named rfbCursor::richSource for colourful cursors. They have the same format as the frameBuffer (i.e. if the server is 32 bit, a 10x4 cursor has 4x10x4 bytes). @section screen_client_difference What is the difference between rfbScreenInfoPtr and rfbClientPtr? The rfbScreenInfoPtr is a pointer to a rfbScreenInfo structure, which holds information about the server, like pixel format, io functions, frame buffer etc. The rfbClientPtr is a pointer to an rfbClientRec structure, which holds information about a client, like pixel format, socket of the connection, etc. A server can have several clients, but needn't have any. So, if you have a server and three clients are connected, you have one instance of a rfbScreenInfo and three instances of rfbClientRec's. The rfbClientRec structure holds a member rfbClientRec::screen which points to the server. So, to access the server from the client structure, you use client->screen. To access all clients from a server be sure to use the provided iterator rfbGetClientIterator() with rfbClientIteratorNext() and rfbReleaseClientIterator() to prevent thread clashes. @section example_code Example Code There are two documented examples included: - example.c, a shared scribble sheet - pnmshow.c, a program to show PNMs (pictures) over the net. The examples are not too well documented, but easy straight forward and a good starting point. Try example.c: it outputs on which port it listens (default: 5900), so it is display 0. To view, call @code vncviewer :0 @endcode You should see a sheet with a gradient and "Hello World!" written on it. Try to paint something. Note that everytime you click, there is some bigger blot, whereas when you drag the mouse while clicked you draw a line. The size of the blot depends on the mouse button you click. Open a second vncviewer with the same parameters and watch it as you paint in the other window. This also works over internet. You just have to know either the name or the IP of your machine. Then it is @code vncviewer machine.where.example.runs.com:0 @endcode or similar for the remote client. Now you are ready to type something. Be sure that your mouse sits still, because everytime the mouse moves, the cursor is reset to the position of the pointer! If you are done with that demo, press the down or up arrows. If your viewer supports it, then the dimensions of the sheet change. Just press Escape in the viewer. Note that the server still runs, even if you closed both windows. When you reconnect now, everything you painted and wrote is still there. You can press "Page Up" for a blank page. The demo pnmshow.c is much simpler: you either provide a filename as argument or pipe a file through stdin. Note that the file has to be a raw pnm/ppm file, i.e. a truecolour graphics. Only the Escape key is implemented. This may be the best starting point if you want to learn how to use LibVNCServer. You are confronted with the fact that the bytes per pixel can only be 8, 16 or 32. */ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbclient.h000066400000000000000000000322331171526373700261110ustar00rootroot00000000000000#ifndef RFBCLIENT_H #define RFBCLIENT_H /** * @defgroup libvncclient_api LibVNCClient API Reference * @{ */ /* * Copyright (C) 2000, 2001 Const Kaplinsky. All Rights Reserved. * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /** * @file rfbclient.h */ #include #include #include #include #include #include #include #ifdef LIBVNCSERVER_WITH_CLIENT_TLS #include #endif #define rfbClientSwap16IfLE(s) \ (*(char *)&client->endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) #define rfbClientSwap32IfLE(l) \ (*(char *)&client->endianTest ? ((((l) & 0xff000000) >> 24) | \ (((l) & 0x00ff0000) >> 8) | \ (((l) & 0x0000ff00) << 8) | \ (((l) & 0x000000ff) << 24)) : (l)) #define rfbClientSwap64IfLE(l) \ (*(char *)&client->endianTest ? ((((l) & 0xff00000000000000ULL) >> 56) | \ (((l) & 0x00ff000000000000ULL) >> 40) | \ (((l) & 0x0000ff0000000000ULL) >> 24) | \ (((l) & 0x000000ff00000000ULL) >> 8) | \ (((l) & 0x00000000ff000000ULL) << 8) | \ (((l) & 0x0000000000ff0000ULL) << 24) | \ (((l) & 0x000000000000ff00ULL) << 40) | \ (((l) & 0x00000000000000ffULL) << 56)) : (l)) #define FLASH_PORT_OFFSET 5400 #define LISTEN_PORT_OFFSET 5500 #define TUNNEL_PORT_OFFSET 5500 #define SERVER_PORT_OFFSET 5900 #define DEFAULT_SSH_CMD "/usr/bin/ssh" #define DEFAULT_TUNNEL_CMD \ (DEFAULT_SSH_CMD " -f -L %L:localhost:%R %H sleep 20") #define DEFAULT_VIA_CMD \ (DEFAULT_SSH_CMD " -f -L %L:%H:%R %G sleep 20") #if(defined __cplusplus) extern "C" { #endif /** vncrec */ typedef struct { FILE* file; struct timeval tv; rfbBool readTimestamp; rfbBool doNotSleep; } rfbVNCRec; /** client data */ typedef struct rfbClientData { void* tag; void* data; struct rfbClientData* next; } rfbClientData; /** app data (belongs into rfbClient?) */ typedef struct { rfbBool shareDesktop; rfbBool viewOnly; const char* encodingsString; rfbBool useBGR233; int nColours; rfbBool forceOwnCmap; rfbBool forceTrueColour; int requestedDepth; int compressLevel; int qualityLevel; rfbBool enableJPEG; rfbBool useRemoteCursor; rfbBool palmVNC; /**< use palmvnc specific SetScale (vs ultravnc) */ int scaleSetting; /**< 0 means no scale set, else 1/scaleSetting */ } AppData; /** For GetCredentialProc callback function to return */ typedef union _rfbCredential { /** X509 (VeNCrypt) */ struct { char *x509CACertFile; char *x509CACrlFile; char *x509ClientCertFile; char *x509ClientKeyFile; } x509Credential; /** Plain (VeNCrypt), MSLogon (UltraVNC) */ struct { char *username; char *password; } userCredential; } rfbCredential; #define rfbCredentialTypeX509 1 #define rfbCredentialTypeUser 2 struct _rfbClient; typedef void (*HandleTextChatProc)(struct _rfbClient* client, int value, char *text); typedef void (*HandleXvpMsgProc)(struct _rfbClient* client, uint8_t version, uint8_t opcode); typedef void (*HandleKeyboardLedStateProc)(struct _rfbClient* client, int value, int pad); typedef rfbBool (*HandleCursorPosProc)(struct _rfbClient* client, int x, int y); typedef void (*SoftCursorLockAreaProc)(struct _rfbClient* client, int x, int y, int w, int h); typedef void (*SoftCursorUnlockScreenProc)(struct _rfbClient* client); typedef void (*GotFrameBufferUpdateProc)(struct _rfbClient* client, int x, int y, int w, int h); typedef void (*FinishedFrameBufferUpdateProc)(struct _rfbClient* client); typedef char* (*GetPasswordProc)(struct _rfbClient* client); typedef rfbCredential* (*GetCredentialProc)(struct _rfbClient* client, int credentialType); typedef rfbBool (*MallocFrameBufferProc)(struct _rfbClient* client); typedef void (*GotXCutTextProc)(struct _rfbClient* client, const char *text, int textlen); typedef void (*BellProc)(struct _rfbClient* client); typedef void (*GotCursorShapeProc)(struct _rfbClient* client, int xhot, int yhot, int width, int height, int bytesPerPixel); typedef void (*GotCopyRectProc)(struct _rfbClient* client, int src_x, int src_y, int w, int h, int dest_x, int dest_y); typedef struct _rfbClient { uint8_t* frameBuffer; int width, height; int endianTest; AppData appData; const char* programName; char* serverHost; int serverPort; /**< if -1, then use file recorded by vncrec */ rfbBool listenSpecified; int listenPort, flashPort; struct { int x, y, w, h; } updateRect; /** Note that the CoRRE encoding uses this buffer and assumes it is big enough to hold 255 * 255 * 32 bits -> 260100 bytes. 640*480 = 307200 bytes. Hextile also assumes it is big enough to hold 16 * 16 * 32 bits. Tight encoding assumes BUFFER_SIZE is at least 16384 bytes. */ #define RFB_BUFFER_SIZE (640*480) char buffer[RFB_BUFFER_SIZE]; /* rfbproto.c */ int sock; rfbBool canUseCoRRE; rfbBool canUseHextile; char *desktopName; rfbPixelFormat format; rfbServerInitMsg si; /* sockets.c */ #define RFB_BUF_SIZE 8192 char buf[RFB_BUF_SIZE]; char *bufoutptr; int buffered; /* The zlib encoding requires expansion/decompression/deflation of the compressed data in the "buffer" above into another, result buffer. However, the size of the result buffer can be determined precisely based on the bitsPerPixel, height and width of the rectangle. We allocate this buffer one time to be the full size of the buffer. */ /* Ultra Encoding uses this buffer too */ int ultra_buffer_size; char *ultra_buffer; int raw_buffer_size; char *raw_buffer; #ifdef LIBVNCSERVER_HAVE_LIBZ z_stream decompStream; rfbBool decompStreamInited; #endif #ifdef LIBVNCSERVER_HAVE_LIBZ /* * Variables for the ``tight'' encoding implementation. */ /** Separate buffer for compressed data. */ #define ZLIB_BUFFER_SIZE 30000 char zlib_buffer[ZLIB_BUFFER_SIZE]; /* Four independent compression streams for zlib library. */ z_stream zlibStream[4]; rfbBool zlibStreamActive[4]; /* Filter stuff. Should be initialized by filter initialization code. */ rfbBool cutZeros; int rectWidth, rectColors; char tightPalette[256*4]; uint8_t tightPrevRow[2048*3*sizeof(uint16_t)]; #ifdef LIBVNCSERVER_HAVE_LIBJPEG /** JPEG decoder state. */ rfbBool jpegError; struct jpeg_source_mgr* jpegSrcManager; void* jpegBufferPtr; size_t jpegBufferLen; #endif #endif /* cursor.c */ uint8_t *rcSource, *rcMask; /** private data pointer */ rfbClientData* clientData; rfbVNCRec* vncRec; /* Keyboard State support (is 'Caps Lock' set on the remote display???) */ int KeyboardLedStateEnabled; int CurrentKeyboardLedState; int canHandleNewFBSize; /* hooks */ HandleTextChatProc HandleTextChat; HandleKeyboardLedStateProc HandleKeyboardLedState; HandleCursorPosProc HandleCursorPos; SoftCursorLockAreaProc SoftCursorLockArea; SoftCursorUnlockScreenProc SoftCursorUnlockScreen; GotFrameBufferUpdateProc GotFrameBufferUpdate; /** the pointer returned by GetPassword will be freed after use! */ GetPasswordProc GetPassword; MallocFrameBufferProc MallocFrameBuffer; GotXCutTextProc GotXCutText; BellProc Bell; GotCursorShapeProc GotCursorShape; GotCopyRectProc GotCopyRect; /** Which messages are supported by the server * This is a *guess* for most servers. * (If we can even detect the type of server) * * If the server supports the "rfbEncodingSupportedMessages" * then this will be updated when the encoding is received to * accurately reflect the servers capabilities. */ rfbSupportedMessages supportedMessages; /** negotiated protocol version */ int major, minor; /** The selected security types */ uint32_t authScheme, subAuthScheme; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS /** The TLS session for Anonymous TLS and VeNCrypt */ gnutls_session_t tlsSession; #endif /** To support security types that requires user input (except VNC password * authentication), for example VeNCrypt and MSLogon, this callback function * must be set before the authentication. Otherwise, it implicates that the * caller application does not support it and related security types should * be bypassed. */ GetCredentialProc GetCredential; /** The 0-terminated security types supported by the client. * Set by function SetClientAuthSchemes() */ uint32_t *clientAuthSchemes; /** When the server is a repeater, this specifies the final destination */ char *destHost; int destPort; /** the QoS IP DSCP for this client */ int QoS_DSCP; /** hook to handle xvp server messages */ HandleXvpMsgProc HandleXvpMsg; /* listen.c */ int listenSock; FinishedFrameBufferUpdateProc FinishedFrameBufferUpdate; } rfbClient; /* cursor.c */ extern rfbBool HandleCursorShape(rfbClient* client,int xhot, int yhot, int width, int height, uint32_t enc); /* listen.c */ extern void listenForIncomingConnections(rfbClient* viewer); extern int listenForIncomingConnectionsNoFork(rfbClient* viewer, int usec_timeout); /* rfbproto.c */ extern rfbBool rfbEnableClientLogging; typedef void (*rfbClientLogProc)(const char *format, ...); extern rfbClientLogProc rfbClientLog,rfbClientErr; extern rfbBool ConnectToRFBServer(rfbClient* client,const char *hostname, int port); extern rfbBool ConnectToRFBRepeater(rfbClient* client,const char *repeaterHost, int repeaterPort, const char *destHost, int destPort); extern void SetClientAuthSchemes(rfbClient* client,const uint32_t *authSchemes, int size); extern rfbBool InitialiseRFBConnection(rfbClient* client); extern rfbBool SetFormatAndEncodings(rfbClient* client); extern rfbBool SendIncrementalFramebufferUpdateRequest(rfbClient* client); extern rfbBool SendFramebufferUpdateRequest(rfbClient* client, int x, int y, int w, int h, rfbBool incremental); extern rfbBool SendScaleSetting(rfbClient* client,int scaleSetting); extern rfbBool SendPointerEvent(rfbClient* client,int x, int y, int buttonMask); extern rfbBool SendKeyEvent(rfbClient* client,uint32_t key, rfbBool down); extern rfbBool SendClientCutText(rfbClient* client,char *str, int len); extern rfbBool HandleRFBServerMessage(rfbClient* client); extern rfbBool TextChatSend(rfbClient* client, char *text); extern rfbBool TextChatOpen(rfbClient* client); extern rfbBool TextChatClose(rfbClient* client); extern rfbBool TextChatFinish(rfbClient* client); extern rfbBool PermitServerInput(rfbClient* client, int enabled); extern rfbBool SendXvpMsg(rfbClient* client, uint8_t version, uint8_t code); extern void PrintPixelFormat(rfbPixelFormat *format); extern rfbBool SupportsClient2Server(rfbClient* client, int messageType); extern rfbBool SupportsServer2Client(rfbClient* client, int messageType); /* client data */ void rfbClientSetClientData(rfbClient* client, void* tag, void* data); void* rfbClientGetClientData(rfbClient* client, void* tag); /* protocol extensions */ typedef struct _rfbClientProtocolExtension { int* encodings; /** returns TRUE if the encoding was handled */ rfbBool (*handleEncoding)(rfbClient* cl, rfbFramebufferUpdateRectHeader* rect); /** returns TRUE if it handled the message */ rfbBool (*handleMessage)(rfbClient* cl, rfbServerToClientMsg* message); struct _rfbClientProtocolExtension* next; } rfbClientProtocolExtension; void rfbClientRegisterExtension(rfbClientProtocolExtension* e); /* sockets.c */ extern rfbBool errorMessageOnReadFailure; extern rfbBool ReadFromRFBServer(rfbClient* client, char *out, unsigned int n); extern rfbBool WriteToRFBServer(rfbClient* client, char *buf, int n); extern int FindFreeTcpPort(void); extern int ListenAtTcpPort(int port); extern int ConnectClientToTcpAddr(unsigned int host, int port); extern int ConnectClientToTcpAddr6(const char *hostname, int port); extern int ConnectClientToUnixSock(const char *sockFile); extern int AcceptTcpConnection(int listenSock); extern rfbBool SetNonBlocking(int sock); extern rfbBool SetDSCP(int sock, int dscp); extern rfbBool StringToIPAddr(const char *str, unsigned int *addr); extern rfbBool SameMachine(int sock); extern int WaitForMessage(rfbClient* client,unsigned int usecs); /* vncviewer.c */ rfbClient* rfbGetClient(int bitsPerSample,int samplesPerPixel,int bytesPerPixel); rfbBool rfbInitClient(rfbClient* client,int* argc,char** argv); /** rfbClientCleanup() does not touch client->frameBuffer */ void rfbClientCleanup(rfbClient* client); #if(defined __cplusplus) } #endif /** * @} */ /** @page libvncclient_doc LibVNCClient Documentation @section example_code Example Code See SDLvncviewer.c for a rather complete client example. */ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbconfig.h000066400000000000000000000054631171526373700261050ustar00rootroot00000000000000#ifndef _RFB_RFBCONFIG_H /* #undef _RFB_RFBCONFIG_H */ /* rfb/rfbconfig.h. Generated automatically by cmake. */ /* Enable 24 bit per pixel in native framebuffer */ #define LIBVNCSERVER_ALLOW24BPP 1 /* work around when write() returns ENOENT but does not mean it */ /* #undef LIBVNCSERVER_ENOENT_WORKAROUND */ /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_FCNTL_H 1 /* Define to 1 if you have the `gettimeofday' function. */ #define LIBVNCSERVER_HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `jpeg' library (-ljpeg). */ #define LIBVNCSERVER_HAVE_LIBJPEG 1 /* Define to 1 if you have the `pthread' library (-lpthread). */ #define LIBVNCSERVER_HAVE_LIBPTHREAD 1 /* Define to 1 if you have the `z' library (-lz). */ #define LIBVNCSERVER_HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_NETINET_IN_H 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_SYS_TYPES_H 1 /* Define to 1 if you have that is POSIX.1 compatible. */ #define LIBVNCSERVER_HAVE_SYS_WAIT_H 1 /* Define to 1 if you have the header file. */ #define LIBVNCSERVER_HAVE_UNISTD_H 1 /* Need a typedef for in_addr_t */ /* #undef LIBVNCSERVER_NEED_INADDR_T */ /* Define to the full name and version of this package. */ #define LIBVNCSERVER_PACKAGE_STRING " " /* Define to the version of this package. */ #define LIBVNCSERVER_PACKAGE_VERSION "" /* Define to 1 if libgcrypt is present */ #define LIBVNCSERVER_WITH_CLIENT_GCRYPT 1 /* Define to 1 if GnuTLS is present */ #define LIBVNCSERVER_WITH_CLIENT_TLS 1 /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #undef LIBVNCSERVER_WORDS_BIGENDIAN */ /* Define to empty if `const' does not conform to ANSI C. */ /* #undef const */ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ //#ifndef __cplusplus /* #undef inline */ //#endif /* Define to `int' if does not define. */ #define HAVE_LIBVNCSERVER_PID_T 1 #ifndef HAVE_LIBVNCSERVER_PID_T typedef int pid_t; #endif /* The type for size_t */ #define HAVE_LIBVNCSERVER_SIZE_T 1 #ifndef HAVE_LIBVNCSERVER_SIZE_T typedef int size_t; #endif /* The type for socklen */ #define HAVE_LIBVNCSERVER_SOCKLEN_T 1 #ifndef HAVE_LIBVNCSERVER_SOCKLEN_T typedef int socklen_t; #endif /* once: _RFB_RFBCONFIG_H */ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbconfig.h.cmake000066400000000000000000000057531171526373700271660ustar00rootroot00000000000000#ifndef _RFB_RFBCONFIG_H #cmakedefine _RFB_RFBCONFIG_H 1 /* rfb/rfbconfig.h. Generated automatically by cmake. */ /* Enable 24 bit per pixel in native framebuffer */ #cmakedefine LIBVNCSERVER_ALLOW24BPP 1 /* work around when write() returns ENOENT but does not mean it */ #cmakedefine LIBVNCSERVER_ENOENT_WORKAROUND 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_FCNTL_H 1 /* Define to 1 if you have the `gettimeofday' function. */ #cmakedefine LIBVNCSERVER_HAVE_GETTIMEOFDAY 1 /* Define to 1 if you have the `jpeg' library (-ljpeg). */ #cmakedefine LIBVNCSERVER_HAVE_LIBJPEG 1 /* Define to 1 if you have the `pthread' library (-lpthread). */ #cmakedefine LIBVNCSERVER_HAVE_LIBPTHREAD 1 /* Define to 1 if you have the `z' library (-lz). */ #cmakedefine LIBVNCSERVER_HAVE_LIBZ 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_NETINET_IN_H 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_SYS_SOCKET_H 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_SYS_STAT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_SYS_TIME_H 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_SYS_TYPES_H 1 /* Define to 1 if you have that is POSIX.1 compatible. */ #cmakedefine LIBVNCSERVER_HAVE_SYS_WAIT_H 1 /* Define to 1 if you have the header file. */ #cmakedefine LIBVNCSERVER_HAVE_UNISTD_H 1 /* Need a typedef for in_addr_t */ #cmakedefine LIBVNCSERVER_NEED_INADDR_T 1 /* Define to the full name and version of this package. */ #define LIBVNCSERVER_PACKAGE_STRING "@FULL_PACKAGE_NAME@ @PACKAGE_VERSION@" /* Define to the version of this package. */ #define LIBVNCSERVER_PACKAGE_VERSION "@PACKAGE_VERSION@" /* Define to 1 if libgcrypt is present */ #cmakedefine LIBVNCSERVER_WITH_CLIENT_GCRYPT 1 /* Define to 1 if GnuTLS is present */ #cmakedefine LIBVNCSERVER_WITH_CLIENT_TLS 1 /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ #cmakedefine LIBVNCSERVER_WORDS_BIGENDIAN 1 /* Define to empty if `const' does not conform to ANSI C. */ //#cmakedefine const @CMAKE_CONST@ /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ //#ifndef __cplusplus //#cmakedefine inline @CMAKE_INLINE@ //#endif /* Define to `int' if does not define. */ #cmakedefine HAVE_LIBVNCSERVER_PID_T 1 #ifndef HAVE_LIBVNCSERVER_PID_T typedef int pid_t; #endif /* The type for size_t */ #cmakedefine HAVE_LIBVNCSERVER_SIZE_T 1 #ifndef HAVE_LIBVNCSERVER_SIZE_T typedef int size_t; #endif /* The type for socklen */ #cmakedefine HAVE_LIBVNCSERVER_SOCKLEN_T 1 #ifndef HAVE_LIBVNCSERVER_SOCKLEN_T typedef int socklen_t; #endif /* once: _RFB_RFBCONFIG_H */ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbint.h.cmake000066400000000000000000000001051171526373700264750ustar00rootroot00000000000000#ifndef _RFB_RFBINT_H #define _RFB_RFBINT_H 1 /* empty ... */ #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbproto.h000066400000000000000000001424041171526373700260000ustar00rootroot00000000000000#ifndef RFBPROTO_H #define RFBPROTO_H /** @mainpage @li @ref libvncserver_api @li @ref libvncserver_doc @li @ref libvncclient_api @li @ref libvncclient_doc */ /* * Copyright (C) 2005 Rohit Kumar, Johannes E. Schindelin * Copyright (C) 2000-2002 Constantin Kaplinsky. All Rights Reserved. * Copyright (C) 2000 Tridia Corporation. All Rights Reserved. * Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, * USA. */ /* * rfbproto.h - header file for the RFB protocol version 3.3 * * Uses types CARD for an n-bit unsigned integer, INT for an n-bit signed * integer (for n = 8, 16 and 32). * * All multiple byte integers are in big endian (network) order (most * significant byte first). Unless noted otherwise there is no special * alignment of protocol structures. * * * Once the initial handshaking is done, all messages start with a type byte, * (usually) followed by message-specific data. The order of definitions in * this file is as follows: * * (1) Structures used in several types of message. * (2) Structures used in the initial handshaking. * (3) Message types. * (4) Encoding types. * (5) For each message type, the form of the data following the type byte. * Sometimes this is defined by a single structure but the more complex * messages have to be explained by comments. */ #if defined(WIN32) && !defined(__MINGW32__) #define LIBVNCSERVER_WORDS_BIGENDIAN #define rfbBool int #include #include #undef SOCKET #define SOCKET int #else #include #include #endif #ifdef LIBVNCSERVER_HAVE_LIBZ #include #ifdef __CHECKER__ #undef Z_NULL #define Z_NULL NULL #endif #endif /* some autotool versions do not properly prefix WORDS_BIGENDIAN, so do that manually */ #ifdef WORDS_BIGENDIAN #define LIBVNCSERVER_WORDS_BIGENDIAN #endif /* MS compilers don't have strncasecmp */ #ifdef _MSC_VER #define strncasecmp _strnicmp #endif #if !defined(WIN32) || defined(__MINGW32__) #define max(a,b) (((a)>(b))?(a):(b)) #ifdef LIBVNCSERVER_HAVE_SYS_TIME_H #include #endif #ifdef LIBVNCSERVER_HAVE_NETINET_IN_H #include #endif #define SOCKET int typedef int8_t rfbBool; #undef FALSE #define FALSE 0 #undef TRUE #define TRUE -1 #endif typedef uint32_t rfbKeySym; typedef uint32_t rfbPixel; #ifdef LIBVNCSERVER_NEED_INADDR_T typedef uint32_t in_addr_t; #endif #ifndef INADDR_NONE #define INADDR_NONE ((in_addr_t) 0xffffffff) #endif #define MAX_ENCODINGS 21 /***************************************************************************** * * Structures used in several messages * *****************************************************************************/ /*----------------------------------------------------------------------------- * Structure used to specify a rectangle. This structure is a multiple of 4 * bytes so that it can be interspersed with 32-bit pixel data without * affecting alignment. */ typedef struct { uint16_t x; uint16_t y; uint16_t w; uint16_t h; } rfbRectangle; #define sz_rfbRectangle 8 /*----------------------------------------------------------------------------- * Structure used to specify pixel format. */ typedef struct { uint8_t bitsPerPixel; /* 8,16,32 only */ uint8_t depth; /* 8 to 32 */ uint8_t bigEndian; /* True if multi-byte pixels are interpreted as big endian, or if single-bit-per-pixel has most significant bit of the byte corresponding to first (leftmost) pixel. Of course this is meaningless for 8 bits/pix */ uint8_t trueColour; /* If false then we need a "colour map" to convert pixels to RGB. If true, xxxMax and xxxShift specify bits used for red, green and blue */ /* the following fields are only meaningful if trueColour is true */ uint16_t redMax; /* maximum red value (= 2^n - 1 where n is the number of bits used for red). Note this value is always in big endian order. */ uint16_t greenMax; /* similar for green */ uint16_t blueMax; /* and blue */ uint8_t redShift; /* number of shifts needed to get the red value in a pixel to the least significant bit. To find the red value from a given pixel, do the following: 1) Swap pixel value according to bigEndian (e.g. if bigEndian is false and host byte order is big endian, then swap). 2) Shift right by redShift. 3) AND with redMax (in host byte order). 4) You now have the red value between 0 and redMax. */ uint8_t greenShift; /* similar for green */ uint8_t blueShift; /* and blue */ uint8_t pad1; uint16_t pad2; } rfbPixelFormat; #define sz_rfbPixelFormat 16 /* UltraVNC: Color settings values */ #define rfbPFFullColors 0 #define rfbPF256Colors 1 #define rfbPF64Colors 2 #define rfbPF8Colors 3 #define rfbPF8GreyColors 4 #define rfbPF4GreyColors 5 #define rfbPF2GreyColors 6 /***************************************************************************** * * Initial handshaking messages * *****************************************************************************/ /*----------------------------------------------------------------------------- * Protocol Version * * The server always sends 12 bytes to start which identifies the latest RFB * protocol version number which it supports. These bytes are interpreted * as a string of 12 ASCII characters in the format "RFB xxx.yyy\n" where * xxx and yyy are the major and minor version numbers (for version 3.3 * this is "RFB 003.003\n"). * * The client then replies with a similar 12-byte message giving the version * number of the protocol which should actually be used (which may be different * to that quoted by the server). * * It is intended that both clients and servers may provide some level of * backwards compatibility by this mechanism. Servers in particular should * attempt to provide backwards compatibility, and even forwards compatibility * to some extent. For example if a client demands version 3.1 of the * protocol, a 3.0 server can probably assume that by ignoring requests for * encoding types it doesn't understand, everything will still work OK. This * will probably not be the case for changes in the major version number. * * The format string below can be used in sprintf or sscanf to generate or * decode the version string respectively. */ #define rfbProtocolVersionFormat "RFB %03d.%03d\n" #define rfbProtocolMajorVersion 3 #define rfbProtocolMinorVersion 8 /* UltraVNC Viewer examines rfbProtocolMinorVersion number (4, and 6) * to identify if the server supports File Transfer */ typedef char rfbProtocolVersionMsg[13]; /* allow extra byte for null */ #define sz_rfbProtocolVersionMsg 12 /* * Negotiation of the security type (protocol version 3.7) * * Once the protocol version has been decided, the server either sends a list * of supported security types, or informs the client about an error (when the * number of security types is 0). Security type rfbSecTypeTight is used to * enable TightVNC-specific protocol extensions. The value rfbSecTypeVncAuth * stands for classic VNC authentication. * * The client selects a particular security type from the list provided by the * server. */ #define rfbSecTypeInvalid 0 #define rfbSecTypeNone 1 #define rfbSecTypeVncAuth 2 /*----------------------------------------------------------------------------- * Authentication * * Once the protocol version has been decided, the server then sends a 32-bit * word indicating whether any authentication is needed on the connection. * The value of this word determines the authentication scheme in use. For * version 3.0 of the protocol this may have one of the following values: */ #define rfbConnFailed 0 #define rfbNoAuth 1 #define rfbVncAuth 2 #define rfbRA2 5 #define rfbRA2ne 6 #define rfbSSPI 7 #define rfbSSPIne 8 #define rfbTight 16 #define rfbUltra 17 #define rfbTLS 18 #define rfbVeNCrypt 19 #define rfbARD 30 #define rfbMSLogon 0xfffffffa #define rfbVeNCryptPlain 256 #define rfbVeNCryptTLSNone 257 #define rfbVeNCryptTLSVNC 258 #define rfbVeNCryptTLSPlain 259 #define rfbVeNCryptX509None 260 #define rfbVeNCryptX509VNC 261 #define rfbVeNCryptX509Plain 262 #define rfbVeNCryptX509SASL 263 #define rfbVeNCryptTLSSASL 264 /* * rfbConnFailed: For some reason the connection failed (e.g. the server * cannot support the desired protocol version). This is * followed by a string describing the reason (where a * string is specified as a 32-bit length followed by that * many ASCII characters). * * rfbNoAuth: No authentication is needed. * * rfbVncAuth: The VNC authentication scheme is to be used. A 16-byte * challenge follows, which the client encrypts as * appropriate using the password and sends the resulting * 16-byte response. If the response is correct, the * server sends the 32-bit word rfbVncAuthOK. If a simple * failure happens, the server sends rfbVncAuthFailed and * closes the connection. If the server decides that too * many failures have occurred, it sends rfbVncAuthTooMany * and closes the connection. In the latter case, the * server should not allow an immediate reconnection by * the client. */ #define rfbVncAuthOK 0 #define rfbVncAuthFailed 1 #define rfbVncAuthTooMany 2 /*----------------------------------------------------------------------------- * Client Initialisation Message * * Once the client and server are sure that they're happy to talk to one * another, the client sends an initialisation message. At present this * message only consists of a boolean indicating whether the server should try * to share the desktop by leaving other clients connected, or give exclusive * access to this client by disconnecting all other clients. */ typedef struct { uint8_t shared; } rfbClientInitMsg; #define sz_rfbClientInitMsg 1 /*----------------------------------------------------------------------------- * Server Initialisation Message * * After the client initialisation message, the server sends one of its own. * This tells the client the width and height of the server's framebuffer, * its pixel format and the name associated with the desktop. */ typedef struct { uint16_t framebufferWidth; uint16_t framebufferHeight; rfbPixelFormat format; /* the server's preferred pixel format */ uint32_t nameLength; /* followed by char name[nameLength] */ } rfbServerInitMsg; #define sz_rfbServerInitMsg (8 + sz_rfbPixelFormat) /* * Following the server initialisation message it's up to the client to send * whichever protocol messages it wants. Typically it will send a * SetPixelFormat message and a SetEncodings message, followed by a * FramebufferUpdateRequest. From then on the server will send * FramebufferUpdate messages in response to the client's * FramebufferUpdateRequest messages. The client should send * FramebufferUpdateRequest messages with incremental set to true when it has * finished processing one FramebufferUpdate and is ready to process another. * With a fast client, the rate at which FramebufferUpdateRequests are sent * should be regulated to avoid hogging the network. */ /***************************************************************************** * * Message types * *****************************************************************************/ /* server -> client */ #define rfbFramebufferUpdate 0 #define rfbSetColourMapEntries 1 #define rfbBell 2 #define rfbServerCutText 3 /* Modif sf@2002 */ #define rfbResizeFrameBuffer 4 #define rfbPalmVNCReSizeFrameBuffer 0xF /* client -> server */ #define rfbSetPixelFormat 0 #define rfbFixColourMapEntries 1 /* not currently supported */ #define rfbSetEncodings 2 #define rfbFramebufferUpdateRequest 3 #define rfbKeyEvent 4 #define rfbPointerEvent 5 #define rfbClientCutText 6 /* Modif sf@2002 - actually bidirectionnal */ #define rfbFileTransfer 7 /* Modif sf@2002 */ #define rfbSetScale 8 /* Modif rdv@2002 */ #define rfbSetServerInput 9 /* Modif rdv@2002 */ #define rfbSetSW 10 /* Modif sf@2002 - TextChat - Bidirectionnal */ #define rfbTextChat 11 /* Modif cs@2005 */ /* PalmVNC 1.4 & 2.0 SetScale Factor message */ #define rfbPalmVNCSetScaleFactor 0xF /* Xvp message - bidirectional */ #define rfbXvp 250 /***************************************************************************** * * Encoding types * *****************************************************************************/ #define rfbEncodingRaw 0 #define rfbEncodingCopyRect 1 #define rfbEncodingRRE 2 #define rfbEncodingCoRRE 4 #define rfbEncodingHextile 5 #define rfbEncodingZlib 6 #define rfbEncodingTight 7 #define rfbEncodingZlibHex 8 #define rfbEncodingUltra 9 #define rfbEncodingZRLE 16 #define rfbEncodingZYWRLE 17 /* Cache & XOR-Zlib - rdv@2002 */ #define rfbEncodingCache 0xFFFF0000 #define rfbEncodingCacheEnable 0xFFFF0001 #define rfbEncodingXOR_Zlib 0xFFFF0002 #define rfbEncodingXORMonoColor_Zlib 0xFFFF0003 #define rfbEncodingXORMultiColor_Zlib 0xFFFF0004 #define rfbEncodingSolidColor 0xFFFF0005 #define rfbEncodingXOREnable 0xFFFF0006 #define rfbEncodingCacheZip 0xFFFF0007 #define rfbEncodingSolMonoZip 0xFFFF0008 #define rfbEncodingUltraZip 0xFFFF0009 /* Xvp pseudo-encoding */ #define rfbEncodingXvp 0xFFFFFECB /* * Special encoding numbers: * 0xFFFFFF00 .. 0xFFFFFF0F -- encoding-specific compression levels; * 0xFFFFFF10 .. 0xFFFFFF1F -- mouse cursor shape data; * 0xFFFFFF20 .. 0xFFFFFF2F -- various protocol extensions; * 0xFFFFFF30 .. 0xFFFFFFDF -- not allocated yet; * 0xFFFFFFE0 .. 0xFFFFFFEF -- quality level for JPEG compressor; * 0xFFFFFFF0 .. 0xFFFFFFFF -- cross-encoding compression levels. */ #define rfbEncodingCompressLevel0 0xFFFFFF00 #define rfbEncodingCompressLevel1 0xFFFFFF01 #define rfbEncodingCompressLevel2 0xFFFFFF02 #define rfbEncodingCompressLevel3 0xFFFFFF03 #define rfbEncodingCompressLevel4 0xFFFFFF04 #define rfbEncodingCompressLevel5 0xFFFFFF05 #define rfbEncodingCompressLevel6 0xFFFFFF06 #define rfbEncodingCompressLevel7 0xFFFFFF07 #define rfbEncodingCompressLevel8 0xFFFFFF08 #define rfbEncodingCompressLevel9 0xFFFFFF09 #define rfbEncodingXCursor 0xFFFFFF10 #define rfbEncodingRichCursor 0xFFFFFF11 #define rfbEncodingPointerPos 0xFFFFFF18 #define rfbEncodingLastRect 0xFFFFFF20 #define rfbEncodingNewFBSize 0xFFFFFF21 #define rfbEncodingQualityLevel0 0xFFFFFFE0 #define rfbEncodingQualityLevel1 0xFFFFFFE1 #define rfbEncodingQualityLevel2 0xFFFFFFE2 #define rfbEncodingQualityLevel3 0xFFFFFFE3 #define rfbEncodingQualityLevel4 0xFFFFFFE4 #define rfbEncodingQualityLevel5 0xFFFFFFE5 #define rfbEncodingQualityLevel6 0xFFFFFFE6 #define rfbEncodingQualityLevel7 0xFFFFFFE7 #define rfbEncodingQualityLevel8 0xFFFFFFE8 #define rfbEncodingQualityLevel9 0xFFFFFFE9 /* LibVNCServer additions. We claim 0xFFFE0000 - 0xFFFE00FF */ #define rfbEncodingKeyboardLedState 0xFFFE0000 #define rfbEncodingSupportedMessages 0xFFFE0001 #define rfbEncodingSupportedEncodings 0xFFFE0002 #define rfbEncodingServerIdentity 0xFFFE0003 /***************************************************************************** * * Server -> client message definitions * *****************************************************************************/ /*----------------------------------------------------------------------------- * FramebufferUpdate - a block of rectangles to be copied to the framebuffer. * * This message consists of a header giving the number of rectangles of pixel * data followed by the rectangles themselves. The header is padded so that * together with the type byte it is an exact multiple of 4 bytes (to help * with alignment of 32-bit pixels): */ typedef struct { uint8_t type; /* always rfbFramebufferUpdate */ uint8_t pad; uint16_t nRects; /* followed by nRects rectangles */ } rfbFramebufferUpdateMsg; #define sz_rfbFramebufferUpdateMsg 4 /* * Each rectangle of pixel data consists of a header describing the position * and size of the rectangle and a type word describing the encoding of the * pixel data, followed finally by the pixel data. Note that if the client has * not sent a SetEncodings message then it will only receive raw pixel data. * Also note again that this structure is a multiple of 4 bytes. */ typedef struct { rfbRectangle r; uint32_t encoding; /* one of the encoding types rfbEncoding... */ } rfbFramebufferUpdateRectHeader; #define sz_rfbFramebufferUpdateRectHeader (sz_rfbRectangle + 4) /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Supported Messages Encoding. This encoding does not contain any pixel data. * Instead, it contains 2 sets of bitflags. These bitflags indicate what messages * are supported by the server. * rect->w contains byte count */ typedef struct { uint8_t client2server[32]; /* maximum of 256 message types (256/8)=32 */ uint8_t server2client[32]; /* maximum of 256 message types (256/8)=32 */ } rfbSupportedMessages; #define sz_rfbSupportedMessages 64 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Supported Encodings Encoding. This encoding does not contain any pixel data. * Instead, it contains a list of (uint32_t) Encodings supported by this server. * rect->w contains byte count * rect->h contains encoding count */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Server Identity Encoding. This encoding does not contain any pixel data. * Instead, it contains a text string containing information about the server. * ie: "x11vnc: 0.8.1 lastmod: 2006-04-25 (libvncserver 0.9pre)\0" * rect->w contains byte count */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Raw Encoding. Pixels are sent in top-to-bottom scanline order, * left-to-right within a scanline with no padding in between. */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * KeyboardLedState Encoding. The X coordinate contains the Locked Modifiers * so that a remote troubleshooter can identify that the users 'Caps Lock' * is set... (It helps a *lot* when the users are untrained) */ #define rfbKeyboardMaskShift 1 #define rfbKeyboardMaskCapsLock 2 #define rfbKeyboardMaskControl 4 #define rfbKeyboardMaskAlt 8 #define rfbKeyboardMaskMeta 16 #define rfbKeyboardMaskSuper 32 #define rfbKeyboardMaskHyper 64 #define rfbKeyboardMaskNumLock 128 #define rfbKeyboardMaskScrollLock 256 #define rfbKeyboardMaskAltGraph 512 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * CopyRect Encoding. The pixels are specified simply by the x and y position * of the source rectangle. */ typedef struct { uint16_t srcX; uint16_t srcY; } rfbCopyRect; #define sz_rfbCopyRect 4 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * RRE - Rise-and-Run-length Encoding. We have an rfbRREHeader structure * giving the number of subrectangles following. Finally the data follows in * the form [...] where each is * []. */ typedef struct { uint32_t nSubrects; } rfbRREHeader; #define sz_rfbRREHeader 4 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * CoRRE - Compact RRE Encoding. We have an rfbRREHeader structure giving * the number of subrectangles following. Finally the data follows in the form * [...] where each is * []. This means that * the whole rectangle must be at most 255x255 pixels. */ typedef struct { uint8_t x; uint8_t y; uint8_t w; uint8_t h; } rfbCoRRERectangle; #define sz_rfbCoRRERectangle 4 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Hextile Encoding. The rectangle is divided up into "tiles" of 16x16 pixels, * starting at the top left going in left-to-right, top-to-bottom order. If * the width of the rectangle is not an exact multiple of 16 then the width of * the last tile in each row will be correspondingly smaller. Similarly if the * height is not an exact multiple of 16 then the height of each tile in the * final row will also be smaller. Each tile begins with a "subencoding" type * byte, which is a mask made up of a number of bits. If the Raw bit is set * then the other bits are irrelevant; w*h pixel values follow (where w and h * are the width and height of the tile). Otherwise the tile is encoded in a * similar way to RRE, except that the position and size of each subrectangle * can be specified in just two bytes. The other bits in the mask are as * follows: * * BackgroundSpecified - if set, a pixel value follows which specifies * the background colour for this tile. The first non-raw tile in a * rectangle must have this bit set. If this bit isn't set then the * background is the same as the last tile. * * ForegroundSpecified - if set, a pixel value follows which specifies * the foreground colour to be used for all subrectangles in this tile. * If this bit is set then the SubrectsColoured bit must be zero. * * AnySubrects - if set, a single byte follows giving the number of * subrectangles following. If not set, there are no subrectangles (i.e. * the whole tile is just solid background colour). * * SubrectsColoured - if set then each subrectangle is preceded by a pixel * value giving the colour of that subrectangle. If not set, all * subrectangles are the same colour, the foreground colour; if the * ForegroundSpecified bit wasn't set then the foreground is the same as * the last tile. * * The position and size of each subrectangle is specified in two bytes. The * Pack macros below can be used to generate the two bytes from x, y, w, h, * and the Extract macros can be used to extract the x, y, w, h values from * the two bytes. */ #define rfbHextileRaw (1 << 0) #define rfbHextileBackgroundSpecified (1 << 1) #define rfbHextileForegroundSpecified (1 << 2) #define rfbHextileAnySubrects (1 << 3) #define rfbHextileSubrectsColoured (1 << 4) #define rfbHextilePackXY(x,y) (((x) << 4) | (y)) #define rfbHextilePackWH(w,h) ((((w)-1) << 4) | ((h)-1)) #define rfbHextileExtractX(byte) ((byte) >> 4) #define rfbHextileExtractY(byte) ((byte) & 0xf) #define rfbHextileExtractW(byte) (((byte) >> 4) + 1) #define rfbHextileExtractH(byte) (((byte) & 0xf) + 1) /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * zlib - zlib compressed Encoding. We have an rfbZlibHeader structure * giving the number of bytes following. Finally the data follows is * zlib compressed version of the raw pixel data as negotiated. * (NOTE: also used by Ultra Encoding) */ typedef struct { uint32_t nBytes; } rfbZlibHeader; #define sz_rfbZlibHeader 4 #ifdef LIBVNCSERVER_HAVE_LIBZ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * Tight Encoding. * *-- The first byte of each Tight-encoded rectangle is a "compression control * byte". Its format is as follows (bit 0 is the least significant one): * * bit 0: if 1, then compression stream 0 should be reset; * bit 1: if 1, then compression stream 1 should be reset; * bit 2: if 1, then compression stream 2 should be reset; * bit 3: if 1, then compression stream 3 should be reset; * bits 7-4: if 1000 (0x08), then the compression type is "fill", * if 1001 (0x09), then the compression type is "jpeg", * if 0xxx, then the compression type is "basic", * values greater than 1001 are not valid. * * If the compression type is "basic", then bits 6..4 of the * compression control byte (those xxx in 0xxx) specify the following: * * bits 5-4: decimal representation is the index of a particular zlib * stream which should be used for decompressing the data; * bit 6: if 1, then a "filter id" byte is following this byte. * *-- The data that follows after the compression control byte described * above depends on the compression type ("fill", "jpeg" or "basic"). * *-- If the compression type is "fill", then the only pixel value follows, in * client pixel format (see NOTE 1). This value applies to all pixels of the * rectangle. * *-- If the compression type is "jpeg", the following data stream looks like * this: * * 1..3 bytes: data size (N) in compact representation; * N bytes: JPEG image. * * Data size is compactly represented in one, two or three bytes, according * to the following scheme: * * 0xxxxxxx (for values 0..127) * 1xxxxxxx 0yyyyyyy (for values 128..16383) * 1xxxxxxx 1yyyyyyy zzzzzzzz (for values 16384..4194303) * * Here each character denotes one bit, xxxxxxx are the least significant 7 * bits of the value (bits 0-6), yyyyyyy are bits 7-13, and zzzzzzzz are the * most significant 8 bits (bits 14-21). For example, decimal value 10000 * should be represented as two bytes: binary 10010000 01001110, or * hexadecimal 90 4E. * *-- If the compression type is "basic" and bit 6 of the compression control * byte was set to 1, then the next (second) byte specifies "filter id" which * tells the decoder what filter type was used by the encoder to pre-process * pixel data before the compression. The "filter id" byte can be one of the * following: * * 0: no filter ("copy" filter); * 1: "palette" filter; * 2: "gradient" filter. * *-- If bit 6 of the compression control byte is set to 0 (no "filter id" * byte), or if the filter id is 0, then raw pixel values in the client * format (see NOTE 1) will be compressed. See below details on the * compression. * *-- The "gradient" filter pre-processes pixel data with a simple algorithm * which converts each color component to a difference between a "predicted" * intensity and the actual intensity. Such a technique does not affect * uncompressed data size, but helps to compress photo-like images better. * Pseudo-code for converting intensities to differences is the following: * * P[i,j] := V[i-1,j] + V[i,j-1] - V[i-1,j-1]; * if (P[i,j] < 0) then P[i,j] := 0; * if (P[i,j] > MAX) then P[i,j] := MAX; * D[i,j] := V[i,j] - P[i,j]; * * Here V[i,j] is the intensity of a color component for a pixel at * coordinates (i,j). MAX is the maximum value of intensity for a color * component. * *-- The "palette" filter converts true-color pixel data to indexed colors * and a palette which can consist of 2..256 colors. If the number of colors * is 2, then each pixel is encoded in 1 bit, otherwise 8 bits is used to * encode one pixel. 1-bit encoding is performed such way that the most * significant bits correspond to the leftmost pixels, and each raw of pixels * is aligned to the byte boundary. When "palette" filter is used, the * palette is sent before the pixel data. The palette begins with an unsigned * byte which value is the number of colors in the palette minus 1 (i.e. 1 * means 2 colors, 255 means 256 colors in the palette). Then follows the * palette itself which consist of pixel values in client pixel format (see * NOTE 1). * *-- The pixel data is compressed using the zlib library. But if the data * size after applying the filter but before the compression is less then 12, * then the data is sent as is, uncompressed. Four separate zlib streams * (0..3) can be used and the decoder should read the actual stream id from * the compression control byte (see NOTE 2). * * If the compression is not used, then the pixel data is sent as is, * otherwise the data stream looks like this: * * 1..3 bytes: data size (N) in compact representation; * N bytes: zlib-compressed data. * * Data size is compactly represented in one, two or three bytes, just like * in the "jpeg" compression method (see above). * *-- NOTE 1. If the color depth is 24, and all three color components are * 8-bit wide, then one pixel in Tight encoding is always represented by * three bytes, where the first byte is red component, the second byte is * green component, and the third byte is blue component of the pixel color * value. This applies to colors in palettes as well. * *-- NOTE 2. The decoder must reset compression streams' states before * decoding the rectangle, if some of bits 0,1,2,3 in the compression control * byte are set to 1. Note that the decoder must reset zlib streams even if * the compression type is "fill" or "jpeg". * *-- NOTE 3. The "gradient" filter and "jpeg" compression may be used only * when bits-per-pixel value is either 16 or 32, not 8. * *-- NOTE 4. The width of any Tight-encoded rectangle cannot exceed 2048 * pixels. If a rectangle is wider, it must be split into several rectangles * and each one should be encoded separately. * */ #define rfbTightExplicitFilter 0x04 #define rfbTightFill 0x08 #define rfbTightJpeg 0x09 #define rfbTightMaxSubencoding 0x09 /* Filters to improve compression efficiency */ #define rfbTightFilterCopy 0x00 #define rfbTightFilterPalette 0x01 #define rfbTightFilterGradient 0x02 #endif /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * XCursor encoding. This is a special encoding used to transmit X-style * cursor shapes from server to clients. Note that for this encoding, * coordinates in rfbFramebufferUpdateRectHeader structure hold hotspot * position (r.x, r.y) and cursor size (r.w, r.h). If (w * h != 0), two RGB * samples are sent after header in the rfbXCursorColors structure. They * denote foreground and background colors of the cursor. If a client * supports only black-and-white cursors, it should ignore these colors and * assume that foreground is black and background is white. Next, two bitmaps * (1 bits per pixel) follow: first one with actual data (value 0 denotes * background color, value 1 denotes foreground color), second one with * transparency data (bits with zero value mean that these pixels are * transparent). Both bitmaps represent cursor data in a byte stream, from * left to right, from top to bottom, and each row is byte-aligned. Most * significant bits correspond to leftmost pixels. The number of bytes in * each row can be calculated as ((w + 7) / 8). If (w * h == 0), cursor * should be hidden (or default local cursor should be set by the client). */ typedef struct { uint8_t foreRed; uint8_t foreGreen; uint8_t foreBlue; uint8_t backRed; uint8_t backGreen; uint8_t backBlue; } rfbXCursorColors; #define sz_rfbXCursorColors 6 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * RichCursor encoding. This is a special encoding used to transmit cursor * shapes from server to clients. It is similar to the XCursor encoding but * uses client pixel format instead of two RGB colors to represent cursor * image. For this encoding, coordinates in rfbFramebufferUpdateRectHeader * structure hold hotspot position (r.x, r.y) and cursor size (r.w, r.h). * After header, two pixmaps follow: first one with cursor image in current * client pixel format (like in raw encoding), second with transparency data * (1 bit per pixel, exactly the same format as used for transparency bitmap * in the XCursor encoding). If (w * h == 0), cursor should be hidden (or * default local cursor should be set by the client). */ /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * ZRLE - encoding combining Zlib compression, tiling, palettisation and * run-length encoding. */ typedef struct { uint32_t length; } rfbZRLEHeader; #define sz_rfbZRLEHeader 4 #define rfbZRLETileWidth 64 #define rfbZRLETileHeight 64 /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * ZLIBHEX - zlib compressed Hextile Encoding. Essentially, this is the * hextile encoding with zlib compression on the tiles that can not be * efficiently encoded with one of the other hextile subencodings. The * new zlib subencoding uses two bytes to specify the length of the * compressed tile and then the compressed data follows. As with the * raw sub-encoding, the zlib subencoding invalidates the other * values, if they are also set. */ #define rfbHextileZlibRaw (1 << 5) #define rfbHextileZlibHex (1 << 6) #define rfbHextileZlibMono (1 << 7) /*----------------------------------------------------------------------------- * SetColourMapEntries - these messages are only sent if the pixel * format uses a "colour map" (i.e. trueColour false) and the client has not * fixed the entire colour map using FixColourMapEntries. In addition they * will only start being sent after the client has sent its first * FramebufferUpdateRequest. So if the client always tells the server to use * trueColour then it never needs to process this type of message. */ typedef struct { uint8_t type; /* always rfbSetColourMapEntries */ uint8_t pad; uint16_t firstColour; uint16_t nColours; /* Followed by nColours * 3 * uint16_t r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ } rfbSetColourMapEntriesMsg; #define sz_rfbSetColourMapEntriesMsg 6 /*----------------------------------------------------------------------------- * Bell - ring a bell on the client if it has one. */ typedef struct { uint8_t type; /* always rfbBell */ } rfbBellMsg; #define sz_rfbBellMsg 1 /*----------------------------------------------------------------------------- * ServerCutText - the server has new text in its cut buffer. */ typedef struct { uint8_t type; /* always rfbServerCutText */ uint8_t pad1; uint16_t pad2; uint32_t length; /* followed by char text[length] */ } rfbServerCutTextMsg; #define sz_rfbServerCutTextMsg 8 /*----------------------------------------------------------------------------- * // Modif sf@2002 * FileTransferMsg - The client sends FileTransfer message. * Bidirectional message - Files can be sent from client to server & vice versa */ typedef struct _rfbFileTransferMsg { uint8_t type; /* always rfbFileTransfer */ uint8_t contentType; /* See defines below */ uint8_t contentParam;/* Other possible content classification (Dir or File name, etc..) */ uint8_t pad; /* It appears that UltraVNC *forgot* to Swap16IfLE(contentParam) */ uint32_t size; /* FileSize or packet index or error or other */ /* uint32_t sizeH; Additional 32Bits params to handle big values. Only for V2 (we want backward compatibility between all V1 versions) */ uint32_t length; /* followed by data char text[length] */ } rfbFileTransferMsg; #define sz_rfbFileTransferMsg 12 #define rfbFileTransferVersion 2 /* v1 is the old FT version ( <= 1.0.0 RC18 versions) */ /* FileTransfer Content types and Params defines */ #define rfbDirContentRequest 1 /* Client asks for the content of a given Server directory */ #define rfbDirPacket 2 /* Full directory name or full file name. */ /* Null content means end of Directory */ #define rfbFileTransferRequest 3 /* Client asks the server for the transfer of a given file */ #define rfbFileHeader 4 /* First packet of a file transfer, containing file's features */ #define rfbFilePacket 5 /* One chunk of the file */ #define rfbEndOfFile 6 /* End of file transfer (the file has been received or error) */ #define rfbAbortFileTransfer 7 /* The file transfer must be aborted, whatever the state */ #define rfbFileTransferOffer 8 /* The client offers to send a file to the server */ #define rfbFileAcceptHeader 9 /* The server accepts or rejects the file */ #define rfbCommand 10 /* The Client sends a simple command (File Delete, Dir create etc...) */ #define rfbCommandReturn 11 /* The Client receives the server's answer about a simple command */ #define rfbFileChecksums 12 /* The zipped checksums of the destination file (Delta Transfer) */ #define rfbFileTransferAccess 14 /* Request FileTransfer authorization */ /* rfbDirContentRequest client Request - content params */ #define rfbRDirContent 1 /* Request a Server Directory contents */ #define rfbRDrivesList 2 /* Request the server's drives list */ #define rfbRDirRecursiveList 3 /* Request a server directory content recursive sorted list */ #define rfbRDirRecursiveSize 4 /* Request a server directory content recursive size */ /* rfbDirPacket & rfbCommandReturn server Answer - content params */ #define rfbADirectory 1 /* Reception of a directory name */ #define rfbAFile 2 /* Reception of a file name */ #define rfbADrivesList 3 /* Reception of a list of drives */ #define rfbADirCreate 4 /* Response to a create dir command */ #define rfbADirDelete 5 /* Response to a delete dir command */ #define rfbAFileCreate 6 /* Response to a create file command */ #define rfbAFileDelete 7 /* Response to a delete file command */ #define rfbAFileRename 8 /* Response to a rename file command */ #define rfbADirRename 9 /* Response to a rename dir command */ #define rfbADirRecursiveListItem 10 #define rfbADirRecursiveSize 11 /* rfbCommand Command - content params */ #define rfbCDirCreate 1 /* Request the server to create the given directory */ #define rfbCDirDelete 2 /* Request the server to delete the given directory */ #define rfbCFileCreate 3 /* Request the server to create the given file */ #define rfbCFileDelete 4 /* Request the server to delete the given file */ #define rfbCFileRename 5 /* Request the server to rename the given file */ #define rfbCDirRename 6 /* Request the server to rename the given directory */ /* Errors - content params or "size" field */ #define rfbRErrorUnknownCmd 1 /* Unknown FileTransfer command. */ #define rfbRErrorCmd 0xFFFFFFFF/* Error when a command fails on remote side (ret in "size" field) */ #define sz_rfbBlockSize 8192 /* Size of a File Transfer packet (before compression) */ #define rfbZipDirectoryPrefix "!UVNCDIR-\0" /* Transfered directory are zipped in a file with this prefix. Must end with "-" */ #define sz_rfbZipDirectoryPrefix 9 #define rfbDirPrefix "[ " #define rfbDirSuffix " ]" /*----------------------------------------------------------------------------- * Modif sf@2002 * TextChatMsg - Utilized to order the TextChat mode on server or client * Bidirectional message */ typedef struct _rfbTextChatMsg { uint8_t type; /* always rfbTextChat */ uint8_t pad1; /* Could be used later as an additionnal param */ uint16_t pad2; /* Could be used later as text offset, for instance */ uint32_t length; /* Specific values for Open, close, finished (-1, -2, -3) */ /* followed by char text[length] */ } rfbTextChatMsg; #define sz_rfbTextChatMsg 8 #define rfbTextMaxSize 4096 #define rfbTextChatOpen 0xFFFFFFFF #define rfbTextChatClose 0xFFFFFFFE #define rfbTextChatFinished 0xFFFFFFFD /*----------------------------------------------------------------------------- * Xvp Message * Bidirectional message * A server which supports the xvp extension declares this by sending a message * with an Xvp_INIT xvp-message-code when it receives a request from the client * to use the xvp Pseudo-encoding. The server must specify in this message the * highest xvp-extension-version it supports: the client may assume that the * server supports all versions from 1 up to this value. The client is then * free to use any supported version. Currently, only version 1 is defined. * * A server which subsequently receives an xvp Client Message requesting an * operation which it is unable to perform, informs the client of this by * sending a message with an Xvp_FAIL xvp-message-code, and the same * xvp-extension-version as included in the client's operation request. * * A client supporting the xvp extension sends this to request that the server * initiate a clean shutdown, clean reboot or abrupt reset of the system whose * framebuffer the client is displaying. */ typedef struct { uint8_t type; /* always rfbXvp */ uint8_t pad; uint8_t version; /* xvp extension version */ uint8_t code; /* xvp message code */ } rfbXvpMsg; #define sz_rfbXvpMsg (4) /* server message codes */ #define rfbXvp_Fail 0 #define rfbXvp_Init 1 /* client message codes */ #define rfbXvp_Shutdown 2 #define rfbXvp_Reboot 3 #define rfbXvp_Reset 4 /*----------------------------------------------------------------------------- * Modif sf@2002 * ResizeFrameBuffer - The Client must change the size of its framebuffer */ typedef struct _rfbResizeFrameBufferMsg { uint8_t type; /* always rfbResizeFrameBuffer */ uint8_t pad1; uint16_t framebufferWidth; /* FrameBuffer width */ uint16_t framebufferHeigth; /* FrameBuffer height */ } rfbResizeFrameBufferMsg; #define sz_rfbResizeFrameBufferMsg 6 /*----------------------------------------------------------------------------- * Copyright (C) 2001 Harakan Software * PalmVNC 1.4 & 2.? ResizeFrameBuffer message * ReSizeFrameBuffer - tell the RFB client to alter its framebuffer, either * due to a resize of the server desktop or a client-requested scaling factor. * The pixel format remains unchanged. */ typedef struct { uint8_t type; /* always rfbReSizeFrameBuffer */ uint8_t pad1; uint16_t desktop_w; /* Desktop width */ uint16_t desktop_h; /* Desktop height */ uint16_t buffer_w; /* FrameBuffer width */ uint16_t buffer_h; /* Framebuffer height */ uint16_t pad2; } rfbPalmVNCReSizeFrameBufferMsg; #define sz_rfbPalmVNCReSizeFrameBufferMsg (12) /*----------------------------------------------------------------------------- * Union of all server->client messages. */ typedef union { uint8_t type; rfbFramebufferUpdateMsg fu; rfbSetColourMapEntriesMsg scme; rfbBellMsg b; rfbServerCutTextMsg sct; rfbResizeFrameBufferMsg rsfb; rfbPalmVNCReSizeFrameBufferMsg prsfb; rfbFileTransferMsg ft; rfbTextChatMsg tc; rfbXvpMsg xvp; } rfbServerToClientMsg; /*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * RDV Cache Encoding. * special is not used at this point, can be used to reset cache or other specials * just put it to make sure we don't have to change the encoding again. */ typedef struct { uint16_t special; } rfbCacheRect; #define sz_rfbCacheRect 2 /***************************************************************************** * * Message definitions (client -> server) * *****************************************************************************/ /*----------------------------------------------------------------------------- * SetPixelFormat - tell the RFB server the format in which the client wants * pixels sent. */ typedef struct { uint8_t type; /* always rfbSetPixelFormat */ uint8_t pad1; uint16_t pad2; rfbPixelFormat format; } rfbSetPixelFormatMsg; #define sz_rfbSetPixelFormatMsg (sz_rfbPixelFormat + 4) /*----------------------------------------------------------------------------- * FixColourMapEntries - when the pixel format uses a "colour map", fix * read-only colour map entries. * * ***************** NOT CURRENTLY SUPPORTED ***************** */ typedef struct { uint8_t type; /* always rfbFixColourMapEntries */ uint8_t pad; uint16_t firstColour; uint16_t nColours; /* Followed by nColours * 3 * uint16_t r1, g1, b1, r2, g2, b2, r3, g3, b3, ..., rn, bn, gn */ } rfbFixColourMapEntriesMsg; #define sz_rfbFixColourMapEntriesMsg 6 /*----------------------------------------------------------------------------- * SetEncodings - tell the RFB server which encoding types we accept. Put them * in order of preference, if we have any. We may always receive raw * encoding, even if we don't specify it here. */ typedef struct { uint8_t type; /* always rfbSetEncodings */ uint8_t pad; uint16_t nEncodings; /* followed by nEncodings * uint32_t encoding types */ } rfbSetEncodingsMsg; #define sz_rfbSetEncodingsMsg 4 /*----------------------------------------------------------------------------- * FramebufferUpdateRequest - request for a framebuffer update. If incremental * is true then the client just wants the changes since the last update. If * false then it wants the whole of the specified rectangle. */ typedef struct { uint8_t type; /* always rfbFramebufferUpdateRequest */ uint8_t incremental; uint16_t x; uint16_t y; uint16_t w; uint16_t h; } rfbFramebufferUpdateRequestMsg; #define sz_rfbFramebufferUpdateRequestMsg 10 /*----------------------------------------------------------------------------- * KeyEvent - key press or release * * Keys are specified using the "keysym" values defined by the X Window System. * For most ordinary keys, the keysym is the same as the corresponding ASCII * value. Other common keys are: * * BackSpace 0xff08 * Tab 0xff09 * Return or Enter 0xff0d * Escape 0xff1b * Insert 0xff63 * Delete 0xffff * Home 0xff50 * End 0xff57 * Page Up 0xff55 * Page Down 0xff56 * Left 0xff51 * Up 0xff52 * Right 0xff53 * Down 0xff54 * F1 0xffbe * F2 0xffbf * ... ... * F12 0xffc9 * Shift 0xffe1 * Control 0xffe3 * Meta 0xffe7 * Alt 0xffe9 */ typedef struct { uint8_t type; /* always rfbKeyEvent */ uint8_t down; /* true if down (press), false if up */ uint16_t pad; uint32_t key; /* key is specified as an X keysym */ } rfbKeyEventMsg; #define sz_rfbKeyEventMsg 8 /*----------------------------------------------------------------------------- * PointerEvent - mouse/pen move and/or button press. */ typedef struct { uint8_t type; /* always rfbPointerEvent */ uint8_t buttonMask; /* bits 0-7 are buttons 1-8, 0=up, 1=down */ uint16_t x; uint16_t y; } rfbPointerEventMsg; #define rfbButton1Mask 1 #define rfbButton2Mask 2 #define rfbButton3Mask 4 #define rfbButton4Mask 8 #define rfbButton5Mask 16 /* RealVNC 335 method */ #define rfbWheelUpMask rfbButton4Mask #define rfbWheelDownMask rfbButton5Mask #define sz_rfbPointerEventMsg 6 /*----------------------------------------------------------------------------- * ClientCutText - the client has new text in its cut buffer. */ typedef struct { uint8_t type; /* always rfbClientCutText */ uint8_t pad1; uint16_t pad2; uint32_t length; /* followed by char text[length] */ } rfbClientCutTextMsg; #define sz_rfbClientCutTextMsg 8 /*----------------------------------------------------------------------------- * sf@2002 - Set Server Scale * SetServerScale - Server must change the scale of the client buffer. */ typedef struct _rfbSetScaleMsg { uint8_t type; /* always rfbSetScale */ uint8_t scale; /* Scale value 1server messages. */ typedef union { uint8_t type; rfbSetPixelFormatMsg spf; rfbFixColourMapEntriesMsg fcme; rfbSetEncodingsMsg se; rfbFramebufferUpdateRequestMsg fur; rfbKeyEventMsg ke; rfbPointerEventMsg pe; rfbClientCutTextMsg cct; rfbSetScaleMsg ssc; rfbPalmVNCSetScaleFactorMsg pssf; rfbSetServerInputMsg sim; rfbFileTransferMsg ft; rfbSetSWMsg sw; rfbTextChatMsg tc; rfbXvpMsg xvp; } rfbClientToServerMsg; /* * vncauth.h - describes the functions provided by the vncauth library. */ #define MAXPWLEN 8 #define CHALLENGESIZE 16 extern int rfbEncryptAndStorePasswd(char *passwd, char *fname); extern char *rfbDecryptPasswdFromFile(char *fname); extern void rfbRandomBytes(unsigned char *bytes); extern void rfbEncryptBytes(unsigned char *bytes, char *passwd); #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfb/rfbregion.h000066400000000000000000000035231171526373700261160ustar00rootroot00000000000000#ifndef SRAREGION_H #define SRAREGION_H /* -=- SRA - Simple Region Algorithm * A simple rectangular region implementation. * Copyright (c) 2001 James "Wez" Weatherall, Johannes E. Schindelin */ /* -=- sraRect */ typedef struct _rect { int x1; int y1; int x2; int y2; } sraRect; typedef struct sraRegion sraRegion; /* -=- Region manipulation functions */ extern sraRegion *sraRgnCreate(); extern sraRegion *sraRgnCreateRect(int x1, int y1, int x2, int y2); extern sraRegion *sraRgnCreateRgn(const sraRegion *src); extern void sraRgnDestroy(sraRegion *rgn); extern void sraRgnMakeEmpty(sraRegion *rgn); extern rfbBool sraRgnAnd(sraRegion *dst, const sraRegion *src); extern void sraRgnOr(sraRegion *dst, const sraRegion *src); extern rfbBool sraRgnSubtract(sraRegion *dst, const sraRegion *src); extern void sraRgnOffset(sraRegion *dst, int dx, int dy); extern rfbBool sraRgnPopRect(sraRegion *region, sraRect *rect, unsigned long flags); extern unsigned long sraRgnCountRects(const sraRegion *rgn); extern rfbBool sraRgnEmpty(const sraRegion *rgn); extern sraRegion *sraRgnBBox(const sraRegion *src); /* -=- rectangle iterator */ typedef struct sraRectangleIterator { rfbBool reverseX,reverseY; int ptrSize,ptrPos; struct sraSpan** sPtrs; } sraRectangleIterator; extern sraRectangleIterator *sraRgnGetIterator(sraRegion *s); extern sraRectangleIterator *sraRgnGetReverseIterator(sraRegion *s,rfbBool reverseX,rfbBool reverseY); extern rfbBool sraRgnIteratorNext(sraRectangleIterator *i,sraRect *r); extern void sraRgnReleaseIterator(sraRectangleIterator *i); void sraRgnPrint(const sraRegion *s); /* -=- Rectangle clipper (for speed) */ extern rfbBool sraClipRect(int *x, int *y, int *w, int *h, int cx, int cy, int cw, int ch); extern rfbBool sraClipRect2(int *x, int *y, int *x2, int *y2, int cx, int cy, int cx2, int cy2); #endif FreeRDP-Remmina-356c033/remmina-plugins/vnc/libvncserver/rfbconfig.h.in000066400000000000000000000245431171526373700257410ustar00rootroot00000000000000/* rfbconfig.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Enable 24 bit per pixel in native framebuffer */ #undef ALLOW24BPP /* work around when write() returns ENOENT but does not mean it */ #undef ENOENT_WORKAROUND /* Use ffmpeg (for vnc2mpg) */ #undef FFMPEG /* Define to 1 if you have the header file. */ #undef HAVE_ARPA_INET_H /* Avahi/mDNS client build environment present */ #undef HAVE_AVAHI /* Define to 1 if you have the `crypt' function. */ #undef HAVE_CRYPT /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ #undef HAVE_DOPRNT /* DPMS extension build environment present */ #undef HAVE_DPMS /* FBPM extension build environment present */ #undef HAVE_FBPM /* Define to 1 if you have the header file. */ #undef HAVE_FCNTL_H /* Define to 1 if you have the `fork' function. */ #undef HAVE_FORK /* Define to 1 if you have the `ftime' function. */ #undef HAVE_FTIME /* Define to 1 if you have the `geteuid' function. */ #undef HAVE_GETEUID /* Define to 1 if you have the `gethostbyname' function. */ #undef HAVE_GETHOSTBYNAME /* Define to 1 if you have the `gethostname' function. */ #undef HAVE_GETHOSTNAME /* Define to 1 if you have the `getpwnam' function. */ #undef HAVE_GETPWNAM /* Define to 1 if you have the `getpwuid' function. */ #undef HAVE_GETPWUID /* Define to 1 if you have the `getspnam' function. */ #undef HAVE_GETSPNAM /* Define to 1 if you have the `gettimeofday' function. */ #undef HAVE_GETTIMEOFDAY /* Define to 1 if you have the `getuid' function. */ #undef HAVE_GETUID /* Define to 1 if you have the `grantpt' function. */ #undef HAVE_GRANTPT /* Define to 1 if you have the `inet_ntoa' function. */ #undef HAVE_INET_NTOA /* Define to 1 if you have the `initgroups' function. */ #undef HAVE_INITGROUPS /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* IRIX XReadDisplay available */ #undef HAVE_IRIX_XREADDISPLAY /* libcrypt library present */ #undef HAVE_LIBCRYPT /* openssl libcrypto library present */ #undef HAVE_LIBCRYPTO /* Define to 1 if you have the `cygipc' library (-lcygipc). */ #undef HAVE_LIBCYGIPC /* Define to 1 if you have the `jpeg' library (-ljpeg). */ #undef HAVE_LIBJPEG /* Define to 1 if you have the `nsl' library (-lnsl). */ #undef HAVE_LIBNSL /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `socket' library (-lsocket). */ #undef HAVE_LIBSOCKET /* openssl libssl library present */ #undef HAVE_LIBSSL /* XDAMAGE extension build environment present */ #undef HAVE_LIBXDAMAGE /* XFIXES extension build environment present */ #undef HAVE_LIBXFIXES /* XINERAMA extension build environment present */ #undef HAVE_LIBXINERAMA /* XRANDR extension build environment present */ #undef HAVE_LIBXRANDR /* DEC-XTRAP extension build environment present */ #undef HAVE_LIBXTRAP /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ /* linux fb device build environment present */ #undef HAVE_LINUX_FB_H /* linux/input.h present */ #undef HAVE_LINUX_INPUT_H /* linux uinput device build environment present */ #undef HAVE_LINUX_UINPUT_H /* video4linux build environment present */ #undef HAVE_LINUX_VIDEODEV_H /* build MacOS X native display support */ #undef HAVE_MACOSX_NATIVE_DISPLAY /* MacOS X OpenGL present */ #undef HAVE_MACOSX_OPENGL_H /* Define to 1 if you have the `memmove' function. */ #undef HAVE_MEMMOVE /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `memset' function. */ #undef HAVE_MEMSET /* Define to 1 if you have the `mkfifo' function. */ #undef HAVE_MKFIFO /* Define to 1 if you have the `mmap' function. */ #undef HAVE_MMAP /* Define to 1 if you have the header file. */ #undef HAVE_NETDB_H /* Define to 1 if you have the header file. */ #undef HAVE_NETINET_IN_H /* Define to 1 if you have the header file. */ #undef HAVE_PWD_H /* RECORD extension build environment present */ #undef HAVE_RECORD /* Define to 1 if you have the `select' function. */ #undef HAVE_SELECT /* Define to 1 if you have the `setegid' function. */ #undef HAVE_SETEGID /* Define to 1 if you have the `seteuid' function. */ #undef HAVE_SETEUID /* Define to 1 if you have the `setgid' function. */ #undef HAVE_SETGID /* Define to 1 if you have the `setpgrp' function. */ #undef HAVE_SETPGRP /* Define to 1 if you have the `setsid' function. */ #undef HAVE_SETSID /* Define to 1 if you have the `setuid' function. */ #undef HAVE_SETUID /* Define to 1 if you have the `setutxent' function. */ #undef HAVE_SETUTXENT /* Define to 1 if you have the `shmat' function. */ #undef HAVE_SHMAT /* Define to 1 if you have the `socket' function. */ #undef HAVE_SOCKET /* Solaris XReadScreen available */ #undef HAVE_SOLARIS_XREADSCREEN /* Define to 1 if `stat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_STAT_EMPTY_STRING_BUG /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the `strchr' function. */ #undef HAVE_STRCHR /* Define to 1 if you have the `strcspn' function. */ #undef HAVE_STRCSPN /* Define to 1 if you have the `strdup' function. */ #undef HAVE_STRDUP /* Define to 1 if you have the `strerror' function. */ #undef HAVE_STRERROR /* Define to 1 if you have the `strftime' function. */ #undef HAVE_STRFTIME /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the `strstr' function. */ #undef HAVE_STRSTR /* Define to 1 if you have the header file. */ #undef HAVE_SYSLOG_H /* Use the system libvncserver build environment for x11vnc. */ #undef HAVE_SYSTEM_LIBVNCSERVER /* Define to 1 if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SOCKET_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STROPTS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIMEB_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have that is POSIX.1 compatible. */ #undef HAVE_SYS_WAIT_H /* Define to 1 if you have the header file. */ #undef HAVE_TERMIOS_H /* Define to 1 if compiler supports __thread */ #undef HAVE_TLS /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define to 1 if you have the header file. */ #undef HAVE_UTMPX_H /* Define to 1 if you have the `vfork' function. */ #undef HAVE_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_VFORK_H /* Define to 1 if you have the `vprintf' function. */ #undef HAVE_VPRINTF /* Define to 1 if you have the `waitpid' function. */ #undef HAVE_WAITPID /* Define to 1 if `fork' works. */ #undef HAVE_WORKING_FORK /* Define to 1 if `vfork' works. */ #undef HAVE_WORKING_VFORK /* Define to 1 if you have the header file. */ #undef HAVE_WS2TCPIP_H /* X11 build environment present */ #undef HAVE_X11 /* open ssl X509_print_ex_fp available */ #undef HAVE_X509_PRINT_EX_FP /* XKEYBOARD extension build environment present */ #undef HAVE_XKEYBOARD /* MIT-SHM extension build environment present */ #undef HAVE_XSHM /* XTEST extension build environment present */ #undef HAVE_XTEST /* XTEST extension has XTestGrabControl */ #undef HAVE_XTESTGRABCONTROL /* Enable IPv6 support */ #undef IPv6 /* Define to 1 if `lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK /* Need a typedef for in_addr_t */ #undef NEED_INADDR_T /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* Name of package */ #undef PACKAGE /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* The number of bytes in type char */ #undef SIZEOF_CHAR /* The number of bytes in type int */ #undef SIZEOF_INT /* The number of bytes in type long */ #undef SIZEOF_LONG /* The number of bytes in type short */ #undef SIZEOF_SHORT /* The number of bytes in type void* */ #undef SIZEOF_VOIDP /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define to 1 if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Version number of package */ #undef VERSION /* Enable support for libgcrypt in libvncclient */ #undef WITH_CLIENT_GCRYPT /* Enable support for gnutls in libvncclient */ #undef WITH_CLIENT_TLS /* Disable TightVNCFileTransfer protocol */ #undef WITH_TIGHTVNC_FILETRANSFER /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Define to empty if `const' does not conform to ANSI C. */ #undef const /* Define to `__inline__' or `__inline' if that's what the C compiler calls it, or to nothing if 'inline' is not supported under any name. */ #ifndef __cplusplus #undef inline #endif /* Define to `int' if does not define. */ #undef pid_t /* Define to `unsigned int' if does not define. */ #undef size_t /* The type for socklen */ #undef socklen_t /* Define as `fork' if `vfork' does not work. */ #undef vfork FreeRDP-Remmina-356c033/remmina-plugins/vnc/vnc_plugin.c000066400000000000000000001646571171526373700230430ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #define REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY 1 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY 2 #define REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT 3 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH 4 #define REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT 5 #define REMMINA_PLUGIN_VNC_FEATURE_SCALE 6 #define REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS 7 typedef struct _RemminaPluginVncData { /* Whether the user requests to connect/disconnect */ gboolean connected; /* Whether the vnc process is running */ gboolean running; /* Whether the initialzation calls the authentication process */ gboolean auth_called; /* Whether it is the first attempt for authentication. Only first attempt will try to use cached credentials */ gboolean auth_first; GtkWidget *drawing_area; guchar *vnc_buffer; GdkPixbuf *rgb_buffer; GdkPixbuf *scale_buffer; gint scale_width; gint scale_height; guint scale_handler; gint queuedraw_x, queuedraw_y, queuedraw_w, queuedraw_h; guint queuedraw_handler; gulong clipboard_handler; GTimeVal clipboard_timer; GdkPixbuf *queuecursor_pixbuf; gint queuecursor_x, queuecursor_y; guint queuecursor_handler; gpointer client; gint listen_sock; gint button_mask; GPtrArray *pressed_keys; GQueue *vnc_event_queue; gint vnc_event_pipe[2]; #ifdef HAVE_PTHREAD pthread_t thread; pthread_mutex_t buffer_mutex; #else gint thread; #endif } RemminaPluginVncData; static RemminaPluginService *remmina_plugin_service = NULL; static int dot_cursor_x_hot = 2; static int dot_cursor_y_hot = 2; static const gchar * dot_cursor_xpm[] = { "5 5 3 1", " c None", ". c #000000", "+ c #FFFFFF", " ... ", ".+++.", ".+ +.", ".+++.", " ... " }; #ifdef HAVE_PTHREAD #define LOCK_BUFFER(t) if(t){CANCEL_DEFER}pthread_mutex_lock(&gpdata->buffer_mutex); #define UNLOCK_BUFFER(t) pthread_mutex_unlock(&gpdata->buffer_mutex);if(t){CANCEL_ASYNC} #else #define LOCK_BUFFER(t) #define UNLOCK_BUFFER(t) #endif enum { REMMINA_PLUGIN_VNC_EVENT_KEY, REMMINA_PLUGIN_VNC_EVENT_POINTER, REMMINA_PLUGIN_VNC_EVENT_CUTTEXT, REMMINA_PLUGIN_VNC_EVENT_CHAT_OPEN, REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND, REMMINA_PLUGIN_VNC_EVENT_CHAT_CLOSE }; typedef struct _RemminaPluginVncEvent { gint event_type; union { struct { guint keyval; gboolean pressed; } key; struct { gint x; gint y; gint button_mask; } pointer; struct { gchar *text; } text; } event_data; } RemminaPluginVncEvent; static void remmina_plugin_vnc_event_push(RemminaProtocolWidget *gp, gint event_type, gpointer p1, gpointer p2, gpointer p3) { RemminaPluginVncData *gpdata; RemminaPluginVncEvent *event; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); event = g_new(RemminaPluginVncEvent, 1); event->event_type = event_type; switch (event_type) { case REMMINA_PLUGIN_VNC_EVENT_KEY: event->event_data.key.keyval = GPOINTER_TO_UINT(p1); event->event_data.key.pressed = GPOINTER_TO_INT(p2); break; case REMMINA_PLUGIN_VNC_EVENT_POINTER: event->event_data.pointer.x = GPOINTER_TO_INT(p1); event->event_data.pointer.y = GPOINTER_TO_INT(p2); event->event_data.pointer.button_mask = GPOINTER_TO_INT(p3); break; case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT: case REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND: event->event_data.text.text = g_strdup((char*) p1); break; default: break; } g_queue_push_tail(gpdata->vnc_event_queue, event); if (write(gpdata->vnc_event_pipe[1], "\0", 1)) { /* Ignore */ } } static void remmina_plugin_vnc_event_free(RemminaPluginVncEvent *event) { switch (event->event_type) { case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT: case REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND: g_free(event->event_data.text.text); break; default: break; } g_free(event); } static void remmina_plugin_vnc_event_free_all(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaPluginVncEvent *event; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); while ((event = g_queue_pop_head(gpdata->vnc_event_queue)) != NULL) { remmina_plugin_vnc_event_free(event); } } static void remmina_plugin_vnc_scale_area(RemminaProtocolWidget *gp, gint *x, gint *y, gint *w, gint *h) { RemminaPluginVncData *gpdata; gint sx, sy, sw, sh; gint width, height; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (gpdata->rgb_buffer == NULL || gpdata->scale_buffer == NULL) return; width = remmina_plugin_service->protocol_plugin_get_width(gp); height = remmina_plugin_service->protocol_plugin_get_height(gp); if (gpdata->scale_width == width && gpdata->scale_height == height) { /* Same size, just copy the pixels */ gdk_pixbuf_copy_area(gpdata->rgb_buffer, *x, *y, *w, *h, gpdata->scale_buffer, *x, *y); return; } /* We have to extend the scaled region 2 scaled pixels, to avoid gaps */ sx = MIN(MAX(0, (*x) * gpdata->scale_width / width - gpdata->scale_width / width - 2), gpdata->scale_width - 1); sy = MIN(MAX(0, (*y) * gpdata->scale_height / height - gpdata->scale_height / height - 2), gpdata->scale_height - 1); sw = MIN(gpdata->scale_width - sx, (*w) * gpdata->scale_width / width + gpdata->scale_width / width + 4); sh = MIN(gpdata->scale_height - sy, (*h) * gpdata->scale_height / height + gpdata->scale_height / height + 4); gdk_pixbuf_scale(gpdata->rgb_buffer, gpdata->scale_buffer, sx, sy, sw, sh, 0, 0, (double) gpdata->scale_width / (double) width, (double) gpdata->scale_height / (double) height, remmina_plugin_service->pref_get_scale_quality()); *x = sx; *y = sy; *w = sw; *h = sh; } static gboolean remmina_plugin_vnc_update_scale_buffer(RemminaProtocolWidget *gp, gboolean in_thread) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint width, height; gint gpwidth, gpheight; gint hscale, vscale; gboolean scale; gint x, y, w, h; GdkPixbuf *pixbuf; GtkAllocation a; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (gpdata->running) { gtk_widget_get_allocation(GTK_WIDGET(gp), &a); width = a.width; height = a.height; scale = remmina_plugin_service->protocol_plugin_get_scale(gp); if (scale) { if (width > 1 && height > 1) { LOCK_BUFFER (in_thread) if (gpdata->scale_buffer) { g_object_unref(gpdata->scale_buffer); } gpwidth = remmina_plugin_service->protocol_plugin_get_width(gp); gpheight = remmina_plugin_service->protocol_plugin_get_height(gp); hscale = remmina_plugin_service->file_get_int(remminafile, "hscale", 0); vscale = remmina_plugin_service->file_get_int(remminafile, "vscale", 0); gpdata->scale_width = (hscale > 0 ? MAX(1, gpwidth * hscale / 100) : width); gpdata->scale_height = (vscale > 0 ? MAX(1, gpheight * vscale / 100) : height); pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, gpdata->scale_width, gpdata->scale_height); gpdata->scale_buffer = pixbuf; x = 0; y = 0; w = gpwidth; h = gpheight; remmina_plugin_vnc_scale_area(gp, &x, &y, &w, &h); UNLOCK_BUFFER (in_thread) } } else { LOCK_BUFFER (in_thread) if (gpdata->scale_buffer) { g_object_unref (gpdata->scale_buffer); gpdata->scale_buffer = NULL; } gpdata->scale_width = 0; gpdata->scale_height = 0; UNLOCK_BUFFER (in_thread) } if (width > 1 && height > 1) { if (in_thread) { THREADS_ENTER gtk_widget_queue_draw_area(GTK_WIDGET(gp), 0, 0, width, height); THREADS_LEAVE } else { gtk_widget_queue_draw_area(GTK_WIDGET(gp), 0, 0, width, height); } } } gpdata->scale_handler = 0; return FALSE; } static gboolean remmina_plugin_vnc_update_scale_buffer_main(RemminaProtocolWidget *gp) { return remmina_plugin_vnc_update_scale_buffer(gp, FALSE); } static void remmina_plugin_vnc_update_scale(RemminaProtocolWidget *gp, gboolean scale) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint width, height; gint hscale, vscale; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); width = remmina_plugin_service->protocol_plugin_get_width(gp); height = remmina_plugin_service->protocol_plugin_get_height(gp); if (scale) { hscale = remmina_plugin_service->file_get_int(remminafile, "hscale", 0); vscale = remmina_plugin_service->file_get_int(remminafile, "vscale", 0); gtk_widget_set_size_request(GTK_WIDGET(gpdata->drawing_area), (hscale > 0 ? width * hscale / 100 : -1), (vscale > 0 ? height * vscale / 100 : -1)); } else { gtk_widget_set_size_request (GTK_WIDGET (gpdata->drawing_area), width, height); } remmina_plugin_service->protocol_plugin_emit_signal(gp, "update-align"); } gboolean remmina_plugin_vnc_setcursor(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; GdkCursor *cur; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); LOCK_BUFFER (FALSE) gpdata->queuecursor_handler = 0; if (gpdata->queuecursor_pixbuf) { cur = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), gpdata->queuecursor_pixbuf, gpdata->queuecursor_x, gpdata->queuecursor_y); gdk_window_set_cursor(gtk_widget_get_window(gpdata->drawing_area), cur); gdk_cursor_unref(cur); g_object_unref(gpdata->queuecursor_pixbuf); gpdata->queuecursor_pixbuf = NULL; } else { gdk_window_set_cursor(gtk_widget_get_window(gpdata->drawing_area), NULL); } UNLOCK_BUFFER (FALSE) return FALSE; } static void remmina_plugin_vnc_queuecursor(RemminaProtocolWidget *gp, GdkPixbuf *pixbuf, gint x, gint y) { RemminaPluginVncData *gpdata; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (gpdata->queuecursor_pixbuf) { g_object_unref(gpdata->queuecursor_pixbuf); } gpdata->queuecursor_pixbuf = pixbuf; gpdata->queuecursor_x = x; gpdata->queuecursor_y = y; if (!gpdata->queuecursor_handler) { gpdata->queuecursor_handler = IDLE_ADD((GSourceFunc) remmina_plugin_vnc_setcursor, gp); } } typedef struct _RemminaKeyVal { guint keyval; guint16 keycode; } RemminaKeyVal; /***************************** LibVNCClient related codes *********************************/ #include #ifdef LIBVNCSERVER_WITH_CLIENT_TLS static const uint32_t remmina_plugin_vnc_no_encrypt_auth_types[] = { rfbNoAuth, rfbVncAuth, rfbMSLogon, 0}; #endif static void remmina_plugin_vnc_process_vnc_event(RemminaProtocolWidget *gp) { RemminaPluginVncEvent *event; RemminaPluginVncData *gpdata; rfbClient *cl; gchar buf[100]; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); cl = (rfbClient*) gpdata->client; while ((event = g_queue_pop_head(gpdata->vnc_event_queue)) != NULL) { if (cl) { switch (event->event_type) { case REMMINA_PLUGIN_VNC_EVENT_KEY: SendKeyEvent(cl, event->event_data.key.keyval, event->event_data.key.pressed); break; case REMMINA_PLUGIN_VNC_EVENT_POINTER: SendPointerEvent(cl, event->event_data.pointer.x, event->event_data.pointer.y, event->event_data.pointer.button_mask); break; case REMMINA_PLUGIN_VNC_EVENT_CUTTEXT: SendClientCutText(cl, event->event_data.text.text, strlen(event->event_data.text.text)); break; case REMMINA_PLUGIN_VNC_EVENT_CHAT_OPEN: TextChatOpen(cl); break; case REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND: TextChatSend(cl, event->event_data.text.text); break; case REMMINA_PLUGIN_VNC_EVENT_CHAT_CLOSE: TextChatClose(cl); TextChatFinish(cl); break; } } remmina_plugin_vnc_event_free(event); } if (read(gpdata->vnc_event_pipe[0], buf, sizeof(buf))) { /* Ignore */ } } typedef struct _RemminaPluginVncCuttextParam { RemminaProtocolWidget *gp; gchar *text; gint textlen; } RemminaPluginVncCuttextParam; static void remmina_plugin_vnc_update_quality(rfbClient *cl, gint quality) { switch (quality) { case 9: cl->appData.useBGR233 = 0; cl->appData.encodingsString = "copyrect hextile raw"; cl->appData.compressLevel = 0; cl->appData.qualityLevel = 9; break; case 2: cl->appData.useBGR233 = 0; cl->appData.encodingsString = "tight zrle ultra copyrect hextile zlib corre rre raw"; cl->appData.compressLevel = 3; cl->appData.qualityLevel = 7; break; case 1: cl->appData.useBGR233 = 0; cl->appData.encodingsString = "tight zrle ultra copyrect hextile zlib corre rre raw"; cl->appData.compressLevel = 5; cl->appData.qualityLevel = 5; break; case 0: default: cl->appData.useBGR233 = 1; cl->appData.encodingsString = "tight zrle ultra copyrect hextile zlib corre rre raw"; cl->appData.compressLevel = 9; cl->appData.qualityLevel = 0; break; } } static void remmina_plugin_vnc_update_colordepth(rfbClient *cl, gint colordepth) { cl->format.depth = colordepth; cl->format.bigEndian = 0; cl->appData.requestedDepth = colordepth; switch (colordepth) { case 24: cl->format.bitsPerPixel = 32; cl->format.redMax = 0xff; cl->format.greenMax = 0xff; cl->format.blueMax = 0xff; cl->format.redShift = 16; cl->format.greenShift = 8; cl->format.blueShift = 0; break; case 16: cl->format.bitsPerPixel = 16; cl->format.redMax = 0x1f; cl->format.greenMax = 0x3f; cl->format.blueMax = 0x1f; cl->format.redShift = 11; cl->format.greenShift = 5; cl->format.blueShift = 0; break; case 15: cl->format.bitsPerPixel = 16; cl->format.redMax = 0x1f; cl->format.greenMax = 0x1f; cl->format.blueMax = 0x1f; cl->format.redShift = 10; cl->format.greenShift = 5; cl->format.blueShift = 0; break; case 8: default: cl->format.bitsPerPixel = 8; cl->format.redMax = 7; cl->format.greenMax = 7; cl->format.blueMax = 3; cl->format.redShift = 0; cl->format.greenShift = 3; cl->format.blueShift = 6; break; } } static rfbBool remmina_plugin_vnc_rfb_allocfb(rfbClient *cl) { RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; gint width, height, depth, size; gboolean scale; GdkPixbuf *new_pixbuf, *old_pixbuf; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); width = cl->width; height = cl->height; depth = cl->format.bitsPerPixel; size = width * height * (depth / 8); /* Putting gdk_pixbuf_new inside a gdk_thread_enter/leave pair could cause dead-lock! */ new_pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, FALSE, 8, width, height); if (new_pixbuf == NULL) return FALSE; gdk_pixbuf_fill(new_pixbuf, 0); old_pixbuf = gpdata->rgb_buffer; LOCK_BUFFER (TRUE) remmina_plugin_service->protocol_plugin_set_width(gp, cl->width); remmina_plugin_service->protocol_plugin_set_height(gp, cl->height); gpdata->rgb_buffer = new_pixbuf; if (gpdata->vnc_buffer) g_free(gpdata->vnc_buffer); gpdata->vnc_buffer = (guchar*) g_malloc(size); cl->frameBuffer = gpdata->vnc_buffer; UNLOCK_BUFFER (TRUE) if (old_pixbuf) g_object_unref(old_pixbuf); scale = remmina_plugin_service->protocol_plugin_get_scale(gp); THREADS_ENTER remmina_plugin_vnc_update_scale( gp, scale); THREADS_LEAVE if (gpdata->scale_handler == 0) remmina_plugin_vnc_update_scale_buffer(gp, TRUE); /* Notify window of change so that scroll border can be hidden or shown if needed */ remmina_plugin_service->protocol_plugin_emit_signal(gp, "desktop-resize"); /* Refresh the client's updateRect - bug in xvncclient */ cl->updateRect.w = width; cl->updateRect.h = height; return TRUE; } static gint remmina_plugin_vnc_bits(gint n) { gint b = 0; while (n) { b++; n >>= 1; } return b ? b : 1; } static gboolean remmina_plugin_vnc_queue_draw_area_real(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gint x, y, w, h; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (GTK_IS_WIDGET(gp) && gpdata->connected) { LOCK_BUFFER (FALSE) x = gpdata->queuedraw_x; y = gpdata->queuedraw_y; w = gpdata->queuedraw_w; h = gpdata->queuedraw_h; gpdata->queuedraw_handler = 0; UNLOCK_BUFFER (FALSE) gtk_widget_queue_draw_area(GTK_WIDGET(gp), x, y, w, h); } return FALSE; } static void remmina_plugin_vnc_queue_draw_area(RemminaProtocolWidget *gp, gint x, gint y, gint w, gint h) { RemminaPluginVncData *gpdata; gint nx2, ny2, ox2, oy2; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); LOCK_BUFFER (TRUE) if (gpdata->queuedraw_handler) { nx2 = x + w; ny2 = y + h; ox2 = gpdata->queuedraw_x + gpdata->queuedraw_w; oy2 = gpdata->queuedraw_y + gpdata->queuedraw_h; gpdata->queuedraw_x = MIN(gpdata->queuedraw_x, x); gpdata->queuedraw_y = MIN(gpdata->queuedraw_y, y); gpdata->queuedraw_w = MAX(ox2, nx2) - gpdata->queuedraw_x; gpdata->queuedraw_h = MAX(oy2, ny2) - gpdata->queuedraw_y; } else { gpdata->queuedraw_x = x; gpdata->queuedraw_y = y; gpdata->queuedraw_w = w; gpdata->queuedraw_h = h; gpdata->queuedraw_handler = IDLE_ADD((GSourceFunc) remmina_plugin_vnc_queue_draw_area_real, gp); } UNLOCK_BUFFER (TRUE) } static void remmina_plugin_vnc_rfb_fill_buffer(rfbClient* cl, guchar *dest, gint dest_rowstride, guchar *src, gint src_rowstride, guchar *mask, gint w, gint h) { guchar *destptr, *srcptr; gint bytesPerPixel; guint32 pixel; gint ix, iy; gint i; guchar c; gint rs, gs, bs, rm, gm, bm, rl, gl, bl, rr, gr, br; gint r; bytesPerPixel = cl->format.bitsPerPixel / 8; switch (cl->format.bitsPerPixel) { case 32: /* The following codes fill in the Alpha channel swap red/green value */ for (iy = 0; iy < h; iy++) { destptr = dest + iy * dest_rowstride; srcptr = src + iy * src_rowstride; for (ix = 0; ix < w; ix++) { *destptr++ = *(srcptr + 2); *destptr++ = *(srcptr + 1); *destptr++ = *srcptr; if (mask) *destptr++ = (*mask++) ? 0xff : 0x00; srcptr += 4; } } break; default: rm = cl->format.redMax; gm = cl->format.greenMax; bm = cl->format.blueMax; rr = remmina_plugin_vnc_bits(rm); gr = remmina_plugin_vnc_bits(gm); br = remmina_plugin_vnc_bits(bm); rl = 8 - rr; gl = 8 - gr; bl = 8 - br; rs = cl->format.redShift; gs = cl->format.greenShift; bs = cl->format.blueShift; for (iy = 0; iy < h; iy++) { destptr = dest + iy * dest_rowstride; srcptr = src + iy * src_rowstride; for (ix = 0; ix < w; ix++) { pixel = 0; for (i = 0; i < bytesPerPixel; i++) pixel += (*srcptr++) << (8 * i); c = (guchar)((pixel >> rs) & rm) << rl; for (r = rr; r < 8; r *= 2) c |= c >> r; *destptr++ = c; c = (guchar)((pixel >> gs) & gm) << gl; for (r = gr; r < 8; r *= 2) c |= c >> r; *destptr++ = c; c = (guchar)((pixel >> bs) & bm) << bl; for (r = br; r < 8; r *= 2) c |= c >> r; *destptr++ = c; if (mask) *destptr++ = (*mask++) ? 0xff : 0x00; } } break; } } static void remmina_plugin_vnc_rfb_updatefb(rfbClient* cl, int x, int y, int w, int h) { RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; gint bytesPerPixel; gint rowstride; gint width; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); LOCK_BUFFER (TRUE) if (w >= 1 || h >= 1) { width = remmina_plugin_service->protocol_plugin_get_width(gp); bytesPerPixel = cl->format.bitsPerPixel / 8; rowstride = gdk_pixbuf_get_rowstride(gpdata->rgb_buffer); remmina_plugin_vnc_rfb_fill_buffer(cl, gdk_pixbuf_get_pixels(gpdata->rgb_buffer) + y * rowstride + x * 3, rowstride, gpdata->vnc_buffer + ((y * width + x) * bytesPerPixel), width * bytesPerPixel, NULL, w, h); } if (remmina_plugin_service->protocol_plugin_get_scale(gp)) { remmina_plugin_vnc_scale_area(gp, &x, &y, &w, &h); } UNLOCK_BUFFER (TRUE) remmina_plugin_vnc_queue_draw_area(gp, x, y, w, h); } static gboolean remmina_plugin_vnc_queue_cuttext(RemminaPluginVncCuttextParam *param) { RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; GTimeVal t; glong diff; gp = param->gp; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (GTK_IS_WIDGET(gp) && gpdata->connected) { g_get_current_time(&t); diff = (t.tv_sec - gpdata->clipboard_timer.tv_sec) * 10 + (t.tv_usec - gpdata->clipboard_timer.tv_usec) / 100000; if (diff >= 10) { gpdata->clipboard_timer = t; gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), param->text, param->textlen); } } g_free(param->text); g_free(param); return FALSE; } static void remmina_plugin_vnc_rfb_cuttext(rfbClient* cl, const char *text, int textlen) { RemminaPluginVncCuttextParam *param; param = g_new(RemminaPluginVncCuttextParam, 1); param->gp = (RemminaProtocolWidget*) rfbClientGetClientData(cl, NULL); param->text = g_malloc(textlen); memcpy(param->text, text, textlen); param->textlen = textlen; IDLE_ADD((GSourceFunc) remmina_plugin_vnc_queue_cuttext, param); } static char* remmina_plugin_vnc_rfb_password(rfbClient *cl) { RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint ret; gchar *pwd = NULL; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->auth_called = TRUE; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (gpdata->auth_first) { THREADS_ENTER pwd = remmina_plugin_service->file_get_secret(remminafile, "password"); THREADS_LEAVE } if (!pwd) { THREADS_ENTER ret = remmina_plugin_service->protocol_plugin_init_authpwd(gp, REMMINA_AUTHPWD_TYPE_PROTOCOL); THREADS_LEAVE if (ret == GTK_RESPONSE_OK) { pwd = remmina_plugin_service->protocol_plugin_init_get_password(gp); } else { gpdata->connected = FALSE; } } return pwd; } #ifdef LIBVNCSERVER_WITH_CLIENT_TLS static rfbCredential* remmina_plugin_vnc_rfb_credential (rfbClient *cl, int credentialType) { rfbCredential *cred; RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint ret; gchar *s1, *s2; gp = (RemminaProtocolWidget*) (rfbClientGetClientData (cl, NULL)); gpdata = (RemminaPluginVncData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); gpdata->auth_called = TRUE; remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); cred = g_new0 (rfbCredential, 1); switch (credentialType) { case rfbCredentialTypeUser: s1 = g_strdup (remmina_plugin_service->file_get_string (remminafile, "username")); THREADS_ENTER s2 = remmina_plugin_service->file_get_secret (remminafile, "password"); THREADS_LEAVE if (gpdata->auth_first && s1 && s2) { cred->userCredential.username = s1; cred->userCredential.password = s2; } else { g_free(s1); g_free(s2); THREADS_ENTER ret = remmina_plugin_service->protocol_plugin_init_authuserpwd (gp, FALSE); THREADS_LEAVE if (ret == GTK_RESPONSE_OK) { cred->userCredential.username = remmina_plugin_service->protocol_plugin_init_get_username (gp); cred->userCredential.password = remmina_plugin_service->protocol_plugin_init_get_password (gp); } else { g_free(cred); cred = NULL; gpdata->connected = FALSE; } } break; case rfbCredentialTypeX509: if (gpdata->auth_first && remmina_plugin_service->file_get_string (remminafile, "cacert")) { cred->x509Credential.x509CACertFile = g_strdup (remmina_plugin_service->file_get_string (remminafile, "cacert")); cred->x509Credential.x509CACrlFile = g_strdup (remmina_plugin_service->file_get_string (remminafile, "cacrl")); cred->x509Credential.x509ClientCertFile = g_strdup (remmina_plugin_service->file_get_string (remminafile, "clientcert")); cred->x509Credential.x509ClientKeyFile = g_strdup (remmina_plugin_service->file_get_string (remminafile, "clientkey")); } else { THREADS_ENTER ret = remmina_plugin_service->protocol_plugin_init_authx509 (gp); THREADS_LEAVE if (ret == GTK_RESPONSE_OK) { cred->x509Credential.x509CACertFile = remmina_plugin_service->protocol_plugin_init_get_cacert (gp); cred->x509Credential.x509CACrlFile = remmina_plugin_service->protocol_plugin_init_get_cacrl (gp); cred->x509Credential.x509ClientCertFile = remmina_plugin_service->protocol_plugin_init_get_clientcert (gp); cred->x509Credential.x509ClientKeyFile = remmina_plugin_service->protocol_plugin_init_get_clientkey (gp); } else { g_free(cred); cred = NULL; gpdata->connected = FALSE; } } break; default: g_free(cred); cred = NULL; break; } return cred; } #endif static void remmina_plugin_vnc_rfb_cursor_shape(rfbClient *cl, int xhot, int yhot, int width, int height, int bytesPerPixel) { RemminaProtocolWidget *gp; RemminaPluginVncData *gpdata; guchar *pixbuf_data; GdkPixbuf *pixbuf; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); if (!gtk_widget_get_window(GTK_WIDGET(gp))) return; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (width && height) { pixbuf_data = g_malloc(width * height * 4); remmina_plugin_vnc_rfb_fill_buffer(cl, pixbuf_data, width * 4, cl->rcSource, width * cl->format.bitsPerPixel / 8, cl->rcMask, width, height); pixbuf = gdk_pixbuf_new_from_data(pixbuf_data, GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, (GdkPixbufDestroyNotify) g_free, NULL); LOCK_BUFFER (TRUE) remmina_plugin_vnc_queuecursor(gp, pixbuf, xhot, yhot); UNLOCK_BUFFER (TRUE) } } static void remmina_plugin_vnc_rfb_bell(rfbClient *cl) { RemminaProtocolWidget *gp; GdkWindow *window; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); window = gtk_widget_get_window(GTK_WIDGET(gp)); if (window) gdk_window_beep(window); } /* Translate known VNC messages. It's for intltool only, not for gcc */ #ifdef __DO_NOT_COMPILE_ME__ N_("Unable to connect to VNC server") N_("Couldn't convert '%s' to host address") N_("VNC connection failed: %s") N_("Your connection has been rejected.") #endif /* TODO: We only store the last message at this moment. */ #define MAX_ERROR_LENGTH 1000 static gchar vnc_error[MAX_ERROR_LENGTH + 1]; static void remmina_plugin_vnc_rfb_output(const char *format, ...) { va_list args; va_start(args, format); gchar *f, *p; /* eliminate the last \n */ f = g_strdup (format); if (f[strlen (f) - 1] == '\n') f[strlen (f) - 1] = '\0'; if (g_strcmp0(f, "VNC connection failed: %s") == 0) { p = va_arg (args, gchar*); g_snprintf (vnc_error, MAX_ERROR_LENGTH, _(f), _(p)); } else { g_vsnprintf (vnc_error, MAX_ERROR_LENGTH, _(f), args); } g_free(f); va_end(args); remmina_plugin_service->log_printf ("[VNC]%s\n", vnc_error); } static void remmina_plugin_vnc_chat_on_send(RemminaProtocolWidget *gp, const gchar *text) { gchar *ptr; /* Need to add a line-feed for UltraVNC */ ptr = g_strdup_printf("%s\n", text); remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_CHAT_SEND, ptr, NULL, NULL); g_free(ptr); } static void remmina_plugin_vnc_chat_on_destroy(RemminaProtocolWidget *gp) { remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_CHAT_CLOSE, NULL, NULL, NULL); } static gboolean remmina_plugin_vnc_close_chat(RemminaProtocolWidget *gp) { remmina_plugin_service->protocol_plugin_chat_close(gp); return FALSE; } static gboolean remmina_plugin_vnc_open_chat(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; rfbClient *cl; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); cl = (rfbClient*) gpdata->client; remmina_plugin_service->protocol_plugin_chat_open(gp, cl->desktopName, remmina_plugin_vnc_chat_on_send, remmina_plugin_vnc_chat_on_destroy); remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_CHAT_OPEN, NULL, NULL, NULL); return FALSE; } static void remmina_plugin_vnc_rfb_chat(rfbClient* cl, int value, char *text) { RemminaProtocolWidget *gp; gp = (RemminaProtocolWidget*) (rfbClientGetClientData(cl, NULL)); switch (value) { case rfbTextChatOpen: IDLE_ADD((GSourceFunc) remmina_plugin_vnc_open_chat, gp); break; case rfbTextChatClose: /* Do nothing... but wait for the next rfbTextChatFinished signal */ break; case rfbTextChatFinished: IDLE_ADD((GSourceFunc) remmina_plugin_vnc_close_chat, gp); break; default: /* value is the text length */ THREADS_ENTER remmina_plugin_service->protocol_plugin_chat_receive(gp, text); THREADS_LEAVE break; } } static gboolean remmina_plugin_vnc_incoming_connection(RemminaProtocolWidget *gp, rfbClient *cl) { RemminaPluginVncData *gpdata; fd_set fds; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->listen_sock = ListenAtTcpPort(cl->listenPort); if (gpdata->listen_sock < 0) return FALSE; remmina_plugin_service->protocol_plugin_init_show_listen(gp, cl->listenPort); remmina_plugin_service->protocol_plugin_start_reverse_tunnel(gp, cl->listenPort); FD_ZERO(&fds); FD_SET(gpdata->listen_sock, &fds); select(gpdata->listen_sock + 1, &fds, NULL, NULL, NULL); if (!FD_ISSET(gpdata->listen_sock, &fds)) { close(gpdata->listen_sock); gpdata->listen_sock = -1; return FALSE; } cl->sock = AcceptTcpConnection(gpdata->listen_sock); close(gpdata->listen_sock); gpdata->listen_sock = -1; if (cl->sock < 0 || !SetNonBlocking(cl->sock)) { return FALSE; } return TRUE; } static gboolean remmina_plugin_vnc_main_loop(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gint ret; rfbClient *cl; fd_set fds; struct timeval timeout; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected) { gpdata->running = FALSE; return FALSE; } cl = (rfbClient*) gpdata->client; timeout.tv_sec = 10; timeout.tv_usec = 0; FD_ZERO(&fds); FD_SET(cl->sock, &fds); FD_SET(gpdata->vnc_event_pipe[0], &fds); ret = select(MAX(cl->sock, gpdata->vnc_event_pipe[0]) + 1, &fds, NULL, NULL, &timeout); /* Sometimes it returns <0 when opening a modal dialog in other window. Absolutely weird */ /* So we continue looping anyway */ if (ret <= 0) return TRUE; if (FD_ISSET(gpdata->vnc_event_pipe[0], &fds)) { remmina_plugin_vnc_process_vnc_event(gp); } if (FD_ISSET(cl->sock, &fds)) { ret = HandleRFBServerMessage(cl); if (!ret) { gpdata->running = FALSE; if (gpdata->connected && !remmina_plugin_service->protocol_plugin_is_closed(gp)) { IDLE_ADD((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, gp); } return FALSE; } } return TRUE; } static gboolean remmina_plugin_vnc_main(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; rfbClient *cl = NULL; gchar *host; gchar *s = NULL; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->running = TRUE; rfbClientLog = remmina_plugin_vnc_rfb_output; rfbClientErr = remmina_plugin_vnc_rfb_output; while (gpdata->connected) { gpdata->auth_called = FALSE; host = remmina_plugin_service->protocol_plugin_start_direct_tunnel(gp, 5900, TRUE); if (host == NULL) { gpdata->connected = FALSE; break; } cl = rfbGetClient(8, 3, 4); cl->MallocFrameBuffer = remmina_plugin_vnc_rfb_allocfb; cl->canHandleNewFBSize = TRUE; cl->GetPassword = remmina_plugin_vnc_rfb_password; #ifdef LIBVNCSERVER_WITH_CLIENT_TLS cl->GetCredential = remmina_plugin_vnc_rfb_credential; #endif cl->GotFrameBufferUpdate = remmina_plugin_vnc_rfb_updatefb; cl->GotXCutText = ( remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE) ? NULL : remmina_plugin_vnc_rfb_cuttext); cl->GotCursorShape = remmina_plugin_vnc_rfb_cursor_shape; cl->Bell = remmina_plugin_vnc_rfb_bell; cl->HandleTextChat = remmina_plugin_vnc_rfb_chat; rfbClientSetClientData(cl, NULL, gp); if (host[0] == '\0') { cl->serverHost = strdup(host); cl->listenSpecified = TRUE; if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { /* When we use reverse tunnel, the local port does not really matter. * Hardcode a default port just in case the remote port is customized * to a privilege port then we will have problem listening. */ cl->listenPort = 5500; } else { cl->listenPort = remmina_plugin_service->file_get_int(remminafile, "listenport", 5500); } remmina_plugin_vnc_incoming_connection(gp, cl); } else { remmina_plugin_service->get_server_port(host, 5900, &s, &cl->serverPort); cl->serverHost = strdup(s); g_free(s); /* Support short-form (:0, :1) */ if (cl->serverPort < 100) cl->serverPort += 5900; } g_free(host); host = NULL; if (remmina_plugin_service->file_get_string(remminafile, "proxy")) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS cl->destHost = cl->serverHost; cl->destPort = cl->serverPort; remmina_plugin_service->get_server_port (remmina_plugin_service->file_get_string (remminafile, "proxy"), 5900, &s, &cl->serverPort); cl->serverHost = strdup (s); g_free(s); #endif } cl->appData.useRemoteCursor = ( remmina_plugin_service->file_get_int(remminafile, "showcursor", FALSE) ? FALSE : TRUE); remmina_plugin_vnc_update_quality(cl, remmina_plugin_service->file_get_int(remminafile, "quality", 0)); remmina_plugin_vnc_update_colordepth(cl, remmina_plugin_service->file_get_int(remminafile, "colordepth", 8)); SetFormatAndEncodings(cl); if (remmina_plugin_service->file_get_int(remminafile, "disableencryption", FALSE)) { #ifdef LIBVNCSERVER_WITH_CLIENT_TLS SetClientAuthSchemes (cl, remmina_plugin_vnc_no_encrypt_auth_types, -1); #endif } if (rfbInitClient(cl, NULL, NULL)) break; /* If the authentication is not called, it has to be a fatel error and must quit */ if (!gpdata->auth_called) { gpdata->connected = FALSE; break; } /* vnc4server reports "already in use" after authentication. Workaround here */ if (strstr(vnc_error, "The server is already in use")) { gpdata->connected = FALSE; gpdata->auth_called = FALSE; break; } /* Otherwise, it's a password error. Try to clear saved password if any */ remmina_plugin_service->file_set_string(remminafile, "password", NULL); if (!gpdata->connected) break; THREADS_ENTER remmina_plugin_service->protocol_plugin_init_show_retry(gp); THREADS_LEAVE /* It's safer to sleep a while before reconnect */ sleep(2); gpdata->auth_first = FALSE; } if (!gpdata->connected) { if (cl && !gpdata->auth_called && !(remmina_plugin_service->protocol_plugin_has_error(gp))) { remmina_plugin_service->protocol_plugin_set_error(gp, "%s", vnc_error); } gpdata->running = FALSE; IDLE_ADD((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, gp); return FALSE; } THREADS_ENTER remmina_plugin_service->protocol_plugin_init_save_cred(gp); THREADS_LEAVE gpdata->client = cl; remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect"); if (remmina_plugin_service->file_get_int(remminafile, "disableserverinput", FALSE)) { PermitServerInput(cl, 1); } if (gpdata->thread) { while (remmina_plugin_vnc_main_loop(gp)) { } gpdata->running = FALSE; } else { IDLE_ADD((GSourceFunc) remmina_plugin_vnc_main_loop, gp); } return FALSE; } #ifdef HAVE_PTHREAD static gpointer remmina_plugin_vnc_main_thread (gpointer data) { pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC remmina_plugin_vnc_main ((RemminaProtocolWidget*) data); return NULL; } #endif static gboolean remmina_plugin_vnc_on_motion(GtkWidget *widget, GdkEventMotion *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint x, y; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected || !gpdata->client) return FALSE; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE)) return FALSE; if (remmina_plugin_service->protocol_plugin_get_scale(gp)) { x = event->x * remmina_plugin_service->protocol_plugin_get_width(gp) / gpdata->scale_width; y = event->y * remmina_plugin_service->protocol_plugin_get_height(gp) / gpdata->scale_height; } else { x = event->x; y = event->y; } remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(x), GINT_TO_POINTER(y), GINT_TO_POINTER(gpdata->button_mask)); return TRUE; } static gboolean remmina_plugin_vnc_on_button(GtkWidget *widget, GdkEventButton *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint x, y; gint mask; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected || !gpdata->client) return FALSE; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE)) return FALSE; /* We only accept 3 buttons */ if (event->button < 1 || event->button > 3) return FALSE; /* We bypass 2button-press and 3button-press events */ if (event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) return TRUE; mask = (1 << (event->button - 1)); gpdata->button_mask = (event->type == GDK_BUTTON_PRESS ? (gpdata->button_mask | mask) : (gpdata->button_mask & (0xff - mask))) ; if (remmina_plugin_service->protocol_plugin_get_scale(gp)) { x = event->x * remmina_plugin_service->protocol_plugin_get_width(gp) / gpdata->scale_width; y = event->y * remmina_plugin_service->protocol_plugin_get_height(gp) / gpdata->scale_height; } else { x = event->x; y = event->y; } remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(x), GINT_TO_POINTER(y), GINT_TO_POINTER(gpdata->button_mask)); return TRUE; } static gboolean remmina_plugin_vnc_on_scroll(GtkWidget *widget, GdkEventScroll *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gint x, y; gint mask; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected || !gpdata->client) return FALSE; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE)) return FALSE; switch (event->direction) { case GDK_SCROLL_UP: mask = (1 << 3); break; case GDK_SCROLL_DOWN: mask = (1 << 4); break; case GDK_SCROLL_LEFT: mask = (1 << 5); break; case GDK_SCROLL_RIGHT: mask = (1 << 6); break; default: return FALSE; } if (remmina_plugin_service->protocol_plugin_get_scale(gp)) { x = event->x * remmina_plugin_service->protocol_plugin_get_width(gp) / gpdata->scale_width; y = event->y * remmina_plugin_service->protocol_plugin_get_height(gp) / gpdata->scale_height; } else { x = event->x; y = event->y; } remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(x), GINT_TO_POINTER(y), GINT_TO_POINTER(mask | gpdata->button_mask)); remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_POINTER, GINT_TO_POINTER(x), GINT_TO_POINTER(y), GINT_TO_POINTER(gpdata->button_mask)); return TRUE; } static void remmina_plugin_vnc_release_key(RemminaProtocolWidget *gp, guint16 keycode) { RemminaPluginVncData *gpdata; RemminaKeyVal *k; gint i; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (keycode == 0) { /* Send all release key events for previously pressed keys */ for (i = 0; i < gpdata->pressed_keys->len; i++) { k = g_ptr_array_index(gpdata->pressed_keys, i); remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_KEY, GUINT_TO_POINTER(k->keyval), GINT_TO_POINTER(FALSE), NULL); g_free(k); } g_ptr_array_set_size(gpdata->pressed_keys, 0); } else { /* Unregister the keycode only */ for (i = 0; i < gpdata->pressed_keys->len; i++) { k = g_ptr_array_index(gpdata->pressed_keys, i); if (k->keycode == keycode) { g_free(k); g_ptr_array_remove_index_fast(gpdata->pressed_keys, i); break; } } } } static gboolean remmina_plugin_vnc_on_key(GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; RemminaKeyVal *k; guint keyval; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected || !gpdata->client) return FALSE; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE)) return FALSE; keyval = remmina_plugin_service->pref_keymap_get_keyval(remmina_plugin_service->file_get_string(remminafile, "gkeymap"), event->keyval); remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_KEY, GUINT_TO_POINTER(keyval), GINT_TO_POINTER(event->type == GDK_KEY_PRESS ? TRUE : FALSE), NULL); /* Register/unregister the pressed key */ if (event->type == GDK_KEY_PRESS) { k = g_new(RemminaKeyVal, 1); k->keyval = keyval; k->keycode = event->hardware_keycode; g_ptr_array_add(gpdata->pressed_keys, k); } else { remmina_plugin_vnc_release_key(gp, event->hardware_keycode); } return TRUE; } static void remmina_plugin_vnc_on_cuttext_request(GtkClipboard *clipboard, const gchar *text, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; GTimeVal t; glong diff; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (text) { /* A timer (1 second) to avoid clipboard "loopback": text cut out from VNC won't paste back into VNC */ g_get_current_time(&t); diff = (t.tv_sec - gpdata->clipboard_timer.tv_sec) * 10 + (t.tv_usec - gpdata->clipboard_timer.tv_usec) / 100000; if (diff < 10) return; gpdata->clipboard_timer = t; remmina_plugin_vnc_event_push(gp, REMMINA_PLUGIN_VNC_EVENT_CUTTEXT, (gpointer) text, NULL, NULL); } } static void remmina_plugin_vnc_on_cuttext(GtkClipboard *clipboard, GdkEvent *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); if (!gpdata->connected || !gpdata->client) return; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "viewonly", FALSE)) return; gtk_clipboard_request_text(clipboard, (GtkClipboardTextReceivedFunc) remmina_plugin_vnc_on_cuttext_request, gp); } static void remmina_plugin_vnc_on_realize(RemminaProtocolWidget *gp, gpointer data) { RemminaFile *remminafile; GdkCursor *cursor; GdkPixbuf *pixbuf; remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "showcursor", FALSE)) { /* Hide local cursor (show a small dot instead) */ pixbuf = gdk_pixbuf_new_from_xpm_data(dot_cursor_xpm); cursor = gdk_cursor_new_from_pixbuf(gdk_display_get_default(), pixbuf, dot_cursor_x_hot, dot_cursor_y_hot); gdk_pixbuf_unref(pixbuf); gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(gp)), cursor); gdk_cursor_unref(cursor); } } /******************************************************************************************/ static gboolean remmina_plugin_vnc_open_connection(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); gpdata->connected = TRUE; remmina_plugin_service->protocol_plugin_register_hostkey(gp, gpdata->drawing_area); g_signal_connect(G_OBJECT(gp), "realize", G_CALLBACK(remmina_plugin_vnc_on_realize), NULL); g_signal_connect(G_OBJECT(gpdata->drawing_area), "motion-notify-event", G_CALLBACK(remmina_plugin_vnc_on_motion), gp); g_signal_connect(G_OBJECT(gpdata->drawing_area), "button-press-event", G_CALLBACK(remmina_plugin_vnc_on_button), gp); g_signal_connect(G_OBJECT(gpdata->drawing_area), "button-release-event", G_CALLBACK(remmina_plugin_vnc_on_button), gp); g_signal_connect(G_OBJECT(gpdata->drawing_area), "scroll-event", G_CALLBACK(remmina_plugin_vnc_on_scroll), gp); g_signal_connect(G_OBJECT(gpdata->drawing_area), "key-press-event", G_CALLBACK(remmina_plugin_vnc_on_key), gp); g_signal_connect(G_OBJECT(gpdata->drawing_area), "key-release-event", G_CALLBACK(remmina_plugin_vnc_on_key), gp); if (!remmina_plugin_service->file_get_int(remminafile, "disableclipboard", FALSE)) { gpdata->clipboard_handler = g_signal_connect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)), "owner-change", G_CALLBACK(remmina_plugin_vnc_on_cuttext), gp); } #ifdef HAVE_PTHREAD if (pthread_create (&gpdata->thread, NULL, remmina_plugin_vnc_main_thread, gp)) { /* I don't think this will ever happen... */ g_print("Failed to initialize pthread. Falling back to non-thread mode...\n"); g_timeout_add (0, (GSourceFunc) remmina_plugin_vnc_main, gp); gpdata->thread = 0; } #else g_timeout_add(0, (GSourceFunc) remmina_plugin_vnc_main, gp); #endif return TRUE; } static gboolean remmina_plugin_vnc_close_connection_timeout(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); /* wait until the running attribute is set to false by the VNC thread */ if (gpdata->running) return TRUE; /* unregister the clipboard monitor */ if (gpdata->clipboard_handler) { g_signal_handler_disconnect(G_OBJECT(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD)), gpdata->clipboard_handler); gpdata->clipboard_handler = 0; } if (gpdata->queuecursor_handler) { g_source_remove(gpdata->queuecursor_handler); gpdata->queuecursor_handler = 0; } if (gpdata->queuecursor_pixbuf) { g_object_unref(gpdata->queuecursor_pixbuf); gpdata->queuecursor_pixbuf = NULL; } if (gpdata->queuedraw_handler) { g_source_remove(gpdata->queuedraw_handler); gpdata->queuedraw_handler = 0; } if (gpdata->scale_handler) { g_source_remove(gpdata->scale_handler); gpdata->scale_handler = 0; } if (gpdata->listen_sock >= 0) { close(gpdata->listen_sock); } if (gpdata->client) { rfbClientCleanup((rfbClient*) gpdata->client); gpdata->client = NULL; } if (gpdata->rgb_buffer) { g_object_unref(gpdata->rgb_buffer); gpdata->rgb_buffer = NULL; } if (gpdata->vnc_buffer) { g_free(gpdata->vnc_buffer); gpdata->vnc_buffer = NULL; } if (gpdata->scale_buffer) { g_object_unref(gpdata->scale_buffer); gpdata->scale_buffer = NULL; } g_ptr_array_free(gpdata->pressed_keys, TRUE); remmina_plugin_vnc_event_free_all(gp); g_queue_free(gpdata->vnc_event_queue); close(gpdata->vnc_event_pipe[0]); close(gpdata->vnc_event_pipe[1]); #ifdef HAVE_PTHREAD pthread_mutex_destroy (&gpdata->buffer_mutex); #endif remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect"); return FALSE; } static gboolean remmina_plugin_vnc_close_connection(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); gpdata->connected = FALSE; #ifdef HAVE_PTHREAD if (gpdata->thread) { pthread_cancel (gpdata->thread); if (gpdata->thread) pthread_join (gpdata->thread, NULL); gpdata->running = FALSE; remmina_plugin_vnc_close_connection_timeout (gp); } else { g_timeout_add (200, (GSourceFunc) remmina_plugin_vnc_close_connection_timeout, gp); } #else g_timeout_add(200, (GSourceFunc) remmina_plugin_vnc_close_connection_timeout, gp); #endif return FALSE; } static gboolean remmina_plugin_vnc_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { RemminaPluginVncData *gpdata; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); switch (feature->id) { case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT: return (SupportsClient2Server((rfbClient*) (gpdata->client), rfbSetServerInput) ? TRUE : FALSE); case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT: return (SupportsClient2Server((rfbClient*) (gpdata->client), rfbTextChat) ? TRUE : FALSE); default: return TRUE; } } static void remmina_plugin_vnc_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { RemminaPluginVncData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); switch (feature->id) { case REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY: remmina_plugin_vnc_update_quality((rfbClient*) (gpdata->client), remmina_plugin_service->file_get_int(remminafile, "quality", 0)); SetFormatAndEncodings((rfbClient*) (gpdata->client)); break; case REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY: break; case REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT: PermitServerInput((rfbClient*) (gpdata->client), remmina_plugin_service->file_get_int(remminafile, "disableserverinput", FALSE) ? 1 : 0); break; case REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS: remmina_plugin_vnc_release_key(gp, 0); break; case REMMINA_PLUGIN_VNC_FEATURE_SCALE: remmina_plugin_vnc_update_scale(gp, remmina_plugin_service->file_get_int(remminafile, "scale", FALSE)); break; case REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH: SendFramebufferUpdateRequest((rfbClient*) (gpdata->client), 0, 0, remmina_plugin_service->protocol_plugin_get_width(gp), remmina_plugin_service->protocol_plugin_get_height(gp), FALSE); break; case REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT: remmina_plugin_vnc_open_chat(gp); break; default: break; } } #if GTK_VERSION == 2 static gboolean remmina_plugin_vnc_on_expose(GtkWidget *widget, GdkEventExpose *event, RemminaProtocolWidget *gp) #else static gboolean remmina_plugin_vnc_on_draw(GtkWidget *widget, cairo_t *context, RemminaProtocolWidget *gp) #endif { RemminaPluginVncData *gpdata; GdkPixbuf *buffer; gboolean scale; #if GTK_VERSION == 2 gint x, y; cairo_t *context; #endif gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); LOCK_BUFFER (FALSE) scale = remmina_plugin_service->protocol_plugin_get_scale(gp); /* widget == gpdata->drawing_area */ buffer = (scale ? gpdata->scale_buffer : gpdata->rgb_buffer); if (!buffer) { UNLOCK_BUFFER (FALSE) return FALSE; } #if GTK_VERSION == 2 x = event->area.x; y = event->area.y; context = gdk_cairo_create(gtk_widget_get_window (gpdata->drawing_area)); cairo_rectangle(context, x, y, event->area.width, event->area.height); #else cairo_rectangle(context, 0, 0, gtk_widget_get_allocated_width(widget), gtk_widget_get_allocated_height(widget)); #endif gdk_cairo_set_source_pixbuf(context, buffer, 0, 0); cairo_fill(context); #if GTK_VERSION == 2 cairo_destroy(context); #endif UNLOCK_BUFFER (FALSE) return TRUE; } static gboolean remmina_plugin_vnc_on_configure(GtkWidget *widget, GdkEventConfigure *event, RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gpdata = (RemminaPluginVncData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); /* We do a delayed reallocating to improve performance */ if (gpdata->scale_handler) g_source_remove(gpdata->scale_handler); gpdata->scale_handler = g_timeout_add(1000, (GSourceFunc) remmina_plugin_vnc_update_scale_buffer_main, gp); return FALSE; } static void remmina_plugin_vnc_init(RemminaProtocolWidget *gp) { RemminaPluginVncData *gpdata; gint flags; gpdata = g_new0(RemminaPluginVncData, 1); g_object_set_data_full(G_OBJECT(gp), "plugin-data", gpdata, g_free); gpdata->drawing_area = gtk_drawing_area_new(); gtk_widget_show(gpdata->drawing_area); gtk_container_add(GTK_CONTAINER(gp), gpdata->drawing_area); gtk_widget_add_events( gpdata->drawing_area, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK); gtk_widget_set_can_focus(gpdata->drawing_area, TRUE); #if GTK_VERSION == 3 g_signal_connect(G_OBJECT(gpdata->drawing_area), "draw", G_CALLBACK(remmina_plugin_vnc_on_draw), gp); #elif GTK_VERSION == 2 g_signal_connect(G_OBJECT(gpdata->drawing_area), "expose-event", G_CALLBACK(remmina_plugin_vnc_on_expose), gp); #endif g_signal_connect(G_OBJECT(gpdata->drawing_area), "configure_event", G_CALLBACK(remmina_plugin_vnc_on_configure), gp); gpdata->auth_first = TRUE; g_get_current_time(&gpdata->clipboard_timer); gpdata->listen_sock = -1; gpdata->pressed_keys = g_ptr_array_new(); gpdata->vnc_event_queue = g_queue_new(); if (pipe(gpdata->vnc_event_pipe)) { g_print("Error creating pipes.\n"); gpdata->vnc_event_pipe[0] = 0; gpdata->vnc_event_pipe[1] = 0; } flags = fcntl(gpdata->vnc_event_pipe[0], F_GETFL, 0); fcntl(gpdata->vnc_event_pipe[0], F_SETFL, flags | O_NONBLOCK); #ifdef HAVE_PTHREAD pthread_mutex_init (&gpdata->buffer_mutex, NULL); #endif } static gpointer colordepth_list[] = { "8", N_("256 colors"), "15", N_("High color (15 bit)"), "16", N_("High color (16 bit)"), "24", N_( "True color (24 bit)"), NULL }; static gpointer quality_list[] = { "0", N_("Poor (fastest)"), "1", N_("Medium"), "2", N_("Good"), "9", N_("Best (slowest)"), NULL }; static const RemminaProtocolSetting remmina_plugin_vnc_basic_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, NULL, NULL, FALSE, "_rfb._tcp", NULL }, #ifdef LIBVNCSERVER_WITH_CLIENT_TLS { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "proxy", N_("Repeater"), FALSE, NULL, NULL}, #endif { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("User name"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Color depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Show remote cursor"), TRUE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "viewonly", N_("View only"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Disable clipboard sync"), TRUE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableencryption", N_("Disable encryption"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverinput", N_("Disable server input"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolSetting remmina_plugin_vnci_basic_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "listenport", N_("Listen on port"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "username", N_("User name"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Color depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "quality", N_("Quality"), FALSE, quality_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Show remote cursor"), TRUE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "viewonly", N_("View only"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableclipboard", N_("Disable clipboard sync"), TRUE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableencryption", N_("Disable encryption"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "disableserverinput", N_("Disable server input"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolSetting remmina_plugin_vnc_advanced_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SCALE, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static const RemminaProtocolFeature remmina_plugin_vnc_features[] = { { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_QUALITY, GINT_TO_POINTER( REMMINA_PROTOCOL_FEATURE_PREF_RADIO), "quality", quality_list }, { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_VIEWONLY, GINT_TO_POINTER( REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "viewonly", N_("View only") }, { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_VNC_FEATURE_PREF_DISABLESERVERINPUT, GINT_TO_POINTER( REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "disableserverinput", N_("Disable server input") }, { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_REFRESH, N_("Refresh"), GTK_STOCK_REFRESH, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_VNC_FEATURE_TOOL_CHAT, N_("Open Chat..."), "face-smile", NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, REMMINA_PLUGIN_VNC_FEATURE_SCALE, NULL, NULL, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, REMMINA_PLUGIN_VNC_FEATURE_UNFOCUS, NULL, NULL, NULL }, { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL } }; static RemminaProtocolPlugin remmina_plugin_vnc = { REMMINA_PLUGIN_TYPE_PROTOCOL, "VNC", N_("VNC - Virtual Network Computing"), GETTEXT_PACKAGE, VERSION, "remmina-vnc", "remmina-vnc-ssh", remmina_plugin_vnc_basic_settings, remmina_plugin_vnc_advanced_settings, REMMINA_PROTOCOL_SSH_SETTING_TUNNEL, remmina_plugin_vnc_features, remmina_plugin_vnc_init, remmina_plugin_vnc_open_connection, remmina_plugin_vnc_close_connection, remmina_plugin_vnc_query_feature, remmina_plugin_vnc_call_feature }; static RemminaProtocolPlugin remmina_plugin_vnci = { REMMINA_PLUGIN_TYPE_PROTOCOL, "VNCI", N_("VNC - Incoming Connection"), GETTEXT_PACKAGE, VERSION, "remmina-vnc", "remmina-vnc-ssh", remmina_plugin_vnci_basic_settings, remmina_plugin_vnc_advanced_settings, REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL, remmina_plugin_vnc_features, remmina_plugin_vnc_init, remmina_plugin_vnc_open_connection, remmina_plugin_vnc_close_connection, remmina_plugin_vnc_query_feature, remmina_plugin_vnc_call_feature }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) { remmina_plugin_service = service; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_vnc)) { return FALSE; } if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_vnci)) { return FALSE; } return TRUE; } FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/000077500000000000000000000000001171526373700210355ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/16x16/000077500000000000000000000000001171526373700216225ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/16x16/emblems/000077500000000000000000000000001171526373700232465ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/16x16/emblems/remmina-xdmcp-ssh.png000066400000000000000000000016721171526373700273160ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<7IDAT8}“KL\e@Ïÿß;Ì0ô‡@)Z¥˜ÐÊDÒˆRŒ%ºq¡ÖêB¦‰Ñ˜t§Æ¸pÓ&š´©‘Ô›FÆWú°S FÀò*¶a°t€ ¯¡áÞ˽÷ÿ\iº0žõÉÙ%"ÜÍHŸêÔ–õºRª]”µ@‰¹)È€ ‚Sé~¸ÛWÿFúT¹¶ô‰HeíKõO½Õ·`WÖ‚ °€››àÖ·Ç¿°ø… Ãcé~ñþ Œô©r­õXªóH}òÐÑ(KP\BB¥#݆ªH"‰&ò?žôòÏdM¶¦ûÅÓZ«Éö§w&»^ŒÊ­AÄ+"ÆEŪPñˆÁ,]ƒ›R_ŽVx®Qký€î¥#Z•úiÏ›gbáð—X­/`5ÆÌ^€•ë¨ØvÄ]T6NžE·<ËôÇÏ;Þjî õF+4[°˜¼ü ‰²,v0C²lé+l¿@ ò—-qs“Íñº‡ ¯‚ÅJ÷áŸûkö,‡ÛvQ‘ˆó@]œ;Þ.Úë‹8îQo‘ßJ¥Jëµ½äKó×{“=oÙ2ÿ;‘Žwð=ë9nÄ–y䙯IܳNU²ŒÕ‰j¡ºÆ§a÷n†²å:Ý/ƒaqíóÅNzöcïá}Š,Œ"Å<±PJ#ÞyŒ›!p†œa|g ¥¥Å0±•?Îõ(%©žwc&{37ˆŒ‚øü Ý/žZ—GÏŸž>õÊF©ä#{{1ÆÂ÷ÖP±'°ÊÇ.ï$o§¬¢Ïóõ;ï׊W•âÀjMYÓâv˲¢•Æuƒ°´†ž'a`„bÑ‚ÓR,™9„eØ¡IEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/16x16/emblems/remmina-xdmcp.png000066400000000000000000000016511171526373700265200ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<&IDAT8]“_l“e‡Ÿó¶M»-`·Y ´Ã & ÊÐ8'¢ ¼áF1:ô† !1ãŒbˆ‹‰$à…h¢aYb¼2šÿ‘2Â1qe€¹ép[Çh·ÑuýÚ¯ß{¼X$Ósý;ÏÅïœGT••“ê”Æç{MDZU|u¢v\ÑK¶\þ$Ñ£—Væå_@ªS*ŒÏœ„×½î­ÊP|+þp ʹÛ8é!&¿ý¸àæ¦?³ž×•èÑâ}@ªS*Œ1W£;Æ#{ÉÁbõ ˆ @p5RAk7“ùét1s¡wÌz^K¢G‹À9i=Pi?ÔÉËhqµªF*kA-6{Æû‰î~5¸¦í…zcL7€ ¼ÌSÁêèÏMoô†¼/ñµ¼„oó³Ø[}0;‚„@y@ \wýÌÖç>ùb¡8—Þí{½…ãöÝá/¤ÑÌš»…‰ïÀDEç'²³\Vì1ìÕ¯Ñ|ñJ„âæo\0F 5´® {û x.¸Kx¿~ ^ Ó°ë, ë·ãÝü-å¡\ÄÞ¹F(ÖŒOÿFÍlv- ”GçÆð®œ…à*Lã>ìßýèüZ¼‡ºKع?ñ‡ã¨ 4U«Ø2¸Qgurh!‡@jÕq4? Nœp  ePUc°¹3cȪµ÷— T!‘fÊ玣3#˜æýHu=º4‹:9$T›E¬;júôuLl;êÜE]_¢7ù!öÞ¥ÞRû»¨tiY³…Âä5U墱–Ï'“½ŽÙø4&üö.J¿|€ÞG3Ø©¥ïßF*k ttCe fÓ^¦’½ŽUΈª2xHNÕnÛsdí3‡ƒnßGèôàòÝ}UÄ_<ø0þ¶7¹“ü™I;¹í¬¾ç°J×ì`²CDë£ï‡ìXvâ2š^þH¦î LÃ.¦<íÌþ~þ«û¿LA#tû«ÂGÖï:XŠm!iÀÍŽâLÝÐôù¯/Ÿ;e•c‰uÿX¡óãF8,B›µÒ¸ìŠŽ¨rÑ*g=úÛÊü?O†–pg@(¯IEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/22x22/000077500000000000000000000000001171526373700216145ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/22x22/emblems/000077500000000000000000000000001171526373700232405ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/22x22/emblems/remmina-xdmcp-ssh.png000066400000000000000000000026551171526373700273120ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<*IDAT8}Ô}hÝÕÀñïù½Ü—Ü—41iÒ¼vjGŒz3]ÛYߢàÒÎ?†v:h&c0°¢ƒ 6EÜÛ`¬î2mHñ¥èÃYVe´ÓµÅ­YjÛbS“šÜÛ4ÉMîͽ÷÷zžýÑÛ±ÛÃs8Ÿç9žG‰W#ƒ*lW†±Å0Í»E¸WêdGäXfHÞ»êe@] T·–õFm÷–kR½5±æëH}¢}ÜKS8¹sA~ìŸN%ûɈƒïf†dæÿÂ#ƒÊ2 ã;ݰ§}Çîx¼®QQ^íAà‚i£" ÄŠ¡M,ýG0óîËí»ß²_ïÿŸðè£Æ/Ò›6?ÑÖ?£0+s¨X¢)”e‚¿ ~µn#VL¾þbÅÉgwf†äí/Á#ƒêÖȺõG»~&®æÇ™”.•`iv‚­7 ")0-\Ä-"aÀøœ‡íÌÑÖÚÁÄðÏò: ®Ë IÀ¨¢QÃ4vÜ»+NîRøŒö­;Ù¶ëǘ½ßáOo ¢ITM=D`ÇqºâWOÐl.bÛÍ›·' ÓØw%c£ºîH_××™è¹3 "ÿÞ‹W)100Àœš˜†0Âömüò7¿ãÙû׳ ô…ãÔßÔo«hrÇÈ jY…•bsrCGÌ} ":Df1Oðóçžç…á(ås¨Ú6ãëé, qиE(Í‘j¹Ö¾¶ Š;cõ­Jгúzºè©p'bÛ6/þú%^úëY&:F½Ì}½ëÁw𠡇³Ô4¶Å[,1ìžHrº0ƒŠ¦À¯ f ãÔ•ôF‚Àç{Oü”<ò¯hêôb± ·›»ÀÅì1 ‹s(už?ïÍãùe¿ÂôäŸ}¡m^îªH5@Í7Zhº#}×ÖÒÛš"ã…8¹F3 Éº¾8.ÚõE»¾ˆBDk&ÝÏí“ñUX)¥ªh² ¯â@¬úÂp PJkÖe))ãj£ D€hŒV§øUøÊôª{ÞZë¿2oaíË…ÙIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/22x22/emblems/remmina-xdmcp.png000066400000000000000000000025511171526373700265120ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<æIDAT8}ÔklUÀñÿÙÙGÛ]hZûƒŪAbP£@ÔŠŠ¡b¢AŒ1†D4ÑÄgÔÄGŒŠÆhÐ ÆW4~P‰ 5Š|MQ@¬K¡Ûn¡}Í{Žv(V'¹¹“¹÷þîÍ™{ަ{²]*¬Ušv±¦ë—‹p"¶ÒÔ>ßóv#²'‘o¦] ¨éàl—Z¡E"ÎXtñɹ5ñ¦Z´¡ \ì‘~¬¡?½±C?Zfîlà{Ò9þ¿p¶KE4M{ÊHÍÚÒ¶îîD¢~¶¢2 ž ºŠÖ"‘8ª¶‘ñƒß{Ç¿Þa®}Ïùïïü'Üs»öLêœÎ{[WwÅ)ôC)Ч –D P:âVÀ5Q3çáоž6­±ÜútF>ûœíRFgÎé^xó¶„:q˜>ig¤ ヽ¬¹d1*š=žØEÄ÷8œw0¬<­-íôî|t,ð½³ÓÐB4¦éúGíWlL0´)£í’õ¬ÜøzÇM¼ñY«CÕ4@´ŒÖ¢yþ£½4飆FSçÚ:M×Þ+× ò ðˆþü ŽYfÍš5ô3—ý½GÁ÷@¿m%Ͻ´¯žC<¢ üDÃÒÕ†ŠÕ­Ëv©æIX):ëÎl¯‘üo >ø…Aô_wðØãOðÔÎ( ¡f´òÕO‡¸(•cî¬ØE(çI6Ïw€ &aM±*ÞТ¤8¾ ¾¾MÐÿv_7†aðô ¯òêçé³êéÙµƒ+;æ€k†s¤˜£fvk¸  š±$Z7“ pK‚k"z´Úþ fjžçrÛ½pÇ-×òÉý`§Œ¸ijÂq mº®qÙé‹oIà!‡¸fõ:9åêß÷l«‚[)ÐÔÜÊÊkÖÓíE¬b—À)ƒSAI€ï˜NÇX‚}öØ*– ÁbÁ.á.ß̶­÷Ñ6ülÛÆ›¿Ä9yr± ÕÍÄf`sƒ€îIØøÎ<™óT]cu’]Dì $½‰×ß~Ÿ-‹sDìÂîùMÓxqû[lýd¬ñðäET¢žÒ‰œ ì›zÝöLíu´–ÕÈØ´y«Ø;dÐÞÿ. “¤2Š|÷•Ùôðv^Ù=ŒX¨XŠ š¢’?jÙI8‘o­á?ör¾¾à*Tª…üü ì~ùÖže!æX. £}º‰âð–-íàÄ‚[éÍ›èç^ÇàÞ/Lqí'Ó™øgJ7éÑøï ®ßœÔŽ|E0üëÔ’š^}ñÃôÒÑ­£ìDd ûãCAÀÒt¦:x*¤32ä;Ö}ó^Åk]…¾ä0á¨T!ð&Q•j&²â.*®!Ç~ü¼Üp ýWu O~•®GÞ³|uª~á²(Ha)æP‘*ÕŒJ6$Î`hï.s¢ÿ@_ˆžêL[è_^­fu6óZÕœð›3Õúó'Š'ÚIEND®B`‚FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/CMakeLists.txt000066400000000000000000000026131171526373700235770ustar00rootroot00000000000000# remmina-plugin-xdmcp - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(REMMINA_PLUGIN_XDMCP_SRCS xdmcp_plugin.c ) add_library(remmina-plugin-xdmcp ${REMMINA_PLUGIN_XDMCP_SRCS}) set_target_properties(remmina-plugin-xdmcp PROPERTIES PREFIX "") include_directories(${REMMINA_COMMON_INCLUDE_DIRS}) target_link_libraries(remmina-plugin-xdmcp ${REMMINA_COMMON_LIBRARIES}) install(TARGETS remmina-plugin-xdmcp DESTINATION ${REMMINA_PLUGINDIR}) install(FILES 16x16/emblems/remmina-xdmcp-ssh.png 16x16/emblems/remmina-xdmcp.png DESTINATION ${APPICON16_EMBLEMS_DIR}) install(FILES 22x22/emblems/remmina-xdmcp-ssh.png 22x22/emblems/remmina-xdmcp.png DESTINATION ${APPICON22_EMBLEMS_DIR}) FreeRDP-Remmina-356c033/remmina-plugins/xdmcp/xdmcp_plugin.c000066400000000000000000000252271171526373700237020ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "common/remmina_plugin.h" #if GTK_VERSION == 3 # include #endif INCLUDE_GET_AVAILABLE_XDISPLAY typedef struct _RemminaPluginXdmcpData { GtkWidget *socket; gint socket_id; GPid pid; gint output_fd; gint error_fd; gint display; gboolean ready; #ifdef HAVE_PTHREAD pthread_t thread; #else gint thread; #endif } RemminaPluginXdmcpData; static RemminaPluginService *remmina_plugin_service = NULL; static void remmina_plugin_xdmcp_on_plug_added(GtkSocket *socket, RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remmina_plugin_service->protocol_plugin_emit_signal(gp, "connect"); gpdata->ready = TRUE; } static void remmina_plugin_xdmcp_on_plug_removed(GtkSocket *socket, RemminaProtocolWidget *gp) { remmina_plugin_service->protocol_plugin_close_connection(gp); } static gboolean remmina_plugin_xdmcp_start_xephyr(RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; RemminaFile *remminafile; gchar *argv[50]; gint argc; gchar *host; gint i; GError *error = NULL; gboolean ret; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); gpdata->display = remmina_get_available_xdisplay(); if (gpdata->display == 0) { remmina_plugin_service->protocol_plugin_set_error(gp, "Run out of available local X display number."); return FALSE; } argc = 0; argv[argc++] = g_strdup("Xephyr"); argv[argc++] = g_strdup_printf(":%i", gpdata->display); argv[argc++] = g_strdup("-parent"); argv[argc++] = g_strdup_printf("%i", gpdata->socket_id); /* All Xephyr version between 1.5.0 and 1.6.4 will break when -screen argument is specified with -parent. * It's not possible to support color depth if you have those Xephyr version. Please see this bug * http://bugs.freedesktop.org/show_bug.cgi?id=24144 * As a workaround, a "Default" color depth will not add the -screen argument. */ i = remmina_plugin_service->file_get_int(remminafile, "colordepth", 8); if (i >= 8) { argv[argc++] = g_strdup("-screen"); argv[argc++] = g_strdup_printf("%ix%ix%i", remmina_plugin_service->file_get_int(remminafile, "resolution_width", 640), remmina_plugin_service->file_get_int(remminafile, "resolution_height", 480), i); } if (i == 2) { argv[argc++] = g_strdup("-grayscale"); } if (remmina_plugin_service->file_get_int(remminafile, "showcursor", FALSE)) { argv[argc++] = g_strdup("-host-cursor"); } if (remmina_plugin_service->file_get_int(remminafile, "once", FALSE)) { argv[argc++] = g_strdup("-once"); } if (!remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { remmina_plugin_service->get_server_port(remmina_plugin_service->file_get_string(remminafile, "server"), 0, &host, &i); argv[argc++] = g_strdup("-query"); argv[argc++] = host; if (i) { argv[argc++] = g_strdup("-port"); argv[argc++] = g_strdup_printf("%i", i); } } else { /* When the connection is through an SSH tunnel, it connects back to local unix socket, * so for security we can disable tcp listening */ argv[argc++] = g_strdup("-nolisten"); argv[argc++] = g_strdup("tcp"); /* FIXME: It's better to get the magic cookie back from xqproxy, then call xauth, * instead of disable access control */ argv[argc++] = g_strdup("-ac"); } argv[argc++] = NULL; ret = g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &gpdata->pid, &error); for (i = 0; i < argc; i++) g_free(argv[i]); if (!ret) { remmina_plugin_service->protocol_plugin_set_error(gp, "%s", error->message); return FALSE; } return TRUE; } static gboolean remmina_plugin_xdmcp_tunnel_init_callback(RemminaProtocolWidget *gp, gint remotedisplay, const gchar *server, gint port) { RemminaPluginXdmcpData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (!remmina_plugin_xdmcp_start_xephyr(gp)) return FALSE; while (!gpdata->ready) sleep(1); remmina_plugin_service->protocol_plugin_set_display(gp, gpdata->display); if (remmina_plugin_service->file_get_string(remminafile, "exec")) { return remmina_plugin_service->protocol_plugin_ssh_exec(gp, FALSE, "DISPLAY=localhost:%i.0 %s", remotedisplay, remmina_plugin_service->file_get_string(remminafile, "exec")); } else { return remmina_plugin_service->protocol_plugin_ssh_exec(gp, TRUE, "xqproxy -display %i -host %s -port %i -query -manage", remotedisplay, server, port); } } static gboolean remmina_plugin_xdmcp_main(RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); if (remmina_plugin_service->file_get_int(remminafile, "ssh_enabled", FALSE)) { if (!remmina_plugin_service->protocol_plugin_start_xport_tunnel(gp, remmina_plugin_xdmcp_tunnel_init_callback)) { gpdata->thread = 0; return FALSE; } } else { if (!remmina_plugin_xdmcp_start_xephyr(gp)) { gpdata->thread = 0; return FALSE; } } gpdata->thread = 0; return TRUE; } #ifdef HAVE_PTHREAD static gpointer remmina_plugin_xdmcp_main_thread (gpointer data) { pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC if (!remmina_plugin_xdmcp_main ((RemminaProtocolWidget*) data)) { IDLE_ADD ((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, data); } return NULL; } #endif static void remmina_plugin_xdmcp_init(RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; gpdata = g_new0(RemminaPluginXdmcpData, 1); g_object_set_data_full(G_OBJECT(gp), "plugin-data", gpdata, g_free); gpdata->socket = gtk_socket_new(); remmina_plugin_service->protocol_plugin_register_hostkey(gp, gpdata->socket); gtk_widget_show(gpdata->socket); g_signal_connect(G_OBJECT(gpdata->socket), "plug-added", G_CALLBACK(remmina_plugin_xdmcp_on_plug_added), gp); g_signal_connect(G_OBJECT(gpdata->socket), "plug-removed", G_CALLBACK(remmina_plugin_xdmcp_on_plug_removed), gp); gtk_container_add(GTK_CONTAINER(gp), gpdata->socket); } static gboolean remmina_plugin_xdmcp_open_connection(RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; RemminaFile *remminafile; gint width, height; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file(gp); width = remmina_plugin_service->file_get_int(remminafile, "resolution_width", 640); height = remmina_plugin_service->file_get_int(remminafile, "resolution_height", 480); remmina_plugin_service->protocol_plugin_set_width(gp, width); remmina_plugin_service->protocol_plugin_set_height(gp, height); gtk_widget_set_size_request(GTK_WIDGET(gp), width, height); gpdata->socket_id = gtk_socket_get_id(GTK_SOCKET(gpdata->socket)); #ifdef HAVE_PTHREAD if (remmina_plugin_service->file_get_int (remminafile, "ssh_enabled", FALSE)) { if (pthread_create (&gpdata->thread, NULL, remmina_plugin_xdmcp_main_thread, gp)) { remmina_plugin_service->protocol_plugin_set_error (gp, "Failed to initialize pthread. Falling back to non-thread mode..."); gpdata->thread = 0; return FALSE; } else { return TRUE; } } else { return remmina_plugin_xdmcp_main (gp); } #else return remmina_plugin_xdmcp_main(gp); #endif } static gboolean remmina_plugin_xdmcp_close_connection(RemminaProtocolWidget *gp) { RemminaPluginXdmcpData *gpdata; gpdata = (RemminaPluginXdmcpData*) g_object_get_data(G_OBJECT(gp), "plugin-data"); #ifdef HAVE_PTHREAD if (gpdata->thread) { pthread_cancel (gpdata->thread); if (gpdata->thread) pthread_join (gpdata->thread, NULL); } #endif if (gpdata->pid) { kill(gpdata->pid, SIGTERM); g_spawn_close_pid(gpdata->pid); gpdata->pid = 0; } remmina_plugin_service->protocol_plugin_emit_signal(gp, "disconnect"); return FALSE; } static gboolean remmina_plugin_xdmcp_query_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { return FALSE; } static void remmina_plugin_xdmcp_call_feature(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { } static gpointer colordepth_list[] = { "0", N_("Default"), "2", N_("Grayscale"), "8", N_("256 colors"), "16", N_("High color (16 bit)"), "24", N_( "True color (24 bit)"), NULL }; static const RemminaProtocolSetting remmina_plugin_xdmcp_basic_settings[] = { { REMMINA_PROTOCOL_SETTING_TYPE_SERVER, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, NULL, NULL, FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_SELECT, "colordepth", N_("Color depth"), FALSE, colordepth_list, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_TEXT, "exec", N_("Startup program"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "showcursor", N_("Use local cursor"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_CHECK, "once", N_("Disconnect after one session"), FALSE, NULL, NULL }, { REMMINA_PROTOCOL_SETTING_TYPE_END, NULL, NULL, FALSE, NULL, NULL } }; static RemminaProtocolPlugin remmina_plugin_xdmcp = { REMMINA_PLUGIN_TYPE_PROTOCOL, "XDMCP", N_("XDMCP - X Remote Session"), GETTEXT_PACKAGE, VERSION, "remmina-xdmcp", "remmina-xdmcp-ssh", remmina_plugin_xdmcp_basic_settings, NULL, REMMINA_PROTOCOL_SSH_SETTING_TUNNEL, NULL, remmina_plugin_xdmcp_init, remmina_plugin_xdmcp_open_connection, remmina_plugin_xdmcp_close_connection, remmina_plugin_xdmcp_query_feature, remmina_plugin_xdmcp_call_feature }; G_MODULE_EXPORT gboolean remmina_plugin_entry(RemminaPluginService *service) { remmina_plugin_service = service; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); if (!service->register_plugin((RemminaPlugin *) &remmina_plugin_xdmcp)) { return FALSE; } return TRUE; } FreeRDP-Remmina-356c033/remmina/000077500000000000000000000000001171526373700162435ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/AUTHORS000066400000000000000000000002161171526373700173120ustar00rootroot00000000000000Please check the application About dialog or the official web site for a full list of authors. http://remmina.sourceforge.net/contact.shtml FreeRDP-Remmina-356c033/remmina/CMakeLists.txt000066400000000000000000000075501171526373700210120ustar00rootroot00000000000000# src/remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(REMMINA_SRCS src/remmina_about.c src/remmina_about.h src/remmina_applet_menu.c src/remmina_applet_menu.h src/remmina_applet_menu_item.c src/remmina_applet_menu_item.h src/remmina_avahi.c src/remmina_avahi.h src/remmina.c src/remmina_chain_button.c src/remmina_chain_button.h src/remmina_chat_window.c src/remmina_chat_window.h src/remmina_connection_window.c src/remmina_connection_window.h src/remmina_crypt.c src/remmina_crypt.h src/remmina_exec.c src/remmina_exec.h src/remmina_file.c src/remmina_file_editor.c src/remmina_file_editor.h src/remmina_file.h src/remmina_file_manager.c src/remmina_file_manager.h src/remmina_ftp_client.c src/remmina_ftp_client.h src/remmina_icon.c src/remmina_icon.h src/remmina_init_dialog.c src/remmina_init_dialog.h src/remmina_key_chooser.c src/remmina_key_chooser.h src/remmina_log.c src/remmina_log.h src/remmina_main.c src/remmina_main.h src/remmina_marshals.c src/remmina_marshals.h src/remmina_marshals.list src/remmina_plugin_manager.c src/remmina_plugin_manager.h src/remmina_pref.c src/remmina_pref_dialog.c src/remmina_pref_dialog.h src/remmina_pref.h src/remmina_protocol_widget.c src/remmina_protocol_widget.h src/remmina_public.c src/remmina_public.h src/remmina_scaler.c src/remmina_scaler.h src/remmina_scrolled_viewport.c src/remmina_scrolled_viewport.h src/remmina_sftp_client.c src/remmina_sftp_client.h src/remmina_sftp_plugin.c src/remmina_sftp_plugin.h src/remmina_ssh.c src/remmina_ssh.h src/remmina_ssh_plugin.c src/remmina_ssh_plugin.h src/remmina_string_array.c src/remmina_string_array.h src/remmina_string_list.c src/remmina_string_list.h src/remmina_widget_pool.c src/remmina_widget_pool.h ) add_executable(remmina ${REMMINA_SRCS}) include_directories(${GTK_INCLUDE_DIRS}) target_link_libraries(remmina ${GTK_LIBRARIES}) find_suggested_package(LIBSSH) if(LIBSSH_FOUND) add_definitions(-DHAVE_LIBSSH) include_directories(${LIBSSH_INCLUDE_DIRS}) target_link_libraries(remmina ${LIBSSH_LIBRARIES}) endif() if(GCRYPT_FOUND) include_directories(${GCRYPT_INCLUDE_DIRS}) target_link_libraries(remmina ${GCRYPT_LIBRARIES}) endif() if(AVAHI_FOUND) include_directories(${AVAHI_INCLUDE_DIRS}) target_link_libraries(remmina ${AVAHI_LIBRARIES}) endif() if(GTK3_FOUND) set(_VTE_VERSION_NUM 2.90) else() set(_VTE_VERSION_NUM) endif() find_suggested_package(VTE _VTE_VERSION_NUM) if(VTE_FOUND) add_definitions(-DHAVE_LIBVTE) include_directories(${VTE_INCLUDE_DIRS}) target_link_libraries(remmina ${VTE_LIBRARIES}) endif() if(GTK3_FOUND) find_suggested_package(APPINDICATOR) if(APPINDICATOR_FOUND) add_definitions(-DHAVE_LIBAPPINDICATOR) include_directories(${APPINDICATOR_INCLUDE_DIRS}) target_link_libraries(remmina ${APPINDICATOR_LIBRARIES}) endif() endif() add_subdirectory(po) add_subdirectory(icons) add_subdirectory(desktop) install(TARGETS remmina DESTINATION ${CMAKE_INSTALL_BINDIR}) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/remmina.pc.in ${CMAKE_CURRENT_BINARY_DIR}/remmina.pc @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/remmina.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) FreeRDP-Remmina-356c033/remmina/COPYING000066400000000000000000000431101171526373700172750ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 Library 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 How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. FreeRDP-Remmina-356c033/remmina/ChangeLog000066400000000000000000000240061171526373700200170ustar00rootroot00000000000000***** 1.0.0 - 2012-02-10 ***** Main program design and functionality: o Switch to the CMake build system o Refactoring of code style o Changing file name convention RDP protocol related: o Support for FreeRDP 1.0 o Support for RemoteFX o Support for Network Level Authentication o Added certificate validation prompt ***** 0.9.0 - 2010-12-12 ***** Main program design and functionality: o Rewrite plugin system so that plugins can have more flexibilities o Integrate scrolled window and fullscreen view modes into one button o Remove quick connect menu and consolidate the feature with Connection->New menu. Move other Edit menu items under Connection menu as well. See http://bugs.debian.org/591755 o Change 'Quit' menu item to 'Close' o Show version information in plugin window o Add link button to resolution field to bring up to resolution preference o Calculate auto-fit window size more correctly o Add subgroup feature, using '/' as subgroup delimiter o Remember group expansion status o Add shortcut key names to toolbar tooltips o Support shortcut key to be same as hostkey, which will be activated by just press(down and up) the hostkey. By default, this is the Keyboard grabbing shortcut. o Add pin button to floating toolbar o Add tray icon and various related preferences options. All featues in the original GNOME/XFCE panel applet have been ported in it, plus all windows can be minimized to tray (default is off) o Add Help/Homepage menu RDP protocol related: o Support TLS negotiation added in FreeRDP 0.8 o Support audio input redirection added in FreeRDP 0.8 o Add new preference option 'Use client keyboard mapping' to obey X key mappings (wfaulk) VNC protocol related: o Change 'Proxy Destination' to 'Repeater' to make it clearer. Now the 'Server' is the server and 'Repeater' is the repeater. :) NX protocol related: o Add SSH tunnel SSH protocol related: o Add ability to spawn new session from toolbar menu o Add Copy/Paste toolbar menu for SSH terminal o Add Font and Scrollback lines preference option o Add ability to show/hide hidden files in SFTP o Remember paned position in SFTP window o Add startup path option in SFTP ***** 0.8.0 - 2010-07-10 ***** Main program design and functionality: o Introduce a new plugin system. All protocols except SSH are moved to a new source package 'remmina-plugins' so that they can have bug-fixes and releases separately. A new Plugins menu is added accordingly o Add Hostkey feature and related Preference options. Hostkey feature provides an easy and reliable way to access various remote desktop toolbar functions through customizable shortcut key combinations o Add Attachable / Detachable Tabs feature. Tabs now can be merged or separated between windows. o Add ability to show / hide the toolbar through Hostkey o Add Quick Search filter feature o Add 'Save Settings When Starting the Connection' preference option, default is true. If set to false, profile will not be saved if only 'Connect' button is clicked o Add 'Always show tab' option o Add a little cosmetic motion effect to the floating toolbar o Add Debug Window feature in Help menu o Add Online Wiki link in Help menu o Support IPv6 address notation RDP protocol related: o Bring in FreeRDP (http://freerdp.sourceforge.net) project as rdesktop replacement. Most of the features described below are direct benefits from the FreeRDP project o FreeRDP provides a new keyboard system which is based on XKB and Windows keyboard layouts. In most cases it can detect the keyboard layout and work out of the box. It's also possible to manually assign a keyboard layout. o Scaling remote screen is supported o More clipboard formats (HTML, bitmaps, etc) are supported o Better disk/printer sharing. Works with Windows 7 and Windows 2008 o Countless of original rdesktop bug-fixes and clean up o Support importing Windows and tsclient .rdp file, either by drag-n-drop to the main window, by Tools / Import menu, or by -e / -c command line argument o Support exporting Windows .rdp file VNC protocol related: o Support disabling TLS/VeNCrypt encryption when connecting to VNC servers that supports it, like Vino o Support Refresh screen o Add UltraVNC repeater support o Add reverse SSH tunnel support for VNC incoming connection o Add disabling clipboard synchronization option o Better cursor and color handling NX protocol related: o New protocol NX is supported. Depends on libssh and nxproxy o Support resizing of remote session and scaling of console session o Support session management, including resume, attach, terminate o Support custom private key and various trivial options SSH protocol related: o SSH terminal and SFTP now works as internal plugins, and can be tabbed or toggled fullscreen like any other protocols o Add startup program support in SSH terminal o Add folder uploading support in SFTP o Add new 'Tunnel via loopback' option o Support tunneling through same server at custom port using ':port' custom server notation XDMCP protocol related: o Support running a startup program from SSH tunnel, without launching XDMCP login window Telepathy support: o Implement as a special plugin so it will work with desktop sharing feature in Empathy IM client ***** 0.7.0 - 2009-12-12 ***** o Add new XDMCP protocol (using Xephyr) o Implement XDMCP session over SSH (using xqproxy on SSH server side) o Add Public Key (Automatic) option to support ssh-agent, by Alex Chateau o A lot of cosmetic changes o Use icon theme approach to install all icons o Fix RGB color issue with VMware VNC server o Enhanced groups and resolution editing o Remove "run in separated process" option. Manage all windows in single process o Upgrade glib dependancy to 2.20 and gtk to 2.16 o Implement single instance application using libunique o Add Copy feature to create a new copy of existing connection profile o Add RDP Sound (off/local/remote) option o Add RDP local printer sharing option o Support Tab Interface and related options (Tab by Group / Tab by Protocol / Tab All / Tab None) o Simplify Groups setting by using combobox. Groups tab in preference dialog removed. o New application logo designed by Martin Lettner o Support more VNC security types: TLS, VeNCrypt, MSLogon o Remember sort column id and order in main window ***** 0.6.0 - 2009-07-07 ***** o Add Avahi support using libavahi-ui o Option to start a connection in view-only mode o Enhanced command line arguments to support new grdc-applet features o Black Scrolled Viewport border (Nikolay Botev) o Better mouse cursor (both server and client side) (Nikolay Botev) o Keyboard mapping option for rdesktop (RDP) o VNC Chat feature o Fix VNC desktop resize bug (Nikolay Botev) o VNC Beep feature (Nikolay Botev) o A SFTP client (stand-alone or integrate with SSH tunnel) o SSH terminal feature integrated with SSH tunnel o Add RDP options: Share folder, Startup program/path and Advanced arguments o New Preference option Default View Mode o Better default window size to match server resolution o New VNC advanced option: Horizontal and Vertical scale o Saved password is now encrypted o Quick Connect protocol sub menus and connection protocol icons o Support VNC keyboard mapping o Fix VNC peer disconnect bug (Alex Chateau) o Greek translation added by Elias Sofronas ***** 0.5.1 - 2009-05-01 ***** o Fixed VNC crash in scrolled viewport mode o Fixed VNC cuttext "loopback" ***** 0.5.0 - 2009-04-14 ***** o Recent server names in quick connect o Invisible floating toolbar option o Floating toolbar transparency feature (by mouse scrolling) o Enhanced Keyboard grabbing feature o Support VNC incoming connections o Changed Keyboard grabbing icon o Center the client in the window when the remote desktop area is smaller than the window (Nikolay) o Change the background color of the viewport to black (Nikolay) o Use a blank dot as local cursor if remote cursor is shown in VNC o Change button order in all dialogs and apply alternative order o Popup menu for list/tree view in main window o Support UltraVNC extension "Disable Server Input" o Eliminate passphrase prompt if SSH private key has empty passphrase o Reuse existing SSH session in case of VNC authentication failure o Change desktop file's Name and Comments ***** 0.4.0 - 2009-02-24 ***** o SSH Tunneling support and SSH Tunnel local port option o VNC Color Depth support o VNC Scaled Mode toggle and Scale Quality option o VNC Poor quality level changed to the lowest to reduce a little bandwidth (marmuta) o RDP new option to attach to console o Auto-fit window button in scrolled window mode (resize to fit remote resolution) o Viewport fullscreen mode nows works with GTK 2.14 o Keyboard grabbing enabled in scrolled window mode o Tree View / List View option o Double-click Action option o New Applet Option: Show Quick Connect on top of the Menu o New Applet Option: Hide Total Count in Group Expander ***** 0.3.1 - 2009-01-26 ***** o Fixed: Pressed keys won't release when focus lost in VNC o Remember main window and connection window state (size/maximized) o Shortcut key changed for Quit(^q) and Quick Connect(^u) ***** 0.3.0 - 2009-01-16 ***** o Double-click to open the connection o Customizable RDP resolution list o Ability to change VNC quality while connected o Support View-Only VNC o New View menu to show/hide toolbar or statusbar o Small toolbar button option o A label in floating toolbar indicating the current connection o New Grouping feature o Ability to save the connection settings as default values o Polish translation added by: Jakub Tomczak o New option to remember the last view mode of each connection o New option to open the connections in separated processes o A new Preferences dialog for the new options o A new look of the remote desktop preference dialog ***** 0.2.0 - 2009-01-05 ***** o VNC support is added o A lot of code arrangement plus some bug fixes ***** 0.1.1 - 2008-12-28 ***** o Spainish translation added by: Julio Napurí Carlos o Added a .desktop file o Gnome panel applet support completed ***** 0.1.0 - 2008-12-25 ***** o First public release! FreeRDP-Remmina-356c033/remmina/INSTALL000066400000000000000000000224501171526373700172770ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is free documentation; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 6. Often, you can also type `make uninstall' to remove the installed files again. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of the options to `configure', and exit. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. FreeRDP-Remmina-356c033/remmina/NEWS000066400000000000000000000000001171526373700167300ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/README000066400000000000000000000013641171526373700171270ustar00rootroot00000000000000To compile with full feature support in Debian, please install the following packages: libgtk2.0-dev libssh-dev libavahi-ui-dev libvte-dev libgcrypt11-dev libunique-dev (libpthread is recommended for VNC support and required for SSH support. libpthread-stub0-dev package will be installed as dependency in the above packages in Debian) To compile and install Remmina, please run the following command as root: $ ./configure $ make $ make install Please visit the following projects that Remmina depends on: Gnome: http://www.gnome.org LibVNCServer: http://libvncserver.sourceforge.net rdesktop: http://www.rdesktop.org libssh: http://www.libssh.org Avahi: http://avahi.org libvte: http://library.gnome.org/devel/vte/ libgcrypt: http://www.gnupg.org FreeRDP-Remmina-356c033/remmina/desktop/000077500000000000000000000000001171526373700177145ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/16x16/000077500000000000000000000000001171526373700205015ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/16x16/apps/000077500000000000000000000000001171526373700214445ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/16x16/apps/remmina.png000066400000000000000000000014621171526373700236050ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¯IDAT8¥“OhgÅßÌÜoò¯ $/šJõÅAŒµ)]*ˆ‹@“&55“âJ—n$"q ¼¨m-ˆ®ºªŠ …R²(Ø.¢‘JmÍBMj,ú¢¾ÌÌ›ù¾ÏEDDc7=›»¸ÜÃážs”sŽw1ÄÌx\ôöíÊȸqü؉Ç7>"èQpoß®Wì³,ëÕ\.§Ëåò 3ï=~ìÄwO´ëC‹ˆY–µ§{S÷L©Ô‘N’8ÂÐ9ò•ÍF¤Ž=4‹{ÉŽÛ3ÿäy^ÿÞ=ûÊÅÖVgò÷ 5qeÜaf{ÍšµQlÂÞf'¾æo‹ÅÖ×>Ý÷™DAþÏ[7]"‚’ Æ$rñ’§c̆fa[·méÉd2=}½}þí;Õ–ÚÜ]H©"HÁH-ò07WC^Óð–žÍ)"Ú¸qÓu?hýÀ_@‘€Èfr¸[›Å™æafÞ], ¥S©–-%BâÔÈVwvbýëoâÂÅó¸zõªø³ÝÝV€ãÀÁ¿o—ÜÚÐÐPUc6l~ó¬ï7 BH@š5¦§§1yyå¿*½8 "rÚ/µ»_)©)%¡éášéà¡ß«L&³ºµØšÔæjBI‰x筷Ѿ²>?ˆÝX¾|9,Ë’` „a€ äÿÔóõy\º4¾UåóyaŒñ¥”š ðì4V­zç~ùÌ ËvðòŽ“B`üçI1À˜_÷>)%©J¥b„–¥5˜5HnܸŽÑ‹£¨V§³@µ·`[¥¶*·ë¸vk/”–"ã9ðý?ž ”„šýføÔðÎõo¬G†¸òÛ$.£\.£V«MK)6H§S°]YÏE‰Zh°tIÚ²qw>A/ô€°°oýçΟó.üzam’$+P>ŸG„lk÷¥( ¦ˆ–L¶ãÂI¹¨G€²äÒê#Š ÂÀ %“† ¥ÄÈðéhdøô'8UÒÒ.y)/„e[>Qܪ”Âà i!†DªÅCH D  !NAˆXÝÛÿºu«—-)¶MÜ™‰åömÛ¹Žm å $œÀqmÄ,0´å@i Q’B‚‰@‚ÀDDülöúºˆ£îÞëÞívw#°@Z ´Sô%>i4úÈCò•¢$m*ª$&µhh‚D $Dcbb( $&Ÿy!|iK б%w·uÛÝíî½wï*µ@*ñŸLÎL2™ß™s2ç3ãÿ”zTB[ûžZqc'ŽŸ\ðnèa´µïy@—¥­×É„Îd2yf>pâøÉ¯Ÿðîž·-":¬µÞ¿¹eK¾±±1AÕ÷}óÙçG#ldôرcÞãÄü`÷;;3ïºnG×®LziÚ¹>¬F®Û ެ]ûrP5~ÛB:¸`˜¿J§Ó¯¿ßõAÅ üäïwn;D% ‡òéE)Û³~!€¹KÞ±s{k<omoïð&'s5…â4¤T¤`D…bžï¹ loÝ%¢Þ[ÆÊå™%¯2[!ˆ€DmÓ…<òù<Œáò‚̼/N§Lv"c)©à§ûû±¦© o¾ñ®\ÂèèhÅ«”Ï·´¬_ذm¶ ÷®9…ÞÞÞ‰9€1fý¶-[§*^%%„$ Y#—ËáÚÈ5dþÈâò•Ë " ƒR;•RJA‘‚PšæÇL‡÷|óч=»hÓæ ‰D"™ûäС°P,jcB„aˆÐ„¸ys +Ðóq:÷ubùòå°, `Àó=ø¾ÏóþñÿŽgJ3æ0€­˜ÙM&“‚™+RJM ¸v «Ÿ]‹?™aEl¼²û¤Œ'<{Üø¢í9H)) B¡ÜÉf2†HX–Ö`Ö AÕ_.#—Ë22f¶äªº"–FC] ÙÉnÝÉãù†Åˆ»6*•ß¿ "@) ¿>„èï;Sšžú²ïtŸ˜ž. 7™Ã… ?âÜç044Œ7FsRJ6ˆÅ¢ˆ86jã.BH|ƒÅ‹j¡­¦gBýÙ •Bý¼9è¸xé¢;ðóÀKa®@Éd¾çsD;/¡7N ÔÄcˆØ쨃R(ËF"f£0‚ªïÔÄc$ ”P?;Éý}g‚þ¾3ÛN}{ºAËHƒu«ÝÝݰ"V…¨ºT)uOBZ¨B"ZãÂ'…r(P å‹E!Ä]À}Ïõºuk–-J×]ý3_•»vî A䨫7™J!ä¶A•fªmÙPZd‚d_ú`" DD*µµ¿­ 8HrÀ¶1¦è8ÎĦÍgŠÑÝ\Kkh¥!”˜Q «ª/€øð}år J)ö=?|è0_û¼w„ARI¥”¬I(¥ •žóçL«ÐÒúøÖÍ;ö>:::"©”t€Zä&2ûöv ­ˆ„ |zôHP_·ä™DbY @¥µµµüËv¿ššš¢3Ž##B¨V­øUHYCƒ°aöFnÝ®›*—ý§Êåppp°´ ‰ææfºg³Yjll¤ññqẮˆF£\*•8{ö,3³Yà¿J<:åÉô<™§¼µIEND®B`‚FreeRDP-Remmina-356c033/remmina/desktop/32x32/000077500000000000000000000000001171526373700204755ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/32x32/apps/000077500000000000000000000000001171526373700214405ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/32x32/apps/remmina.png000066400000000000000000000040051171526373700235750ustar00rootroot00000000000000‰PNG  IHDR szzôsBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<‚IDATX…ÅV[lTçþfæœ=»ëµñ LŠm 1h®éC-HJhJ¸$—M¹$áFE'm5UE+Axhë–KUiK+E—ªà *!U#AÓ„F\B¸ÛØ»^{í={fúpÖÆ›>@Ô‘þs¤ÿœóÏw¾™ùfÈÌðÿ4çvŸ{~CÀf/ˆHh°íç»vë `ÓsëçÑ¾ššš¢… ^+..qZ[[ñÛ½ [ÓéÎ6?¹h°lØøì|"zë‰E‹>›>ýÑך¯J{*)÷T|Éoiiq~Õægmž={Zîß¼±~÷çšÙ–?µâó)S§UzöL¤©¹Iº3\¹zÉ­=šbñ‚àÿøNßàÙï¬-V³†9s¾ùŸ‰'V^øìœççr°0B²cÇÖDüœÎ¹ëÌìõáÇÇgcöø«×®zª a‹@Xà8(+/GW¦«rÕªUEw  /Ö®[]ÇÌõÛ_¾¢T´\oU…™BU¡føäãOðî‰ð³>TqĈ8ˆ0D¤4ƒ…ûöEÄÜMLõÛ¾W¿£¯ ÌlË”)SÎÆb±Q—¯^f JHÇ7âßÌ &"€äMËL¨"¨†+Pƒç qðàŸ¶¬~æéræ-\ðxSgW§ÇÄ€ä["‹‹\.€çEñµÕ¿„›ÇÔ¹µðnÁÏxçg‹!" ¯f¶¢ªz4%#ZZ›‰…A ¿nø :Rxxöìð0S0F–%`¨Ì3CÄŒª†l.@*ÝÖö.%<ŒUÚÇÒ‰σY@¦€©Î`ÆŒs¾ï1‡±Ëg~iq Òé”–”ÂÌ`þ—`„0ÂGHx0"=¢Q÷ †žl€LÎî\è”ÜèÏ@Í—'M* 4ç 3")aÞüGẪ««ÀÌP Ø‹zy® „0‰ˆÙ\Çu1¢8° 0C`C3 ³Ü fUÅÅ%n¦;a‘B5ŒYň‘XûÌZ>z8 ¬¢|’àE£È©"à¥%…p=f €Aa0#0Ñ –¯\à‘ 3LÐA<ÇñÆcÈdºòò x‘¼ã°ZÇ;4›CA< /"PE2 ¦Ð+û–þÝþ7³fö¡ïû*â@8¬W/Em:N~ðÁõõõKˆhÀµéùõ»„e³ÃïŸ< B¨……E#’çS­îðÖ&"„ÊkMÍîÇï|í‡/nÙzø–‘Œˆ@tÅÊå{²=šªf¦HÄýû‘C?vìØsDuõ¨Ã±x|z¿C€\ëøÇÉÎL¥RÉ0=Œ–.[òpÅÈŠ×þuú£ÊAgB"rËËË£å•åe¾ï;Dd®ëæš/6_oiiÉÔÖÖÞ¾ög2—£ÊªÊÚYÖmtÝÈ8Ç‘1Ìì¦Ó[_{õGp7mÙSOF§Lü3ïð7Ÿ¾¸ekGïó!sà¥W^šÁª»®µ´~%äÔ4ž^3X¨,ùw……m™®L‘ªJ$âfÆÔÖ4'Ó©jUÛag°¼`oï÷ƒ2°téR©®©üwUUUu[[» A  îuLf¨z߉yžeÙî±y~N ¢Q׺ºº3édçWwìØqvHÊ+J7M¾ÿþòd*é••ÃèîêÿþfÙ³L4Ô ŽK“kkqæÌ$âÄÂH¦R€)ÀL'L’#GìðÈ"ï•o=2·øÔéSá\@”oDÎÿ)(l«½wêe G¬ †Â‚"˜)†—@Óµ«05˜ªGW{©ŽŽº5kVÕ54ì;q "¢Ç?vyûËÛo¹Uþ¡ÁÀ&ß0Éö¤ïgƒv`ˆ pÔ½ÝÑwjfyÇ_xþ/û/SPDßÔÙè“IEND®B`‚FreeRDP-Remmina-356c033/remmina/desktop/48x48/000077500000000000000000000000001171526373700205135ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/48x48/apps/000077500000000000000000000000001171526373700214565ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/48x48/apps/remmina.png000066400000000000000000000063741171526373700236260ustar00rootroot00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< yIDAThÕZkp]ÕuþÖÚ{ŸsϽ2–Ë2Á+~èQÜÄ6ÔI;É„‡LŒã M‰d«ÓŽƒë&à8$iÒÄ2 Ó0i“IKñØSÓ Mèt*ŒM]ƒü°¶‘dÝÇ9gïÕçÞ«{%Å!ÁÃÒì9¯}Î]ßúÖcïe“ˆà½,|¾x§òž Ÿ—²ÙìaYMäXÕÝÕÕõÂT³i ½¸võstÈwè¼è¢‹ŒïùèíëE±X‚<$NýMWW—ýã©;Y¦ÍÀúë×mÑà»Z—¶Ö]sͧË››sÎcÔó¿ùMô£‡þéF(û,€‡þˆúN’i1½þ³·3ó7¿ôÅ/EË.[†¡Sƒj` Ÿ£8‚ïûh]ÜnwïÝÍO?ùt>f×ñèÏ}ý]ÐÀ4‚xýuë¾jŒùææ›6‡íöÐá×Lÿ@?;q`f„aˆÞ¾cjÍ'×ÐÜ ›´çÝP¼,g½þ³7Aðím[·ÅÍÍÍòú‘Ã)ë˜ Ì\grcð=«®Xé9ëÖf³Ù–ó ›Í~Àw7|~Cqvãl{¬÷¨ Qž¸f@"FCC2™LÈ]y^\}õÕ>Ø=¸bù ,»lŸè?áL%åK–§Ò ˆÐ4·Éáòó 3#¸}Ö¬Y‹7nØh‡ŒH­Û”O® A*@† €¦9Zký‘ó ›Í¶Ñ-›nÜŠyÉòå‰Tã> #u™=3hll„µvqgg§y7L®ì¾³xÑbïâ‹/ŽúÞì5L `„""€ãĉ~ìÛ÷ËDs›æjb¹ùï·€©ÌV‰AbÑ„{U-¿CDɵbˆ“S£££[wÜñ‡«Õ­©ënX7OÅtdûmÛs ³f¥ßy‹EµÃUÎéz;î܉t”?YkPù TŸ£ü¬|¿ê˜Xå)Fìºïsc#…Y;vì§d@[ÞÐÜÜÌóçÍû™™k•w†ƒTÉårR)t¬ß…0²Hbyˆ©1}yéç›áOÍ,¤L @D¾xÍ5Ÿr…bÀÄÊŸƒcD@Έ "`&ˆ±u˜×TŸM¾UcURŒ¹³/€³Ö9ä Nä!d|ƒKç½®dy'ç’w_¸iӦʢzÚÆÆr›·~å†LÏÑÃ0ÚTVšÆó°úÏ>R·õÖ[îhkkûî¤÷r¹‡6®¿nÆðÈ0½üÊ‹PŠ¡XCi•œ+ “ÒØ¸á üƒûï]Öw¬÷Ï …X"DΊ. ‘¸¥eÁÂyó/º*¶îqWi€ùÊ•»þöï6ßaETyQ/Iv‚b¶Å(ú·#o¾¹PSÔÆÓ3gæÓõõÑ /uïykøÞe8û>pìx£¹ƒ&•ªqE¿®Îíßð,hùO0^­Ñówgâ’ò¿4<$”jŒgH ÀÕÕÕ 3GÌzžWH§ÓÅL&@CCC`ŒñΦ¼sΞ€¥K—fÚ;Zo°\HRLì“bÍ"gÎŒýäîoýýçðv„’êDøú×ýûÏiésÉ]ú“û†Oç_ê~õG!0Ô'2òûö…2…²Ó°sçÎ4‘[_ŒÂÙaX˜)"B‰”: Boçž1~N)e …Ü ""‘LÝŒSLT$¢/ÄÖ¾¨˜_N”¤áY³Nï¾é¦'ê5­ &"ºuû¶'µÖ«N¿5Œºu(ä R)„Qæ¤o“ËRˆ¢ÏóË)X›, <ÏC¡«$GHùò¹¼(B¾!¶örÅ à‚ôõ§žðÉß‹-[7oR©{—,^jõWp¬4â8†VªÒePL°ÖB•ºjql¡†c0'ó¬µÐZ#¶K>°‡^?„|.t†R F{Èr°ÎAk†8ÁüùóÝ8ŸÏ߸ë{÷Õü Ð9tvv6{)½ÿ3ŸY˯½öjZœƒÖÅbXêJ´V(Cø¾‡8¶Ji„aÏ3pÎÁ÷}¸x‡•+.lj8|ø ø¾9s!"èíëÄAit:XºxiaïÞ½aºÖx wÚ.KôîZíͼ`¦×Ós¨²bŨ޻—/ª£¸ú™Ö kÆXgñ‰ý%þûÙg10Ð&©ÓCXþÁìD.?­5œM6¶+W¬J]±êJõÔ/ŸzÀ§¦ÅÑç7þutËWo‹g7*'®j]FÕ”úU]‰©Õ&(fç,U÷H‰Yœs„R‡¯¼Êcbrwßó-ï§ÿò3UÎHçbÀœ:urïÎoìXKDï8=¾SÉåCR‹B` i0Jú.ˆ i.Æeþ …ì|Ê{þÿJ¼çü? UÝÕSvJIEND®B`‚FreeRDP-Remmina-356c033/remmina/desktop/CMakeLists.txt000066400000000000000000000033371171526373700224620ustar00rootroot00000000000000# desktop/remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. set(ICON16_DIR "${REMMINA_DATADIR}/icons/hicolor/16x16/apps") set(ICON22_DIR "${REMMINA_DATADIR}/icons/hicolor/22x22/apps") set(ICON24_DIR "${REMMINA_DATADIR}/icons/hicolor/24x24/apps") set(ICON32_DIR "${REMMINA_DATADIR}/icons/hicolor/32x32/apps") set(ICON48_DIR "${REMMINA_DATADIR}/icons/hicolor/48x48/apps") set(ICONSVG_DIR "${REMMINA_DATADIR}/icons/hicolor/scalable/apps") set(ICON16_DATA 16x16/apps/remmina.png) set(ICON22_DATA 22x22/apps/remmina.png) set(ICON24_DATA 24x24/apps/remmina.png) set(ICON32_DATA 32x32/apps/remmina.png) set(ICON48_DATA 48x48/apps/remmina.png) set(ICONSVG_DATA scalable/apps/remmina.svg) install(FILES ${ICON16_DATA} DESTINATION ${ICON16_DIR}) install(FILES ${ICON22_DATA} DESTINATION ${ICON22_DIR}) install(FILES ${ICON24_DATA} DESTINATION ${ICON24_DIR}) install(FILES ${ICON32_DATA} DESTINATION ${ICON32_DIR}) install(FILES ${ICON48_DATA} DESTINATION ${ICON48_DIR}) install(FILES ${ICONSVG_DATA} DESTINATION ${ICONSVG_DIR}) FreeRDP-Remmina-356c033/remmina/desktop/remmina.desktop.in000066400000000000000000000003561171526373700233500ustar00rootroot00000000000000[Desktop Entry] Version=1.0 _Name=Remmina Remote Desktop Client _Comment=Connect to remote desktops TryExec=remmina Exec=remmina Icon=remmina Terminal=false Type=Application Actions= Categories=GTK;GNOME;X-GNOME-NetworkSettings;Network; FreeRDP-Remmina-356c033/remmina/desktop/scalable/000077500000000000000000000000001171526373700214625ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/scalable/apps/000077500000000000000000000000001171526373700224255ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/desktop/scalable/apps/remmina.svg000066400000000000000000002236121171526373700246040ustar00rootroot00000000000000 image/svg+xml FreeRDP-Remmina-356c033/remmina/icons/000077500000000000000000000000001171526373700173565ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/16x16/000077500000000000000000000000001171526373700201435ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/000077500000000000000000000000001171526373700216035ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/remmina-fit-window.png000077500000000000000000000010471171526373700260330ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<¤IDAT8“¿kAÇ?óffs›õ©ˆÚ –6v6éR$)I {QY«À.»·X«EŠ`cŠ@šVþþæÌU œ?îîXì*—À­’™7óæûý¾Ç<åœã"–©ŒÉ‹ô<ÂÍ(Œ:ý P–l˜”Ù0QÎ9þdzab§ö'¨³²þàqO—[ZT¿Kº«9^ÛØ|¾·ûa‡VÊ•(Œ­onlÝ]|Ô .c­Æ3Ïj¬¼6¶Vø19Yx¿ý:v€ë& ãï vÕï/ ØÞÿLà[ßrÉ÷˜ïYß#è5g‹÷nkQê*@ƧfZÞÃ¥;¬Þ¿8”R(¥Pª]ß÷þ6^¦<«[ö†ùÍ»·,-¯ 8ælS’u¦'gÎÛ‹gO0Æ õì´N€ªª™ffÞ´öéãAç½äEˆÈx4:ü¦µ)»üpôeâj÷ /Ò9åEzÃUõÓøUœˆÈµ.ƺ®ÇµãeŽU6LNù(Œ«•Ó²z@Móƒ àe^¤rfSkšæ ê¢ãܪQ¿Kw¢­µèIEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/remmina-fullscreen.png000077500000000000000000000010761171526373700261100ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<»IDAT8­’¿kAÇßÌ{s{3lQkÿ9¬M.»,”Äxö 64Šˆ]!˜ïn=›`¿¥‚ØX¥¸JbíÝæfw~Xœš÷‚A¿0 oø¼/ßy<潇Iºwþ‰÷þôËõÍæ$†•D:CÄçˆø€1æ1kí­îÿ68Žè`QoÄËÙcÆ™(ƒ½sº0¶Õëöžþ‘ Š"¤€ö®\»#”R@ˆ ˆÿ<Dl®a»ý"sN&Ib'ˆõ‹axb·°9r `%y*¨€¬ PUŒïøæUàœ J5ê—“Nï3›g. â‡jE]2.ÿ¾º²FÃ,¶?(6Nª› y ä©ÜŒvcÓ$¥|'„¨Úb !r¨,çû¦SS¡tµÖsÃá€J;ŽÐ`0tƘ[¼ó:ùb­»~\ƒ¢(nl½j"€¤ÓûX«ÕèÜù³E¶—q%/kʲlàœeý~ߤiºph‘fã™%"ZâœeÎ9mŒi½é¾mýzû¿›xPs·ãGˆ¸L„Vëb{÷ë·ù4MÍaîȋͅgÎû3ë›wýðŸ¿ðœÊ¼ŽÇãWƒÁàE–åa­V“*• :xž‡,˰, óùÜ¢èÍÅüë<ìv»ÒñxD£ÑÀjµ‚®ëÐuªª¢Õje|º6ƒçv»-†\.×u±ßï!IÂ0„(Š(—Ë¢®ëï¯Òé4¶Û-òù<â8†çy ”‚RŠR©Ó4ÁûyÑB’$8Npab·Û¡^¯ƒ‚B¡€ `cß.*ˆãxaÛö#!ëõà8ŠÅ"6› <σïûËÉdòë¢A4˲NÕj„,—K˜¦ Ó4žç¾ïnÜA¯×{!„ E‘TU…(Š‚¶m)¥“Ùlöå&ø»ÎóùüœJ¥€1¶A›N§ßÿçܼ&î~¦»ã¯Çú/ À™IEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/remmina-pin-up.png000066400000000000000000000011341171526373700251460ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<ÙIDAT8¥“?¨ÓPÆO.M›¦dQ0"!Þ$Ä×’Q„"HÇfRÓ’Ü,8¸¸djGq)âÐ ‡.op*âÒAHi)ŠyKé`Ót ¤éÍq“÷jVýà,ç~üî=.ƒˆð?"Ç ÃÐšÍæíÃ|æXÇq BÈ <ø§0 ó˜ã8Í4ÍçWòi=hµZw3™ÌJé·8Ž?³,{¿P(¼j4ù~¿FQT²m{‘ 0MÓÌf³okµçy8Žƒ²,GÕj•p]7FÓív{o8Ò´\°, ’$QaµZ ¼çy°Ûí X,QÕ$I^€•ZB»Ý~§ªê³J¥ÂM§SpJ¥H’³Ù,ò}?Ùl6Ù$INSº®çAp5M»Cù|a¥4Œ¢èÏ !·ñGêeY~Çñv<ß,—Ë|.—J)ø¾Ù¶ýä²÷ @×õ¼ªªga>áiåÉdòRQ”<˲°^¯ÝÃË~íA§Ó9Eñoì÷{¹×ë}TÅ ‚àûb±Àår"â§Cƒˆ`Yñ}ÿ Ïóï»Ý®}Ù`Æ |%„¼ ~«ÿõz={ÝYêþFGÿ…ëô®ùˆÏIIEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/remmina-scale.png000077500000000000000000000014661171526373700250400ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<³IDAT8¥ÓOh\uÀñïû½ÿoÿ¤Í¾d·iRjµØ´Išx(M‹Ahi]iÔŠ½ì!7QJ© ´×BIÛ›‚=¤ÂAEz‰`/ÕR¼ˆÓìfíJò–$›v›÷˦û~”š ‚Ã0Ãð9Œ¦”âÿ„vbèÔ;¦xtI#ÚñÖË Îå'&ÇO†Þz3è:ú†ŸÙѦ†ŽeLCÇÜ¢V—*µñÑ«¢(Ú™Ÿ˜TêQK³ŸáÓ/oá:&1ÇÄÛ1×ijM<×d๧ã–e™RJÀéWº91ðšFƒŸºE±Pd!XÀM$ÈÄÛèð÷m:ʰL¸k°°06öÉd‚®®núaõaR©Äå‘tÝÐ7bcS¯¯3:zÞÞ^½ð*?–Î~^à“é4ïçÔÛ§ñܘs[ÓÓÓ¤ÓiÜ–½\øâ7–×4^±“g÷¤ùævÀµï+d_ËbÛö-™™zzzÿáú»wrpo†¸k²;“äåÃ{(/IÖL!D2—ËíÚA…T*ÅŸ‹’Öæ8¶M®ÆvO°ÍdR1JÁC|ß_!D¹\.¯:ŽK:fqq‘Öm6Ë÷CS#a š\˜¥±´Ò–òRjRÊûFEg>:ÿá¥”áØ®.„Ð‡Ž¾ÄÇ7g‰ëôw¶P©J¾»3OÂtl‡ùùy+ Ã_D~b2¯”Ú4)¥Z‹Åâ=VfÕûÇŸa¹Zãâø/ŒMÝ¥«#Æ'÷Q ¤”kRJ@{ò™r¹Ü˲n¶··û}}}^,ÙÌêƒ*³³wÃB¡ÐÈf³ñ¹¹¹(ŸÏ¯ÔëõÛ€K×õ÷,Ë:Öh4:…¿W«Õ¯Â0¬)¥F†‡‡½b±MMM}½%ðo188ø¼išßNEïþö{‘ÊåIEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/16x16/actions/remmina-switch-page.png000077500000000000000000000010701171526373700261530ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<µIDAT8¥’=oA„ŸýºËÙg[Ê/pAA©é0ˆŠÂ%q’‚‚ž‚†"‘€QŒ 2¶)¬$RèH?ǘœœœow)Ù>Š(#­^­vv4³;Â{ÏU ¯tÐK««›ZùM)„É#9ç3k³7vïùô™ðÞÓXk¤ w›0ˆÐZh…Ñòl)–Ý/Û£ÐDó­VëxÆwÖ¢"ï»?‰BCaNOÌ¥{ (¥Ü`0˜Žg,¯,úO?“$ ?98Øgœ/H€µ sÞ§6˶»_¿m;PRÅÞþ.×o5ˆã2ZKŒ’£0J¢µÔÞfz¯ýöY½^Ýï÷ÿh¦0NOˆã2ﺿˆÂQ.â<¼{cÌ8 Ã"0+ ¥àÑý›<¸} qâtB).ò½‡xD)e2u¥RQ€Œ¢Tò~£ÕÄ^8ç¶Ö7ž¼”R†Þ]®™ Óîí;+kË)[¨ÿ L@%G¥r©¬rø¤i:JORŒrœu¯žn¬¿PZå×Ú:a­ýÐéô~ÃY‘¦Q«ÕtµZuA`›ÍæyËr.ƒ¿« ˜UÕd’IEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/16x16/emblems/000077500000000000000000000000001171526373700215675ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/16x16/emblems/remmina-sftp.png000077500000000000000000000015611171526373700247050ustar00rootroot00000000000000‰PNG  IHDRóÿasBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<îIDAT8“MlTuÅϽÿ÷óf˜gʘ¶ÈØF¦ÍȇE6™À¢!¦ˆ.š`Œ1d6êÂèš–jâ‚„11ÄDeÃBhq‚M­& !GÚ™ÔvÚ¡3ó¦ï½ÿ X%ñ¬ïýäÞsÈZ‹µª”i€…ü€…ÜcTX fŸ˜ÕQpÑZ{²X²þ£YzP)ñG‰Ü7ô~,ÕU /Ù £Zè4«X˜½ü=seQ+õf±d¯ý ðÓ™u§ÖoÜñn~øˆ+ÝÐf° ˆZKÓ¸Y9Ñ W›¯KöÊc@¥L»¥—¶TömÛèÀòãzÐw9¿àú÷ŸÌk¥·ð#w!×}GVÉæÂ5LOƒu ˆT µêº^»eØÈp ‰õYôæGža!޵•29nììàðA¸ñ˜ûý‚N€vcÖì—,œ>æø«/¿ö™#ô$…¶ß‹ß.zƒ+e%·›G ]på+ä¶! —ÕVG_y»³°–îþ` žÌ¼äfh­@ÀörÑjÓ¶÷¬6d­Z†18`DÁý ­Úup¦ðm!ÓK1/YçbɳZû›è¦D’IPƒ²Ïkfê0Y)Ópb¦2/d¡çz@n>ôg3QØaçá «¡¿cc Ñ…¨=Žlÿ[Â(³oþÎÔN,ar[÷{ñ }@xy´ê‚ˆ&¿qâëÔ©t÷à{›vÊhå ¯™qXHY¢ŸÁ"ëîÅ/w¿¾÷ÉÄ„#«ýCoô&Ói2þ%…`' f,\7övcæú7Áü«Ÿ¿Zå­BºãÙÜ®LÏ–ÉÔÙH‚eTH¸=ù…ßnÌ\ÕJK¶CkËT)S\8ò¸—’é\”Êlv´ ÍÊÂŒYmÕ´1úP±dOÿg™Ö€</Ø ` Àt±ôÏ…§þ¯¢H]~«J ¿IEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/22x22/000077500000000000000000000000001171526373700201355ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/22x22/actions/000077500000000000000000000000001171526373700215755ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/22x22/actions/remmina-fit-window.png000077500000000000000000000014351171526373700260260ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<šIDAT8µ•ÏKTQÇ?çÞ;ïÍrtZA$´“~™µèwDF› 2Zô' S³wr”6-"Ú¥‹šZDeµ0ÇZ¸0"W‘­Ä…VXþhœw[¼76jг¾Üwî/çœwÏ÷е–ÿa:–pdÏî½ÿœØ^¾;g¯ k2éì·ßÎwç\à# ª ÀzLpP† “ÎΛf ØpY8™tÖ¶·oš·æ²Ñì;uú¤^AÖ¶\öm™tooo1ßÀ3@ÀCåR ;lÞ¶K´V­1Z0ZaŒòG­‚¹ŸkZ+y;¼¥ïÑË@k±g‚ìmlÞ.wŸ¼afö;Q'BÔÕ¸Ž&êßw|ß ¾£ŽaUÜa×Ö–Ä‹Çw7µµµ¹ûîY—IggT&ˆ„é™Ò ª¥ù²X„úúzɤ³àߊ;q¨yúðΆxÅWJ`üòù±xœX,†AÄ…T²„E ±ˆ¸vµëÕ$ K›fjê+ò¹”ï Ug©¹Îò­Â¤{ãÖm>ŒŽ""a¶‡'>wö uuÉe™ü5±ãDÀ†641€ã:\ k­'"¯Ðsó:©ºº_®XÏÊøø¸Íwç4øê69Pì¿266ÖªD%›š6&#cL((¥(¾œ¹¯pu Ø?1Pì¿f€(PÂSç  ùÂÃÂZü¶ kö„ 甆ß{zzÞÇDÄœ`¾]U6(ó@i{k‹$‰Ù¶£Gf*J:»:,0G•¦¾|½õþ½“ø:R ‚½ èìêx¯ÁÕz¼V:»:Ü ðúž>§ïé3…ß•K£®D[ªD ”­µ½Y0ù_o^è{¼RûŽ/Î+¾7ªIEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/22x22/actions/remmina-fullscreen.png000077500000000000000000000015431171526373700261010ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<àIDAT8µ•ˆTUÇ¿çþxofg'¡\g!Ý4P¬íÿ ¿t…„ˆÖ™qÖm… ¨(ÊÀÿ\ö¯Hñ?•%–Ýñ5•øƒ é¯þ‰Àþ(E"XIÐvËÝ7óÞ»oÞé§õ¡£ópóÀ…sÏ9÷sϽÜs.13ž†ˆ¤#£ÃöŽ”$§$¿½¯ü¹m§>BÀu§§&«. <>>.~ýí— zO)@†Ž­~ùñƒóù¼êëë[ÙÉ788xgll,J .·ó—QL®CDŸ:S__ŽU‡N®ßüÖú5/¬ZIXJ@J ­D{H(IÐêžíßo¬¾øÍ™ã^~$¸R©¤¼Ø¿z­˜þö*”–è±R¶F-‘¶5Ò)…´¥‘Nid3^}eã³`ôV*•”Û\ðjØs+• ‡Ú*€ë4=ƒ¦oàù^ BøAß„L Æ´ÚÇÄ÷y´T.ÐRÆ#£Ã‡ìp®¼± ¥mî_qL'€¢{z*^ò !ÞQJ®,• £jïhù³loöÝùùù¥)–î^;DAŸËlö™¡» wCA —2™žÄØMlÛ&0rÂS¼}ûÎOÿ”™£z}ögc̛©֌1æu?.EÑA`v:ÕZ À©Öv-  èTk.{ÇNµö7QqÏî[37g¬5Ï'!ÍÜœùŒ`bbÂçX?\ÒåâtLk½" ØóOÄ­Oœé¯jq{Ç&”ÏçU£ÑxnqqÑ‚À ÃPEQ$™™@JJ)[–eõzý¯ÙÙY—uQ@*Ó›ÉîØ¹ý”ÖzGÜïûþwß_¾ò‘ëº <.3û]Ám¸ r¹U™­Û¶8ýý¹×<ÏÇÜÜÜ…‹ç/½ßlzÀ0óCí3ÑR*´Öú®M~1½¿ë`æD£¸g·HËÌøæyh‹Ö€ÓIEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/22x22/actions/remmina-scale.png000077500000000000000000000022651171526373700250300ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<2IDAT8µ•KLœU†ŸsþÛ0ÃÌ-Å™D(iz©FÚ¤õ’@Ò«&¦JÒ…+“º0ÑÆ…+šbÓ.í®I;iHÁX« 6j45•H5•(Ž(”·ÎýòÌc£ ¿äÍ;çùÞó/çJ)þÐ 7GŽ2ùæªÐÅË©ú(=Ø¢½š­Bû_S•’¶mÿœ ]¼|sc…ø0°ã…ÝO…&%º.ѵ"Zó^ i‚Û¿þ¼ãúµÐGÀžu`MŠý¾š øôÊM4)qXSÇaêX+WKÇÒ%¦%ÎÜN‹g›vz®_ í:rìºx9½,„RJ„˜†ÄеµeãÑ8j~¥øB tÝdɳûm6EöF8Ñõ¯½\WÇáá[\¹ÒO0¤¡±œî!ž23CäÁß~ý9n—ÇÈd³^ ¹\,îÜùÏx¹»›á)wCQbÍâ05æ—’|¥œ8rœ¡åèèh_OOÏîóçϫǂc±—.…èìì$ôS‚‰HŠÎ=AÜN¥·Çg9ua„^ÝÏÌÌLS$9 |\`íÛ7nPWWǽ¨“»Óqžo­[!ØV·‰§üôŒÑÝÝí’R¾¿šQß#ðÝí‡l«Û„&R€¥ƒÓ§)pܼ¥D–Œ,Å0 ­§§§ö±à‰‰ |>áq6–• 8Œe Ë”¸Lpš’CPYîâ™>Ÿ/ ´<ìñxˆF£lôZD ,]â0NSPj-CMâ‰4•^‹t:mÛ‰°R*›Ëå(ô²‚ššj¦¦¦ØQãe|rM t ¦¶ .1¦óKI¢)j«\ÌÍÍi©TêϰmÛW¯]Íf³(¥PJ±uk#CCC´ï¬$²ã—±ÙµK‚ùGi¾óú¾ÆïŽFgS©ÔÈÊÃGÖ§€W—Æíòxššš­–]ûDïÀ(™Ôú=”:t.&ø-¼ÀÁçüt<ãçܹs©p8üI__ß;+`¥B 0XîkжlÙâÙ»wïW~¿ßßqà€slÖfl*ÊbÏC"‚“:*S-FGï Ñ$€¾¦: ßy–ŒÏ%\®Z1òàþ§Î¾[×:®Ñ žÕ°FÁèr.‡®åß¿6þÎNOÄÑ…d26œ@ï¹ó´ða%"XDƒÀ³ˆQ¿œ#¾E4°¸Þ×uÆZïOÑ•ÎÈ@(”œc­`4A+ã%­`‚3 ç¸üºPÃ?_oEîÍë·sè‹V¿®â]<Žlöçá^ï(M‚'‰ÄìÜïhn~§/¢{è2LÍc«w|6uÏ673íóÓS/ÆÇÇÆÆÆ¸!xccƒ=wxÿ̼ËórmøßâTàa¸¿«]£–––ÚäÝÇJ˜"3Tjaˆ VѮކÀãÛ1<ºÙfNgDvudG‹ª/§VRë¾ìûz+ªY!DÏ'&^¾ÒVÀ9ç3óñÁ3ñ™Dtu`` -—Ëùý×b¥”CèVÀ{=öimmMÀqnÔ]»BD Däl‹ðJ*õåLOOog3 ™Ì÷C‹Å¶€º#½W#ïÞ«I­uÇÞ5Ù·oE8ËÂO«×hC0U=ÏçóžsÎ2³ED¬” µÖÎó¼b:Þnìˆ*¹ZŠò¶ëò?) ®À[ ¿’5€R]¸ê´M[Õ=ìX­L®?IEND®B`‚FreeRDP-Remmina-356c033/remmina/icons/22x22/emblems/000077500000000000000000000000001171526373700215615ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/icons/22x22/emblems/remmina-sftp.png000077500000000000000000000023541171526373700247000ustar00rootroot00000000000000‰PNG  IHDRÄ´l;sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î<iIDAT8µ•]lU€¿{gfw»Ûí)¶.k‹!ËŸ”M ! $JÀ(‰1š|ÐÐG 1M|ðÁD}Ð6(1$&( %!„@J+ØH-J[ òS`SJ»Ým;;³3s|è <9É—LæÞóåÜ{ν£D„ÿã14¡µY­RÚXc˜‘ï4¢ «Ë÷œ£-©´™*NÝ+ãÖf5Ͱ¢ß”Åg¯­{ìÅpyUƒŠÄgvþcÃ=rµgŸ]ëßë{Å7SiÉ>PÜÚ¬š «|OrѶòÚ† †’ ƒàØ ,PUG¦o_ñâéÝyßs×¥Òrüžâ®–•3] z¨(àŒƒ{ŒXE‰Ç_ˆ¦ùÅ ÏmâKnsÇ.-±s]z<×IwÛ'f=b6&7œCÌ`.Ä·º9«CáXíúÖf•ºKœ8ò¶3zJ7<±‘úE/¡t‘¿Ž}Jîú@p¾óg÷üŸ»N9¶ãÄɽ[ ¹¡Œj|qtÐÇŒ†¦°RêÙÛÄm;Õ{E»'9çÉ—ñíC¸#;ydÞjÊ«ªù§}»¶óÿ¾±à¹?/{¥°¬XȯéiÿÌ=tlB «J¦e5Ý·6«w‚€ÌP…ÒF¾ó7—Á+tPQ“À${¥eGk³šJËÑÀs.ØÙ>Ð5%q–²x™ [›•ö+í‘ÞÀs†(:[Qtlœñ †i ‰°°o5ªˆ¸w”> Si‘TZºSi9Š„;ÝB–HpîdÞ%\ùʨBÄË8§ÜÓÞàD¡t ÂÏ0š ¿ûÀˆïú[oÖvªK¨í[µ\YÆþÚ9Kãµ®2ðÏ‚ %Ã(F[³ÐæL0Èôµ¸ýÝ-Ù è?¿|“œ¼¯ ã+UYŒé/Ípõ†‡¡hUBG+(L £Wé2gÛÏÉîö]kj‹ä'ÇO)VJ™@þ.©DMqµ G_BEGIN_DECLS typedef enum { REMMINA_PLUGIN_TYPE_PROTOCOL = 0, REMMINA_PLUGIN_TYPE_ENTRY = 1, REMMINA_PLUGIN_TYPE_FILE = 2, REMMINA_PLUGIN_TYPE_TOOL = 3, REMMINA_PLUGIN_TYPE_PREF = 4, REMMINA_PLUGIN_TYPE_SECRET = 5 } RemminaPluginType; typedef struct _RemminaPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; } RemminaPlugin; typedef struct _RemminaProtocolPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; const gchar *icon_name; const gchar *icon_name_ssh; const RemminaProtocolSetting *basic_settings; const RemminaProtocolSetting *advanced_settings; RemminaProtocolSSHSetting ssh_setting; const RemminaProtocolFeature *features; void (* init) (RemminaProtocolWidget *gp); gboolean (* open_connection) (RemminaProtocolWidget *gp); gboolean (* close_connection) (RemminaProtocolWidget *gp); gboolean (* query_feature) (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature); void (* call_feature) (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature); } RemminaProtocolPlugin; typedef struct _RemminaEntryPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; void (* entry_func) (void); } RemminaEntryPlugin; typedef struct _RemminaFilePlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; gboolean (* import_test_func) (const gchar *from_file); RemminaFile* (* import_func) (const gchar *from_file); gboolean (* export_test_func) (RemminaFile *file); gboolean (* export_func) (RemminaFile *file, const gchar *to_file); const gchar *export_hints; } RemminaFilePlugin; typedef struct _RemminaToolPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; void (* exec_func) (void); } RemminaToolPlugin; typedef struct _RemminaPrefPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; const gchar *pref_label; GtkWidget* (* get_pref_body) (void); } RemminaPrefPlugin; typedef struct _RemminaSecretPlugin { RemminaPluginType type; const gchar *name; const gchar *description; const gchar *domain; const gchar *version; gboolean trusted; void (* store_password) (RemminaFile *remminafile, const gchar *key, const gchar *password); gchar* (* get_password) (RemminaFile *remminafile, const gchar *key); void (* delete_password) (RemminaFile *remminafile, const gchar *key); } RemminaSecretPlugin; /* Plugin Service is a struct containing a list of function pointers, * which is passed from Remmina main program to the plugin module * through the plugin entry function remmina_plugin_entry() */ typedef struct _RemminaPluginService { gboolean (* register_plugin) (RemminaPlugin *plugin); gint (* protocol_plugin_get_width) (RemminaProtocolWidget *gp); void (* protocol_plugin_set_width) (RemminaProtocolWidget *gp, gint width); gint (* protocol_plugin_get_height) (RemminaProtocolWidget *gp); void (* protocol_plugin_set_height) (RemminaProtocolWidget *gp, gint height); gboolean (* protocol_plugin_get_scale) (RemminaProtocolWidget *gp); gboolean (* protocol_plugin_get_expand) (RemminaProtocolWidget *gp); void (* protocol_plugin_set_expand) (RemminaProtocolWidget *gp, gboolean expand); gboolean (* protocol_plugin_has_error) (RemminaProtocolWidget *gp); void (* protocol_plugin_set_error) (RemminaProtocolWidget *gp, const gchar *fmt, ...); gboolean (* protocol_plugin_is_closed) (RemminaProtocolWidget *gp); RemminaFile* (* protocol_plugin_get_file) (RemminaProtocolWidget *gp); void (* protocol_plugin_emit_signal) (RemminaProtocolWidget *gp, const gchar *signal_name); void (* protocol_plugin_register_hostkey) (RemminaProtocolWidget *gp, GtkWidget *widget); gchar* (* protocol_plugin_start_direct_tunnel) (RemminaProtocolWidget *gp, gint default_port, gboolean port_plus); gboolean (* protocol_plugin_start_reverse_tunnel) (RemminaProtocolWidget *gp, gint local_port); gboolean (* protocol_plugin_start_xport_tunnel) (RemminaProtocolWidget *gp, RemminaXPortTunnelInitFunc init_func); void (* protocol_plugin_set_display) (RemminaProtocolWidget *gp, gint display); gboolean (* protocol_plugin_close_connection) (RemminaProtocolWidget *gp); gint (* protocol_plugin_init_authpwd) (RemminaProtocolWidget *gp, RemminaAuthpwdType authpwd_type); gint (* protocol_plugin_init_authuserpwd) (RemminaProtocolWidget *gp, gboolean want_domain); gint (* protocol_plugin_init_certificate) (RemminaProtocolWidget *gp, const gchar* subject, const gchar* issuer, const gchar* fingerprint); gchar* (* protocol_plugin_init_get_username) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_password) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_domain) (RemminaProtocolWidget *gp); gint (* protocol_plugin_init_authx509) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_cacert) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_cacrl) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_clientcert) (RemminaProtocolWidget *gp); gchar* (* protocol_plugin_init_get_clientkey) (RemminaProtocolWidget *gp); void (* protocol_plugin_init_save_cred) (RemminaProtocolWidget *gp); void (* protocol_plugin_init_show_listen) (RemminaProtocolWidget *gp, gint port); void (* protocol_plugin_init_show_retry) (RemminaProtocolWidget *gp); void (* protocol_plugin_init_show) (RemminaProtocolWidget *gp); void (* protocol_plugin_init_hide) (RemminaProtocolWidget *gp); gboolean (* protocol_plugin_ssh_exec) (RemminaProtocolWidget *gp, gboolean wait, const gchar *fmt, ...); void (* protocol_plugin_chat_open) (RemminaProtocolWidget *gp, const gchar *name, void(*on_send)(RemminaProtocolWidget *gp, const gchar *text), void(*on_destroy)(RemminaProtocolWidget *gp)); void (* protocol_plugin_chat_close) (RemminaProtocolWidget *gp); void (* protocol_plugin_chat_receive) (RemminaProtocolWidget *gp, const gchar *text); RemminaFile* (* file_new) (void); const gchar* (* file_get_path) (RemminaFile *remminafile); void (* file_set_string) (RemminaFile *remminafile, const gchar *setting, const gchar *value); const gchar* (* file_get_string) (RemminaFile *remminafile, const gchar *setting); gchar* (* file_get_secret) (RemminaFile *remminafile, const gchar *setting); void (* file_set_int) (RemminaFile *remminafile, const gchar *setting, gint value); gint (* file_get_int) (RemminaFile *remminafile, const gchar *setting, gint default_value); void (* pref_set_value) (const gchar *key, const gchar *value); gchar* (* pref_get_value) (const gchar *key); gint (* pref_get_scale_quality) (void); gint (* pref_get_sshtunnel_port) (void); guint (* pref_keymap_get_keyval) (const gchar *keymap, guint keyval); void (* log_print) (const gchar *text); void (* log_printf) (const gchar *fmt, ...); void (* ui_register) (GtkWidget *widget); GtkWidget* (* open_connection) (RemminaFile *remminafile, GCallback disconnect_cb, gpointer data, guint *handler); void (* get_server_port) (const gchar *server, gint defaultport, gchar **host, gint *port); } RemminaPluginService; /* "Prototype" of the plugin entry function */ typedef gboolean (*RemminaPluginEntryFunc) (RemminaPluginService *service); G_END_DECLS #endif /* __REMMINA_PLUGIN_H__ */ FreeRDP-Remmina-356c033/remmina/include/remmina/types.h000066400000000000000000000056061171526373700226420ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINA_TYPES_H__ #define __REMMINA_TYPES_H__ G_BEGIN_DECLS typedef struct _RemminaFile RemminaFile; typedef enum { REMMINA_PROTOCOL_FEATURE_TYPE_END, REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, REMMINA_PROTOCOL_FEATURE_TYPE_SCALE } RemminaProtocolFeatureType; #define REMMINA_PROTOCOL_FEATURE_PREF_RADIO 1 #define REMMINA_PROTOCOL_FEATURE_PREF_CHECK 2 typedef struct _RemminaProtocolFeature { RemminaProtocolFeatureType type; gint id; gpointer opt1; gpointer opt2; gpointer opt3; } RemminaProtocolFeature; typedef struct _RemminaProtocolWidgetClass RemminaProtocolWidgetClass; typedef struct _RemminaProtocolWidget RemminaProtocolWidget; typedef gpointer RemminaTunnelInitFunc; typedef gboolean (*RemminaXPortTunnelInitFunc) (RemminaProtocolWidget *gp, gint remotedisplay, const gchar *server, gint port); typedef enum { REMMINA_PROTOCOL_SETTING_TYPE_END, REMMINA_PROTOCOL_SETTING_TYPE_SERVER, REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD, REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION, REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP, REMMINA_PROTOCOL_SETTING_TYPE_SCALE, REMMINA_PROTOCOL_SETTING_TYPE_TEXT, REMMINA_PROTOCOL_SETTING_TYPE_SELECT, REMMINA_PROTOCOL_SETTING_TYPE_COMBO, REMMINA_PROTOCOL_SETTING_TYPE_CHECK, REMMINA_PROTOCOL_SETTING_TYPE_FILE, REMMINA_PROTOCOL_SETTING_TYPE_FOLDER } RemminaProtocolSettingType; typedef struct _RemminaProtocolSetting { RemminaProtocolSettingType type; const gchar *name; const gchar *label; gboolean compact; const gpointer opt1; const gpointer opt2; } RemminaProtocolSetting; typedef enum { REMMINA_PROTOCOL_SSH_SETTING_NONE, REMMINA_PROTOCOL_SSH_SETTING_TUNNEL, REMMINA_PROTOCOL_SSH_SETTING_SSH, REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL, REMMINA_PROTOCOL_SSH_SETTING_SFTP } RemminaProtocolSSHSetting; typedef enum { REMMINA_AUTHPWD_TYPE_PROTOCOL, REMMINA_AUTHPWD_TYPE_SSH_PWD, REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY } RemminaAuthpwdType; G_END_DECLS #endif /* __REMMINA_TYPES_H__ */ FreeRDP-Remmina-356c033/remmina/po/000077500000000000000000000000001171526373700166615ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/po/CMakeLists.txt000066400000000000000000000015321171526373700214220ustar00rootroot00000000000000# po/remmina - The GTK+ Remote Desktop Client # # Copyright (C) 2011 Marc-Andre Moreau # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, # Boston, MA 02111-1307, USA. include(GETTEXT) gettext(${CMAKE_CURRENT_SOURCE_DIR} "remmina") FreeRDP-Remmina-356c033/remmina/po/ChangeLog000066400000000000000000000000001171526373700204210ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/po/POTFILES.in000066400000000000000000000011301171526373700204310ustar00rootroot00000000000000desktop/remmina.desktop.in src/remmina.c src/remminamain.c src/remminapublic.c src/remminafile.c src/remminafilemanager.c src/remminafileeditor.c src/remminaconnectionwindow.c src/remminaprotocolwidget.c src/remminainitdialog.c src/remminaabout.c src/remminapref.c src/remminastringlist.c src/remminaprefdialog.c src/remminassh.c src/remminasshplugin.c src/remminachatwindow.c src/remminaftpclient.c src/remminasftpclient.c src/remminasftpplugin.c src/remminascaler.c src/remminapluginmanager.c src/remminalog.c src/remminakeychooser.c src/remminaexec.c src/remminaicon.c src/remminaappletmenuitem.c FreeRDP-Remmina-356c033/remmina/po/bg.po000066400000000000000000000742741171526373700176270ustar00rootroot00000000000000# Bulgarian translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:24+0000\n" "Last-Translator: Vic \n" "Language-Team: Svetoslav Stefanov \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "X-Poedit-Country: BULGARIA\n" "Language: \n" "X-Poedit-Language: Bulgarian\n" "X-Poedit-SourceCharset: utf-8\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Свързване към отдалечени компютри" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Клиент за отдалечен доÑтъп Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Общо %i елемент." msgstr[1] "Общо %i елемента." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Сигурни ли Ñте, че желаете да изтриете '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "ÐевъзможноÑÑ‚ за внаÑÑне:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "ВнаÑÑне" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Този протокол не поддържа изнаÑÑне" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Редактиране" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Изглед" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_ИнÑтрументи" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Помощ" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Създаване на нов файл за отдалечен доÑтъп" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "ОтварÑне диалога за наÑтройки" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "ПриÑтавки" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Онлайн Уики" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Прозорец за изчиÑтване на грешки" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "ÐžÑ‚Ð²Ð°Ñ€Ñ Ð²Ñ€ÑŠÐ·ÐºÐ°Ñ‚Ð° към Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за отдалечен доÑтъп" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Създава копие на Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за отдалечен доÑтъп" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Редактира Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за отдалечен доÑтъп" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Изтрива Ð¸Ð·Ð±Ñ€Ð°Ð½Ð¸Ñ Ñ„Ð°Ð¹Ð» за отдалечен доÑтъп" #: ../src/remminamain.c:980 msgid "Export" msgstr "ИзнаÑÑне" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Лента Ñ Ð¸Ð½Ñтрументи" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Лента за ÑÑŠÑтоÑнието" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Бързо търÑене" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Малки бутони в лентата Ñ Ð¸Ð½Ñтрументи" #: ../src/remminamain.c:1002 msgid "List View" msgstr "СпиÑъчен изглед" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Дървовиден изглед" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Име" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Група" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Сървър" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Поддържани формати\n" "* Ñървър\n" "* Ñървър:порт\n" "* [Ñървър]:порт" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Поддържани формати\n" "* :порт\n" "* Ñървър\n" "* Ñървър:порт\n" "* [Ñървър]:порт" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Избиране на Ñървър за отдалечен доÑтъп" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Файл за идентичноÑÑ‚" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Преглеждане на мрежата за откриване на %s Ñървър" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Парола" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Разделителна ÑпоÑобноÑÑ‚" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Използване на размера на прозореца" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Използване на разделителната ÑпоÑобноÑÑ‚ на клиента" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "От потребителÑ" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Клавиатурна подредба" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Хоризонтално мащабиране" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Вертикално мащабиране" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Включване на SSH тунел" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Тунел чрез локален адреÑ" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Ñървър" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "СъщиÑÑ‚ Ñървър на порт %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Кодова таблица" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Стартиране на програма при Ñвързване" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Път за Ñтартиране" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH идентифициране" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "ПотребителÑко име" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Публичен ключ (Ðвтоматично)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "ОÑновни" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Допълнителни" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Стандартните наÑтройки Ñа запазени." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "ÐаÑтройки на отдалечен доÑтъп" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Стандартно" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Профил" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Бързо Ñвързване" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Протокол" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Файлът %s не е открит." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Ð’ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ† има %i активни връзки. Сигурни ли Ñте, че желаете да го " "затворите?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "" "ПреоразмерÑва прозореца така, че да паÑне Ñ Ð¾Ñ‚Ð´Ð°Ð»ÐµÑ‡ÐµÐ½Ð°Ñ‚Ð° разделителна " "ÑпоÑобноÑÑ‚" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Превключване на пълноекранен режим" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Превключва подÑтраниците" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Превключва в мащабиран режим" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Прихващане на входа от клавиатурата" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "ÐаÑтройки" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "ИнÑтрументи" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Минимизиране на прозорец" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "ПрекъÑване" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Свързване към „%s“…" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "ОтварÑне на Ñигурна конзола в нов терминал..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "ОтварÑне на Ñигурен транÑфер на файлове..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Свързване към SSH Ñървъра %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Свързване към %s чрез SSH тунел..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Изчакване за приÑтигащ SSH тунел на порт %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Командата %s не е открита на SSH Ñървъра" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Командата %s Ñе провали на SSH Ñървъра (ÑÑŠÑтоÑние = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "ÐеуÑпех при изпълнението на команда: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s парола" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH парола" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Ключова дума за Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ на SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Слушане на Порт %i за приÑтигаща %s Връзка..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Идентифицирането Ñе провали. Опит за повторно Ñвързване..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Запазване на %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Запазване на паролата" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA Ñертификат" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Сертификат на клиента" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Ключ на клиента" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Поддръжка:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Сътрудници:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina е безплатен Ñофтуер; Вие можете да Ñ Ð¿Ñ€ÐµÐ¾Ñ‚Ñтъпвате и/или променÑте " "ÑъглаÑно уÑловиÑта залегнали в GNU General Public License, който е " "публикуван от Free Software Foundation; или верÑÐ¸Ñ 2 на лиценза или (по Ваш " "избор) вÑÑка Ñледваща верÑиÑ." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina Ñе разпроÑтранÑва Ñ Ð½Ð°Ð´ÐµÐ¶Ð´Ð°Ñ‚Ð° да е полезна, но ÐЕЗ ÐИКÐКВРГÐРÐÐЦИЯ; " "без дори коÑвена Ð³Ð°Ñ€Ð°Ð½Ñ†Ð¸Ñ Ð·Ð° ПРОДÐЖБРили ПРИГОДÐОСТ ЗРОПРЕДЕЛЕÐРЦЕЛ. Виж " "GNU General Public License за повече подробноÑти." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "ТрÑбва да Ñте получили копие на GNU General Public License заедно Ñ Ñ‚Ð°Ð·Ð¸ " "програма, ако ли не, пишете на ФондациÑта за Ñвободен Ñофтуер, Inc, 59 " "Temple Place, Suite 330, Boston, MA 02111-1307, СÐЩ." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Клиента за отдалечен доÑтъп за GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Nikolay Ninkov https://launchpad.net/~nickypn\n" " Svetoslav Stefanov https://launchpad.net/~svetlisashkov\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "ОтварÑне на връзка" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Редактиране на наÑтройки" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Ðай-близък" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Плочки" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Двулинейно" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Хипер" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Ðвтоматично" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Прозорец Ñ Ð¿Ñ€ÐµÐ²ÑŠÑ€Ñ‚Ð°Ð½Ðµ" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Пълен екран Ñ Ð¿Ñ€ÐµÐ²ÑŠÑ€Ñ‚Ð°Ð½Ðµ" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Пълен екран" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "ПодÑтраници по групи" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "ПодÑтраници по протоколи" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "ПодÑтраници за вÑички връзки" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Да не Ñе използват подÑтраници" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ формат 'ширинахвиÑочина'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "СпиÑъците ÑÑŠÑ Ñкорошни връзки Ñа изчиÑтени" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "ÐаÑтройки на Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "ÐаÑтройки" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "ЗапомнÑне на режима на преглед за вÑÑка връзка" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Запазване на наÑтройките при начало на Ñвързването" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Ðевидима плаваща лента Ñ Ð¸Ð½Ñтрументи" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Подпрозорците винаги да Ñе показват" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Скриване на лентата Ñ Ð¸Ð½Ñтрументи за връзка" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "ДейÑтвие при двойно цъкане" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Стандартен режим на преглед" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ñ Ð¿Ð¾Ð´Ñтраници" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "КачеÑтво на мащабиране" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Локален порт на SSH тунела" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "МакÑимален брой Ñкорошни връзки" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "ИзчиÑтване" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Разделителни ÑпоÑобноÑти" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Ðплет" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Клавиатура" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host клавиш" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Ðвтоматично намеÑтване на прозореца" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Прихващане на клавиатурата" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Показване/Ñкриване на лентата Ñ Ð¸Ð½Ñтрументи" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Идентифициране на SSH паролата не уÑпÑ: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Идентифицирането на Ð¿ÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ на SSH не уÑпÑ: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Файлът Ñ SSH ключа вÑе още не е зададен." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Ðвтоматично идентифициране Ñ Ð¿ÑƒÐ±Ð»Ð¸Ñ‡ÐµÐ½ ключ на SSH не уÑпÑ: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Идентифициране паролата на %s's на SSH Ñървъра %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Идентифициране идентичноÑтта на %s's на SSH Ñървъра %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Стартирането на SSH ÑеÑÐ¸Ñ Ð½Ðµ уÑпÑ: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "ÐеуÑпех при Ñвързването към целта на SSH тунела: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Изпълнението на %s на SSH Ñървъра не уÑÐ¿Ñ : %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "ЗаÑвката за пренаÑочване на портове не уÑÐ¿Ñ : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "ÐÑма отговор от Ñървъра." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Създаването на sftp ÑеÑÐ¸Ñ Ð½Ðµ уÑпÑ: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Инициализирането на sftp ÑеÑÐ¸Ñ Ð½Ð° уÑпÑ: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Сигурна обвивка" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Чат Ñ %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "Изпра_щане" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_ИзчиÑтване" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Избор на меÑтоположение за изтеглÑнето" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Сигурни ли Ñте, че желаете да изтриете избраните файлове на Ñървъра?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Избор на файл за качване" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Качване на папка" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "ИзтеглÑне" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Качване" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Отиване в домашната папка" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Отиване в родителÑката папка" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "ОпреÑнÑване на текущата папка" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "ИзтеглÑне от Ñървъра" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Качване на Ñървъра" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Изтриване на файлове от Ñървъра" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Име на файл" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Размер" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Потребител" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Право" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Отдалечен" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Локален" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Ðапредък" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Грешка при Ñъздаването на папка %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Грешка при отварÑнето на файла %s на Ñървъра. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Грешка при Ñъздаването на файла %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Грешка при запиÑването на файла %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Грешка при отварÑнето на папката %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Грешка при Ñъздаването на папката %s на Ñървъра. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Грешка при Ñъздаването на файла %s на Ñървъра. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Грешка при отварÑнето на файла %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Грешка при запиÑването на файла %s на Ñървъра. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "ОтварÑнето на папката %s не уÑпÑ. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Прочитането на папката не уÑпÑ. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Ð’ момента тече файлов транÑфер.\n" "Сигурни ли Ñте, че желаете да го откажете?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Създаването на '%s' не уÑпÑ. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Сигурен транÑфер на файлове" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "ÐапаÑване размера на прозореца" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "ЗапиÑ" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Файл" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "ИнÑтрумент" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "ПредпочитаниÑ" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Тип" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "ОпиÑание" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<Без>" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Изберете нов клавиш" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "ÐœÐ¾Ð»Ñ Ð½Ð°Ñ‚Ð¸Ñнете Ð½Ð¾Ð²Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "ПриÑтавката %s не е региÑтрирана." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "ОтварÑне на оÑÐ½Ð¾Ð²Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð·Ð¾Ñ€ÐµÑ†" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Включване на откриване на уÑлуги" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Свържете Ñе към отдалечени работни меÑта чрез менюто на аплета" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Открити" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Ðова връзка" FreeRDP-Remmina-356c033/remmina/po/ca.po000066400000000000000000000523201171526373700176060ustar00rootroot00000000000000# Catalan translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:23+0000\n" "Last-Translator: Joan Duran \n" "Language-Team: Catalan \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: ca\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Connecteu-vos a escriptoris remots" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Client d'escriptori remot Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "%i element en total." msgstr[1] "%i elements en total." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Segur que voleu suprimir «%s»?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "No s'ha pogut importar:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importa" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Aquest protocol no admet l'exportació." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Edita" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Visualitza" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Eines" #: ../src/remminamain.c:923 msgid "_Help" msgstr "A_juda" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Crea un fitxer d'escriptori remot nou" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Obre el diàleg de preferències" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Connectors" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Wiki en línia" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Finestra de depuració" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Obre una connexió amb el fitxer d'escriptori remot seleccionat" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Crea una còpia del fitxer d'escriptori remot seleccionat" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Edita el fitxer d'escriptori remot seleccionat" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Suprimeix el fitxer d'escriptori remot seleccionat" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exporta" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barra d'eines" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barra d'estat" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Cerca ràpida" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Botons petits a la barra d'eines" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Vista de llista" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Vista d'arbre" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nom" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grup" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Servidor" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formats compatibles\n" "* servidor\n" "* servidor:port\n" "* [servidor]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formats compatibles\n" "* :port\n" "* servidor\n" "* servidor:port\n" "* [servidor]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Trieu un servidor d'escriptori remot" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Fitxer d'identitat" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Exploreu la xarxa per cercar un servidor %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Contrasenya" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Resolució" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Utilitza la mida de la finestra" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Utilitza la resolució del client" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personalitzat" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Distribució del teclat" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Escala horitzontal" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Escala vertical" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Habilita el túnel SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Túnel a través de l'adreça de bucle tancat" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Servidor SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Mateix servidor en el port %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Joc de caràcters" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Programa d'inici" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Camí d'inici" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Autenticació SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Nom d'usuari" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Clau pública (automàtic)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Bàsic" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avançat" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "S'han desat els paràmetres predeterminats." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Preferències de l'escriptori remot" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Per defecte" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Perfil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Connexió ràpida" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "" #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Joan Duran https://launchpad.net/~jodufi" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Remot" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Local" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "El connector %s no està registrar." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Obre la finestra principal" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Habilita el descobriment de serveis" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "" "Connecteu-vos a escriptoris remots mitjançant el menú de la miniaplicació" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Descobert" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Connexió nova" FreeRDP-Remmina-356c033/remmina/po/cs.po000066400000000000000000000765001171526373700176360ustar00rootroot00000000000000# Czech translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-27 19:43+0000\n" "Last-Translator: Kabi \n" "Language-Team: Czech \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-Launchpad-Export-Date: 2010-12-28 04:54+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: cs\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "PÅ™ipojení ke vzdáleným plochám" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Klient vzdálené plochy Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Celkem %i položka." msgstr[1] "Celkem %i položka" msgstr[2] "Celkem %i položky." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "SkuteÄnÄ› smazat '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Nelze importovat:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Import" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Tento protokol nepodporuje importování." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_PÅ™ipojení" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Upravit" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Zobrazení" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Nástroje" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_NápovÄ›da" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "VytvoÅ™it nový RDP soubor" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Otevřít dialog pÅ™edvoleb" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Pluginy" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Domovská stránka" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online nápovÄ›da" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Ladící okno" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "PÅ™ipojit k oznaÄenému RDP souboru" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "VytvoÅ™it kopii oznaÄeného RDP souboru" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Upravit oznaÄený RDP soubor" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Smazat oznaÄený RDP soubor" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exportovat" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Nástrojová liÅ¡ta" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Stavová liÅ¡ta" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Rychlé hledání" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Malé klávesy nástrojové liÅ¡ty" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Zobrazení seznamu" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Stromové zobrazení" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Jméno" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Skupina" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Podporované formáty\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Podporované formáty\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Vybrat RDP server" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identita souboru" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Najít %s server v síti" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Heslo" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "RozliÅ¡ení" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Použít velikost okna" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Použít rozliÅ¡ení klienta" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Volitelné" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Mapování klávesnice" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Horizontální stupnice" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Vertikální stupnice" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "povolit SSH tunel" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunel pÅ™es adresní smyÄku" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Server" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Stejný server na portu %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Znaková sada" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "SpouÅ¡tÄ›ný program" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "SpouÅ¡tÄ›ná cesta" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH ověření" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Uživatelské jméno" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "VeÅ™ejný klíÄ" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Základní" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "PokroÄilé" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Standardní nastavení uloženo." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "PÅ™edvolby vzdálené plochy" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Výchozí" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Rychlé pÅ™ipojení" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "Použít '%s' jako oddÄ›lovaÄ podskupiny" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokol" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Soubor %s nenalezen." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "V aktuálním oknÄ› je aktivních %i pÅ™ipojení. SkuteÄnÄ› chcete okno zavřít?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "Režim celé obrazovky" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "Roztáhnout na obrazovku s posuvnou liÅ¡tou" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Roztáhnout okno dle vzdáleného rozliÅ¡ení" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "PÅ™epnutí fullscreen zobrazení" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "PÅ™epnout záložky" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "ZmenÅ¡it" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Brát vÅ¡echny události klávesnice" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "PÅ™edvolby" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Nástroje" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimalizovat okno" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Odpojit se" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "PÅ™ipojování k '%s'…" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Zásuvný modul protokolu %s není nainstalován" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Otevřít zabezpeÄený Shell v novém terminálu..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Otevřít zabezpeÄený pÅ™enos souboru..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "PÅ™ipojování k SSH serveru %s ..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "PÅ™ipojování k %s pÅ™es SSH tunel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "ÄŒekání na příchozí SSH tunel na portu %i ..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Příkaz %s nebyl na SSH serveru nalezen" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Příkaz %s na SSH serveru selhal (status = %i)" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "NeúspÄ›ch pÅ™i provádÄ›ní příkazu: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s heslo" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH heslo" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH soukromý klíÄ" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Naslouchání na portu %i pro příchozí %s pÅ™ipojení..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Ověření bylo neúspěšné. Zkouším se pÅ™ipojit znovu..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Uložit %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Uložit heslo" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certifikát CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certifikát klienta" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Klientský klíÄ" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Správci:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "PÅ™ispÄ›li:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina je volný software; software můžete dále distribuovat Äi modifikovat " "v rámci GNU GPL od FSF." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina je distribuován v nadÄ›ji, že bude užiteÄný, avÅ¡ak bez jakékoliv " "záruky; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO " "URÄŒITà ÚČEL. Pro více informací se podívejte na GNU GPL." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "S programem byste mÄ›li obdržet i kopii GNU GPL, v případÄ›, že se tak " "nestalo, napiÅ¡te do Free Software Foundation, Inc., 59 Temple Place, Suite " "330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ klient vzdálené plochy" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Kabi https://launchpad.net/~kubat-jan\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Otevřít spojení" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Upravit nastavení" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Nejbližsí" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Dlaždice" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineární" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automaticky" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Okno s posuvníky" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Scrolled Fullscreen" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Viewport Fullscreen" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Panel dle skupin" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Panel dle protokolu" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Panel vÅ¡ech spojení" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Nepoužívat panely" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Vložte ve formátu 'widthxheight'" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Seznam posledních smazán" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Predvolby Remminy" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Možnosti" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Pamatovat si poslední režim zobrazení pro každé pÅ™ipojení" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Uložit nastavení pÅ™i spuÅ¡tÄ›ní spojení" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Neviditelná plovoucí nástrojová liÅ¡ta" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Vždy zobrazit panely" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Skrýt panel spojení" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Double-click Akce" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Standardní pohled" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Rozhraní panelů" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Stupnice kvality" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Místní port SSH tunelu" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Maximum posledních položek" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Smazat" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "RozliÅ¡ení" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "Zobrazit nové pÅ™ipojení nahoÅ™e v menu" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "Skrýt celkový poÄet v menu skupiny" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "Zakázat tray ikonu" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "Spustit tray ikonu automaticky" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "Minimalizovat okna do tray" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Klávesnice" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "KlÃ­Ä hosta" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Automaticky roztáhnout okno" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Grab Keyboard" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Zobraz / Skryj panel nástrojů" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "Terminál" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "Písmo" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "Použít standardní systémový font" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "Řádků zpÄ›t" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Autorizace pomocí SSH hesla selhala: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Autorizace pomocí veÅ™ejného klíÄe selhala: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSH klÃ­Ä jeÅ¡tÄ› nebyl nastaven." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Autorizace pomocí automatického veÅ™ejného klíÄe selhala: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Autorizace %s hesla u SSH serveru %s ..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Autorizace %s identity u SSH serveru %s ..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Chyba pÅ™i startu SSH sezení: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Chyba pÅ™i spojování k cílovému SSH tunelu: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Chyba pÅ™i zpracování %s na SSH serveru : %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Selhání žádosti o nastavení portů : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Žádná odpovÄ›Ä od serveru." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Chyba pÅ™i vytváření sftp: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Chyba pÅ™i inicializaci sftp: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - ZabezpeÄený Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Pokec s %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Odeslat" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Smazat" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Zvolte umístÄ›ní pro stažení" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Jste jist se smazáním oznaÄených souborů ze serveru?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Zvolte soubor pro nahrání" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Nahrát složku" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Stáhnout" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Nahrát" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "PÅ™ejít do domácího adresáře" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "PÅ™ejít do koÅ™enového adresáře" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Obnovit adresář" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Stáhnout ze serveru" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Nahrát na server" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Smazat soubory ze serveru" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Jméno souboru" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Velikost" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Uživatel" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "OprávnÄ›ní" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Vzdálený" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Místní" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "PrůbÄ›h" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Chyba pÅ™i vytváření složky %s ." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Chyba pÅ™i otevírání souboru %s na serveru. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Chyba pÅ™i vytváření souboru %s ." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Chyba pÅ™i vytváření souboru %s ." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Chyba pÅ™i otevírání adresáře %s . %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Chyba pÅ™i vytváření složky %s na serveru. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Chyba pÅ™i vytváření souboru %s na serveru. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Chyba pÅ™i otevírání souboru %s ." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Chyba pÅ™i zapisování souboru %s na server. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "OtevÅ™ení adresáře %s selhalo. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "NaÄítání adresáře selhalo. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "PrávÄ› probíhá pÅ™enos souboru.\n" "Opravdu chcete pÅ™enos ukonÄit?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Smazání '%s' se nezdaÅ™ilo. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "Zobrazit skryté soubory" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - ZabezpeÄený pÅ™enos souborů" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "PÅ™izpůsobit velikost okna" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Záznam" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Soubor" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Nástroj" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Nastavení" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Typ" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Popis" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "Verze" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<Žádný>" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Zvolte nový klíÄ" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "StisknÄ›te novou klávesu..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Plugin %s není registrován." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Otevřít hlavní okno" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Povolit prohledávání služeb" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Remmina Applet" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "PÅ™ipojit ke vzdálené ploÅ¡e pomocí applet menu" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Prozkoumáno" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nové pÅ™ipojení" #~ msgid "_Action" #~ msgstr "_Akce" #~ msgid "Quit Remmina" #~ msgstr "UkonÄit program" #~ msgid "Quick _Connect To" #~ msgstr "Rychlé _pÅ™ipojení k" #~ msgid "Open a quick connection" #~ msgstr "Otevřít rychlé pÅ™ipojení" #~ msgid "High Color (15 bit)" #~ msgstr "High Color (15 bitů)" #~ msgid "High Color (16 bit)" #~ msgstr "High Color (16 bitů)" #~ msgid "256 Colors" #~ msgstr "256 barev" #~ msgid "Remote Desktop Client" #~ msgstr "Klient vzdálené pracovní plochy" #~ msgid "True Color (24 bit)" #~ msgstr "True Color (24 bitů)" #~ msgid "Grayscale" #~ msgstr "Odstíny Å¡edi" #~ msgid "Poor (Fastest)" #~ msgstr "Nejhorší (Rychlejší)" #~ msgid "Medium" #~ msgstr "StÅ™ední" #~ msgid "Good" #~ msgstr "Dobré" #~ msgid "Off" #~ msgstr "Vypnout" #~ msgid "Best (Slowest)" #~ msgstr "Nejlepší (Nejpomalejší)" #~ msgid "Use Client Resolution" #~ msgstr "Použít rozliÅ¡ení klienta" #~ msgid "Use Window Size" #~ msgstr "Použít velikost okna" #~ msgid "Identity File" #~ msgstr "Identita souboru" #~ msgid "Startup Path" #~ msgstr "SpouÅ¡tÄ›ná cesta" #~ msgid "Startup Program" #~ msgstr "SpouÅ¡tÄ›ný program" #~ msgid "User Name" #~ msgstr "Uživatelské jméno" #~ msgid "Client Name" #~ msgstr "Název klienta" #~ msgid "Keyboard Mapping" #~ msgstr "Mapování klávesnice" #~ msgid "Sound" #~ msgstr "Zvuk" #~ msgid "Share Folder" #~ msgstr "Sdílená složka" #~ msgid "Color Depth" #~ msgstr "Barevná hloubka" #~ msgid "Domain" #~ msgstr "Doména" #~ msgid "Show Remote Cursor" #~ msgstr "Zobrazit vzdálený kurzor" #~ msgid "Use Local Cursor" #~ msgstr "Použít místní kurzor" #~ msgid "Share Local Printers" #~ msgstr "Sdílení lokálních tiskáren" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "PÅ™ipojit ke konzole (Windows 2003 nebo novÄ›jší)" #~ msgid "Enable bitmap caching" #~ msgstr "Povolit vyrovnávací paměť obrázků" #~ msgid "Enable compression" #~ msgstr "Povolit kompresi" #~ msgid "Advanced Arguments" #~ msgstr "PokroÄilé argumenty" #~ msgid "Listen on Port" #~ msgstr "Naslouchání na portu" #~ msgid "Quality" #~ msgstr "Kvalita" #~ msgid "View Only" #~ msgstr "Pouze náhled" #~ msgid "Disable Server Input" #~ msgstr "Zakázat vstup serveru" #~ msgid "Vertical Scale" #~ msgstr "Vertikální stupnice" #~ msgid "Horizontal Scale" #~ msgstr "Horizontální stupnice" #~ msgid "Disconnect After One Session" #~ msgstr "Odpojit po jednom sezení" #~ msgid "Disable Clipboard Sync" #~ msgstr "Zakázat synchronizaci schránky" #~ msgid "Proxy Destination" #~ msgstr "Cíl proxy" #~ msgid "Disable Encryption" #~ msgstr "Zakázat Å¡ifrování" #~ msgid "Enable SSH Tunnel" #~ msgstr "povolit SSH tunel" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Tunel pÅ™es adresní smyÄku" #~ msgid "Character Set" #~ msgstr "Znaková sada" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Stejný server na portu %i" #~ msgid "Public Key (Automatic)" #~ msgstr "VeÅ™ejný klíÄ" #~ msgid "Refresh" #~ msgstr "Obnovit" #~ msgid "Auto-Fit Window" #~ msgstr "Automaticky roztáhnout okno" #~ msgid "Open Chat..." #~ msgstr "Otevřít chat..." #~ msgid "Scrolled Window" #~ msgstr "Okno s posuvníky" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "PÅ™epnout na plné zobrazení" #~ msgid "Viewport Fullscreen" #~ msgstr "Viewport Fullscreen" #~ msgid "Toggle scrolled window mode" #~ msgstr "PÅ™epnout do okna" #~ msgid "Scrolled Fullscreen" #~ msgstr "Scrolled Fullscreen" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "Toggle viewport fullscreen mode" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "Protokol %s není podporován." #~ msgid "Minimize Window" #~ msgstr "Minimalizovat okno" #~ msgid "SSH Password" #~ msgstr "SSH Heslo" #~ msgid "SSH Private Key Passphrase" #~ msgstr "SSH soukromý klíÄ" #, c-format #~ msgid "%s Password" #~ msgstr "%s Heslo" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "Naslouchání na portu %i pro příchozí %s pÅ™ipojení..." #~ msgid "Save Password" #~ msgstr "Uložit heslo" #~ msgid "CA Certificate" #~ msgstr "Certifikát CA" #~ msgid "Client Certificate" #~ msgstr "Certifikát klienta" #~ msgid "Edit Settings" #~ msgstr "Upravit nastavení" #~ msgid "Open Connection" #~ msgstr "Otevřít spojení" #~ msgid "Client Key" #~ msgstr "Klientský klíÄ" #~ msgid "Do Not Use Tabs" #~ msgstr "Nepoužívat panely" #~ msgid "Tab by Protocols" #~ msgstr "Panel dle protokolu" #~ msgid "Tab All Connections" #~ msgstr "Panel vÅ¡ech spojení" #~ msgid "Tab by Groups" #~ msgstr "Panel dle skupin" #~ msgid "Default View Mode" #~ msgstr "Standardní pohled" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "Pamatovat si poslední režim zobrazení pro každé pÅ™ipojení" #~ msgid "Double-click Action" #~ msgstr "Double-click Akce" #~ msgid "Invisible Floating Toolbar" #~ msgstr "Neviditelná plovoucí nástrojová liÅ¡ta" #~ msgid "Always Show Tabs" #~ msgstr "Vždy zobrazit panely" #~ msgid "Hide Connection Toolbar" #~ msgstr "Skrýt panel spojení" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "Uložit nastavení pÅ™i spuÅ¡tÄ›ní spojení" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Zobrazit v menu \"Rychlé pÅ™ipojení\"" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "Skrýt v nabídce celkový poÄet" #~ msgid "Maximum Recent Items" #~ msgstr "Maximum posledních položek" #~ msgid "Tab Interface" #~ msgstr "Rozhraní panelů" #~ msgid "SSH Tunnel Local Port" #~ msgstr "Místní port SSH tunelu" #~ msgid "Scale Quality" #~ msgstr "Stupnice kvality" #~ msgid "Switch Tab Pages" #~ msgstr "PÅ™epnout strany panelů" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "PÅ™epnutí fullscreen zobrazení" #~ msgid "Show / Hide Toolbar" #~ msgstr "Zobraz / Skryj panel nástrojů" #~ msgid "Toggle Scaled Mode" #~ msgstr "Toggle Scaled Mode" #~ msgid "Grab Keyboard" #~ msgstr "Grab Keyboard" #~ msgid "Host Key" #~ msgstr "KlÃ­Ä hosta" #~ msgid "Fit Window Size" #~ msgstr "PÅ™izpůsobit velikost okna" FreeRDP-Remmina-356c033/remmina/po/da.po000066400000000000000000000612671171526373700176210ustar00rootroot00000000000000# Danish translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:22+0000\n" "Last-Translator: Vic \n" "Language-Team: Danish \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: da\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Tilslut fjernskriveborde" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina Fjernskrivebords Klient" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Total %i element." msgstr[1] "Total %i elementer." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Er du sikker pÃ¥ at slette '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Kan ikke importere:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importér" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Denne protokol understøtter ikke eksport." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Redigér" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Vis" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Værktøjer" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Hjælp" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Opret en ny remote desktop-fil" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Ã…bn vinduet indstillinger" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Udvidelser" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online Wiki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Fejlsøgningsvindue" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Ã…bn forbindelsen i den valgte remote desktop-fil" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Kopier den valgte remote desktop-fil" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Rediger den valgte remote desktop-fil" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Slet den valgte remote desktop-fil" #: ../src/remminamain.c:980 msgid "Export" msgstr "Eksporter" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Værktøjslinie" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Statuslinie" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Hurtig søgning" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "SmÃ¥ Værktøjslinie Knapper" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Listevisning" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Trævisning" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Navn" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Gruppe" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Understøttede formater\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Understøttede formater\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Vælg en Terminal Server" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identitets fil" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Gennemse netværket for at finde en %s server" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Adgangskode" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Opløsning" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Brug vinduesstørrelse" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Brug klientens opløsning" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Tilpasset" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Tastebrug" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Vandret skalering" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Lodret skalering" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Aktiver SSH tunnel" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel via loopback adresse" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Server" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Samme server pÃ¥ port %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Tegnsæt" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Opstartsprogram" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Opstartssti" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH Autentificering" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Brugernavn" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Offentlig nøgle (automatisk)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Generelt" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avanceret" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Standard indstillinger gemt." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Fjernskrivebords Indstilling" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Standard" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Forbind Hurtigt" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokol" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Fil %s ikke fundet." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Der er %i aktive forbindelser i det aktuelle vindue. Er du sikker pÃ¥ at " "lukke?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Tilpas størrelsen pÃ¥ vinduet efter serverens opløsning" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Toggle fuldskærmstilstand" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Skift faneblade" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Vælg skaleret mode" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Fang alle tastetryk" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Indstillinger" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Værktøjer" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimér vindue" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Afbryd forbindelse" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Tilslutter '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Ã…ben Secure Shell i en Ny Terminal..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Ã…ben Secure File Transfer..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Tilslutter SSH server %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Tilslutter %s gennem SSH tunnel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Venter pÃ¥ en indgÃ¥ende SSH tunnel pÃ¥ port %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Kommando %s ikke fundet pÃ¥ SSH server" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Kommando %s fejlede pÃ¥ SSH server (status = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Kunne ikke udføre kommandoen: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s adgangskode" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH adgangskode" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH privat nøglekode" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Lytter pÃ¥ port %i efter en indgÃ¥ende %s forbindelse..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Godkendelse mislykkedes. Forsøger at tilslutte igen..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Gem %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Gem adgangskode" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA certifikat" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Klient certifikat" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Klient nøgle" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Vedligeholdere:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Bidragsydere:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina er fri software; du kan redistribuere det og/eller ændre det under " "betingelserne af GNU General Public License offentliggjort af Free Software " "Foundation; enten version 2 af licensen eller (efter eget valg) enhver nyere " "version." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina distribueres i hÃ¥b om at det vil være nyttigt, men UDEN NOGEN " "GARANTI; uden selv de underforstÃ¥ede garantier SALGBARHED eller TILPASNING " "TIL ET BESTEMT FORMÃ…L. Se GNU General Public License for yderligere detaljer." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Du bør have modtaget en kopi af GNU General Public License sammen med dette " "program; hvis ikke, sÃ¥ skriv til Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ Fjernskrivebords Klienten" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Niels Kristensen https://launchpad.net/~nielskri\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Ã…ben Tilslutning" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Redigér indstillinger" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Nærmeste" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Felter" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineær" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatisk" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Rulleskaktsvindue" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Scrolled fuldskærm" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Viewport fuldskærm" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Opdel efter grupper" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Opdel efter protokoller" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Opdel alle forbindelser" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Brug ikke faner" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Indtast format 'breddexhøjde'" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Nylige lister ryddet." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina Indstillinger" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Indstillinger" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Husk seneste visnings metode for hver forbindelse" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Gem indstillinger nÃ¥r forbindelsen startes" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Usynlig flydende værktøjslinie" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Vis altid faner" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Skjul tilslutnings værktøjslinie" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Dobbeltklik handling" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Standard visnings metode" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Fane interface" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Skaler kvalitet" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Lokal SSH tunnel port" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Maksimum nylige filer" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Ryd" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Opløsninger" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Tastatur" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host tast" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Auto-tilpas vindue" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Indfang tastatur" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Vis / skjul værktøjslinie" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSH adgangskode genkendelse mislykkedes: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSH offentlig nøgle genkendelse mislykkedes: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSH nøglefil ikke valgt" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSH automatisk offentlig nøgle genkendelse mislykkedes: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Validere %s's adgangskode pÃ¥ SSH server %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Validere %s's identitet pÃ¥ SSH server %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Kunne ikke Ã¥bne SSH session: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Kunne ikke forbinde SSH tunnel destinationen: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Kunne ikke udføre %s pÃ¥ SSH server: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Kunne ikke anmode om port viderestilling : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Intet svar fra serveren." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Kunne ikke lave sftp session: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Kunne ikke starte sftp session: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Chat med %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Send" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Ryd" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Vælg download placering" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Er du sikker pÃ¥ at slette de valgte filer pÃ¥ serveren?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Vælg en fil at uploade" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Upload mappe" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Download" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Upload" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "GÃ¥ til hjemmemappe" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "GÃ¥ til overliggende mappe" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Opdater den aktuelle mappe" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Download fra server" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Upload til server" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Slet filer pÃ¥ server" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Filnavn" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Størrelse" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Bruger" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Rettighed" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Fjern" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokal" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Status" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Fejl ved oprettelse af mappen %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Fejl ved Ã¥bning af fil %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Fejl ved oprettelse af filen %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Fejl ved skrivning af filen %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Fejl ved Ã¥bning af mappen %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Fejl ved oprettelse af mappen %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Fejl ved oprettelse af filen %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Fejl ved Ã¥bning af filen %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Fejl ved skrivning af filen %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Fejl ved Ã¥bning af mappen %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Fejl ved læsning af mappen. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "En filoverførsel er i gang.\n" "Er du sikker pÃ¥ at du vil annullere den?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Fejl ved sletning af '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Tilpas vindue størrelse" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Indtastning" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "fil" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Værktøj" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Præference" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Type" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Beskrivelse" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Vælg en ny nøgle" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Tryk venligst den nye nøgle..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Plugin %s er ikke registreret." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Ã…ben Hovedvindue" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Aktiver service opdagelse" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Tilslut fjernskrivebord gennem applet menuen" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Opdaget" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Ny Forbindelse" FreeRDP-Remmina-356c033/remmina/po/de.po000066400000000000000000000602641171526373700176210ustar00rootroot00000000000000# German translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:20+0000\n" "Last-Translator: Felix Kaechele \n" "Language-Team: German \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: de\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Zu entfernten Arbeitsflächen verbinden" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina Betrachter für entfernte Arbeitsflächen" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Gesamt %i Objekt." msgstr[1] "Gesamt %i Objekte." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Soll '%s' wirklich gelöscht werden" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Import fehlgeschlagen:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Import" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Dieses Protokoll unterstützt den Export nicht." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Bearbeiten" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Ansicht" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Werkzeuge" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Hilfe" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Eine neue entfernte Arbeitsfläche erstellen" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Einstellungen verändern" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Plugins" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online Wiki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Debugfenster" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Verbindung zu der gewählten entfernten Arbeitsfläche herstellen" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Eine Kopie der gewählten entfernten Arbeitsfläche erstellen" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Gewählte entfernte Arbeitsfläche bearbeiten" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Gewählte entfernte Arbeitsfläche entfernen" #: ../src/remminamain.c:980 msgid "Export" msgstr "Export" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Werkzeugleiste" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Statusleiste" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Schnellsuche" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Kleine Symbole in der Werkzeugleiste" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Listenansicht" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Baumansicht" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Bezeichnung" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Gruppe" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Unterstützte Formate\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Unterstützte Formate\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Einen Server für eine entfernte Arbeitsfläche auswählen" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identitäts-datei" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Das netzwerk durchsuchen um einen %s server zu finden" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Passwort" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Bildschirmauflösung" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Auflösung des clients verwenden" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Benutzerdefiniert" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Tastaturlayout" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Horizontale skalierung" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Vertikale skalierung" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "SSH tunnel aktivieren" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel via loopback adresse" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Server" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Server auf port %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Zeichensatz" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Start-programm" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Start-pfad" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH Authentifizierung" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Benutzername" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Öffentlicher schlüssel (automatisch)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Grundlegend" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Erweitert" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Standard-einstellungen wurden gespeichert." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Einstellungen für entfernte Arbeitsflächen" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Vorgabe" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Schnell-Verbindung" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokoll" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Datei %s nicht gefunden." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Es sind %i Verbindungen in diesem Fenster aktiv. Sind Sie sicher, dass Sie " "das Fenster schließen möchten?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Das Fenster auf die entfernte Bildschirmauflösung anpassen" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Alle tastatureingaben abfangen" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Einstellungen" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Werkzeuge" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Fenster minimieren" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Verbindung trennen" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Verbindung zu »%s« wird hergestellt…" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Secure Shell in einem neuen Terminal starten..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Sichere Dateiübertragung (SFTP) öffnen..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Verbindung zu SSH-Server »%s« wird hergestellt…" #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Verbindung zu »%s« wird über SSH-Tunnel hergestellt…" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH passwort" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "%s speichern" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Passwort speichern" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA-zertifikat" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Betreuer:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Mitwirkende:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina ist freie Software, Sie können sie weitergeben und/oder verändern " "solange Sie sich an die Regeln der GNU General Public License halten, so wie " "sie von der Free Software Foundation festgelegt wurden; entweder in Version " "2 der Lizenz oder (nach Ihrem Ermessen) in jeder folgenden Lizenz." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina wurde mit dem Ziel veröffentlicht, dass Sie es nützlich finden, " "jedoch OHNE JEDWEDE GARANTIE, sogar ohne eine implizite Garantie der " "VERKAUFBARKEIT oder der NUTZBARKEIT FÜR EINEN SPEZIELLEN ZWECK. Schauen Sie " "für weitere Informationen bitte in der GNU General Public License (GNU GPL) " "nach." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Mit diesem Programm sollten Sie außerdem eine Kopie der GNU General Public " "License erhalten haben. Wenn dem nicht so ist, so schreiben Sie bitte an die " "Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA " "02110-1301, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Der GTK+ Betrachter für entfernte Arbeitsflächen" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Felix Kaechele https://launchpad.net/~felix-kaechele\n" " Martin Lettner https://launchpad.net/~m.lettner" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Verbindung herstellen" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Einstellungen bearbeiten" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Nächster" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Kacheln" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatisch" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Bitte im Format »breitexhöhe« eingeben." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Liste zuletzt geöffneter Verbindungen geleert." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina Einstellungen" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Optionen" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Ansichts-Einstellungen für jede Verbindung merken" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Unsichtbare schwebende Werkzeugleiste" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Doppelklick-aktion" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Vorgabe-ansicht" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Skalierungs-qualität" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Lokaler port des SSH-tunnels" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Anzahl zuletzt geöffneter Verbindungen" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Leeren" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Bildschirmauflösungen" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Fenster automatisch anpassen" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Tastatur einfangen" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Keine rückmeldung vom server erhalten." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Chat mit %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Senden" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Leeren" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Download-verzeichnis wählen" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Sollen die gewählten Dateien am Server wirklich gelöscht werden?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Datei zum hochladen auswählen" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Herunterladen" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Hochladen" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Persönlichen ordner anzeigen" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Zum übergeordneten verzeichnis" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Diesen ordner aktualisieren" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Vom Server herunterladen" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Zum server hochladen" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Dateien am server löschen" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Dateiname" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Größe" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Benutzer" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Rechte" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Entfernt" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokal" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Fortschritt" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Verzeichnis %s konnte nicht erstellt werden." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Datei %s am Server konnte nicht geöffnet werden. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Datei %s konnte nicht erstellt werden." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Datei %s konnte nicht gespeichert werden." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Verzeichnis %s konnte nicht geöffnet werden. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Datei %s am server konnte nicht erstellt werden. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Datei %s konnte nicht geöffnet werden." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Datei %s am server konnte nicht gespeichert werden. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Verzeichnis %s konnte nicht geöffnet werden. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Verzeichnis %s konnte nicht gelesen werden." #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "»%s« konnte nicht gelöscht werden. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Sichere Dateiübertragung" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Fenstergröße automatisch anpassen" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Plugin %s ist nicht registriert." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Haupt-Fenster öffnen" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Dienst-Erkennung aktivieren" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Mit dem Applet-Menü zu entfernten Arbeitsflächen verbinden" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Entdeckt" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Neue Verbindung" FreeRDP-Remmina-356c033/remmina/po/el.po000066400000000000000000000611641171526373700176310ustar00rootroot00000000000000# 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: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:19+0000\n" "Last-Translator: Vic \n" "Language-Team: LANGUAGE \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: \n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina ΑπομακÏυσμένη ΣÏνδεση" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "ΣÏνολο %i αντικείμενο." msgstr[1] "ΣÏνολο %i αντικείμενα." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Είστε σίγουÏος να διαγÏαφεί '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "" #: ../src/remminamain.c:921 msgid "_View" msgstr "_ΠÏοβολή" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Βοήθεια" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "ΔημιουÏγία νέου αÏχείου απομακÏυσμένης σÏνδεσης" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Άνοιγμα παÏαθÏÏου Ï€Ïοτιμήσεων" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Άνοιξε την σÏνδεση στο επιλεγμένο αÏχείο απομακÏυσμένης σÏνδεσης" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "ΔιόÏθωση του επιλεγμένου αÏχείου απομακÏυσμένης σÏνδεσης" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "ΔιαγÏαφή του επιλεγμένου αÏχείου απομακÏυσμένης σÏνδεσης" #: ../src/remminamain.c:980 msgid "Export" msgstr "" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "ΕÏγαλειοθήκη" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "ΜπάÏα κατάστασης" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Κουμπιά ΜικÏής ΕÏγαλειοθήκης" #: ../src/remminamain.c:1002 msgid "List View" msgstr "ΠÏοβολή Λίστας" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "ΠÏοβολή ΔέντÏου" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Όνομα" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Ομάδα" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "ΕξυπηÏετητής" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Επέλεξε ΕξυπηÏετητή για ΑπομακÏυσμένη ΣÏνδεση" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "ΑÏχείο Identity" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Κωδικός" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Ανάλυση" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "ΧÏησιμοποίησε" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "ΠÏοσαÏμοσμένο" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Αντιστοίχιση ΠληκτÏολογίου" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "ΟÏιζόντια Σκάλα" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Κάθετη Σκάλα" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Ενεγοποίηση SSH Tunnel" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH ΕπυπηÏετητής" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Ο ίδιος εξυπηÏετητής στην πόÏτα %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Σέτ ΧαÏακτήÏων" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "ΠÏόγÏαμμα Εκκίνησης" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "ΔιαδÏομή Εκκίνησης" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH Πιστοποίηση" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Όνομα ΧÏήστη" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Βασικό" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "ΠÏοχωÏημένο" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "ΠÏοεπιλεγμένες Ïυθμίσεις αποθηκεÏτηκαν" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Επιλογές ΑπομακÏυσμένης ΣÏνδεσης" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "ΠÏοεπιλογή" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "ΠÏοφίλ" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "ΓÏήγοÏη ΣÏνδεση" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "ΠÏωτόκολο" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Το αÏχείο %s δεν βÏέθηκε." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "ΕπανακαθοÏισμός παÏαθÏÏου για ταίÏιασμα στην ανάλυση" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Toggle scaled mode" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "ΑναγνώÏισε όλες τις εισόδους πλήκτÏων" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Επιλογές" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "ΕÏγαλεία" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Ελαχιστοποίηση ΠαÏάθυÏου" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "ΑποσÏνδεση" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "ΣÏνδεση στο '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Άνοιγμα ΑσφαλοÏÏ‚ Κέλυφους σε Îέο ΤεÏματικό..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Άνοιγμα ΑσφαλοÏÏ‚ ΜεταφοÏάς ΑÏχείου" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Συνδέεται στον SSH εξυπηÏετητή %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Συνδέεται στον %s μέσω του SSH tunnel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH Κωδικός" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH Private κλειδί ΦÏάση" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Αποθήκευση %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Elias Sofronas \n" "\n" "Launchpad Contributions:\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Άνοιξε ΣÏνδεση" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Αλλαγή Ρυθμίσεων" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "ΚοντινότεÏο" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Tiles" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Αυτόματο" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Scrolled ΠαÏάθυÏο" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Scrolled Fullscreen" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Viewport ΟλόκληÏη οθόνη" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "ΠαÏακαλώ εισάγετε format 'widthxheight" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "ΠÏόσφατες λίστες καθαÏίστηκαν." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Επιλογές" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Θυμίσου την τελευταία επιλογή Ï€Ïοβολής για Κάθε ΣÏνδεση" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Διπλό κλίκ ΕνέÏγεια" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Σκάλα Ποιότητας" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSH Tunnel Τοπική ΠόÏτα" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Μέγιστα ΠÏόσφατα Αντικείμενα" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "ΚαθαÏισμός" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "ΑναλÏσεις" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Αυτόματο ΤαίÏιασμα ΠαÏαθÏÏου" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "ΑναγνώÏιση πλήκτÏων" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Η πιστοποίηση του SSH ÎºÏ‰Î´Î¹ÎºÎ¿Ï Î±Ï€Î­Ï„Ï…Ï‡Îµ: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Το public κλειδί πιστοποίησης απέτυχε: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Το SSH κλειδί δεν έχει οÏιστεί ακόμα." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Πιστοποίηση %s's κωδικών στον SSH εξυπηÏετητή %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Αποτυχία εκκίνησης του SSH session: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Aποτυχία σÏνδεσης στο SSH tunnel: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Αποτυχία δημιουÏγίας του sftp session: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Συνομιλία με %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Aποστολή" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_KαθαÏισμός" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Επέλεξε τοποθεσία λήψης" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" "Είστε σιγουÏος για την διαγÏαφή των επιλεγμέων αÏχείων στον εξυπηÏετητή;" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Επέλεξε αÏχείο για αποστολή" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Λήψη" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Αποστολή" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Πήγαινε στον κατάλογο home" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Πήγαινε στον γονικό κατάλογο" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Λήψη από τον εξυπηÏετητή" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Αποστολή σοτν εξυπηÏετητή" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "ΔιαγÏαφή αÏχείων στον εξυπηÏετητή" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Όνομα ΑÏχείου" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Μέγεθος" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "ΧÏήστης" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Διακαιώματα" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "ΑπομακÏυσμένο" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Τοπικό" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "ΠÏόοδος" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Αδυναμία δημιουÏγίας του καταλόγου %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Αδυναμία ανοίγματος καταλόγου %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "ΑδÏνατη η δημιουÏγία του αÏχείου %s στον εξυπηÏετητή. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Αδυναμία ανοίγματος του αÏχείου %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Αδυναμία εγγÏαφής του αÏχείου %s στον εξυπηÏετητή. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Αποτυχία ανοίγματος καταλόγου %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Αποτυχία διαβάσματος καταλογου. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "ΑδÏνατη η διαγÏαφή '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "ΤαίÏιασμα Μεγέθους ΠαÏαθÏÏου" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<Κανένα>" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Άνοιγμα ΚεντÏÎ¹ÎºÎ¿Ï Î Î±ÏαθÏÏου" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "ΕνεÏγοποίηση Διαδικασίας Ανίχνευσης" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "ΣÏνδεση στους απομακÏυσμένους Η/Î¥ μέσω του applet μενοÏ" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Εντοπίστηκε" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Îέα ΣÏνδεση" FreeRDP-Remmina-356c033/remmina/po/es.po000066400000000000000000001061371171526373700176400ustar00rootroot00000000000000# Spanish translation of remmina # Copyright (C) 2008 - 2009 The remmina'S COPYRIGHT HOLDER # This file is distributed under the same license as the remmina package. # # Julio Napurí Carlos , 2008-2009 # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-04 17:15+0000\n" "Last-Translator: Martín V. \n" "Language-Team: Spanish \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-Launchpad-Export-Date: 2011-01-05 04:56+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: es\n" "X-Poedit-Language: Spanish\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Conectar a escritorio remoto" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Cliente de escritorio remoto Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Total de %i elementos." msgstr[1] "Total de %i elementos." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "¿Estas seguro de borrar '%s'?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "No se pudo importar:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importar" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Este protocolo no soporta la exportación." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_Conexión" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Editar" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Ver" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Herramientas" #: ../src/remminamain.c:923 msgid "_Help" msgstr "Ay_uda" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Crear un nuevo escritorio remoto" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Abrir el diálogo de preferencias" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Complementos" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Página inicial" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Wiki en línea" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Ventana de depuración" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Abrir una conexión con el escritorio remoto seleccionado" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Crear una copia de archivo de escritorio remoto seleccionado" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Editar el escritorio remoto seleccionado" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Borrar el escritorio remoto seleccionado" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exportar" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barra de herramientas" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barra de estado" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Búsqueda rápida" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Pequeños botones en la barra de herramientas" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Ver como lista" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Vista de árbol" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nombre" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grupo" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Servidor" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formatos soportados\n" "* servidor\n" "* servidor:puerto\n" "* [servidor]:puerto" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formatos soportados\n" "* :puerto\n" "* servidor:puerto\n" "* [servidor]:puerto" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Seleccionar un servidor de escritorio remoto" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Archivo de identidad" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Explorar la red en busca del servidor %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Contraseña" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Resolución" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Usar tamaño de ventana" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Utilizar resolución del cliente" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personalizado" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Distribución del teclado" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Escala horizontal" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Escala vertical" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Permitir tunel SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Túnel a través de dirección de autobucle" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Servidor SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Mismo servidor en el puerto %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Juego de caracteres" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Programa de inicio" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Ruta de inicio" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Autenticación SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Usuario" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Clave pública (Automático)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Básico" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avanzado" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Guardado los ajustes por omiisión" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Preferencias del escritorio remoto" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Por omisión" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Perfil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Conexión rápida" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "Usar '%s' como delimitador de subgrupos" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocolo" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Archivo %s no encontrado." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Hay %i conexiones activas en la ventana actual. ¿Estás seguro de cerrarlo?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "Modo pantalla completa" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "Modo pantalla completa con barras de desplazamiento" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Cambiar el tamaño de la ventana a la resolución remota" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Activar/Desactivar pantalla completa" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Cambiar pestañas" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Cambiar el modo de escala" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Capturar todos los eventos del teclado" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Preferencias" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Herramientas" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimizar ventana" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Desconectarse" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Conectando con '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Componente de protocolo %s no instalado." #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Abrir Shell segura en un nuevo termina..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Abrir transferencia segura de de archivos..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Conectanto al servidor SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Conexión a %s a través del túnel SSH..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Esperando al túnel de entrada SSH en el puerto %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "La orden %s no se ha encontrado en el servidor SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "La orden %s ha fallado en el servidor SSH (estado = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Falló al ejecutar la orden: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "Contraseña %s" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Contraseña SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Clave privada SHH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Escuchando en puerto %i una conexión %s entrante..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "La autenticación ha fallado. Se intenta reconectar..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Guardar %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Guardar contraseña" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certificado de AC" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "Lista CRL de AC" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certificado del cliente" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Llave del cliente" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Desarrolladores:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Contribuidores:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina es software libre; puedes redistribuirlo y/o modificarlo bajo los " "términos de la Licencia Pública General GNU (GPL) publicada por la Free " "Software Foundation; en la segunda versión de la licencia, o (según " "prefieras) alguna otra versión posterior." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina se distribuye con la esperanza de que sea útil, pero sin NINGUNA " "GARANTÃA; ni siquiera la garantía implícita de Comerciabilidad o para uso " "personal. Ver la Licencia Pública General GNU (GPL) para más detalles." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Debería haber recibido una copia de la Licencia Pública General GNU (GPL) " "con este programa; si no es así, escriba la Free Software Foundation, Inc., " "59 Temple Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "El cliente de escritorio remoto en GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Julio Napurí Carlos \n" "\n" "Launchpad Contributions:\n" " DiegoJ https://launchpad.net/~diegojromerolopez\n" " José Lecaros Cisterna https://launchpad.net/~lecaros\n" " Julio Napurí Carlos https://launchpad.net/~julionc\n" " Martín V. https://launchpad.net/~martinvukovic\n" " Moritatux https://launchpad.net/~moritatux" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Abrir conexión" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Editar preferencias" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "El más cercano" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Fichas" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bi-lineal" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automático" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Ventana con barras de desplazamiento" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Desplazarse a pantalla completa" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Vista a pantalla completa" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Pestaña por grupos" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Pestaña por protocolo" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Pestaña con todas las conexiones" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "No usar pestañas" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Por favor, introduzca el formato 'ANCHOxALTO'" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Lista reciente." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Preferencias de Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Opciones" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Recordar el último modo de visualización para cada conexión" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Guardar preferencias al iniciar la conexión" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Esconder la barra de herramientas" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Mostrar siempre las pestañas" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Ocultar la barra de herramientas de conexión" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Double-click Acción" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Modo de visualización por defecto" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Interfaz de la pestaña" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Escala de calidad" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Puerto del túnel SSH" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Máximo de artículos recientes" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Limpiar" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Resoluciones" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Miniaplicación" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "Mostrar conexión nueva en la parte superior del menú" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "Ocultar contador total en el menú de grupo" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "Desactivar ícono en el área de notificación" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "Iniciar ícono de notificación automáticamente" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "Minimizar la ventana al área de notificación" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Teclado" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Tecla de anfitrión" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Ajuste automático en la ventana" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Capturar teclado" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Mostrar/Ocultar barra de herramientas" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "Terminal" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "Tipografía" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "Usar tipografía del sistema" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "Líneas de salida (scrollback)" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "La autenticación SSH ha fallado: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "La autentificación con la clave pública SSH ha fallado: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Aún no se ha definido una llave SHH Key." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Fallo SSH automático con autenticación con clave pública : %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Autenticando con la contraseña de %s al servidor SSH %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Autentificando la identidad de %s al servidor SSH %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Error al iniciar la sesión SSH: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "La conexión al túnel SSH ha fallado: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "No se pudo ejectuar %s en el servidor SSH: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Fallo el reenvío de puerto remoto : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Sin respuesta del servidor" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Fallo la creación de sesión SFTP: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Fallo al inicializar la sesión SFTP: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Conversando con %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "E_nviar" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Vaciar" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Seleccionar ubicación de descarga" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "¿Estas seguro de borrar los archivos selecionados en el servidor?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Seleccione un archivo para subir" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Subir carpeta" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Descargar" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Subir" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Ir a la carpeta de inicio" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Ir a la carpeta padre" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Actualizar la carpeta actual" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Descargar desde el servidor" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Subir al servidor" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Eliminar archivos en el servidor" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Nombre de archivo" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Tamaño" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Usuario" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Permisos" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Remoto" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Local" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Progreso" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Error creando la carpeta %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Error abriendo el archivo %s en el servidor. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Error creando el archivo %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Error escribiendo el archivo %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Error abriendo la carpeta %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Error creando la carpeta %s en el servidor. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Error creando el archivo %s en el servidor. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Error abriendo el archivo %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Error escribiendo el archivo %s en el servidor. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Fallo al abrir la carpeta %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Fallo en la lectura de la carpeta. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Transferencias de archivos en curso.\n" "¿Estas seguro que desea salir?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "No se ha eliminado '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "Mostrar archivos ocultos" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Transferencia segura de archivos" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Ajuste el tamaño de la ventana" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Entrada" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Archivo" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Herramienta" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Preferencias" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Tipo" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Descripción" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "Versión" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Elegir una nueva tecla" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Pulse la nueva tecla..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "El complemento %s no está registrado." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Abrir en ventana principal" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Habilitar descubrimiento de servicios" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Miniaplicación Remmina" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "" "Conectarse a escritorio remoto a través del menú de la miniaplicación" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Descubierto" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nueva conexión" #~ msgid "Open a quick connection" #~ msgstr "Abrir una conexión rápida" #~ msgid "Quick _Connect To" #~ msgstr "_Conexión rápida" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Protocolo de Escritorio Remoto de Windows" #~ msgid "VNC - Virtual Network Computing" #~ msgstr "VNC - Virtual Network Computing" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - Conexión entrante" #~ msgid "Quit Remmina" #~ msgstr "Salir de Remmina" #~ msgid "Remote Desktop Client" #~ msgstr "Cliente de escritorio remoto" #~ msgid "256 Colors" #~ msgstr "256 Colores" #~ msgid "High Color (15 bit)" #~ msgstr "Alta densidad (15 bit)" #~ msgid "High Color (16 bit)" #~ msgstr "Alta densidad (16 bit)" #~ msgid "Poor (Fastest)" #~ msgstr "Pobre (más rápido)" #~ msgid "Medium" #~ msgstr "Medio" #~ msgid "Good" #~ msgstr "Buena" #~ msgid "Best (Slowest)" #~ msgstr "Mejor (más lento)" #~ msgid "None" #~ msgstr "Nada" #~ msgid "My Home Folder" #~ msgstr "Mi carpeta" #~ msgid "System Root Folder" #~ msgstr "Carpeta raíz del sistema" #~ msgid "Use Client Resolution" #~ msgstr "Utilizar resolución del cliente" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Mismo servidor en el puerto %i" #~ msgid "User Name" #~ msgstr "Usuario" #~ msgid "Identity File" #~ msgstr "Archivo de identidad" #~ msgid "Domain" #~ msgstr "Dominio" #~ msgid "Color Depth" #~ msgstr "Profundidad de color" #~ msgid "Share Folder" #~ msgstr "Carpeta compartida" #~ msgid "Keyboard Mapping" #~ msgstr "Distribución del teclado" #~ msgid "Client Name" #~ msgstr "Nombre del cliente" #~ msgid "Startup Program" #~ msgstr "Programa de inicio" #~ msgid "Startup Path" #~ msgstr "Ruta de inicio" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "Adjuntar a la consola (Windows 2003 o posterior)" #~ msgid "Enable bitmap caching" #~ msgstr "Habilitar la caché de mapa de bits" #~ msgid "Enable compression" #~ msgstr "Habilitar compresión" #~ msgid "Advanced Arguments" #~ msgstr "Argumentos avanzados" #~ msgid "Listen on Port" #~ msgstr "Escuchar en el puerto" #~ msgid "Quality" #~ msgstr "Calidad" #~ msgid "Show remote cursor" #~ msgstr "Mostrar el cursor remoto" #~ msgid "View Only" #~ msgstr "Ver solamente" #~ msgid "Disable Server Input" #~ msgstr "Deshabilitar entrada del servidor" #~ msgid "Horizontal Scale" #~ msgstr "Escala horizontal" #~ msgid "Vertical Scale" #~ msgstr "Escala vertical" #~ msgid "Open Chat..." #~ msgstr "Abrir chat..." #~ msgid "Auto-Fit Window" #~ msgstr "Ajuste automático en la ventana" #~ msgid "Toggle scrolled window mode" #~ msgstr "Desplazarse en la ventana" #~ msgid "Scrolled Fullscreen" #~ msgstr "Desplazarse a pantalla completa" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "Desplazare en modo pantalla completa" #~ msgid "Viewport Fullscreen" #~ msgstr "Vista a pantalla completa" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "Cambiar la vista a pantalla completa" #~ msgid "Minimize Window" #~ msgstr "Minimizar ventana" #~ msgid "VNC Password" #~ msgstr "Contraseña VNC" #~ msgid "Unable to connect to VNC server" #~ msgstr "No se pudo conectar al servidor VNC" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "No se pudo convertir '%s' en una dirección de servidor" #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "La conexión VNC ha fallado: %s" #~ msgid "Your connection has been rejected." #~ msgstr "La conexión ha sido rechazada." #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "Escuchando en el puerto %i para la conexión VNC entrante..." #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "Fallo la autentificación VNC. Intentando conectar..." #~ msgid "Open Connection" #~ msgstr "Abrir conexión" #~ msgid "Edit Settings" #~ msgstr "Editar preferencias" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "Recordar el último modo de visualización para cada conexión" #~ msgid "Invisible Floating Toolbar" #~ msgstr "Esconder la barra de herramientas" #~ msgid "Double-click Action" #~ msgstr "Double-click Acción" #~ msgid "Default View Mode" #~ msgstr "Modo de visualización por defecto" #~ msgid "Scale Quality" #~ msgstr "Escala de calidad" #~ msgid "SSH Tunnel Local Port" #~ msgstr "Puerto del túnel SSH" #~ msgid "Maximum Recent Items" #~ msgstr "Máximo de artículos recientes" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Mostrar conexiones rápidas en el menú" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "Ocultar el total de grupos expandidos" #~ msgid "SSH Password" #~ msgstr "Contraseña SSH" #~ msgid "SSH Private Key Passphrase" #~ msgstr "Clave privada SHH" #, c-format #~ msgid "File Transfer: %s" #~ msgstr "Transferencia de archivos: %s" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "" #~ "Transferencia de archivos en progreso.\n" #~ "¿Estas seguro que desea salir?" #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "Transferencia segura de archivos: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "Conectanto al servidor SFTP %s..." #~ msgid "Fit Window Size" #~ msgstr "Ajuste el tamaño de la ventana" #~ msgid "_File" #~ msgstr "_Archivo" #~ msgid "Settings" #~ msgstr "Configuración" #~ msgid "Scaled Mode" #~ msgstr "Modo a escala" #~ msgid "Grab Keyboard" #~ msgstr "Capturar teclado" #~ msgid "Minimize" #~ msgstr "Minimizar" #~ msgid "Open Connections in Separated Processes" #~ msgstr "Abrir conexiones en procesos separados" #~ msgid "Press Enter key to add new group" #~ msgstr "Pulse Enter para añadir un nuevo grupo" #~ msgid "Press Enter key to add new resolution" #~ msgstr "Pulse Enter para añadir una nueva resolución" #~ msgid "Quit File Transfer" #~ msgstr "Salir de transferencia de archivos" #~ msgid "Grayscale" #~ msgstr "Escala de grises" #~ msgid "Share Local Printers" #~ msgstr "Impresoras locales compartidas" #~ msgid "_Action" #~ msgstr "_Acción" #~ msgid "Public Key (Automatic)" #~ msgstr "Clave pública (Automático)" #~ msgid "Off" #~ msgstr "Off" #~ msgid "Sound" #~ msgstr "Sonido" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - Protocolo de Control de Administrador de la Pantalla X" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "Por favor, instale Xephyr para activar la característica de XDMCP" #~ msgid "Disconnect After One Session" #~ msgstr "Desconectarse después de una sesión" #~ msgid "Use Local Cursor" #~ msgstr "Usar cursor local" #~ msgid "Save Password" #~ msgstr "Guardar contraseña" #~ msgid "CA Certificate" #~ msgstr "Certificado de AC" #~ msgid "Client Certificate" #~ msgstr "Certificado del cliente" #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "" #~ "Por favor, instale xqproxy en el servidor SSH para ejecutar XDMCP a través " #~ "de SSH" #~ msgid "Do Not Use Tabs" #~ msgstr "No usar pestañas" #~ msgid "Tab by Protocols" #~ msgstr "Pestaña por protocolo" #~ msgid "Tab by Groups" #~ msgstr "Pestaña por grupos" #~ msgid "Client Key" #~ msgstr "Llave del cliente" #~ msgid "Tab All Connections" #~ msgstr "Pestaña con todas las conexiones" #~ msgid "Tab Interface" #~ msgstr "Interfaz de la pestaña" #~ msgid "True Color (24 bit)" #~ msgstr "Color verdadero (24 bits)" #~ msgid "Character Set" #~ msgstr "Juego de caracteres" #~ msgid "Enable SSH Tunnel" #~ msgstr "Permitir tunel SSH" #~ msgid "Scrolled Window" #~ msgstr "Ventana con barras de desplazamiento" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "El protocolo %s no está soportado." #~ msgid "Disable Clipboard Sync" #~ msgstr "Desactivar sincronización entre portapapeles" #~ msgid "Disable Encryption" #~ msgstr "Desactivar cifrado" #~ msgid "Show Remote Cursor" #~ msgstr "Mostrar cursor remoto" #~ msgid "Use Window Size" #~ msgstr "Usar tamaño de ventana" #~ msgid "Refresh" #~ msgstr "Actualizar" #~ msgid "Always Show Tabs" #~ msgstr "Mostrar siempre las pestañas" #~ msgid "Hide Connection Toolbar" #~ msgstr "Ocultar la barra de herramientas de conexión" #~ msgid "Show / Hide Toolbar" #~ msgstr "Mostrar/Ocultar barra de herramientas" #~ msgid "Host Key" #~ msgstr "Tecla de anfitrión" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "Guardar preferencias al iniciar la conexión" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "Escuchando en puerto %i una conexión %s entrante..." #~ msgid "Proxy Destination" #~ msgstr "Destino del proxy" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Activar/Desactivar pantalla completa" #~ msgid "Toggle Scaled Mode" #~ msgstr "Activar/Desactivar modo escalado" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Túnel a través de dirección de autobucle" #, c-format #~ msgid "%s Password" #~ msgstr "Contraseña %s" #~ msgid "Switch Tab Pages" #~ msgstr "Cambiar a páginas en pestañas" FreeRDP-Remmina-356c033/remmina/po/eu.po000066400000000000000000000605231171526373700176400ustar00rootroot00000000000000# translation of eu.po to Basque # Basque translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # # FIRST AUTHOR , 2010. # Iñaki Larrañaga Murgoitio , 2010. msgid "" msgstr "" "Project-Id-Version: eu\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:18+0000\n" "Last-Translator: Vic \n" "Language-Team: Basque \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: eu\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Konektatu urruneko mahaigainekin" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina, urruneko mahaigainen bezeroa" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Guztira elementu %i." msgstr[1] "Guztira %i elementu." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Ziur zaude '%s' elementua ezabatzea nahi duzula?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Editatu" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Ikusi" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Laguntza" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Sortu urruneko mahaigain berria" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Ireki hobespenen elkarrizketa-koadroa" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Ireki konexioa hautatutako urruneko mahaigainarekin" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Sortu hautatutako urruneko mahaigainaren kopia" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Editatu hautatutako urruneko mahaigaina" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Ezabatu hautatutako urruneko mahaigaina" #: ../src/remminamain.c:980 msgid "Export" msgstr "" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Tresna-barra" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Egoera-barra" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Tresna-barrako botoi txikiak" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Zerrenda-ikuspegia" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Zuhaitz-ikuspegia" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Izena" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Taldea" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Zerbitzaria" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Aukeratu urruneko mahaigainaren zerbitzaria" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identitate-fitxategia" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Arakatu sarea '%s' zerbitzaria aurkitzeko" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Pasahitza" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Bereizmena" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Erabili bezeroaren bereizmena" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Pertsonalizatua" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Teklatuaren mapa" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Eskala horizontala" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Eskala bertikala" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Gaitu SSH tunela" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH zerbitzaria" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Zerbitzari berdina %i atakan" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Karaktere-jokoa" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Abioko programa" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Abioko bide-izena" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH autentifikazioa" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Erabiltzaile-izena" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Gako publikoa (automatikoa)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Oinarrizkoa" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Aurreratua" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Ezarpen lehenetsiak gordeta." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Urruneko mahaigainaren hobespenak" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Lehenetsia" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profila" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Konexio azkarra" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokoloa" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Ez da '%s' fitxategia aurkitu." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "Uneko leihoan %i konexio aktibo daude. Ixtea nahi duzu?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Aldatu leihoaren tamaina urruneko bereizmenera doitzeko" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Aldatu fitxak" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Txandakatu eskalaren modua" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Kapturatu teklatuko gertaera guztiak" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Hobespenak" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Tresnak" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimizatu leihoa" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Deskonektatu" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "'%s'(r)ekin konektatzen..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Ireki Shell segurua terminal berrian..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Ireki fitxategi-transferentzia segurua..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "%s SSH zerbitzariarekin konektatzen..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "%s(r)ekin konektatzen SSH tunelaren bidez..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH pasahitza" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH gako pribatuaren pasaesaldia" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Gorde %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Gorde pasahitza" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "ZE ziurtagiria" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "ZE CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Bezeroaren ziurtagiria" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Bezeroaren gakoa" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Mantentzaileak:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Laguntzaileak:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina software librea da; birbana eta/edo alda dezakezu Software " "Foundation-ek argitaratutako GNU Lizentzia Publiko Orokorraren 2. bertsioan " "edo (nahiago baduzu) beste berriago batean, jasotako baldintzak betez gero." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina erabilgarria izango delakoan banatzen da, baina INOLAKO BERMERIK " "GABE; era berean, ez da bermatzen beraren EGOKITASUNA MERKATURATZEKO edo " "HELBURU PARTIKULARRETARAKO ERABILTZEKO. Argibide gehiago nahi izanez gero, " "ikus GNU Lizentzia Publiko Orokorra." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Programa honekin batera GNU Lizentzia Publiko Orokorraren kopia bat ere jaso " "beharko zenuke; horrela ez bada, idatzi helbide honetara: Free Software " "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+-ko urruneko mahaigainen bezeroa" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Iñaki Larrañaga Murgoitio https://launchpad.net/~dooteo\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Ireki konexioa" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Editatu ezarpenak" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Hurbilena" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Lauzak" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineala" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatikoa" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Korritutako leihoa" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Korritutako pantaila osoa" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Leihatila pantaila osoan" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Fitxak taldeen arabera" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Fitxak protokoloen arabera" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Fitxak konexio guztiekin" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Ez erabili fitxarik" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Sartu 'zabaleraxaltuera' formatuan:" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Azken zerrendak garbituta." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina-ren hobespenak" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Aukerak" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Gogoratu ikuspegiaren azken modua konexio bakoitzean" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Tresna-barra mugikorra ikusezina" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Klik bikoitzaren ekintza" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Lehenespeneko ikuspegi modua" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Fitxaren interfazea" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Eskalaren kalitatea" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSH tunelaren lokaleko ataka" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Gehienezko azken elementuak" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Garbitu" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Bereizmenak" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Miniaplikazioa" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Doitu automatikoki leihoa" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSHko pasahitzaren autentifikazioak huts egin du: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSHko gako publikoaren autentifikazioak huts egin du: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSHko gako-fitxategia ez da oraindik ezarri." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSHren gako publikoaren autentifikazio automatikoak huts egin du: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "%s(r)en pasahitza autentifikatzen %s SSH zerbitzarian..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "%s(r)en identitatea autentifikatzen %s SSH zerbitzarian..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Huts egin du SSH saioa abiatzean: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Huts egin du helburuko SSH tunelarekin konektatzean: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Huts egin du %s exekutatzean SSH zerbitzarian: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Huts egin du ataka bideratzea eskatzean: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Ez dago erantzunik zerbitzaritik." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Huts egin du sftp saioa sortzean: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Huts egin du sftp saioa hasieratzean: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Egin berriketan %s(r)ekin" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Bidali" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Garbitu" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Aukeratu deskargen kokalekua" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" "Ziur zaude hautatutako fitxategi guztiak zerbitzaritik ezabatzea nahi " "dituzula?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Aukeratu fitxategia igotzeko" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Deskargatu" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Igo" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Joan karpeta nagusira" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Joan karpeta gurasora" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Freskatu uneko karpeta" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Deskargatu zerbitzaritik" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Igo zerbitzarira" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Ezabatu fitxategiak zerbitzaritik" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Fitxategi-izena" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Tamaina" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Erabiltzailea" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Baimenak" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Urrunekoa" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokala" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Aurrerapena" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Errorea %s direktorioa sortzean." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Errorea %s fitxategia irekitzean zerbitzarian. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Errorea %s fitxategia sortzean." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Errorea %s fitxategia idaztean." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Errorea %s direktorioa irekitzean. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Errorea %s fitxategia sortzean zerbitzarian. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Errorea %s fitxategia irekitzean." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Errorea %s fitxategia irekitzean zerbitzarian. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Huts egin du %s direktorioa irekitzean. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Huts egin du direktorioa irakurtzean. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Fitxategi-transferentzia egiten ari da oraindik.\n" "Ziur zaude bertan behera uztea nahi duzula?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Huts egin du '%s' ezabatzean. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Fitxategi-transferentzia segurua" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Doitu leihoaren tamaina" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Ireki leiho nagusia" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Gaitu zerbitzu-aurkikuntza" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Konektatu urruneko mahaigainetara miniaplikazioaren menutik" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Aurkituta" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Konexio berria" FreeRDP-Remmina-356c033/remmina/po/fr.po000066400000000000000000000643671171526373700176500ustar00rootroot00000000000000# French translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:16+0000\n" "Last-Translator: Davy Defaud \n" "Language-Team: French \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Connectez-vous à des bureaux distants" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Visionneur de bureaux distants Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "%i item." msgstr[1] "%i items." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Êtes-vous sûr de vouloir détruire « %s » ?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Importation impossible :\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importer" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Ce protocole ne supporte pas l’exportation." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Édition" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Affichage" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Outils" #: ../src/remminamain.c:923 msgid "_Help" msgstr "Aid_e" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Créer un nouveau fichier de bureau distant" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Ouvrir la boîte de dialogue des préférences" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Greffons" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Wiki en ligne" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Fenêtre de débogage" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Lancer la connexion du fichier de bureau distant sélectionné" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Créer une copie du fichier de bureau distant sélectionné" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Éditer le fichier de bureau distant sélectionné" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Supprimer le fichier de bureau distant sélectionné" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exporter" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barre d’outils" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barre d’état" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Recherche rapide" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Barre d’outils réduite (petits boutons)" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Affichage en liste" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Affichage arborescent" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nom" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Groupe" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Serveur" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formats supportés :\n" "* serveur\n" "* serveur:port\n" "* [serveur]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formats supportés :\n" "* :port\n" "* serveur\n" "* serveur:port\n" "* [serveur]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Choisir un serveur de bureau distant" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Fichier d’identité" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Parcourir le réseau à la recherche d’un serveur %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Mot de passe" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Résolution" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Utiliser la taille de la fenêtre" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Utiliser la résolution du client" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personnalisé" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Agencement du clavier" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Échelle horizontale" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Échelle verticale" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Activer le tunnel SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel via adresse de bouclage" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Serveur SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Même serveur sur le port %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Jeu de caractères" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Programme de démarrage" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Chemin de démarrage" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Authentification SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Nom d’utilisateur" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Clef publique (automatique)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Basique" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avancé" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Les paramètres par défaut ont été enregistrés." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Préférences de bureau distant" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Par défaut" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Connexion rapide" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocole" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Fichier %s introuvable." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Il y a %i connexion(s) active(s) sur la fenêtre courante. Êtes-vous sûr de " "vouloir quitter ?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Redimensionner la fenêtre en fonction de la résolution distante" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Basculer en mode plein écran" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Changer d’onglet" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Basculer en mode réduit" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Capturer les événements du clavier" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Préférences" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Outils" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Réduire la fenêtre" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Se déconnecter" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Connexion à « %s » en cours..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Ouvrir la console sécurisée dans un nouveau terminal..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Ouvrir le transfert de fichier sécurisé" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Connexion au serveur SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Connexion à %s via tunnel SSH..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "En attente d’un tunnel SSH entrant sur le port %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Commande %s non trouvée sur le serveur SSH." #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Échec de la commande %s sur le serveur SSH (statut = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "La commande a échoué : %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "Mot de passe %s" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Mot de passe SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Phrase de passe de la clef privée" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Écoute sur le port %i d’une connexion %s entrante..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "L’authentification a échoué. Nouvelle tentative de connexion..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Sauvegarder %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Enregistrer le mot de passe" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certificat de l’autorité" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "Liste de révocation de l’autorité" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certificat client" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Clef du client" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Mainteneurs :" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Contributeurs :" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina est un logiciel libre ; vous pouvez le redistribuer et / ou le " "modifier en respectant les termes de la Licence Publique Générale GNU " "publiée par la Free Software Foundation ; ou de la version 2 de la licence, " "ou (à votre choix) toutes les versions supérieures." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina est distribué dans l’espoir qu’il sera utile, mais SANS AUCUNE " "GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou " "D'ADAPTATION À UN USAGE PARTICULIER. Voir la Licence Publique Générale GNU " "pour plus de détails." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Si devriez avoir reçu une copie de la Licence Publique Générale GNU utilisée " "par ce programme ; sinon, écrivez à la Free Software Foundation, Inc., 59 " "Temple Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Le visualiseur de bureaux distants en GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Davy Defaud https://launchpad.net/~davy-defaud\n" " Florent DEUTSCH https://launchpad.net/~florent-arawn\n" " Guilhem Lettron https://launchpad.net/~guilhem-fr\n" " Vic https://launchpad.net/~llyzs\n" " Étienne BERSAC https://launchpad.net/~bersace" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Ouvrir la connexion" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Éditer les paramètres" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Le plus proche" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Mosaïques" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinéaire" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatique" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Fenêtre avec défilement" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Plein écran avec défilement" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Zone de visualisation (viewport) en plein écran" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Onglets par groupes" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Onglets par protocoles" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Onglets par connexions" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Ne pas utiliser d’onglets" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Veuillez entrer un format de type « ‘largeur’x‘hauteur’ »." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Les listes récentes ont été vidées." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Préférences de Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Options" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Se souvenir du dernier mode d’affichage de chaque connexion" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Enregistrer les préférences au lancement de la connexion." #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Barre d’outils flottante invisible" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Toujours afficher les onglets." #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Masquer la barre d’outils de connexion" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Action du double-clic" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Mode d’affichage par défaut" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Interface par onglets" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Qualité de la mise à l’échelle" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Port local du tunnel SSH" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Nombre maximum d’entrées conservées" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Effacer" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Résolutions" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Clavier" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Clef de l’hôte" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Fenêtre d’ajustement automatique" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "S’approprier les entrées clavier" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Afficher / Masquer la barre d’outils" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "L’authentification SSH par mot de passe a échoué : %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "L’authentification SSH par clef publique a échoué : %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Le fichier contenant la clef SSH n’a pas encore été défini." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "L’authentification automatique par clef publique a échoué : %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Vérification du mot de passe de %s sur le serveur SSH %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Vérification de l’identité de %s sur le serveur SSH %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Échec de l’initialisation de la session SSH : %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Échec de la connexion à la destination du tunnel SSH : %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Impossible d’exécuter %s sur le serveur SSH : %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Échec de la demande de redirection de port : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Aucune réponse du serveur." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Échec de la création de la session SFTP : %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Impossible d’initialiser la session SFTP : %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - shell sécurisé" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Discussion avec %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Envoyer" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Effacer" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Choisir le dossier de téléchargement" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" "Êtes-vous sûr de vouloir supprimer les fichiers sélectionnés sur le serveur ?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Choisissez un fichier à envoyer" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Réportoire d’envoi" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Télécharger" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Envoyer" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Aller dans votre répertoire utilisateur" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Remonter au dossier parent" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Actualiser le dossier courant" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Télécharger depuis le serveur" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Transférer sur le serveur" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Effacer les fichiers sur le serveur" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Nom du fichier" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Taille" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Utilisateur" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Permissions" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Distant" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Local" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "État d’avancement" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Erreur à la création du répertoire %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Erreur à l’ouverture du fichier %s sur le serveur. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Erreur à la création du fichier %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Erreur lors de l’écriture du fichier %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Erreur à l’ouverture du répertoire %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Erreur lors de la création du dossier %s sur le serveur. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Erreur à la création du fichier %s sur le serveur. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Erreur à l’ouverture du fichier %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Erreur lors de l’écriture du fichier %s sur le serveur. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Échec de l’ouverture du répertoire %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Échec lors de la lecture du répertoire. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Transfert de fichiers en cours.\n" "Êtes-vous sûr de vouloir l’annuler ?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Impossible de supprimer « %s ». %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Transfert de fichiers sécurisé" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Ajuster la taille de la fenêtre" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Entrée" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Fichier" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Type" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Description" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Choisissez une nouvelle touche" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Veuillez presser la nouvelle touche..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Le greffon %s n’est pas enregistré." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Ouvrir la fenêtre principale" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Activer la découverte de services" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Se connecter aux bureaux distants via le menu de l'applet" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Détectés" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nouvelle connexion" FreeRDP-Remmina-356c033/remmina/po/hu.po000066400000000000000000000630521171526373700176430ustar00rootroot00000000000000# Hungarian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:15+0000\n" "Last-Translator: kilo aka Gabor Kmetyko \n" "Language-Team: Hungarian \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: hu\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Kapcsolódás távoli asztalokhoz" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina távoli asztal kliens" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Összesen %i elem." msgstr[1] "Összesen %i elem." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Biztosan törölni akarod: '%s'?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Nem importálható:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importálás" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Ez a protokol nem támogatja az exportálást." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "S_zerkesztés" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Nézet" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Eszközök" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Súgó" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Új távoli asztal fájl létrehozása" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "A beállítások párbeszédablakának megnyitása" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Modulok" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online Wiki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "HibakeresÅ‘ ablak" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "A kiválasztott távoli asztal fájl kapcsolat megnyitása" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "A kiválasztott távoli asztal fájl kapcsolat másolása" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "A kiválasztott távoli asztal fájl kapcsolat szerkesztése" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "A kiválasztott távoli asztal fájl kapcsolat törlése" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exportálás" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Eszköztár" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Ãllapotsor" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "GyorskeresÅ‘" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Kisméretű eszköztár gombok" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Listanézet" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Fastruktúra-nézet" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Név" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Csoport" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Kiszolgáló" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Támogatott formátumok\n" "* kiszolgáló\n" "* kiszolgáló:port\n" "* [kiszolgáló]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Támogatott formátumok\n" "* :port\n" "* kiszolgáló\n" "* kiszolgáló:port\n" "* [kiszolgáló]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Válassz egy távoli asztal kiszolgálót" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Azonosító fájl" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Hálózat böngészése egy %s kiszolgáló keresésére" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Jelszó" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Felbontás" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Ablak méretének használata" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Kliens felbontásának használata" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Egyéni" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Billentyűzet kiosztás" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Vízszintes méretezés" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "FüggÅ‘leges méretezés" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "SSH alagút engedélyezése" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Alagút a loopback címen keresztül" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH kiszolgáló" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Ugyanazon kiszolgáló %i porton" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Karakterkészlet" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Induló program" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Induló útvonal" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH azonosítás" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Felhasználónév" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Nyilvános kulcs (automatikus)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Alap" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Speciális" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Alapértelmezett beállítások mentve." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Távoli asztal tulajdonságok" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Alapértelmezett" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Gyors kapcsolat" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokoll" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Fájl nem található: %s" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "%i nyitott kapcsolat van az aktív ablakban. Biztosan be akarod zárni?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Az ablakot a távoli felbontásnak megfelelÅ‘en méretezi" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Teljes képernyÅ‘ ki/bekapcsolása" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Minden billentyű esemény elkapása" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Tulajdonságok" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Eszközök" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Ablak minimalizálása" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Leválasztás" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Csatlakozás: '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "SSH megnyitása új terminálban..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Biztonságos fájl átvitel megnyitása..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Csatlakozás az SSH kiszolgálóhoz: %s" #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Csatlakozás SSH alagúton keresztül: %s" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Várakozás bejövÅ‘ SSH alagútra %i porton..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "%s parancs nem található az SSH kiszolgálón" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "%s parancs hibát jelzett az SSH kiszolgálón (állapot = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Parancs végrehajtása sikertelen: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s jelszó" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH jelszó" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH titkos kulcs jelszava" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Várakozás %i porton egy bejövÅ‘ %s kapcsolatra..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Azonosítás sikertelen. Újrakapcsolódás..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Mentés %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Jelszó mentése" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA tanusítvány" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Kliens tanusítvány" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Kliens kulcs" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Karbantartók:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "KözreműködÅ‘k:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "A Remmina egy szabad szoftver; terjeszthetÅ‘ illetve módosítható a Free " "Software Foundation által kiadott GNU General Public License dokumentumában " "leírtak; akár a licenc 3-as, akár (tetszÅ‘leges) késÅ‘bbi változata szerint." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "A Remmina abban a reményben kerül közreadásra, hogy hasznos lesz, de minden " "egyéb GARANCIA NÉLKÜL, az ELADHATÓSÃGRA vagy VALAMELY CÉLRA VALÓ " "ALKALMAZHATÓSÃGRA való származtatott garanciát is beleértve. További " "részleteket a GNU General Public License tartalmaz." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "A felhasználónak a programmal együtt meg kell kapnia a GNU General Public " "License egy példányát; ha mégsem kapta meg, akkor írjon a Free Software " "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA " "címre." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "A GTK+ távoli asztal kliens" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Vic https://launchpad.net/~llyzs\n" " kilo aka Gabor Kmetyko https://launchpad.net/~kg.kilo" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Kapcsolat megnyitása" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Beállítások szerkesztése" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Legközelebbi" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Mozaik" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineáris" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatikus" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "GörgetÅ‘ablak" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Görgetett teljes képernyÅ‘" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Fülek csoportok alapján" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Fülek protokoll alapján" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Minden kapcsolat fül" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Ne használjon füleket" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Add meg 'szélességxmagasság' formátumban." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Utolsók lista kiürítve." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina beállítások" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Beállítások" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Minden kapcsolatnál jegyezze meg a legutóbbi nézetet" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "A kapcsolat megnyitásakor mentse el a beállításokat" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Láthatatlan lebegÅ‘ eszköztár" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Mindig mutassa a füleket" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Kapcsolat eszköztár elrejtése" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Dupla kattintás eseménye" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Alapértelmezett nézet mód" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Füles megjelenítés" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Skálázás minÅ‘sége" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSH alagút helyi portja" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Utolsó elemek száma" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Kiürít" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Felbontások" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Alkalmazás" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Billentyűzet" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Gazda kulcs" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Ablak automatikus méretezése" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Billentyűzet elkapása" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Eszköztár mutatása / elrejtése" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSH jelszó azonosítási hiba: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSH nyílvános kulcs azonosítási hiba: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSH kulcsfájl még nincs beállítva." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSH automatikus nyilvános kulcs azonosítási hiba: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "%s jelszavának azonosítása %s SSH kiszolgálón..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "%s azonosságának azonosítása %s SSH kiszolgálón..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Nem sikerült elindítani az SSH kapcsolatot: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Nem sikerült kapcsolódni az SSH alagút céljához: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Nem sikerült %s végrehajtása az SSH kiszolgálón: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Nem sikerült a port továbbítás kérése: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Nincs válasz a kiszolgálótól." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Nem sikerült létrehozni az sftp kapcsolatot: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Nem sikerült inicializálni az sftp kapcsolatot: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Beszélgetés vele: %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Küldés" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Törlés" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Válassz letöltési helyet" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Biztosan törölni akarod a kiválasztott fájlt a kiszolgálón?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Válassz egy fájlt a feltöltéshez" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Könyvtár feltöltése" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Letöltés" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Feltöltés" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Ugrás a saját mappára" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Ugrás a szülÅ‘ mappára" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Aktuális mappa frissítése" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Letöltés a kiszolgálóról" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Feltöltés a kiszolgálóra" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Fájl törlése a kiszolgálón" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Fájlnév" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Méret" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Felhasználó" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Jogosultság" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Távoli" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Helyi" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Folyamat" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Könyvtár létrehozási hiba %s" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Fájl megnyitási hiba %s a kiszolgálón. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Fájl létrehozási hiba %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Fájl írási hiba %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Könyvtár megnyitási hiba %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Könyvtár létrehozási hiba %s a kiszolgálón. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Fájl létrehozási hiba %s a kiszolgálón. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Fájl megnyitási hiba %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Fájl írási hiba %s a kiszolgálón. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Nem sikerült megnyitni a könyvtárat %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Nem sikerült olvasni a könyvtárat. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Fájl átvitel folyamatban.\n" "Biztosan meg akarod szakítani?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Nem sikerült törölni '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Biztonságos fájl átvitel" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Ablakmérethez igazítás" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Bejegyzés" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Fájl" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Eszköz" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Beállítás" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Típus" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Leírás" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Válassz új billentyűt" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Nyomd le az új billentyűt..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "%s modul nincs regisztrálva." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "FÅ‘ablak megnyitása" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Szolgáltatás felfedezés engedélyezése" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Kapcsolódás távoli asztalokhoz a kisalkalmazás menüjén keresztül" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Felfedezve" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Új kapcsolat" FreeRDP-Remmina-356c033/remmina/po/id.po000066400000000000000000000476651171526373700176370ustar00rootroot00000000000000# Indonesian translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:14+0000\n" "Last-Translator: tri m s \n" "Language-Team: Indonesian \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: id\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Mengakses remote desktop" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina Remote Desktop Client" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Total %i item." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Anda yankin untuk menghapus '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Gagal meng-import:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Impor" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Sunting" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Tampilan" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "Ala_t" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Bantuan" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Buat berkas remote desktop baru" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Buka jendela pengaturan" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Pengaya" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Buka koneksi dengan berkas remote dekstop" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "" #: ../src/remminamain.c:980 msgid "Export" msgstr "" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "" #: ../src/remminamain.c:1002 msgid "List View" msgstr "" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Hubung Cepat" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "" #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " tri m s https://launchpad.net/~trims" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Pegaya %s tidak terdaftar" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Buka Jendela Utama" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Aktifkan Layanan Pencarian" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Akses remote desktop dari menu applet" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Ditemukan" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "" FreeRDP-Remmina-356c033/remmina/po/it.po000066400000000000000000001035411171526373700176410ustar00rootroot00000000000000# Italian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-17 23:35+0000\n" "Last-Translator: mrktt77 \n" "Language-Team: Italian \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-Launchpad-Export-Date: 2011-01-18 05:16+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: it\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Connessione a desktop remoti" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Client di connessione a desktop remoti Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Elementi totali: %i" msgstr[1] "Elementi totali: %i" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Si vuole davvero cancellare '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Impossibile importare:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importa" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Questo protocollo non supporta l'export." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Modifica" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Visualizza" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Strumenti" #: ../src/remminamain.c:923 msgid "_Help" msgstr "A_iuto" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Creare un nuovo file di connessione a desktop remoto" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Aprire la finestra delle preferenze" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Plugins" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Guida On Line" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Finestra di debug" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Stabilire la connessione con il desktop remoto selezionato" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Creare una copia del file di connessione al desktop remoto" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Modificare il file di connessione al desktop remoto" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Cancellare il file di connessione al desktop remoto" #: ../src/remminamain.c:980 msgid "Export" msgstr "_Esporta" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barra degli strumenti" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barra di stato" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Ricerca Rapida" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Pulsanti della barra degli strumenti piccoli" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Vista a elenco" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Vista ad albero" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nome" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Gruppo" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formati Supportati\n" "* server\n" "* server:porta\n" "* [server]:porta" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formati Supportati\n" "* server\n" "* server:porta\n" "* [server]:porta" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Selezionare un server di deskop remoto" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Certificato di identità" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Scansione della rete per trovare un server %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Password" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Risoluzione" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Usa Dimensione Finestra" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Usa la risoluzione del client" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personalizza" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Mappatura tastiera" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Scala orizzontale" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Scala verticale" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Abilita il tunnel SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel via Indirizzo di Loopback" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Server SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Lo stesso server su porta %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Set di caratteri" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Programma di avvio" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Percorso di avvio" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Autenticazione SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Nome utente" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Chiave pubblica (automatico)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Generale" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avanzato" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Impostazioni predefinite salvate" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Preferenze del desktop remoto" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Predefinita" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profilo" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Connessione rapida" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "Utilizza '%s' come delimitatore di sottogruppo" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocollo" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "File %s non trovato." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "Sono presenti %i connessioni attive. Terminare ugualmente?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Ridimensionare lo schermo per adattarsi alla risoluzione remota" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Imposta Schermo Intero" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Cambia Scheda" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Attivare modalità riscalata" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Catturare tutti gli eventi della tastiera" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Preferenze" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Strumenti" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimizzare la finestra" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Scollegarsi" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Connessione a '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Il plugin per il protocollo %s non è installato" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Aprire una sessione Secure Shell in un nuovo terminale..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Aprire una sessione Secure File Transfer..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Connessione al server SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Connessione a %s attraverso il tunnel SSH..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Attendo un tunnel SSH in ingresso sulla porta %i" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Comando %s non trovato sul server SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Comando %s fallito sul server SSH (status = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Fallita esecuzione comando: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s Password" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Password SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Password della chiave privata SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "In ascolto sulla Porta %i per una connesione in ingresso %s" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Autenticazione Fallita. Provo a riconnettermi ..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Salva %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Memorizzare la password" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certificato CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certificato del client" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Chiave del client" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Mantenuto da:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Hanno contribuito:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina è software libero; è lecito redistribuirlo o modificarlo secondo " "i termini della Licenza Pubblica Generica GNU come è pubblicata dalla Free " "Software Foundation; o la versione 2 della licenza o (a propria scelta) una " "versione successiva." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Questo programma è distribuito nella speranza che sia utile, ma SENZA " "ALCUNA GARANZIA; senza neppure la garanzia implicita di NEGOZIABILITÀ o " "di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Si veda la Licenza Pubblica " "Generica GNU per avere maggiori dettagli." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Questo programma deve essere distribuito assieme ad una copia della " "Licenza Pubblica Generica GNU; in caso contrario, se ne può ottenere una " "scrivendo alla Free Software Foundation, Inc., 59 Temple Place, Suite " "330, Boston, MA 02111-1307 USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Client GTK+ per connessioni a desktop remoto" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Fabio Isgrò https://launchpad.net/~dr.gogeta86\n" " Gabbe https://launchpad.net/~gabbe\n" " Luca Falavigna https://launchpad.net/~dktrkranz\n" " Vic https://launchpad.net/~llyzs\n" " mrktt77 https://launchpad.net/~marketto" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Aprire una connessione" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Modifica impostazioni" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Più vicino" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Tessere" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineare" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatico" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Finestra di scorrimento" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Schermo intero scorrevole" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Viewport a schermo intero" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Raggruppare per gruppo" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Raggruppare per protocollo" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Raggruppa tutte le connessioni" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Non Usare Schede" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Inserire formato 'widthxheight'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Pulire l'elenco degli elementi recenti" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Preferenze di Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Opzioni" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" "Memorizzare l'ultima modalità di visualizzazione per ciascuna connessione" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Salva impostazioni una volta connesso" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Toolbar fluttuante invisibile" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Mostra sempre i tabs" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Nascondi barra degli strumenti" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Azione del doppio click" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Modalità di visualizzazione predefinita" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Interfaccia a schede" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Fattore di scala" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Porta locale del tunnel SSH" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Numero massimo elementi recenti" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Pulisci" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Risoluzioni" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Tastiera" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host key" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Regolazione automatica dello schermo" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Cattura input tastiera" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Mostra/ nascondi barra degli strumenti" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Autenticazione SSH con password fallita: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Autenticazione SSH con chiave pubblica fallita: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Chiave SSH non ancora impostata." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Autenticazione automatica SSH con chiave pubblica fallita: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Autenticazione della password di %s al server SSH %s in corso..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Autenticazione dell'identità di %s al server SSH %s in corso..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Impossibile creare la sessione SSH: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Impossibile connettersi alla destinazione del tunnel SSH: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Impossibile eseguire %s sul server SSH: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Impossibile abilitare il port forwarding: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Nessuna risposta dal server." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Impossibile creare la sessione sftp: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Impossibile inizializzare la sessione sftp: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "In chat con %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Invia" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Pulisci" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Scegliere una posizione per lo scaricamento" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Cancellare i file selezionati dal server?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Scegliere un file da caricare" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Cartella caricamenti" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Scaricamento" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Invio" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Visualizzare la cartella home" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Visualizzare la cartella padre" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Aggiornare la cartella corrente" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Scaricare dal server" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Inviare al server" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Cancellare i file sul server" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Nome del file" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Dimensione" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Nome utente" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Permesso" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Remoto" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Locale" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Avanzamento" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Impossibile creare la directory %s" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Impossibile aprire il file %s sul server. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Impossibile creare il file %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Impossibile scrivere sul file %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Impossibile aprire la directory %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Errore nella creazione della cartella %s sul server. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Impossibile creare il file %s sul server. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Impossibile aprire il file %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Impossibile scrivere nel file %s sul server. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Impossibile aprire la directory %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Impossibile leggere la directory. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Trasferimento file in corso.\n" "Terminare il trasferimento?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Impossibile cancellare '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "Mostra i file nascosti" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Regola la dimensione dello schermo" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Voce" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "_File" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Strumento" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Preferenza" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Digita" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Descrizione" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "Versione" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Seleziona un nuovo tasto" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Premi il nuovo tasto ..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Il Plugin %s non è registrato" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Aprire la schermata principale" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Abilita la ricerca dei servizi" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Connessione al desktop remoto utilizzando il menu dell'applet" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Scoperto" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nuova connessione" #~ msgid "Open a quick connection" #~ msgstr "Apri una connessione rapida" #~ msgid "_Action" #~ msgstr "_Azione" #~ msgid "Quit Remmina" #~ msgstr "Uscire da Remmina" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - Connessione in ingresso" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - X Remote Session" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Remote Desktop Protocol" #~ msgid "VNC - Virtual Network Computing" #~ msgstr "VNC - Virtual Network Computing" #~ msgid "Quick _Connect To" #~ msgstr "_Connessione rapida a" #~ msgid "True Color (24 bit)" #~ msgstr "True color (24 bit)" #~ msgid "Grayscale" #~ msgstr "Scala di grigi" #~ msgid "256 Colors" #~ msgstr "256 colori" #~ msgid "High Color (15 bit)" #~ msgstr "High color (15 bit)" #~ msgid "High Color (16 bit)" #~ msgstr "High color (16 bit)" #~ msgid "Remote Desktop Client" #~ msgstr "Client per connessione a desktop remoto" #~ msgid "Poor (Fastest)" #~ msgstr "Peggiore (più veloce)" #~ msgid "Medium" #~ msgstr "Media" #~ msgid "Good" #~ msgstr "Buona" #~ msgid "Off" #~ msgstr "Inattivo" #~ msgid "System Root Folder" #~ msgstr "Directory radice" #~ msgid "Best (Slowest)" #~ msgstr "Migliore (più lenta)" #~ msgid "My Home Folder" #~ msgstr "Directory Home" #~ msgid "None" #~ msgstr "Nessuno" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Lo stesso server su porta %i" #~ msgid "Enable SSH Tunnel" #~ msgstr "Abilita il tunnel SSH" #~ msgid "Use Client Resolution" #~ msgstr "Usa la risoluzione del client" #~ msgid "Color Depth" #~ msgstr "Profondità colore" #~ msgid "Character Set" #~ msgstr "Set di caratteri" #~ msgid "User Name" #~ msgstr "Nome utente" #~ msgid "Share Folder" #~ msgstr "Condivisione cartella" #~ msgid "Domain" #~ msgstr "Dominio" #~ msgid "Identity File" #~ msgstr "Certificato di identità" #~ msgid "Public Key (Automatic)" #~ msgstr "Chiave pubblica (automatico)" #~ msgid "Startup Path" #~ msgstr "Percorso di avvio" #~ msgid "Startup Program" #~ msgstr "Programma di avvio" #~ msgid "Share Local Printers" #~ msgstr "Condividere le stampanti locali" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "Collegamento alla console (Windows 2003 o più recente)" #~ msgid "Enable bitmap caching" #~ msgstr "Abilitare cache bitmap" #~ msgid "Enable compression" #~ msgstr "Abilitare compressione" #~ msgid "Advanced Arguments" #~ msgstr "Parametri avanzati" #~ msgid "Client Name" #~ msgstr "Nome client" #~ msgid "Keyboard Mapping" #~ msgstr "Mappatura tastiera" #~ msgid "Sound" #~ msgstr "Audio" #~ msgid "Disable Server Input" #~ msgstr "Disabilita l'input del server" #~ msgid "View Only" #~ msgstr "Solo visualizzazione" #~ msgid "Vertical Scale" #~ msgstr "Scala verticale" #~ msgid "Horizontal Scale" #~ msgstr "Scala orizzontale" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "Installare Xephyr per utilizzare XDMCP" #~ msgid "Use Local Cursor" #~ msgstr "Usare il cursore locale" #~ msgid "Listen on Port" #~ msgstr "Ascoltare sulla porta" #~ msgid "Quality" #~ msgstr "Qualità" #~ msgid "Show remote cursor" #~ msgstr "Visualizzare il cursore remoto" #~ msgid "Disconnect After One Session" #~ msgstr "Disconnettersi al termine di una sessione" #~ msgid "Open Chat..." #~ msgstr "Aprire la chat" #~ msgid "Auto-Fit Window" #~ msgstr "Regolazione automatica dello schermo" #~ msgid "Scrolled Window" #~ msgstr "Finestra di scorrimento" #~ msgid "Unable to connect to VNC server" #~ msgstr "Impossibile connettersi al server VNC" #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "Connessione VPN fallite: %s" #~ msgid "Minimize Window" #~ msgstr "Minimizzare la finestra" #~ msgid "VNC Password" #~ msgstr "Password VNC" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "Impossibile risolvere '%s' ad un nome host" #~ msgid "Your connection has been rejected." #~ msgstr "Connessione rifiutata." #~ msgid "Client Key" #~ msgstr "Chiave del client" #~ msgid "Save Password" #~ msgstr "Memorizzare la password" #~ msgid "CA Certificate" #~ msgstr "Certificato CA" #~ msgid "Client Certificate" #~ msgstr "Certificato del client" #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "In attesa di connessioni VNC in ingresso sulla porta %i" #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "Autenticazione VNC fallita. Riconnessione in corso..." #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "Installare xqproxy sul server SSH per sessioni XDMCP su SSH" #~ msgid "Edit Settings" #~ msgstr "Modifica impostazioni" #~ msgid "Open Connection" #~ msgstr "Aprire una connessione" #~ msgid "SSH Password" #~ msgstr "Password SSH" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Mostrare Connessione rapida nel menu" #~ msgid "SSH Tunnel Local Port" #~ msgstr "Porta locale del tunnel SSH" #~ msgid "Maximum Recent Items" #~ msgstr "Numero massimo elementi recenti" #~ msgid "SSH Private Key Passphrase" #~ msgstr "Password della chiave privata SSH" #, c-format #~ msgid "File Transfer: %s" #~ msgstr "Trasferimento file: %s" #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "Secure File Transfer: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "Connessione al server SFTP '%s' in corso..." #~ msgid "Fit Window Size" #~ msgstr "Regola la dimensione dello schermo" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "" #~ "Trasferimento file in corso.\n" #~ "Chiudere?" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "Attivare la modalità schermo intero scorrevole" #~ msgid "Viewport Fullscreen" #~ msgstr "Viewport a schermo intero" #~ msgid "Toggle scrolled window mode" #~ msgstr "Attivare la modalità schermo scorrevole" #~ msgid "Scrolled Fullscreen" #~ msgstr "Schermo intero scorrevole" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "Attivare la modalità viewport a schermo intero" #~ msgid "Tab by Protocols" #~ msgstr "Raggruppare per protocollo" #~ msgid "Tab by Groups" #~ msgstr "Raggruppare per gruppo" #~ msgid "Tab All Connections" #~ msgstr "Raggruppa tutte le connessioni" #~ msgid "Default View Mode" #~ msgstr "Modalità di visualizzazione predefinita" #~ msgid "Scale Quality" #~ msgstr "Fattore di scala" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "" #~ "Memorizzare l'ultima modalità di visualizzazione per ciascuna connessione" #~ msgid "Double-click Action" #~ msgstr "Azione del doppio click" #~ msgid "Tab Interface" #~ msgstr "Interfaccia a Schede" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "Nascondi il numerto totale" #~ msgid "Do Not Use Tabs" #~ msgstr "Non Usare Schede" #~ msgid "Invisible Floating Toolbar" #~ msgstr "Toolbar Fluttuante Invisibile" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "Il Protocollo %s non è supportato" #~ msgid "Refresh" #~ msgstr "Aggiorna" #~ msgid "Disable Clipboard Sync" #~ msgstr "Disabilita Sincronizzazione Appunti" #~ msgid "Proxy Destination" #~ msgstr "Proxy di Destinazione" #~ msgid "Disable Encryption" #~ msgstr "Disabilita Crittografia" #~ msgid "Show Remote Cursor" #~ msgstr "Visualizza Cursore Remoto" #~ msgid "Use Window Size" #~ msgstr "Usa Dimensione Finestra" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Tunnel via Indirizzo di Loopback" #~ msgid "Always Show Tabs" #~ msgstr "Mostra sempre i Tabs" #~ msgid "Hide Connection Toolbar" #~ msgstr "Nascondi Barra degli Strumenti" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "Salva Impostazioni una volta Connesso" #, c-format #~ msgid "%s Password" #~ msgstr "%s Password" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "In ascolto sulla Porta %i per una connesione in ingresso %s" #~ msgid "Switch Tab Pages" #~ msgstr "Cambia Scheda" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Imposta Schermo Intero" #~ msgid "Show / Hide Toolbar" #~ msgstr "Mostra/ Nascondi Barra degli Strumenti" #~ msgid "Toggle Scaled Mode" #~ msgstr "Imposta Modalità Riscalata" #~ msgid "Grab Keyboard" #~ msgstr "Cattura input tastiera" #~ msgid "Host Key" #~ msgstr "Host Key" FreeRDP-Remmina-356c033/remmina/po/kk.po000066400000000000000000000652701171526373700176400ustar00rootroot00000000000000# Kazakh translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-08 11:06+0000\n" "Last-Translator: jmb_kz \n" "Language-Team: Kazakh \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-Launchpad-Export-Date: 2011-01-09 05:07+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: kk\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелдерге қоÑылу" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел клиенті" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Жалпы %i қоÑылыÑ." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "\"%s\" жою қажет пе?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Импорттау мүмкін емеÑ:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Импорттау" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Бұл протокол ÑкÑпорттауды жоқ." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_ҚоÑылыÑ" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Өзгерту" #: ../src/remminamain.c:921 msgid "_View" msgstr "Сырт _көрініÑ" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "Са_ймандар" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Көмек" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Жаңа қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел қоÑылыÑын құру" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Баптаулар терезеÑін ашу" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Кеңейтулер" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Үй парағы" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Онлайн Wiki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Мінету (debug) терезеÑÑ–" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Таңдалған қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтеліне қоÑылу" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Таңдалған қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелдің көшірмеÑін жаÑау" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Таңдалған қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел қоÑылыÑын өзгерту" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Таңдалған қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел қоÑылыÑты жою" #: ../src/remminamain.c:980 msgid "Export" msgstr "ЭкÑпорттау" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Құрал-Ñаймандар панелі" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Күй жолағы" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Шұғыл іздеу" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Құрал-Ñаймандар батырмаларын кішірейту" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Тізімді көрініÑ" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Бұтақты көрініÑ" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Ðты" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Тобы" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Сервер" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Қолдауы бар форматтар\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Қолдауы бар форматтар\n" "* :порт\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел Ñерверін таңдаңыз" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Кілт файлы" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Желіде %s Ñерверлерін іздеу" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөз" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Экран өлшемдер қатынаÑÑ‹" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Терезе өлшемін қолдану" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Клиент Ñкран өлшем қатынаÑын қолдану" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Өзіндік" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Пернетақта тілі" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Көлденең маÑштабы" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Тігінен маÑштабы" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "SSH туннелін Ñ–Ñке қоÑу" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "loopback адреÑÑ– арқылы туннелдеу" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Ñервері" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "ОÑÑ‹ Ñервер %i портында" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Символдар кодылауы" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Ðшылатын бағдарлама" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Ðшылудың орнаÑқан жері" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH аутентификациÑÑÑ‹" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Пайдаланушы аты" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Ðшық жариÑлы кілт (автоматты)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Ðегізгі" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "ҚоÑымша" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Қалыпты баптаулар Ñақталынды." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел баптаулары" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Қалыпты" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Профиль" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Жылдам қоÑылу" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Протокол" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "%s файлы табылмады." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "ОÑÑ‹ терезеде %i белÑенді қоÑÑ‹Ð»Ñ‹Ñ Ð±Ð°Ñ€ болып тұр.\r\n" "Терезені жабуға ÑенімдіÑіз бе?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "Толық Ñкран режимі" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "Жылжытуы бар толық Ñкран режимі" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Терезе қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелдің Ñкран өлшемдер қатынаÑын қабылдауы" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Толық Ñкран режиміне өту" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "МаÑштабтау режиміне өту" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "БаÑылған барлық пернелерді өзіне қаратып қабылдау" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Баптаулар" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Құралдар" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Терезені қайыру" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "БайланыÑты үзу" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "\"%s\" хоÑтына қоÑылу..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "%s протокол кеңейтуі орнатылмаған." #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Қорғалған қабықшаны (SSH) жаңа терминалда ашу..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Қорғалған файлдар алмаÑуын (SFTP) ашу..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "%s SSH Ñерверіне қоÑылу..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "%s хоÑтына SSH туннель арқылы қоÑылу..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "ÐšÑ–Ñ€Ñ–Ñ SSH туннелді %i портында күту..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "%s командаÑÑ‹ SSH Ñерверінде табылмады" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "%s командаÑының SSH Ñерверінде орындауы ÑәтÑіз аÑқталды (күйі = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "ОÑÑ‹ команда орындауы ÑәтÑіз аÑқталды: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s Ò›Ò±Ð¿Ð¸Ñ Ñөзі" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH Ò›Ò±Ð¿Ð¸Ñ Ñөзі" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Жеке жабық SSH кілттің Ò›Ò±Ð¿Ð¸Ñ Ñөзі" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑәтÑіз аÑқталды. Қайта қоÑылу..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "%s Ñақтау" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "ÒšÒ±Ð¿Ð¸Ñ Ñөзді Ñақтау" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA Ñертификаты" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Клиенттік Ñертификат" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Клиенттік кілт" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Қолдаушылар:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "ҮлеÑін қоÑқандар:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina бұл Ð±Ð¾Ñ (еркін) бағдарламалық қамтама болып келеді; Ñіз оны еркін " "түрде Free Software Foundation жариÑлаған GNU GPL 2-ші (немеÑе қалауыңызша " "одан кейінгі) үлгіÑімен ÑәйкеÑ, таратуға және/немеÑе өзгертуіңізге болады." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina бағдарламаÑÑ‹ ЕШБІР КЕПІЛДІКСІЗ, бірақ Ñізге пайдалы болу үшін " "таратылады; КЕЙБІР БЕЛГІЛЕÐГЕРМÐҚСÐТТЫ ОРЫÐДÐУ ҮШІРДЕ ЖÐРÐМДЫЛЫҒЫ " "кепілденбейді. Көбірек ақпарт үшін GNU General Public License-ті қараңыз." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел клиенті" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Vic https://launchpad.net/~llyzs\n" " jmb_kz https://launchpad.net/~jmb-kz" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "ҚоÑылыÑты ашу" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Баптауларды өзгерту" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina баптаулары" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Баптаулар" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Әрбір қоÑÑ‹Ð»Ñ‹Ñ Ò¯ÑˆÑ–Ð½ Ñоңғы көру режимін Ñақтау" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "ҚоÑÑ‹Ð»Ñ‹Ñ Ð°ÑˆÑƒ кезінде баптауларды Ñақтау" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "ҚоÑÑ‹Ð»Ñ‹Ñ Ò›Ò±Ñ€Ð°Ð»-Ñайман панелін жаÑыру" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Тышқан екі рет шерту кезінде орындалынатын әрекет" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Қалыпты көру режимі" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Сипаттама" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "%s кеңейтуі тіркелмеген." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Ð‘Ð°Ñ Ñ‚ÐµÑ€ÐµÐ·ÐµÐ½Ñ– ашу" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Қызметтерді іздеуді Ñ–Ñке қоÑу" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Ðпплет мәзірінен қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтелдерге қоÑылу" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Табылған" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Жаңа қоÑылыÑ" #~ msgid "_Action" #~ msgstr "Әр_екет" #~ msgid "256 Colors" #~ msgstr "256 түÑ" #~ msgid "Poor (Fastest)" #~ msgstr "Ðашар (ең жылдам)" #~ msgid "Medium" #~ msgstr "Орташа" #~ msgid "Good" #~ msgstr "ЖақÑÑ‹" #~ msgid "Best (Slowest)" #~ msgstr "Ең жақÑÑ‹ (ең баÑу)" #~ msgid "Quit Remmina" #~ msgstr "Remmina бағдарламаÑынан шығу" #~ msgid "Quick _Connect To" #~ msgstr "Ж_ылдам қоÑылу..." #~ msgid "Open a quick connection" #~ msgstr "Жылдам қоÑылуды ашу" #~ msgid "High Color (15 bit)" #~ msgstr "High Color (15 бит)" #~ msgid "High Color (16 bit)" #~ msgstr "High Color (16 бит)" #~ msgid "Remote Desktop Client" #~ msgstr "Қашықтаған Ð¶Ò±Ð¼Ñ‹Ñ Ò¯Ñтел клиенті" #~ msgid "True Color (24 bit)" #~ msgstr "True Color (24 бит)" #~ msgid "Grayscale" #~ msgstr "Сұр реңкті" #~ msgid "Use Window Size" #~ msgstr "Терезе өлшемін қолдану" #~ msgid "Use Client Resolution" #~ msgstr "Клиент Ñкран өлшем қатынаÑын қолдану" #~ msgid "Color Depth" #~ msgstr "Ð¢Ò¯Ñ Ñ‚ÐµÑ€ÐµÒ£Ð´Ñ–Ð³Ñ–" #~ msgid "User Name" #~ msgstr "Пайдаланушы аты" #~ msgid "Client Name" #~ msgstr "Клиент аты" #~ msgid "Sound" #~ msgstr "ДыбыÑ" #~ msgid "Share Folder" #~ msgstr "Буманы жалпы жетімдігіне жариÑлау" #~ msgid "Domain" #~ msgstr "Домен" FreeRDP-Remmina-356c033/remmina/po/lt.po000066400000000000000000001037141171526373700176460ustar00rootroot00000000000000# Lithuanian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-17 10:34+0000\n" "Last-Translator: Aurimas FiÅ¡eras \n" "Language-Team: Lithuanian \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%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2011-01-18 05:16+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: lt\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Jungtis prie nutolusių darbalaukių" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina nutolusio darbalaukio klientas" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "IÅ¡ viso %i elementas." msgstr[1] "IÅ¡ viso %i elementai." msgstr[2] "IÅ¡ viso %i elementų." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Ar tikrai norite paÅ¡alinti „%s“" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Nepavyko importuoti:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importuoti" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Å is protokolas nepalaiko eksportavimo." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_RyÅ¡ys" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Keisti" #: ../src/remminamain.c:921 msgid "_View" msgstr "R_odymas" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "Ä®ran_kiai" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Žinynas" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Sukurti naujÄ… nutolusio darbalaukio failÄ…" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Atverti nuostatų dialogÄ…" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Papildiniai" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Namų puslapis" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Vikis internete" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Derinimo langas" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Prisijungti naudojant pažymÄ—tÄ… nutolusio darbalaukio failÄ…" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Sukurti pažymÄ—to nutolusio darbalaukio failo kopijÄ…" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Redaguoti pažymÄ—tÄ… nutolusio darbalaukio failÄ…" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "PaÅ¡alinti pažymÄ—tÄ… nutolusio darbalaukio failÄ…" #: ../src/remminamain.c:980 msgid "Export" msgstr "Eksportuoti" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Ä®rankių juosta" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "BÅ«senos juosta" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Greita paieÅ¡ka" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Maži įrankių juostos mygtukai" #: ../src/remminamain.c:1002 msgid "List View" msgstr "SÄ…raÅ¡o rodinys" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Medžio rodinys" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Pavadinimas" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "GrupÄ—" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Serveris" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Palaikomi formatai\n" "* serveris\n" "* serveris:prievadas\n" "* [serveris]:prievadas" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Palaikomi formatai\n" "* :prievadas\n" "* serveris\n" "* serveris:prievadas\n" "* [serveris]:prievadas" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Pasirinkite nutolusio darbalaukio serverį" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Tapatumo failas" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "NarÅ¡yti tinkle %s serveriui rasti" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Slaptažodis" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Skiriamoji geba" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Naudoti lango dydį" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Naudoti kliento skiriamÄ…jÄ… gebÄ…" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Kita" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "KlaviatÅ«ros atvaizdavimas" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Horizontalus mastelis" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Vertikalus mastelis" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Ä®jungti SSH tunelį" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunelis per loopback adresÄ…" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH serveris" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Tas pats serveris, prievadas %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Ženklų rinkinys" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Paleidimo programa" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Paleidimo kelias" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH tapatumo nustatymas" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Naudotojo vardas" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "VieÅ¡asis raktas (automatiÅ¡kai)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "PagrindinÄ—s" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "IÅ¡plÄ—stinÄ—s" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Numatytieji nustatymai iÅ¡saugoti." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Nutolusio darbalaukio nuostatos" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Numatytasis" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profilis" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Greitas prisijungimas" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "Naudoti „%s“ kaip pogrupio skirtukÄ…" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokolas" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Failas %s nerastas." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "Dabartiniame lange yra %i aktyvÅ«s ryÅ¡iai. Ar norite užverti?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "PeržiÅ«ros srities viso ekrano veiksena" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "Slankiojama viso ekrano veiksena" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Pakeisti lango dydį, kad tilptų nutolusi skiriamoji geba" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Perjungti viso ekrano veiksenÄ…" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Perjungti kortelių puslapius" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Perjungti mastelio keitimo veiskenÄ…" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Pasisavinti visus klaviatÅ«ros įvykius" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Nuostatos" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Ä®rankiai" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Sutraukti langÄ…" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Nutraukti ryšį" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Jungiamasi prie „%s“..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Protokolo papildinys %s neįdiegtas." #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Atverti saugų shell naujame terminale..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Atverti saugų failų siuntimÄ…..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Jungiamasi prie SSH serverio %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Jungiamasi prie %s per SSH tunelį..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Laukiama įeinanÄio SSH tunelio per prievadÄ… %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Komanda %s nerasta SSH serveryje" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Nepavyko įvykdyti komandos %s SSH serveryje (bÅ«sena = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Nepavyko įvykdyti komandos: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s slaptažodis" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH slaptažodis" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH privaÄiojo rakto slaptafrazÄ—" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Per prievadÄ… %i laukiama įeinanÄio %s prisijungimo..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Nepavyko nustatyti tapatumo. MÄ—ginama prisijungti iÅ¡ naujo..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "IÅ¡saugoti %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "IÅ¡saugoti slaptažodį" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA liudijimas" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Kliento liudijimas" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Kliento raktas" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "PrižiÅ«rÄ—tojai:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Pagalbininkai:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina yra laisva programinÄ— įranga; galite jÄ… platinti ir/ar modifikuoti " "GNU bendrosios vieÅ¡osios licencijos (GPL) sÄ…lygomis, kurios paskelbtos " "Laisvosios programinÄ—s įrangos fondo (FSF); 2-osios arba (JÅ«sų pasirinkimu) " "bet kurios vÄ—lesnÄ—s licencijos versijos sÄ…lygomis." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina yra platinama tikintis, kad ji bus naudinga, bet BE JOKIŲ GARANTIJŲ; " "net be numanomų PERKAMUMO ar TINKAMUMO KONKREÄŒIAI UŽDUOÄŒIAI garantijų. " "IÅ¡samiÄ… informacijÄ… rasite GNU bendrojoje vieÅ¡ojoje licencijoje." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "JÅ«s turÄ—jote gauti GNU bendrosios vieÅ¡osios licencijos kopijÄ… kartu su Å¡ia " "programa; jei negavote, raÅ¡ykite adresu Free Software Foundation, Inc., 59 " "Temple Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ nutolusio darbalaukio klientas" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Aurimas FiÅ¡eras https://launchpad.net/~aurimas-gmail\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Užmegzti ryšį" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Keisti nustatymus" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Artimiausias" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "IÅ¡klotinÄ—" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Dvilinijinis" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatinis" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Slankiojamas langas" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Slankiojamas visas ekranas" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "PeržiÅ«ros sritis visame ekrane" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "KortelÄ—s pagal grupes" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "KortelÄ—s pagal protokolus" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "KortelÄ—s visiems susijungimams" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Nenaudoti kortelių" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "PraÅ¡ome įvesti formatu „plotisxaukÅ¡tis“." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Paskiausių sÄ…raÅ¡ai iÅ¡valyti." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina nuostatos" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Parinktys" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Prisiminti paskutinÄ™ peržiÅ«ros veiksenÄ… kiekvienam ryÅ¡iui" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "IÅ¡saugoti nustatymus, kai pradedamas prisijungimas" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Nematoma slanki įrankių juosta" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Visada rodyti korteles" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "SlÄ—pti ryÅ¡io įrankių juostÄ…" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "DvikarÄio spustelÄ—jimo veiksmas" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Numatytoji peržiÅ«ros veiksena" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "KortelÄ—s" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Mastelio kokybÄ—" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSH tunelio vietinis prievadas" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Daugiausia paskiausių elementų" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "IÅ¡valyti" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Skiriamosios gebos" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "ProgramÄ—lÄ—" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "Rodyti „Naujas ryÅ¡ys“ meniu virÅ¡uje" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "PaslÄ—pti bendrÄ… skaiÄių grupÄ—s meniu" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "IÅ¡jungti dÄ—klo piktogramÄ…" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "AutomatiÅ¡kai paleisti dÄ—klo piktogramÄ…" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "Suskleisti langus į dÄ—klÄ…" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Klavišų deriniai" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Pagrindinis klaviÅ¡as" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "AutomatiÅ¡kai pritaikyti langÄ…" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Pasisavinti klaviatÅ«rÄ…" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Rodyti, slÄ—pti įrankių juostÄ…" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "Terminalas" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "Å riftas" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "Naudoti sistemos numatytÄ…jį Å¡riftÄ…" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "EiluÄių slinktis" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Nepavyko SSH tapatumo nustatymas slaptažodžiu: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Nepavyko SSH tapatumo nustatymas vieÅ¡uoju raktu: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSH rakto failas dar nenurodytas." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Nepavyko automatinis SSH tapatumo nustatymas vieÅ¡uoju raktu: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Nustatomas %s slaptažodžio tapatumas SSH serveriui %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Nustatomas %s tapatybÄ—s tapatumas SSH serveriui %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Nepavyko paleisti SSH seanso: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Nepavyko prisijungti prie SSH tunelio paskirties: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Nepavyko paleisti %s SSH serveryje: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Nepavyko užklausti prievadų persiuntimo: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "NÄ—ra atsako iÅ¡ serverio." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Nepavyko sukurti sftp seanso: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Nepavyko inicijuoti sftp seanso: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - saugus apvalkalas" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Pokalbis su %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Siųsti" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "IÅ¡_valyti" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Pasirinkite atsiuntimo vietÄ…" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Ar tikrai norite paÅ¡alinti pažymÄ—tus failus serveryje?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Pasirinkite failÄ… iÅ¡siuntimui" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "IÅ¡siuntimo aplankas" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Atsisiųsti" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "IÅ¡siuntimas" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Eiti į namų aplankÄ…" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Eiti į virÅ¡katalogį" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Atnaujinti dabartinį katalogÄ…" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Atsiųsti iÅ¡ serverio" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "IÅ¡siųsti į serverį" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Å alinti failus serveryje" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Failo vardas" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Dydis" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Naudotojas" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Leidimas" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "NutolÄ™s" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Vietinis" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Eiga" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Klaida kuriant katalogÄ…: %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Klaida atveriant failÄ… %s serveryje. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Klaida kuriant failÄ… %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Klaida įraÅ¡ant failÄ… %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Klaida atveriant katalogÄ… %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Klaida kuriant aplankÄ… %s serveryje. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Klaida kuriant failÄ… %s serveryje. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Klaida atveriant failÄ… %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Klaida įraÅ¡ant failÄ… %s serveryje. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Nepavyko atverti katalogo %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Nepavyko perskaityti katalogo. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Å iuo metu vyksta failo siuntimas.\n" "Ar tikrai norite jį nutraukti?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Nepavyko paÅ¡alinti „%s“. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "Rodyti paslÄ—ptus failus" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - saugus failų siuntimas" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Pritaikyti lango dydį" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Ä®raÅ¡as" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Failas" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Ä®rankis" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Nuostata" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Tipas" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "ApraÅ¡as" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "Versija" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Pasirinkite naujÄ… klavišą" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Paspauskite naujÄ… klavišą..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Papildinys %s neužregistruotas." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Atverti pagrindinį langÄ…" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Ä®jungti paslaugų paieÅ¡kÄ…" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Remmina programÄ—lÄ—" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Prisijungti prie nutolusio darbalaukio naudojant meniu" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Rastas" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Naujas ryÅ¡ys" #~ msgid "_Action" #~ msgstr "_Veiksmas" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - X nutolÄ™s seansas" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Windows terminalų paslauga" #~ msgid "Quit Remmina" #~ msgstr "Baigti darbÄ… su Remmina" #~ msgid "256 Colors" #~ msgstr "256 spalvos" #~ msgid "Remote Desktop Client" #~ msgstr "Nutolusio darbalaukio klientas" #~ msgid "High Color (15 bit)" #~ msgstr "AukÅ¡tos raiÅ¡kos (15 bitų)" #~ msgid "Good" #~ msgstr "Gera" #~ msgid "True Color (24 bit)" #~ msgstr "AukÅ¡Äiausios raiÅ¡kos (24 bitų)" #~ msgid "Grayscale" #~ msgstr "Pilkumo atspalviai" #~ msgid "Poor (Fastest)" #~ msgstr "Prasta (greiÄiausia)" #~ msgid "High Color (16 bit)" #~ msgstr "AukÅ¡tos raiÅ¡kos (16 bitų)" #~ msgid "Medium" #~ msgstr "VidutinÄ—" #~ msgid "Best (Slowest)" #~ msgstr "Geriausia (lÄ—Äiausia)" #~ msgid "None" #~ msgstr "NÄ—ra" #~ msgid "Use Client Resolution" #~ msgstr "Naudoti kliento skiriamÄ…jÄ… gebÄ…" #~ msgid "Off" #~ msgstr "IÅ¡jungtas" #~ msgid "System Root Folder" #~ msgstr "Sistemos Å¡akninis aplankas" #~ msgid "My Home Folder" #~ msgstr "Mano namų aplankas" #~ msgid "Character Set" #~ msgstr "Ženklų rinkinys" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Tas pats serveris, prievadas %i" #~ msgid "Enable SSH Tunnel" #~ msgstr "Ä®jungti SSH tunelį" #~ msgid "User Name" #~ msgstr "Naudotojo vardas" #~ msgid "Identity File" #~ msgstr "Tapatumo failas" #~ msgid "Public Key (Automatic)" #~ msgstr "VieÅ¡asis raktas (automatiÅ¡kai)" #~ msgid "Startup Program" #~ msgstr "Paleidimo programa" #~ msgid "Startup Path" #~ msgstr "Paleidimo kelias" #~ msgid "Share Local Printers" #~ msgstr "Dalintis vietiniais spausdintuvais" #~ msgid "Client Name" #~ msgstr "Kliento vardas" #~ msgid "Keyboard Mapping" #~ msgstr "KlaviatÅ«ros atvaizdavimas" #~ msgid "Sound" #~ msgstr "Garsas" #~ msgid "Share Folder" #~ msgstr "Dalintis aplanku" #~ msgid "Color Depth" #~ msgstr "Spalvų skaiÄius" #~ msgid "Domain" #~ msgstr "Sritis" #~ msgid "View Only" #~ msgstr "Tik peržiÅ«ra" #~ msgid "Horizontal Scale" #~ msgstr "Horizontalus mastelis" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "Prisijungti prie konsolÄ—s (Windows 2003 ar naujesnÄ—)" #~ msgid "Enable bitmap caching" #~ msgstr "Ä®jungti grafikos podÄ—lį" #~ msgid "Enable compression" #~ msgstr "Ä®jungti glaudinimÄ…" #~ msgid "Advanced Arguments" #~ msgstr "IÅ¡plÄ—stiniai argumentai" #~ msgid "Listen on Port" #~ msgstr "Klausytis prievado" #~ msgid "Quality" #~ msgstr "KokybÄ—" #~ msgid "Show remote cursor" #~ msgstr "Rodyti nutolusį žymeklį" #~ msgid "Vertical Scale" #~ msgstr "Vertikalus mastelis" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "PraÅ¡ome įdiegti Xephyr XDMCP funkcijai įjungti" #~ msgid "Disconnect After One Session" #~ msgstr "Atsijungti po vienos sesijos" #~ msgid "Use Local Cursor" #~ msgstr "Naudoti vietinį žymeklį" #~ msgid "Scrolled Fullscreen" #~ msgstr "Slankiojamas visas ekranas" #~ msgid "Auto-Fit Window" #~ msgstr "AutomatiÅ¡kai pritaikyti langÄ…" #~ msgid "Open Chat..." #~ msgstr "Atverti pokalbį..." #~ msgid "Scrolled Window" #~ msgstr "Slankiojamas langas" #~ msgid "Minimize Window" #~ msgstr "Sutraukti langÄ…" #~ msgid "VNC Password" #~ msgstr "VNC slaptažodis" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "Nepavyko konvertuoti „%s“ į kompiuterio adresÄ…" #~ msgid "Unable to connect to VNC server" #~ msgstr "Nepavyko prisijungti prie VNC serverio" #~ msgid "Your connection has been rejected." #~ msgstr "JÅ«sų prisijungimas buvo atmestas." #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "VNC ryÅ¡ys nepavyko: %s" #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "Nepavyko VNC tapatumo nustatymas. Jungiamasi iÅ¡ naujo..." #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "PraÅ¡ome įdiegti xqproxy SSH serveryje XDMCP paleidimui per SSH" #~ msgid "Client Key" #~ msgstr "Kliento raktas" #~ msgid "Save Password" #~ msgstr "IÅ¡saugoti slaptažodį" #~ msgid "CA Certificate" #~ msgstr "CA liudijimas" #~ msgid "Client Certificate" #~ msgstr "Kliento liudijimas" #~ msgid "Edit Settings" #~ msgstr "Keisti nustatymus" #~ msgid "Do Not Use Tabs" #~ msgstr "Nenaudoti kortelių" #~ msgid "Invisible Floating Toolbar" #~ msgstr "Nematoma slanki įrankių juosta" #~ msgid "Double-click Action" #~ msgstr "DvikarÄio spustelÄ—jimo veiksmas" #~ msgid "SSH Tunnel Local Port" #~ msgstr "SSH tunelio vietinis prievadas" #~ msgid "Scale Quality" #~ msgstr "Mastelio kokybÄ—" #~ msgid "SSH Password" #~ msgstr "SSH slaptažodis" #~ msgid "SSH Private Key Passphrase" #~ msgstr "SSH privaÄiojo rakto slaptafrazÄ—" #, c-format #~ msgid "File Transfer: %s" #~ msgstr "Failo siuntimas: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "Jungiamasi prie SFTP serverio „%s“..." #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "Saugus failo siuntimas: %s" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "" #~ "Å iuo metu vyksta failo siuntimas.\n" #~ "Ar tikrai norite baigti?" #~ msgid "Disable Server Input" #~ msgstr "IÅ¡jungti serverio įvedimÄ…" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - gaunamas prisijungimas" #~ msgid "Quick _Connect To" #~ msgstr "Greitai _prisijungti prie" #~ msgid "Open a quick connection" #~ msgstr "Atverti greitÄ… prisijungimÄ…" #~ msgid "Tab All Connections" #~ msgstr "KortelÄ—s visiems susijungimams" #~ msgid "Tab by Groups" #~ msgstr "KortelÄ—s pagal grupes" #~ msgid "Tab by Protocols" #~ msgstr "KortelÄ—s pagal protokolus" #~ msgid "Open Connection" #~ msgstr "Užmegzti ryšį" #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "Klausomasi prievado %i gaunamam VNC prisijungimui..." #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Rodyti greitÄ… prisijungimÄ… meniu virÅ¡uje" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "SlÄ—pti bendrÄ… skaiÄių grupių skleidiklyje" #~ msgid "Maximum Recent Items" #~ msgstr "Daugiausia paskiausių elementų" #~ msgid "Tab Interface" #~ msgstr "KortelÄ—s" #~ msgid "Fit Window Size" #~ msgstr "Pritaikyti lango dydį" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "Protokolas %s nepalaikomas." #~ msgid "Refresh" #~ msgstr "Atnaujinti" #~ msgid "Disable Clipboard Sync" #~ msgstr "IÅ¡jungti iÅ¡karpinÄ—s sinchronizavimÄ…" #~ msgid "Disable Encryption" #~ msgstr "IÅ¡jungti Å¡ifravimÄ…" #~ msgid "Show Remote Cursor" #~ msgstr "Rodyti nuotolinį žymeklį" #~ msgid "Use Window Size" #~ msgstr "Naudoti lango dydį" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Tunelis per loopback adresÄ…" #~ msgid "Always Show Tabs" #~ msgstr "Visada rodyti korteles" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "IÅ¡saugoti nustatymus, kai pradedamas prisijungimas" #, c-format #~ msgid "%s Password" #~ msgstr "%s slaptažodis" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "Per prievadÄ… %i laukiama įeinanÄio %s prisijungimo..." #~ msgid "Switch Tab Pages" #~ msgstr "Perjungti korteles" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Perjungti viso ekrano veiksenÄ…" #~ msgid "Show / Hide Toolbar" #~ msgstr "Rodyti, slÄ—pti įrankių juostÄ…" #~ msgid "Toggle Scaled Mode" #~ msgstr "Perjungti mastelio keitimo veiksenÄ…" #~ msgid "Grab Keyboard" #~ msgstr "Pasisavinti klaviatÅ«rÄ…" #~ msgid "Hide Connection Toolbar" #~ msgstr "SlÄ—pti ryÅ¡io įrankių juostÄ…" #~ msgid "Host Key" #~ msgstr "Pagrindinis klaviÅ¡as" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "Perjungti viso ekrano slankiojimo veiksenÄ…" #~ msgid "Toggle scrolled window mode" #~ msgstr "Perjungti lango slankiojimo veiksenÄ…" #~ msgid "Default View Mode" #~ msgstr "Numatytoji peržiÅ«ros veiksena" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "Prisiminti paskutinÄ™ peržiÅ«ros veiksenÄ… kiekvienam ryÅ¡iui" FreeRDP-Remmina-356c033/remmina/po/nl.po000066400000000000000000001037211171526373700176360ustar00rootroot00000000000000# Dutch translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-15 09:56+0000\n" "Last-Translator: Stefan73 \n" "Language-Team: Dutch \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-Launchpad-Export-Date: 2011-01-16 05:12+0000\n" "X-Generator: Launchpad (build 12177)\n" "Language: nl\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Verbinding maken met bureaubladen op afstand" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina Extern Bureaublad Client" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Totaal %i item." msgstr[1] "Totaal %i items." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Weet u zeker dat u '%s' wilt verwijderen?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Onmogelijk te importeren:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importeren" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Dit protocol ondersteunt exporteren niet." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Bewerken" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Weergave" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Extra" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Hulp" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Een nieuw 'remote desktop'-bestand aanmaken" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Voorkeuren-venster openen" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Plugins" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online Wiki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Foutopsporingsvenster" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Open de verbinding naar het geselecteerde 'remote-desktop'-bestand" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Maak een kopie van het geselecteerde extern bureaublad bestand" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Bewerk het geselecteerde 'remote desktop'-bestand" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Verwijder het geselecteerde 'remote desktop'-bestand" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exporteren" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Werkbalk" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Statusbalk" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Snel Zoeken" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Kleine werkbalk-knoppen" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Lijstweergave" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Boomweergave" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Naam" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Groep" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Ondersteunde formaten\n" "* server\n" "* server:poort\n" "* [server]:poort" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Ondersteunde formaten\n" "* :poort\n" "* server\n" "* server:poort\n" "* [server]:poort" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Kies een Remote Desktop Server" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identiteitsbestand" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Op het netwerk naar een %s server zoeken" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Wachtwoord" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Resolutie" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Gebruik venster grootte" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Gebruik client resolutie" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Aangepast" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Toetsenbord layout" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Horizontale schaal" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Verticale schaal" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "SSH-tunnel inschakelen" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel langs loopback address" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH-server" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Zelfde server op poort %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Tekenset" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Opstartprogramma" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Opstartlocatie" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH-verificatie" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Gebruikersnaam" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Publieke sleutel (automatisch)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Standaard" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Geavanceerd" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Standaardinstellingen opgeslagen." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Voorkeuren voor bureaublad op afstand" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Standaard" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profiel" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Snel verbinden" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "Gebruik '%s' als scheidingsteken voor de subgroep" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocol" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Bestand %s niet gevonden." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Er zijn %i actieve verbindingen in dit venster. Ben je zeker dat je wilt " "afsluiten?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Pas het venster aan om in de externe resolutie te passen" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Volledig Scherm Aan / Uit" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Wijzig tab pagina's" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Schaal modus" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Alle toetsenbord-gebeurtenissen afvangen" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Voorkeuren" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Gereedschap" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Venster minimaliseren" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Verbinding verbreken" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Bezig met verbinden naar '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Open beveiligde schil (SSH) in nieuw terminalvenster..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Open beveiligde bestandsoverdracht (SFTP)..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Bezig met verbinden naar SSH-server '%s'..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Bezig met verbinden naar '%s' via SSH-tunnel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Wachten op een inkomende SSH tunnel op poort %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Opdracht %s niet gevonden op SSH server." #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Opdracht %s mislukt op SSH server (status = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Opdracht uitvoeren mislukt: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s wachtwoord" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH-wachtwoord" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Wachtwoord voor geheime SSH-sleutel" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Luisteren op Poort %i naar een Inkomende %s Connectie..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Authenticatie mislukt. Opnieuw proberen verbinden..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "%s opslaan" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Bewaar paswoord" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA certificaat" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Client Certificaat" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Client Sleutel" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Ontwikkelaars:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Bijdragen van:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina is vrije software; u mag het herdistribueren en/of aanpassen onder " "de voorwaarden van de GNU General Public License, zoals gepubliceerd door de " "Free Software Foundation; ofwel versie 2 van de licentie, of (naar uw " "believen) een latere versie." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina wordt uitgegeven in de hoop dat het nuttig zal zijn, maar ZONDER " "ENIGE GARANTIE; zonder zelfs een impliciete garantie van VERKOOPBAARHEID of " "GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de GNU General Public License voor " "meer informatie." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "U zou een kopie van de GNU General Public License moeten hebben gekregen " "samen met dit programma. Indien dit niet het geval is, kunt u schrijven naar " "de Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, " "MA 02110-1301, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "De GTK+ Extern Bureaublad Client" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Jaap-Willem Dooge https://launchpad.net/~japydooge\n" " Stefan73 https://launchpad.net/~stefan73be\n" " Ulukai https://launchpad.net/~jonathan-denil\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Open verbinding" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Instellingen bewerken" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Dichtsbijzijnde" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Beeldvlakken" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilineair" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatisch" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Schuifbaar venster" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Schuifbaar volledig scherm" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Beeld over volledig scherm" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Tab per groep" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Tab per protocol" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Tab alle connecties" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Geen tabs" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Specifieer formaat 'breedtexhoogte\"." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Recente lijsten leeggemaakt." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina Voorkeuren" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Opties" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Onthoud de laatstgekozen weergavemodus voor elke verbinding" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Instellingen bewaren als de verbinding wordt opgeslagen" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Onzichtbare zwevende werkbalk" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Tabbladen altijd tonen" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Verbindingswerkbalk verbergen" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Dubbelklik-actie" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Standaard weergavemodus" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Tab gebruik" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Schaal kwaliteit" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Lokale poort voor SSH-tunnel" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Maximum aantal recente items" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Wissen" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Schermresoluties" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Applet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "Verberg het totale aantal in het groepsmenu" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Toetsenbord" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host toets" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Venster automatisch aanpassen" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Toetsenbord afvangen" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Toon / verberg werkbalk" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSH-verificatie met wachtwoord is mislukt: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSH-verificatie met publieke sleutel is mislukt: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "U heeft nog geen bestand met een SSH-sleutel gekozen." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSH automatische authenticatie met publieek sleutel mislukt: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Bezig het wachtwoord van %s voor SSH-server %s te authenticeren..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Bezig de identiteit van %s voor SSH-server %s te authenticeren..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Opstarten van SSH-sessie is mislukt: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Kon niet met de bestemming van de SSH-tunnel verbinden: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Kan %s niet uitvoeren op SSH server: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Kan de aanvraag om de poort door te sturen niet uitvoeren: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Geen antwoord van server." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Creëren van SFTP-sessie is mislukt: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Initiëren van SFTP-sessie is mislukt: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Voer gesprek met %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Verzenden" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Wissen" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Kies downloadlokatie" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Weet u zeker dat u de geselecteerde files op de server wilt wissen?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Kies een bestand om te uploaden" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Upload map" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Downloaden" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Uploaden" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Ga naar persoonlijke map" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Ga naar bovenliggende map" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Ververs huidige map" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Van server downloaden" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Naar server uploaden" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Wis bestanden op server" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Bestandsnaam" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Omvang" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Gebruiker" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Rechten" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Op afstand" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokaal" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Voortgang" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Aanmaken van map %s is mislukt." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Openen van bestand %s op de server is mislukt. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Aanmaken van bestand %s is mislukt." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Schrijven van bestand %s is mislukt." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Openen van map %s is mislukt. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Foutmelding bij het aanmaken van map %s op server. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Aanmaken van bestand %s op de server is mislukt. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Openen van bestand %s is mislukt." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Schrijven van bestand %s op de sever is mislukt. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Kon map %s niet openen. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Kon map niet lezen. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "De bestandsoverdracht is momenteel nog gaande.\n" "Weet u zeker dat u dit wilt stoppen?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Verwijderen van '%s' is mislukt. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Pas Venster Grootte Aan" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Invoer" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Bestand" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Hulpmiddel" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Voorkeur" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Soort" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Omschrijving" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Kies een nieuwe toets" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Duw op de nieuwe toets..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Plugin %s is niet geregistreerd." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Open hoofdvenster" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Automatisch Zoeken" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Remmina Applet" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Verbinding met extern bureaublad maken via het applet menu" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Gevonden" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nieuwe verbinding" #~ msgid "Open a quick connection" #~ msgstr "Open een snelverbinding" #~ msgid "Quick _Connect To" #~ msgstr "Snel_verbind naar" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Remote Desktop Protocol" #~ msgid "VNC - Virtual Network Computing" #~ msgstr "VNC - Virtual Network Computing" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - Inkomende verbinding" #~ msgid "Quit Remmina" #~ msgstr "Remmina afsluiten" #~ msgid "256 Colors" #~ msgstr "256 kleuren" #~ msgid "High Color (15 bit)" #~ msgstr "Hoge kleuren (15 bit)" #~ msgid "High Color (16 bit)" #~ msgstr "Hoge kleuren (16 bit)" #~ msgid "True Color (24 bit)" #~ msgstr "Ware kleuren (24 bit)" #~ msgid "Poor (Fastest)" #~ msgstr "Slecht (snelste)" #~ msgid "Medium" #~ msgstr "Gemiddeld" #~ msgid "Good" #~ msgstr "Goed" #~ msgid "Best (Slowest)" #~ msgstr "Beste (langzaamst)" #~ msgid "None" #~ msgstr "Geen" #~ msgid "My Home Folder" #~ msgstr "Mijn persoonlijke map" #~ msgid "System Root Folder" #~ msgstr "Hoofdmap bestandssysteem" #~ msgid "Enable SSH Tunnel" #~ msgstr "SSH-tunnel inschakelen" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Zelfde server op poort %i" #~ msgid "Character Set" #~ msgstr "Tekenset" #~ msgid "User Name" #~ msgstr "Gebruikersnaam" #~ msgid "Identity File" #~ msgstr "Identiteitsbestand" #~ msgid "Domain" #~ msgstr "Domein" #~ msgid "Color Depth" #~ msgstr "Kleurdiepte" #~ msgid "Share Folder" #~ msgstr "Map delen" #~ msgid "Enable bitmap caching" #~ msgstr "Activeer 'bitmap caching'" #~ msgid "Enable compression" #~ msgstr "Compressie inschakelen" #~ msgid "Advanced Arguments" #~ msgstr "Geavanceerde parameters" #~ msgid "Listen on Port" #~ msgstr "Luister naar poort" #~ msgid "Quality" #~ msgstr "Kwaliteit" #~ msgid "Show remote cursor" #~ msgstr "Toon muisaanwijzer op afstand" #~ msgid "View Only" #~ msgstr "Alleen kijken" #~ msgid "Disable Server Input" #~ msgstr "Server-invoer uitschakelen" #~ msgid "Horizontal Scale" #~ msgstr "Horizontale schaal" #~ msgid "Vertical Scale" #~ msgstr "Verticale schaal" #~ msgid "Open Chat..." #~ msgstr "Open gesprek..." #~ msgid "Minimize Window" #~ msgstr "Venster minimaliseren" #~ msgid "VNC Password" #~ msgstr "VNC-wachtwoord" #~ msgid "Unable to connect to VNC server" #~ msgstr "Kan geen verbinding maken met VNC-server" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "Kon '%s' niet naar een netwerk-adres vertalen" #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "VNC-verbinding mislukt: %s" #~ msgid "Your connection has been rejected." #~ msgstr "De verbinding is geweigerd" #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "" #~ "Bezig met luisteren naar poort %i voor een inkomende VNC-verbinding..." #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "VNC-verificatie mislukt. Bezig met nieuwe poging om te verbinden..." #~ msgid "Open Connection" #~ msgstr "Open Verbinding" #~ msgid "Edit Settings" #~ msgstr "Instellingen bewerken" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "Onthoud de laatstgekozen weergavemodus voor elke verbinding" #~ msgid "Invisible Floating Toolbar" #~ msgstr "Onzichtbare zwevende werkbalk" #~ msgid "Double-click Action" #~ msgstr "Dubbelklik-actie" #~ msgid "Default View Mode" #~ msgstr "Standaard weergavemodus" #~ msgid "SSH Tunnel Local Port" #~ msgstr "Lokale poort voor SSH-tunnel" #~ msgid "Maximum Recent Items" #~ msgstr "Maximum aantal recente items" #~ msgid "SSH Password" #~ msgstr "SSH-wachtwoord" #~ msgid "SSH Private Key Passphrase" #~ msgstr "Wachtwoord voor geheime SSH-sleutel" #, c-format #~ msgid "File Transfer: %s" #~ msgstr "Bestandsoverdracht: %s" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "" #~ "Bestandsoverdracht is momenteel nog gaande.\n" #~ "Weet u zeker dat u deze wilt afsluiten?" #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "Beveiligde bestandsoverdracht: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "Bezig met verbinden naar SFTP-server '%s'..." #~ msgid "_File" #~ msgstr "_Bestand" #~ msgid "Settings" #~ msgstr "Instellingen" #~ msgid "Grab Keyboard" #~ msgstr "Toetsenbord afvangen" #~ msgid "Minimize" #~ msgstr "Minimaliseren" #~ msgid "Press Enter key to add new group" #~ msgstr "Druk op de enter-toets om een nieuwe groep toe te voegen" #~ msgid "Press Enter key to add new resolution" #~ msgstr "Druk op de enter-toets om een nieuwe schermresolutie toe te voegen" #~ msgid "Quit File Transfer" #~ msgstr "Bestandsoverdracht afsluiten" #~ msgid "Grayscale" #~ msgstr "Grijstinten" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - X Externe Sessie" #~ msgid "Use Client Resolution" #~ msgstr "Gebruik Client Resolutie" #~ msgid "Remote Desktop Client" #~ msgstr "Client voor verbinding met extern bureaublad" #~ msgid "_Action" #~ msgstr "_Actie" #~ msgid "Off" #~ msgstr "Uit" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "Verbind met console (Windows 2003 of nieuwer)" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "Installeer Xephyr om de XDMCP mogelijkheid in te schakelen" #~ msgid "Startup Path" #~ msgstr "Opstartlocatie" #~ msgid "Use Local Cursor" #~ msgstr "Gebruik Lokale Aanwijzer" #~ msgid "Startup Program" #~ msgstr "Opstartprogramma" #~ msgid "Share Local Printers" #~ msgstr "Deel Lokale Printers" #~ msgid "Client Name" #~ msgstr "Client Naam" #~ msgid "Keyboard Mapping" #~ msgstr "Toetsenbord Layout" #~ msgid "Sound" #~ msgstr "Geluid" #~ msgid "Public Key (Automatic)" #~ msgstr "Publieke Sleutel (Automatisch)" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "Schuifbaar volledig scherm modus" #~ msgid "Viewport Fullscreen" #~ msgstr "Beeld Over Volledig Scherm" #~ msgid "Toggle scrolled window mode" #~ msgstr "Schuifbaar venster modus" #~ msgid "Scrolled Fullscreen" #~ msgstr "Schuifbaar Volledig Scherm" #~ msgid "Disconnect After One Session" #~ msgstr "Verbreek Connectie na één Sessie" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "Beeld over volledig scherm modus" #~ msgid "Auto-Fit Window" #~ msgstr "Venster Automatisch Aanpassen" #~ msgid "Scrolled Window" #~ msgstr "Schuifbaar Venster" #~ msgid "Tab by Groups" #~ msgstr "Tab per Groep" #~ msgid "Client Certificate" #~ msgstr "Client Certificaat" #~ msgid "Client Key" #~ msgstr "Client Sleutel" #~ msgid "Save Password" #~ msgstr "Bewaar paswoord" #~ msgid "CA Certificate" #~ msgstr "CA certificaat" #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "" #~ "Installeer xqproxy op de SSH server om XDMCP over SSH mogelijk te maken" #~ msgid "Do Not Use Tabs" #~ msgstr "Geen Tabs" #~ msgid "Tab by Protocols" #~ msgstr "Tab per Protocol" #~ msgid "Tab All Connections" #~ msgstr "Tab Alle Connecties" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Toon Snel Verbinden bovenaan het Menu" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "Verberg het Totale Aantal per Groep" #~ msgid "Scale Quality" #~ msgstr "Schaal Kwaliteit" #~ msgid "Tab Interface" #~ msgstr "Tab Gebruik" #~ msgid "Fit Window Size" #~ msgstr "Pas Venster Grootte Aan" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "Protocol %s wordt niet ondersteund." #~ msgid "Refresh" #~ msgstr "Vernieuwen" #~ msgid "Disable Clipboard Sync" #~ msgstr "Klembord Synchronisatie Uitschakelen" #~ msgid "Proxy Destination" #~ msgstr "Proxy Bestemming" #~ msgid "Disable Encryption" #~ msgstr "Encryptie Uitschakelen" #~ msgid "Show Remote Cursor" #~ msgstr "Toon Cursor op Afstand" #~ msgid "Use Window Size" #~ msgstr "Gebruik Venster Grootte" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Tunnel langs Loopback Address" #~ msgid "Always Show Tabs" #~ msgstr "Tabbladen altijd tonen" #~ msgid "Hide Connection Toolbar" #~ msgstr "Verbindingswerkbalk Verbergen" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "Instellingen Bewaren als de Verbinding Wordt Opgeslagen" #, c-format #~ msgid "%s Password" #~ msgstr "%s Wachtwoord" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "Luisteren op Poort %i naar een Inkomende %s Connectie..." #~ msgid "Switch Tab Pages" #~ msgstr "Tabbladen Wisselen" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Volledig Scherm Aan / Uit" #~ msgid "Show / Hide Toolbar" #~ msgstr "Toon / Verberg Werkbalk" #~ msgid "Toggle Scaled Mode" #~ msgstr "Schaalmode Aan / Uit" #~ msgid "Host Key" #~ msgstr "Host Toets" FreeRDP-Remmina-356c033/remmina/po/pl.po000066400000000000000000000651021171526373700176400ustar00rootroot00000000000000# Polish translation of remmina package # Copyright (C) 2008 The remmina'S COPYRIGHT HOLDER # This file is distributed under the same license as the remmina package. # Jakub Tomczak , 2009 # Piotr Sokół , 2010, 2011. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-04 19:01+0000\n" "Last-Translator: Piotr Sokół \n" "Language-Team: Polish <>\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%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2011-01-05 04:56+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: pl\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "ÅÄ…czy ze zdalnymi pulpitami" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Klient zdalnego pulpitu Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "ÅÄ…cznie %i element." msgstr[1] "ÅÄ…cznie %i elementy." msgstr[2] "ÅÄ…cznie %i elementów." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Usunąć „%sâ€?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Nie można zaimportować:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importuj" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Ten protokół nie obsÅ‚uguje eksportowania." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_Połączenie" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Edycja" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Widok" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_NarzÄ™dzia" #: ../src/remminamain.c:923 msgid "_Help" msgstr "Pomo_c" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Tworzy nowy plik zdalnego pulpitu" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Otwiera okno preferencji" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Wtyczki" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Strona główna" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Spis treÅ›ci" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Diagnozowanie błędów" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "NawiÄ…zuje połączenie dla wybranego pliku zdalnego pulpitu" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Tworzy kopiÄ™ wybranego pliku zdalnego pulpitu" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Modyfikuje wybrany plik zdalnego pulpitu" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Usuwa wybrany plik zdalnego pulpitu" #: ../src/remminamain.c:980 msgid "Export" msgstr "Eksportuj" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Pasek narzÄ™dziowy" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Pasek stanu" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Szybkie wyszukiwanie" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "MaÅ‚e przyciski paska narzÄ™dziowego" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Lista" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Drzewo" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nazwa" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grupa" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Serwer" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "ObsÅ‚ugiwane formaty:\n" "* serwer\n" "* serwer:port\n" "* [serwer]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "ObsÅ‚ugiwane formaty:\n" "* serwer\n" "* serwer:port\n" "* [serwer]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Wybór serwera zdalnego pulpitu" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Plik tożsamoÅ›ci" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Przeszukaj sieć w poszukiwaniu serwera %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "HasÅ‚o" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Rozdzielczość" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Użycie rozmiaru okna" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Użycie ustawieÅ„ klienta" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "WÅ‚asne" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Mapowanie klawiatury" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Skala pozioma ekranu" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Skala pionowa ekranu" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Tunelowanie SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunelowanie poprzez adres zwrotny" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Serwer" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Użycie portu %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Kodowanie znaków" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Program startowy" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Åšcieżka startowa" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Uwierzytelnianie" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Nazwa użytkownika" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Klucz publiczny (automatycznie)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Ogólne" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Zaawansowane" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Zapisano jako ustawienia domyÅ›lne." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Preferencje zdalnego pulpitu" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Ustaw jako domyÅ›lne" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Szybkie połączenie" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokół" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Nie odnaleziono pliku %s." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "W bieżącym oknie pozostaÅ‚o %i nawiÄ…zanych połączeÅ„. Przerwać je?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Dopasowuje rozmiar okna do rozdzielczoÅ›ci zdalnego pulpitu" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Przełączenie trybu peÅ‚nego ekranu" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "PrzejÅ›cie pomiÄ™dzy kartami pulpitów" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Przełączenie skalowania ekranu serwera" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Przechwytywanie wszystkich zdarzeÅ„ klawiatury" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Rozwija menu preferencji" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Rozwija menu narzÄ™dzi" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Zminimalizowanie okna" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Przerwanie połączenia" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "NawiÄ…zywanie połączenia z „%sâ€..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Wtyczka protokoÅ‚u %s nie jest zainstalowana." #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Otwórz bezpiecznÄ… powÅ‚okÄ™ w nowym terminalu..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Otwórz bezpieczne przesyÅ‚anie plików..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "NawiÄ…zywanie połączenia SSH z „%sâ€..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "NawiÄ…zywanie połączenia z „%s†poprzez tunel SSH..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Oczekiwanie na przychodzÄ…ce połączenie SSH na porcie %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Nie odnaleziono polecenia %s na serwerze SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Nie udaÅ‚o siÄ™ wykonać polecenia %s na serwerze SSH (status = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Nie udaÅ‚o siÄ™ wykonać polecenia: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "HasÅ‚o %s" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "HasÅ‚o SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "HasÅ‚o klucza prywatnego SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "NasÅ‚uchiwanie portu %i oczekujÄ…c na połączenie przychodzÄ…ce %s..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Nie udaÅ‚o siÄ™ uwierzytelnić. Ponawianie nawiÄ…zania połączenia..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Zapisanie %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Zapisz hasÅ‚o" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certyfikat CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certyfikat klienta" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Klucz klienta" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Opiekunowie:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Współautorzy:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Niniejszy program jest wolnym oprogramowaniem; można go rozprowadzać dalej " "i/lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU, wydanej " "przez FundacjÄ™ Wolnego Oprogramowania - wedÅ‚ug wersji 2-giej tej Licencji " "lub którejÅ› z późniejszych wersji." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Niniejszy program rozpowszechniany jest z nadziejÄ…, iż bÄ™dzie on użyteczny - " "jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyÅ›lnej gwarancji PRZYDATNOÅšCI " "HANDLOWEJ albo PRZYDATNOÅšCI DO OKREÅšLONYCH ZASTOSOWAŃ. W celu uzyskania " "bliższych informacji, proszÄ™ zapoznać siÄ™ z treÅ›ciÄ… Powszechnej Licencja " "Publicznej GNU." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Z pewnoÅ›ciÄ… wraz z niniejszym programem dostarczono też egzemplarz " "Powszechnej Licencji Publicznej GNU (GNU General Public License); jeÅ›li nie -" " proszÄ™ w tej sprawie napisać do Free Software Foundation, Inc., 675 Mass " "Ave, Cambridge, MA 02139, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Klient GTK+ zdalnego pulpitu" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Jakub Tomczak , 2009\n" "\n" "Launchpad Contributions:\n" " Piotr Sokół https://launchpad.net/~psokol\n" " Stefan Lijewski https://launchpad.net/~lijewski-stefan\n" " Vic https://launchpad.net/~llyzs\n" " XeonBloomfield https://launchpad.net/~xeonbloomfield\n" " bogus https://launchpad.net/~tomczak-jakub" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "NawiÄ…zanie połączenia" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Edycja preferencji" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Najbliższy" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Części" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Dwuliniowy" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatycznie" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Przewijane okno" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Przewijany peÅ‚ny ekran" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "PeÅ‚ny ekran" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Rozmieszczanie pomiÄ™dzy oknami wedÅ‚ug grupy" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Rozmieszczanie pomiÄ™dzy oknami wedÅ‚ug protokoÅ‚u" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Używanie pojedynczego okna" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Używanie osobnych okien" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "ProszÄ™ wprowadzić rozdzielczość w formacie „szerokośćxwysokośćâ€." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Wyczyszczono listÄ™ ostatnio używanych elementów." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Preferencje" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Opcje" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "PamiÄ™tanie ostatniego trybu wyÅ›wietlania dla każdego połączenia" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Zapisywanie zmian podczas nawiÄ…zywania połączenia" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Ukrywanie paska narzÄ™dziowego peÅ‚nego ekranu" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Zawsze widoczny pasek kart" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Ukrycie paska narzÄ™dziowego połączeÅ„" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Czynność dwukrotnego klikniÄ™cia" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "DomyÅ›lny tryb widoku" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Karty" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Algorytm skalowania obrazu" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Lokalny port tunelu SSH" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Ilość ostatnio używanych elementów" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Wyczyść" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "RozdzielczoÅ›ci" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Aplet" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "WyÅ›wietlanie polecenia nowego połączenia na poczÄ…tku menu" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "Urywanie łącznej iloÅ›ci połączeÅ„ w menu grup" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "Wyłączenie ikony obszaru powiadamiania" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "Minimalizowanie okien do ikony obszaru powiadamiania" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Klawiatura" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Przełączenie do komputera lokalnego" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Dopasuj okno automatycznie" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Przechwycenie klawiatury" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Przełączenie widocznoÅ›ci paska narzÄ™dziowego" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "Terminal" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "Czcionka" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "Użycie domyÅ›lnej czcionki systemowej" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "Ilość buforowanych wierszy" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Nie udaÅ‚o siÄ™ uwierzytelnić hasÅ‚a SSH: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Nie udaÅ‚o siÄ™ uwierzytelnić przy pomocy klucza publicznego SSH: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Nie okreÅ›lono klucza SSH." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" "Nie udaÅ‚o siÄ™ uwierzytelnić automatycznie przy pomocy klucza publicznego " "SSH: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Uwierzytelnianie hasÅ‚a użytkownika „%s†do serwera SSH „%sâ€..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Uwierzytelnianie nazwy użytkownika „%s†do serwera SSH „%sâ€..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Nie udaÅ‚o siÄ™ rozpocząć sesji SSH: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Nie udaÅ‚o siÄ™ połączyć z poÅ‚ożeniem docelowym tunelu SSH: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Nie udaÅ‚o siÄ™ wykonać %s na serwerze SSH: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Nie udaÅ‚o siÄ™ zażądać przekierowania portów: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Brak odpowiedzi serwera." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Nie udaÅ‚o siÄ™ rozpocząć sesji sftp: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Nie udaÅ‚o siÄ™ zainicjować sesji sftp: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Bezpieczna powÅ‚oka" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Porozmawiaj z %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_WyÅ›lij" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Wyczyść" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Wybór poÅ‚ożenia" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Usunąć wybrane pliki z serwera?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Wybór pliku" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Katalog docelowy" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Pobierz" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "WyÅ›lij" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Przechodzi do katalogu użytkownika" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Przechodzi do katalogu nadrzÄ™dnego" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "OdÅ›wieża widok bieżącego poÅ‚ożenia" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Pobiera pliki z serwera" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "WysyÅ‚a pliki na serwer" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Usuwa pliki z serwera" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Nazwa pliku" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Rozmiar" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "WÅ‚aÅ›ciciel" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Uprawnienia" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Zdalny" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokalny" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "PostÄ™p" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "WystÄ…piÅ‚ błąd podczas tworzenia katalogu %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "WystÄ…piÅ‚ błąd podczas otwierania pliku %s na serwerze. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "WystÄ…piÅ‚ błąd podczas tworzenia pliku %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "WystÄ…piÅ‚ błąd podczas zapisywania pliku %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "WystÄ…piÅ‚ błąd podczas otwierania katalogu %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "WystÄ…piÅ‚ błąd podczas tworzenia katalogu %s na serwerze %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "WystÄ…piÅ‚ błąd podczas tworzenia pliku %s na serwerze. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "WystÄ…piÅ‚ błąd podczas otwierania pliku %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "WystÄ…piÅ‚ błąd podczas zapisywania pliku %s na serwerze. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Nie udaÅ‚o sie otworzyć katalogu %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Nie udaÅ‚o siÄ™ odczytać katalogu. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Aktualnie przesyÅ‚ane sÄ… pliki.\n" "Przerwać?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Nie udaÅ‚o siÄ™ usunąć „%sâ€. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "WyÅ›wietlanie ukrytych plików" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Bezpieczne przesyÅ‚anie plików" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Automatycznie" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Wpis" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Plik" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "NarzÄ™dzia" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Preferencje" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Typ" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Opis" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "Wersja" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Wybór nowego skrótu" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "ProszÄ™ wcisnąć nowy klawisz..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Wtyczka %s nie jest zarejestrowana." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Pokaż okno" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Wykrywanie usÅ‚ug" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Aplet klienta zdalnego pulpitu Remmina" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Połącz poprzez menu apletu" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Wykryty" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nowe połączenie" FreeRDP-Remmina-356c033/remmina/po/pt_BR.po000066400000000000000000000624661171526373700202450ustar00rootroot00000000000000# Brazilian Portuguese translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:03+0000\n" "Last-Translator: Vic \n" "Language-Team: Brazilian Portuguese \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-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: pt_BR\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Conecte-se a áreas de trabalho remotas" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Cliente de área de trabalho remota Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Total de %i item." msgstr[1] "Total de %i itens." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Tem certeza que deseja apagar '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Impossível importar:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importar" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Não é possível exportar com esse protocolo" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Editar" #: ../src/remminamain.c:921 msgid "_View" msgstr "E_xibir" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Ferramentas" #: ../src/remminamain.c:923 msgid "_Help" msgstr "A_juda" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Criar uma nova conexão de área de trabalho remota" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Abrir janela de configuração" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Plugins" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Wiki Online" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Janela de depuração" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Abrir conexão da área de trabalho remota selecionada" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Criar uma cópia da área de trabalho remota selecionada" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Editar área de trabalho remota selecionada" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Apagar área de trabalho remota selecionada" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exportar" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barra de ferramentas" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barra de status" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Busca Rápida" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Botões pequenos na barra de ferramentas" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Visão em lista" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Visão em árvore" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nome" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grupo" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Servidor" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formatos suportados\n" "*servidor\n" "*servidor:porta\n" "*[servidor]:porta" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Formatos suportados\n" "* :porta\n" "* servidor\n" "* servidor:porta\n" "* [servidor]:porta" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Escolha uma área de trabalho remota" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Arquivo de identidade" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Procurar um servidor %s na rede" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Senha" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Resolução" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Tamanho da janela" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Resolução do cliente" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personalizar" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Mapa do teclado" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Escala horizontal" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Escala vertical" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Habilitar túnel SSH" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Túnel via endereço local" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Servidor SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Mesmo servidor na porta %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Codificação" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Programa de inicialização" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Caminho de inicialização" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Autenticação SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Nome de usuário" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Chave pública (automática)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Básico" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avançado" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Salvar configurações padrões" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Configurações da Ãrea de Trabalho Remota" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Definir como padrão" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Perfil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Conectar rapidamente" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocolo" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Arquivo %s não encontrado." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Existem %i conexões ativas na janela atual. Tem certeza que deseja fechá-la?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Redimensionar a janela para adaptar-se à resolução remota" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Alternar para modo tela cheia" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Mudar guia de páginas" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Alternar para modo dimensionado" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Capturar todos eventos do teclado" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Preferências" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Ferramentas" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimizar janela" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Desconectar" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Conectando a '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Abrir uma shell segura em um novo terminal..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Abrir Transferência de Arquivo Segura..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Conectando ao servidor SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Conectando a %s através de um túnel SSH" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Aguardando túnel SSH na porta %i" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Comando %s não encontrado no servidor SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Comando %s falhou no servidor SSH (estado = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Falha ao executar o comando: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s Senha" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Senha SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Frase secreta da chave privada SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "Escutando na porta %i por uma conexão %s de entrada..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Falha na Autenticação. Tente reconectar novamente..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Salvar %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Salvar senha" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Certificado CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Certificado do cliente" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Chave do cliente" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Mantenedores:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Colaboradores:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Este programa é software livre; você pode redistribuí-lo e/ou modificá-lo " "sob os termos da Licença Pública Geral GNU, conforme publicada pela Free " "Software Foundation; tanto a versão 2 da Licença como (a seu critério) " "qualquer versão mais nova." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER " "GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO " "A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU " "para obter mais detalhes." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este " "programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Cliente de área de trabalho remota GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Cleyton Fábio - pixies https://launchpad.net/~pixies.pelivre\n" " Deivis L. Kehl https://launchpad.net/~dlkehl\n" " Vic https://launchpad.net/~llyzs\n" " cristianfere https://launchpad.net/~cristianfere" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Abrir conexão" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Editar configurações" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Mais próxima" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Peças" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automático" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Janela com rolagem" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Tela cheia com rolagem" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Tela cheia" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Abas por grupos" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Abas por protocolos" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Abas para todas conexões" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Não usar abas" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Por favor, digite no formato 'largura x altura'" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Lista de recentes apagada." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Preferências do Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Opções" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Lembrar o último modo de visão para cada conexão" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Salvando configurações enquanto inicia a Conexão" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Barra de ferramentas flutuante invisível" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Mostre sempre as abas" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Ocultar barra de conexão" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Ação do clique duplo" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Modo de visão padrão" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Interface de abas" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Qualidade de escala" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Porta local de túnel SSH" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Máximo de itens recentes" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Apagar" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Resoluções" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Miniaplicativo" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Teclado" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Chave do Host" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Auto-redimensionar janela" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Capturar teclado" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Mostrar / esconder barra de ferramentas" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Autenticação de senha SSH falhou: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Autenticação de chave pública falhou: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Arquivo de chave SSH não foi configurado ainda." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Autenticação automática com chave pública SSH falhou: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Autentica senha de %s no servidor SSH %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Autenticando identidade %s no servidor SSH %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Falha ao iniciar sessão SSH: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Falha ao conectar no túnel SSH de destino: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Falha ao executar %s no servidor SSH: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Falha ao requerer encaminhamento de porta: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Nenhuma resposta do servidor." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Falha ao criar sessão sftp: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Falha ao iniciar sessão sftp: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "Shell Segura - SSH" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Bate-papo com %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Enviar" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Limpar" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Escolher local do download" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Tem certeza que deseja deletar os arquivos selecionados no servidor?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Escolha o arquivo para enviar" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Enviar a pasta" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Baixar" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Enviar" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Ir para pasta pessoal" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Ir para pasta acima" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Atualizar pasta atual" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Baixar do servidor" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Enviar para o servidor" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Deletar arquivos no servidor" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Nome do Arquivo" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Tamanho" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Usuário" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Permissão" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Remoto" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Local" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Progresso" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Erro ao criar diretório %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Erro ao abrir arquivo %s no servidor. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Erro ao criar arquivo %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Erro ao gravar arquivo %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Erro ao abrir diretório %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Erro ao criar pasta %s no servidor. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Erro ao criar arquivo %s no servidor. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Erro ao abrir arquivo %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Erro ao gravar arquivo %s no servidor. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Falha ao abrir diretório %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Falha ao ler diretório. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Transferência de arquivo atualmente em progresso.\n" "Tem certeza que deseja cancelar isso?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Falha ao deletar '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Transferência Segura de Arquivos" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Dimensionar tamanho da janela" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Entrada" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Arquivo" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Ferramenta" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Preferência" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Tipo" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Descrição" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Escolher nova chave" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Por favor insira uma nova chave..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Plugin %s não cadastrado" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Abrir janela principal" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Habilitar serviço de descoberta" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Conectar a áreas de trabalho remotas através do miniaplicativo" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Descoberto" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nova Conexão" FreeRDP-Remmina-356c033/remmina/po/pt_PT.po000066400000000000000000000521601171526373700202530ustar00rootroot00000000000000# Portuguese (Portugal) translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2009-11-28 22:21+0000\n" "Last-Translator: Filipe Gomes \n" "Language-Team: Portuguese (Portugal) \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-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Ligar a áreas de trabalho remotas" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Visualizador de Ãrea de Trabalho Remota" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Total de %i elemento." msgstr[1] "Total de %i elementos." #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Tem a certeza que quer apagar '%s'?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Editar" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Ver" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Ajuda" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Criar um novo ficheiro de área de trabalho remota" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Abrir o diálogo de preferências" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "" "Abrir a ligação para o ficheiro de área de trabalho remota seleccionado" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Criar uma cópia do ficheiro de área de trabalho remota seleccionado" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Editar o ficheiro de área de trabalho remota seleccionado" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Apagar o ficheiro de área de trabalho remota seleccionado" #: ../src/remminamain.c:980 msgid "Export" msgstr "" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Barra de Ferramentas" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Barra de Estado" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Butões da Barra de Ferramentas Pequenos" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Vista em Lista" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Vista em Ãrvore" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Nome" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grupo" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Servidor" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Escolha um Servidor de Ãrea de Trabalho Remota" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Procurar na rede um servidor de %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Senha" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Resolução" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Personalizado" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Servidor SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Autenticação SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Básico" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avançado" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Definições por omissão guardadas." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Preferências da Ãrea de Trabalho Remota" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Por Omissão" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Perfil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Ligação Rápida" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protocolo" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Ficheiro %s não encontrado" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Existem %i ligações activas na janela actual. Tem a certeza de que quer " "fechar?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Redimensionar a janela para caber na resolução remota" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Alternar modo escalado" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Capturar todos os eventos do teclado" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Preferências" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Ferramentas" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Desligar" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "A ligar a '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Abrir Shell Segura num Novo Terminal..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Abrir Transferência de Ficheiros Segura" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "A ligar ao servidor SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "A ligar a %s por túnel SSH..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Guardar %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CRL CA" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "O Cliente GTK+ de Ãrea de Trabalho Remota" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Filipe Gomes https://launchpad.net/~filipefgomes" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Mais Próximo" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Mosaicos" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automático" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Por favor insira no formato 'larguraxaltura'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Lista de recentes limpa." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Remoto" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Local" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Transferência de Ficheiros Segura" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nova Ligação" FreeRDP-Remmina-356c033/remmina/po/ru.po000066400000000000000000001234221171526373700176530ustar00rootroot00000000000000# Russian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-07 17:38+0000\n" "Last-Translator: jmb_kz \n" "Language-Team: Russian \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-Launchpad-Export-Date: 2011-01-08 05:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: ru\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Подключение к удалённым рабочим Ñтолам" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Клиент удалённого рабочего Ñтола Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Ð’Ñего %i подключение." msgstr[1] "Ð’Ñего %i подключениÑ." msgstr[2] "Ð’Ñего подключений: %i" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить '%s' ?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Ðе удалоÑÑŒ импортировать:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Импорт" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Этот протокол не поддерживает ÑкÑпорт" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_Соединение" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Правка" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Вид" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_ИнÑтрументы" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Справка" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Создать новое подключение к удалённому рабочему Ñтолу" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Открыть диалог параметров" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Плагины" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "ДомашнÑÑ Ñтраница" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Wiki онлайн" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Окно отладки" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Открыть выбранное удалённое подключение" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Создать копию выбранного Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº удалённому рабочему Ñтолу" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Редактировать ÑвойÑтва удалённого подключениÑ" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Удалить файл удалённого подключениÑ" #: ../src/remminamain.c:980 msgid "Export" msgstr "ЭкÑпорт" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Панель инÑтрументов" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Строка ÑоÑтоÑниÑ" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "БыÑтрый поиÑк" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Маленькие кнопки панели инÑтрументов" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Ð’ виде ÑпиÑка" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Ð’ виде дерева" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Ðазвание" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Группа" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Сервер" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Поддерживаемые форматы\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Поддерживаемые форматы\n" "* :порт\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Выберите Ñервер удалённого рабочего Ñтола" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Файл ключа" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "ПровеÑти обзор Ñети Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка Ñервера %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Пароль" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Разрешение" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "ИÑпользовать размер окна" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "ИÑпользовать клиентÑкое разрешение" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Вручную" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "РаÑкладка клавиатуры" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Горизонтальный маÑштаб" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Вертикальный маÑштаб" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Включить SSH туннель" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Туннель через loopback адреÑ" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "Сервер SSH" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Этот же Ñервер на порту %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Кодировка" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "ЗапуÑк программы" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Путь запуÑка" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Публичный ключ (автоматичеÑки)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "ОÑновные" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Дополнительные" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "ÐаÑтройки по умолчанию Ñохранены." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Параметры удалённого рабочего Ñтола" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "По умолчанию" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Профиль" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "БыÑтрое подключение" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "ИÑпользовать '%s' как разделитель подгрупп" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Протокол" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Файл %s не найден." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Ðайдено %i активное подключение.\n" "Ð’Ñ‹ дейÑтвительно хотите выйти?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "Режим полного Ñкрана" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "Режим полного Ñкрана Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "РаÑÑ‚Ñнуть окно в размер удалённого разрешениÑ" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Переключить на полный Ñкран" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Переключить вкладку" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Переключить в режим маÑштабированиÑ" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Захватывать вÑе Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ ÐºÐ»Ð°Ð²Ð¸Ñˆ" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Параметры" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "ИнÑтрументы" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Свернуть окно" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "ОтключитьÑÑ" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Подключение к '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "Плагин протокола %s не уÑтановлен." #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Открыть защищённую оболочку SSH в новом терминале..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Открыть защищённую передачу файлов (SFTP)..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Подключение к SSH Ñерверу %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Подключение к %s через SSH туннель..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "Ожидание входÑщего SSH Ñ‚ÑƒÐ½ÐµÐ»Ñ Ð½Ð° порту %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Команда %s не найдена на Ñервере SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Команда %s завершилаÑÑŒ ошибкой на Ñервере SSH (ÑÑ‚Ð°Ñ‚ÑƒÑ = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Ошибка при выполнении команды: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s пароль" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Пароль SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° закрытого ключа SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "ПроÑлушивание порта %i на входÑщее %s подключение..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð·Ð°Ð²ÐµÑ€ÑˆÐ¸Ð»Ð°ÑÑŒ ошибкой. ПытаюÑÑŒ подключитьÑÑ Ñнова..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Сохранить %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Сохранить пароль" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "Сертификат CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "КлиентÑкий Ñертификат" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "КлиентÑкий ключ" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Разработчики:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Сопровождающие:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina - Ñто беÑплатное программное обеÑпечение; вы можете раÑпроÑтранÑть " "его и/или модифицировать в ÑоответÑтвии Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸ÐµÐ¹ верÑии 2 (или, по вашему " "выбору, более поздней верÑии) GNU General Public License, опубликованной " "Free Software Foundation;" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Программа Remmina раÑпроÑтранÑетÑÑ Ð² верой в то, что она будет полезна, но " "без КÐКИХ-ЛИБО ГÐРÐÐТИЙ; в том чиÑле и без гарантий КОММЕРЧЕСКОЙ ЦЕÐÐОСТИ " "или ПРИГОДÐОСТИ ДЛЯ КÐКОЙ-ЛИБО КОÐКРЕТÐОЙ ЦЕЛИ. Более подробно - Ñмотрите " "лицензию GNU General Public License." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Ð’Ñ‹ дожны были получить копию лицензии GNU General Public License вмеÑте Ñ " "Ñтой программой, еÑли Ñтого не произошло, то напишите по адреÑу Free " "Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-" "1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Клиент удалённого Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº рабочему Ñтолу на GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Alexander Logvinov https://launchpad.net/~avl-logvinov\n" " DIR https://launchpad.net/~dirnet\n" " Sergey Sedov https://launchpad.net/~serg-sedov\n" " Vic https://launchpad.net/~llyzs\n" " jmb_kz https://launchpad.net/~jmb-kz" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Открыть подключение" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Изменить наÑтройки" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Ближайший" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Тайлы" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Билинейный" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Гипер" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "ÐвтоматичеÑки" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Прокручиваемое окно" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Ðа веÑÑŒ Ñкран Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Полный Ñкран" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "ОбъединÑть по группам" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "ОбъединÑть по протоколам" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "ОбъединÑть вÑе ÑоединениÑ" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Ðе иÑпользовать вкладки" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "ПожалуйÑта, введите в формате 'ширинаxвыÑота'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "СпиÑки иÑтории очищены." #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Параметры Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Параметры" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Помнить поÑледний режим проÑмотра Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ подключениÑ" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "Сохранить наÑтройки при запуÑке подключениÑ" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ инÑтрументов" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Ð’Ñегда показывать вкладки" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Cкрыть панель инÑтрументов подключениÑ" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "ДейÑтвиÑ, предпринимаемые по двойному щелчку" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Режим проÑмотра по умолчанию" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Режим вкладок" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "КачеÑтво увеличениÑ" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Локальный порт SSH-туннелÑ" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Ðедавние подключениÑ" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "ОчиÑтить" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Разрешение" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Ðпплет" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "Показывать \\\"Ðовое подключение\\\" Ñверху меню" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "Скрыть полное количеÑтво в меню групп" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "Отключить значок в ÑиÑтемном лотке" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "ÐвтоматичеÑки включать значок в ÑиÑтемном лотке" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "Сворачивать окна в ÑиÑтемный лоток" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Клавиатура" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host клавиша" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Ðвтоподгон размера окна" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Захват клавиатуры" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Показать / Ñкрыть панель" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "Терминал" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "Шрифт" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "ИÑпользовать ÑиÑтемный шрифт" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "Буфер" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ð¾ паролю SSH не удалаÑÑŒ: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ð¾ публичному ключу SSH не удалаÑÑŒ: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Ключевой файл SSH ещё не уÑтановлен." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ð¾ публичному ключу SSH не удалаÑÑŒ: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "Подключение Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ %s к SSH-Ñерверу %s..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Проверка подлинноÑти %s на SSH-Ñервере %s..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Ошибка при запуÑке ÑеанÑа SSH: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Ошибка при подключении к пункту Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² туннеле SSH: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Ðе удалоÑÑŒ выполнить %s на SSH Ñервере: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Ðе удалоÑть запроÑить переадреÑацию порта: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Сервер не отвечает." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Ðе удалоÑÑŒ Ñоздать sftp ÑеÑÑию: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Ðе удалоÑÑŒ инициализировать sftp ÑеÑÑию: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - безопаÑÐ½Ð°Ñ Ð¾Ð±Ð¾Ð»Ð¾Ñ‡ÐºÐ°" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Чат Ñ %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Отправить" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_ОчиÑтить" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Выбрать меÑто Ð´Ð»Ñ ÑкачиваниÑ" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Ð’Ñ‹ дейÑтвительно хотите удалить выбранные файлы Ñ Ñервера?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Выберите файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Загрузить папку" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Скачать" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Закачка" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Перейти в домашний каталог" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Вверх" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Обновить текущий каталог" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Скачать Ñ Ñервера" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Закачка на Ñервер" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Удалить файлы Ñ Ñервера" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Ðазвание файла" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Размер" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Пользователь" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Права доÑтупа" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Удалённый" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Локальный" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Выполнение" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Ошибка при Ñоздании каталога %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Ошибка при открытии файла %s Ñ Ñервера. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Ошибка при Ñоздании файла %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Ошибка при запиÑи файла %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Ошибка при открытии каталога %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Ошибка при Ñоздании папки %s на Ñервере. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Ошибка при Ñоздании файла %s на Ñервере. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Ошибка при открытии файла %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Ошибка при запиÑи файла %s на Ñервере. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Ðе удалоÑÑŒ открыть каталог %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Ошибка при чтении каталога. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "ОÑущеÑтвлÑетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файла.\n" "Ð’Ñ‹ дейÑтвительно хотите отменить её?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Ðе удалоÑÑŒ удалить '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "Показывать Ñкрытые файлы" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Ð·Ð°Ñ‰Ð¸Ñ‰Ñ‘Ð½Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файлов" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "РаÑÑ‚Ñнуть в размер окна" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "ЗапиÑÑŒ" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Файл" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "ИнÑтрумент" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "ÐаÑтройка" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Тип" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "ОпиÑание" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "ВерÑиÑ" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<ОтÑутÑтвует>" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Выберите новую клавишу" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "ПожалуйÑта нажмите новую клавишу..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Плагин %s не зарегеÑтрирован." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Открыть оÑновное окно программы" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Включить Ñлужбу обнаружениÑ" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Ðпплет" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Подключение к удалённым рабочим Ñтолам через меню апплета" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Обнаружен" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Ðовое подключение" #~ msgid "Open a quick connection" #~ msgstr "Открыть быÑтрое подключение" #~ msgid "Quick _Connect To" #~ msgstr "БыÑтрое подключение к" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Ñлужба терминалов Windows" #~ msgid "VNC - Virtual Network Computing" #~ msgstr "VNC - виртуальное Ñетевое вычиÑление" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - входÑщее подключение" #~ msgid "Quit Remmina" #~ msgstr "Выйти из программы" #~ msgid "Remote Desktop Client" #~ msgstr "Клиент удалённого Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº рабочему Ñтолу" #~ msgid "256 Colors" #~ msgstr "256 цветов" #~ msgid "High Color (15 bit)" #~ msgstr "High Color (15 бит)" #~ msgid "High Color (16 bit)" #~ msgstr "High Color (16 бит)" #~ msgid "True Color (24 bit)" #~ msgstr "True Color (24 бит)" #~ msgid "Poor (Fastest)" #~ msgstr "Плохое (Ñамое быÑтрое)" #~ msgid "Medium" #~ msgstr "Среднее" #~ msgid "Good" #~ msgstr "Хорошее" #~ msgid "Best (Slowest)" #~ msgstr "Лучшее (Ñамое медленное)" #~ msgid "None" #~ msgstr "Ðет" #~ msgid "My Home Folder" #~ msgstr "Мой домашний каталог" #~ msgid "System Root Folder" #~ msgstr "СиÑтемный каталог Root`a" #~ msgid "Use Client Resolution" #~ msgstr "ИÑпользовать клиентÑкое разрешение" #~ msgid "Enable SSH Tunnel" #~ msgstr "Включить SSH туннель" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "Этот же Ñервер на порту %i" #~ msgid "Character Set" #~ msgstr "Кодировка" #~ msgid "User Name" #~ msgstr "Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ" #~ msgid "Identity File" #~ msgstr "Файл ключа" #~ msgid "Domain" #~ msgstr "Домен" #~ msgid "Color Depth" #~ msgstr "Глубина цвета" #~ msgid "Share Folder" #~ msgstr "ÐžÐ±Ñ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ°" #~ msgid "Keyboard Mapping" #~ msgstr "РаÑкладка клавиатуры" #~ msgid "Client Name" #~ msgstr "Ð˜Ð¼Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°" #~ msgid "Startup Program" #~ msgstr "ЗапуÑк программы" #~ msgid "Startup Path" #~ msgstr "Путь запуÑка" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "Прикрепить к конÑоли (Windows 2003 или новее)" #~ msgid "Enable bitmap caching" #~ msgstr "Включить кÑширование графики" #~ msgid "Enable compression" #~ msgstr "Включить Ñжатие" #~ msgid "Advanced Arguments" #~ msgstr "Дополнительные аргументы" #~ msgid "Listen on Port" #~ msgstr "ПроÑлушивать порт" #~ msgid "Quality" #~ msgstr "КачеÑтво" #~ msgid "Show remote cursor" #~ msgstr "Показать удалённый курÑор" #~ msgid "View Only" #~ msgstr "Только проÑмотр" #~ msgid "Disable Server Input" #~ msgstr "Отключить ввод на Ñервере" #~ msgid "Horizontal Scale" #~ msgstr "Горизонтальный маÑштаб" #~ msgid "Vertical Scale" #~ msgstr "Вертикальный маÑштаб" #~ msgid "Open Chat..." #~ msgstr "Открыть чат..." #~ msgid "Auto-Fit Window" #~ msgstr "Ðвтоподгон размера окна" #~ msgid "Scrolled Window" #~ msgstr "Прокручиваемое окно" #~ msgid "Toggle scrolled window mode" #~ msgstr "Переключить в оконный режим Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹" #~ msgid "Scrolled Fullscreen" #~ msgstr "Ðа веÑÑŒ Ñкран Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "Переключить в полный Ñкран Ñ Ð¿Ñ€Ð¾ÐºÑ€ÑƒÑ‚ÐºÐ¾Ð¹" #~ msgid "Viewport Fullscreen" #~ msgstr "Полный Ñкран" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "Переключить на полный Ñкран" #~ msgid "Minimize Window" #~ msgstr "Свернуть окно" #~ msgid "VNC Password" #~ msgstr "Пароль VNC" #~ msgid "Unable to connect to VNC server" #~ msgstr "Ðевозможно подключитьÑÑ Ðº Ñерверу VNC" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "Ðевозможно преобразовать '%s' в Ð°Ð´Ñ€ÐµÑ Ñ…Ð¾Ñта" #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "Подключение через VNC не удалоÑÑŒ: %s" #~ msgid "Your connection has been rejected." #~ msgstr "Ваше подключение было отклонено." #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "ПроÑлушивание порта %i на входÑщие VNC подключениÑ..." #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "" #~ "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ VNC завершилаÑÑŒ ошибкой. ПытаюÑÑŒ подключитьÑÑ Ñнова..." #~ msgid "Open Connection" #~ msgstr "Открыть подключение" #~ msgid "Edit Settings" #~ msgstr "Изменить наÑтройки" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "Помнить поÑледний режим проÑмотра Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ подключениÑ" #~ msgid "Invisible Floating Toolbar" #~ msgstr "ÐÐµÐ²Ð¸Ð´Ð¸Ð¼Ð°Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ инÑтрументов" #~ msgid "Double-click Action" #~ msgstr "ДейÑтвиÑ, предпринимаемые по двойному щелчку" #~ msgid "Default View Mode" #~ msgstr "Режим проÑмотра по умолчанию" #~ msgid "Scale Quality" #~ msgstr "КачеÑтво увеличениÑ" #~ msgid "SSH Tunnel Local Port" #~ msgstr "Локальный порт SSH-туннелÑ" #~ msgid "Maximum Recent Items" #~ msgstr "Ðедавние подключениÑ" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "Показывать \"БыÑтрое подключение\" Ñверху меню" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "Скрыть полное количеÑтво в ÑпиÑке групп" #~ msgid "SSH Password" #~ msgstr "Пароль SSH" #~ msgid "SSH Private Key Passphrase" #~ msgstr "ÐšÐ»ÑŽÑ‡ÐµÐ²Ð°Ñ Ñ„Ñ€Ð°Ð·Ð° закрытого ключа SSH" #, c-format #~ msgid "File Transfer: %s" #~ msgstr "Передача файла: %s" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "" #~ "ОÑущеÑтвлÑетÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файла.\n" #~ "Ð’Ñ‹ дейÑтвительно хотите выйти?" #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "БезопаÑÐ½Ð°Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файла: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "Подключение к SFTP Ñерверу %s'..." #~ msgid "Fit Window Size" #~ msgstr "РаÑÑ‚Ñнуть в размер окна" #~ msgid "_File" #~ msgstr "_Файл" #~ msgid "Settings" #~ msgstr "ÐаÑтройки" #~ msgid "Scaled Mode" #~ msgstr "Режим маÑштабированиÑ" #~ msgid "Grab Keyboard" #~ msgstr "Захват клавиатуры" #~ msgid "Minimize" #~ msgstr "Свернуть" #~ msgid "Open Connections in Separated Processes" #~ msgstr "Подключать в раздельных процеÑÑах" #~ msgid "Press Enter key to add new group" #~ msgstr "Ðажмите Enter Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð¹ группы" #~ msgid "Press Enter key to add new resolution" #~ msgstr "Ðажмите Enter Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ разрешениÑ" #~ msgid "Quit File Transfer" #~ msgstr "Выйти из передачи файлов" #~ msgid "_Action" #~ msgstr "_ДейÑтвие" #~ msgid "Grayscale" #~ msgstr "Оттенки Ñерого" #~ msgid "Sound" #~ msgstr "Звук" #~ msgid "Off" #~ msgstr "Выключен" #~ msgid "Share Local Printers" #~ msgstr "Опубликовать локальные принтеры" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "ПожалуйÑта, уÑтановите Xephyr Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ XDMCP" #~ msgid "Disconnect After One Session" #~ msgstr "ОтключатьÑÑ Ð¿Ð¾Ñле одной ÑеÑÑии" #~ msgid "Use Local Cursor" #~ msgstr "ИÑпользовать локальный курÑор" #~ msgid "Save Password" #~ msgstr "Сохранить пароль" #~ msgid "CA Certificate" #~ msgstr "Сертификат CA" #~ msgid "Client Certificate" #~ msgstr "КлиентÑкий Ñертификат" #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "" #~ "ПожалуйÑта, уÑтановите xqproxy на Ñтороне SSH Ñервера Ð´Ð»Ñ Ð·Ð°Ð¿ÑƒÑка XDMCP " #~ "через SSH" #~ msgid "Do Not Use Tabs" #~ msgstr "Ðе иÑпользовать вкладки" #~ msgid "Tab by Protocols" #~ msgstr "ОбъединÑть по протоколам" #~ msgid "Tab All Connections" #~ msgstr "ОбъединÑть вÑе ÑоединениÑ" #~ msgid "Tab by Groups" #~ msgstr "ОбъединÑть по группам" #~ msgid "Public Key (Automatic)" #~ msgstr "Публичный ключ (автоматичеÑки)" #~ msgid "Client Key" #~ msgstr "КлиентÑкий ключ" #~ msgid "Tab Interface" #~ msgstr "Режим вкладок" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - удалённое подключение к X-Ñерверу" #~ msgid "Refresh" #~ msgstr "Обновить" #~ msgid "Disable Clipboard Sync" #~ msgstr "Отключить Ñинхронизацию буфера обмена" #~ msgid "Proxy Destination" #~ msgstr "ÐÐ´Ñ€ÐµÑ Ð¿Ñ€Ð¾ÐºÑи" #~ msgid "Disable Encryption" #~ msgstr "Отключить шифрование" #~ msgid "Show Remote Cursor" #~ msgstr "Показать удалённый курÑор" #~ msgid "Use Window Size" #~ msgstr "ИÑпользовать размер окна" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "Протокол %s не поддерживаетÑÑ" #~ msgid "Always Show Tabs" #~ msgstr "Ð’Ñегда показывать вкладки" #~ msgid "Hide Connection Toolbar" #~ msgstr "Cкрыть панель инÑтрументов подключениÑ" #~ msgid "Save Settings When Starting the Connection" #~ msgstr "Сохранить наÑтройки при запуÑке подключениÑ" #, c-format #~ msgid "%s Password" #~ msgstr "%s пароль" #~ msgid "Switch Tab Pages" #~ msgstr "Переключить вкладку" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Переключить на полный Ñкран" #~ msgid "Toggle Scaled Mode" #~ msgstr "Переключить в режим маÑштабированиÑ" #~ msgid "Host Key" #~ msgstr "Host клавиша" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "ПроÑлушивание порта %i на входÑщее %s подключение..." #~ msgid "Show / Hide Toolbar" #~ msgstr "Показать / Ñкрыть панель" #~ msgid "Tunnel via Loopback Address" #~ msgstr "Туннель через loopback адреÑ" FreeRDP-Remmina-356c033/remmina/po/sk.po000066400000000000000000000551761171526373700176540ustar00rootroot00000000000000# Slovak translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 09:02+0000\n" "Last-Translator: Vic \n" "Language-Team: Slovak \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) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: sk\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Pripojenie k vzdialeným plochám" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Klient pripojenia k vzdialenej ploche Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Celkovo %i položka" msgstr[1] "Celkovo %i položiek" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Želáte si vymazaÅ¥ '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Nebolo možné importovaÅ¥:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importovanie" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Tento protokol nepodporuje exportovanie." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Úpravy" #: ../src/remminamain.c:921 msgid "_View" msgstr "_ZobraziÅ¥" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Nástroje" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Nápoveda" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Nový súbor pripojenia vzdialenej plochy" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Otvorenie nastavení" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Zásuvné moduly" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Otvor pripojenie k zvolenému súboru vzdialeného pripojenia k ploche" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Vytvor kópiu súboru vzdialeného prístupu k ploche" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Uprav zvolený súbor pripojenia k vzdialenej ploche" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Zmaž zvolený súbor pripojenia k vzdialenej ploche" #: ../src/remminamain.c:980 msgid "Export" msgstr "Export" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Stavový riadok" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Rýchle hľadanie" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Zobrazenie zoznamu" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Zobrazenie stromu" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Meno" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Skupina" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Podporované formáty\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Podporované formáty\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Zvoľte server vzdialenej plochy" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identifikujte súbor" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Prehliadanie siete k nájdeniu %s servera" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Heslo" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Rozlíšenie" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "PoužiÅ¥ veľkosÅ¥ okna" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "PoužiÅ¥ rozlíšenie klienta" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Vlastné" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Rozloženie klávesnice" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Horizontálny rozmer" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Vertikálny rozmer" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH server" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Rovnaký server na porte %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Znaková sada" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "Program po spustení" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "Cesta k programu po spustení" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH autentifikácia" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Uživateľské meno" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Verejný kÄ¾ÃºÄ (automaticky)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Základné" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Rozšírené" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Východzie nastavenia boli uložené." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Prednastavenia vzdialenej plochy" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Východzie" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Rýchle pripojenie" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokol" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Súbor %s nenájdený." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "V aktuálnom okne je %i aktívnych pripojení. Chcete ich naozaj zavrieÅ¥?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Nástroje" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimalizovanie okna" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Odpojenie" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Pripájanie k '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "OtvoriÅ¥ zabezpeÄeného prenosu súboru (SFTP)..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Pripojenie k SSH serveru %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Pripojenie k %s cez SSH tunel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Príkaz %s nenájdený na SSH serveri" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Príkaz %s zlyhal na SSH serveri (stav = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Zlyhalo vykonávanie príkazu: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s heslo" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH heslo" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Autentifikácia zlyhala. Pokus o znovupripojenie..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "UložiÅ¥ %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "UložiÅ¥ heslo" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA certifikát" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Klientský certifikát" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Klientský kľúÄ" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "Klient vzdialenej plochy GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Roland Turcan https://launchpad.net/~info-rotursoft\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Otvorenie pripojenia" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Úpravy nastavení" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Najbližší" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Dlaždice" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Automatický" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Zadajte formát pre 'widthxheight'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Lokálny port SSH tunela" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "VymazaÅ¥" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Rozlíšenia" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Klávesnica" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Automaticky prispôsobiÅ¥ k oknu" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "Autentifikácia SSH hesla zlyhala: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "Autentifikácia verejného kľúÄa SSH zlyhala: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Súbor SSH kľúÄa eÅ¡te nebol nastavený." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Automatická autentifikácia SSH verejného kľúÄa zlyhala: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Žiadna odozva zo servera." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_OdoslaÅ¥" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_VymazaÅ¥" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Zmazanie súborov na serveri" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Názov súboru" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "VeľkosÅ¥" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Užívateľ" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Oprávnenie" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Vzdialené" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokálne" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "Priebeh" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Chyba pri vytváraní adresára %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Chyba pri otváraní súboru %s na serveri. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Chyba pri vytváraní súboru %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Chyba pri zápise do súboru %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Chyba otvárania adresára %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Chyba vytvárania adresára %s na severi. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Chyba vytvárania súboru %s na serveri. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Chyba otvárania súboru %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Chyba pri zápise súboru %s na serveri. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Zlyhalo otvorenia adresára %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Zlyhalo naÄítanie adresára. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Nebolo možné zmazaÅ¥ '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Súbor" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Nástroj" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Popis" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<Žiadny>" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Zvoľte nový súbor kľúÄa" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Otvor hlavné okno" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Zapnúť prehliadanie služby" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Pripojenie vzdialenej plochy cez appletové menu" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Nové pripojenie" FreeRDP-Remmina-356c033/remmina/po/sv.po000066400000000000000000000574761171526373700176740ustar00rootroot00000000000000# Swedish translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2011-01-07 21:45+0000\n" "Last-Translator: Mikael Mildén \n" "Language-Team: Swedish \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-Launchpad-Export-Date: 2011-01-08 05:12+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: sv\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Anslut till fjärrskrivbord" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina - Klient för fjärrskrivbord" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "" msgstr[1] "" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Vill du verkligen radera '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Kunde inte importera:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "Importera" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Detta protokoll stödjer inte export." #: ../src/remminamain.c:919 msgid "_Connection" msgstr "_Anslutning" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Redigera" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Visa" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "Verk_tyg" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Hjälp" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Skapa ny fil för fjärrskrivbord" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Öppna inställningar" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Tilläggsprogram" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "Webbplats" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Felsökningsfönster" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Öppna anslutning till det valda fjärrskrivbordet" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Skapa en kopia av den valda fjärrskrivbordsfilen" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Redigera den valda fjärrskrivbordsfilen" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Radera den valda fjärrskrivbordsfilen" #: ../src/remminamain.c:980 msgid "Export" msgstr "Exportera" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Verktygsfält" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Statusrad" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Snabbsök" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Listvy" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Trädvy" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Namn" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Välj en server för fjärrskrivbordet" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Bläddra i nätverket för att hitta en %s-server" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Lösenord" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Upplösning" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Använd fönsterstorlek" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "Använd klientens upplösning" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Anpassad" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Tangentbordslayout" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Användarnamn" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Grundläggande" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Avancerad" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Inställningar för fjärrskrivbord" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Standard" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Snabbanslutning" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Protokoll" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Kunde inte hitta fil: %s" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Fullskärmsläge av/pÃ¥" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Inställningar" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Verktyg" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Minimera fönster" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Koppla ner" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Ansluter till '%s'" #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Ansluter till SSH-server %s" #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Kunde inte utföra kommando: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s lösenord" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Lösenord för SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Spara %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Spara lösenord" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "Klientcertifikat" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "Klientnyckel" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "This is a dummy translation so that the credits are counted as translated.\n" "\n" "Launchpad Contributions:\n" " Mikael Mildén https://launchpad.net/~mikael-milden" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Redigera inställningar" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Använd inte tabbar" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Rensa" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Upplösningar" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Tangentbord" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Värdnyckel" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Visa/dölj verktygsfält" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Servern svarar inte." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Chatta med %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Skicka" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Rensa" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Välj plats för nedladdning" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "" "Är du säker pÃ¥ att du vill ta bort de markerade filerna frÃ¥n servern?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Välj fil för uppladdning" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Mapp för uppladdning" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "Ladda ner" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Ladda upp" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "GÃ¥ till hemkatalog" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Läs om katalog" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Ladda ner frÃ¥n server" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Ladda upp till server" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Ta bort filer frÃ¥n server" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Filnamn" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Storlek" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Användare" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Fjärr" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Lokal" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Kunde inte skapa katalog %s." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Kunde inte öppna fil %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Kunde inte skapa fil %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Kunde inte skriva till fil %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Kunde inte öppna katalog %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Kunde inte skapa katalog %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Kunde inte skapa fil %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "KUnde inte öppna fil %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Kunde inte skriva till fil %s pÃ¥ server. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Kunde inte öppna katalog %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Kunde inte läsa katalog. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Filöverföring pÃ¥gÃ¥r.\n" "Vill du verkligen avbryta?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Kunde inte ta bort '%s'. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Verktyg" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Typ" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Beskrivning" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Öppna huvudfönstret" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Anslut till fjärrskrivbord med panelmenyn" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Upptäckt" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Ny anslutning" #~ msgid "_Action" #~ msgstr "_Ã…tgärd" #~ msgid "Open a quick connection" #~ msgstr "Öppna en snabbanslutning" #~ msgid "Quick _Connect To" #~ msgstr "_Snabbanslut till" #~ msgid "Quit Remmina" #~ msgstr "Avsluta Remmina" #~ msgid "Remote Desktop Client" #~ msgstr "Klient för fjärrskrivbord" #~ msgid "256 Colors" #~ msgstr "256 färger" #~ msgid "High Color (15 bit)" #~ msgstr "\"High Color\" (15 bitar)" #~ msgid "High Color (16 bit)" #~ msgstr "\"High Color\" (16 bitar)" #~ msgid "True Color (24 bit)" #~ msgstr "\"True Color\" (24 bitar)" #~ msgid "Grayscale" #~ msgstr "GrÃ¥skala" #~ msgid "Medium" #~ msgstr "Medel" #~ msgid "Good" #~ msgstr "Bra" #~ msgid "Best (Slowest)" #~ msgstr "Bäst (LÃ¥ngsammast)" #~ msgid "Off" #~ msgstr "Av" #~ msgid "Use Window Size" #~ msgstr "Använd fönsterstorlek" #~ msgid "Use Client Resolution" #~ msgstr "Använd klientens upplösning" #~ msgid "User Name" #~ msgstr "Användarnamn" #~ msgid "Domain" #~ msgstr "Domän" #~ msgid "Color Depth" #~ msgstr "Färgdjup" #~ msgid "Share Folder" #~ msgstr "Dela mapp" #~ msgid "Sound" #~ msgstr "Ljud" #~ msgid "Keyboard Mapping" #~ msgstr "Tangentbordslayout" #~ msgid "Client Name" #~ msgstr "Klientnamn" #~ msgid "Share Local Printers" #~ msgstr "Dela lokala skrivare" #~ msgid "Enable bitmap caching" #~ msgstr "Aktivera mellanlagring av bilder" #~ msgid "Quality" #~ msgstr "Kvalitet" #~ msgid "View Only" #~ msgstr "Visa endast" #~ msgid "Open Chat..." #~ msgstr "Öppna chat..." #~ msgid "Minimize Window" #~ msgstr "Minimera fönster" #, c-format #~ msgid "%s Password" #~ msgstr "%s lösenord" #~ msgid "SSH Password" #~ msgstr "Lösenord för SSH" #~ msgid "Save Password" #~ msgstr "Spara lösenord" #~ msgid "Client Certificate" #~ msgstr "Klientcertifikat" #~ msgid "Client Key" #~ msgstr "Klientnyckel" #~ msgid "Edit Settings" #~ msgstr "Redigera inställningar" #~ msgid "Do Not Use Tabs" #~ msgstr "Använd inte tabbar" #~ msgid "Host Key" #~ msgstr "Värdnyckel" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "Fullskärmsläge av/pÃ¥" #~ msgid "Show / Hide Toolbar" #~ msgstr "Visa/dölj verktygsfält" FreeRDP-Remmina-356c033/remmina/po/th.po000066400000000000000000001000261171526373700176330ustar00rootroot00000000000000# Thai translation for remmina # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 08:57+0000\n" "Last-Translator: Kitt Tientanopajai \n" "Language-Team: Thai \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-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: th\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "เชื่อมต่อไปยังพื้นโต๊ะระยะไà¸à¸¥" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina ลูà¸à¸‚่ายพื้นโต๊ะระยะไà¸à¸¥" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "ทั้งหมด %i รายà¸à¸²à¸£" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ที่จะลบ '%s'" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "ไม่สามารถนำเข้า:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "นำเข้า" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "โปรโตคอลนี้ไม่รองรับà¸à¸²à¸£à¸ªà¹ˆà¸‡à¸­à¸­à¸" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "à¹_à¸à¹‰à¹„ข" #: ../src/remminamain.c:921 msgid "_View" msgstr "มุ_มมอง" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "เ_ครื่องมือ" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_ช่วยเหลือ" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "สร้างà¹à¸Ÿà¹‰à¸¡à¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥à¹ƒà¸«à¸¡à¹ˆ" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "เปิดà¸à¸¥à¹ˆà¸­à¸‡à¹‚ต้ตอบà¸à¸²à¸£à¸›à¸£à¸±à¸šà¹à¸•่ง" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "ปลั๊à¸à¸­à¸´à¸™" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "วิà¸à¸´à¸­à¸­à¸™à¹„ลน์" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "หน้าต่างดีบั๊à¸" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "เปิดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อไปยังà¹à¸Ÿà¹‰à¸¡à¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥à¸—ี่เลือà¸" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "สร้างสำเนาของà¹à¸Ÿà¹‰à¸¡à¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥à¸—ี่เลือà¸" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "à¹à¸à¹‰à¹„ขà¹à¸Ÿà¹‰à¸¡à¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥à¸—ี่เลือà¸" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "ลบà¹à¸Ÿà¹‰à¸¡à¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥à¸—ี่เลือà¸" #: ../src/remminamain.c:980 msgid "Export" msgstr "ส่งออà¸" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "à¹à¸–บเครื่องมือ" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "à¹à¸–บสถานะ" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "ค้นหาด่วน" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "ปุ่มà¹à¸–บเครื่องมือขนาดเล็à¸" #: ../src/remminamain.c:1002 msgid "List View" msgstr "มุมมองล่าสุด" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "มุมมองต้นไม้" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "ชื่อ" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "à¸à¸¥à¸¸à¹ˆà¸¡" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "เซิร์ฟเวอร์" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "รูปà¹à¸šà¸šà¸—ี่รองรับ\n" "* เซิร์ฟเวอร์\n" "* เซิร์ฟเวอร์:พอร์ท\n" "* [เซิร์ฟเวอร์]:พอร์ท" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "รูปà¹à¸šà¸šà¸—ี่รองรับ\n" "* :พอร์ท\n" "* เซิร์ฟเวอร์\n" "* เซิร์ฟเวอร์:พอร์ท\n" "* [เซิร์ฟเวอร์]:พอร์ท" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "เลือà¸à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œà¸žà¸·à¹‰à¸™à¹‚ต๊ะระยะไà¸à¸¥" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "ระบุà¹à¸Ÿà¹‰à¸¡" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "ท่องดูเครือข่ายเพื่อหาเซิร์ฟเวอร์ %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "รหัสผ่าน" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "ความละเอียด" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "ใช้ขนาดหน้าต่าง" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "ใช้ความละเอียดของไคลเอนต์" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "ปรับà¹à¸à¹‰" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "ผังà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "ปรับขนาดà¹à¸™à¸§à¸™à¸­à¸™" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "ปรับขนาดà¹à¸™à¸§à¸•ั้ง" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "ใช้งาน SSH Tunnel" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "ใช้ Tunnel ผ่าน Loopback Address" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "เซิร์ฟเวอร์ SSH Serve" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "เซิร์ฟเวอร์เดียวà¸à¸±à¸™à¸—ี่พอร์ท %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "ชุดอัà¸à¸‚ระ" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "โปรà¹à¸à¸£à¸¡à¹€à¸£à¸´à¹ˆà¸¡à¸•้น" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "พาธเริ่มต้น" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคลของ SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "ชื่อผู้ใช้" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "à¸à¸¸à¸à¹à¸ˆà¸ªà¸²à¸˜à¸²à¸£à¸“ะ (อัตโนมัติ)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "เบื้องต้น" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "ขั้นสูง" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "บันทึà¸à¸à¸²à¸£à¸•ั้งค่าปริยายà¹à¸¥à¹‰à¸§" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "ค่าปรับà¹à¸•่งพื้นโต๊ะระยะไà¸à¸¥" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "ปริยาย" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "โปรไฟล์" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "เชื่อมต่อด่วน" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "โปรโตคอล" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "ไม่พบà¹à¸Ÿà¹‰à¸¡ %s" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "มี %i à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อในหน้าต่างปัจจุบัน คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ที่จะปิด?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "ปรับขนาดหน้าต่างให้พอดีà¸à¸±à¸šà¸„วามละเอียดของเครื่องทางไà¸à¸¥" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "สลับสถานะโหมดเต็มจอ" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "สลับหน้าà¹à¸—็บ" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "สลับสถานะโหมดà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸‚นาด" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "จับทุà¸à¹€à¸«à¸•ุà¸à¸²à¸£à¸“์à¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "ปรับà¹à¸•่ง" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "เครื่องมือ" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "ย่อหน้าต่าง" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "ตัดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "เชื่อมต่อไปยัง '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "เปิด Secure Shell ในเทอร์มินัลใหม่" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "เปิด Secure File Transfer ..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "เชื่อมต่อไปยังเซิร์ฟเวอร์ SSH %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อไป %s ผ่าน SSH tunnel..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸£à¸­ SSH tunnel ขาเข้าที่พอร์ต %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "ไม่พบคำสั่ง %s บนเซิร์ฟเวอร์ SSH" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "คำสั่ง %s ล้มเหลวบนเซิร์ฟเวอร์ SSH (สถานะ = %i)" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "à¸à¸²à¸£à¸—ำตามคำสั่งล้มเหลว: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "รหัสผ่าน %s" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "รหัสผ่าน SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "วลีรหัสผ่านà¸à¸¸à¸à¹à¸ˆà¸ªà¹ˆà¸§à¸™à¸•ัว SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "เà¸à¹‰à¸²à¸Ÿà¸±à¸‡à¸šà¸™à¸žà¸­à¸£à¹Œà¸• %i สำหรับà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อขาเข้าจาภ%s ..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคลล้มเหลว à¸à¸³à¸¥à¸±à¸‡à¸žà¸¢à¸²à¸¢à¸²à¸²à¸¡à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อใหม่ ..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "บันทึภ%s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "บันทึà¸à¸£à¸«à¸±à¸ªà¸œà¹ˆà¸²à¸™" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "ใบรับรอง CA" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "ใบรับรองไคลเอนต์" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "à¸à¸¸à¸à¹à¸ˆà¹„คลเอนต์" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "ผู้ดูà¹à¸¥:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "ผู้ร่วมสมทบ" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina เป็นซอฟต์à¹à¸§à¸£à¹Œà¹€à¸ªà¸£à¸µ คุณสามารถเผยà¹à¸žà¸£à¹ˆà¸‹à¹‰à¸³ à¹à¸¥à¸°/หรือ " "à¹à¸à¹‰à¹„ขได้ภายใต้สัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•สาธารณะทั่วไปของà¸à¸™à¸¹à¸•ามที่ตีพิมพ์โดยมูลนิธิซอฟต์à¹à¸§à¸£à¹Œà¹€" "สรี รุ่นที่สองหรือสัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•รุ่นหลัง (à¹à¸¥à¹‰à¸§à¹à¸•่คุณเลือà¸)" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina เผยà¹à¸žà¸£à¹ˆà¹‚ดยหวังว่าจะเป็นประโยชน์ à¹à¸•่ไม่มีà¸à¸²à¸£à¸£à¸±à¸šà¸›à¸£à¸°à¸à¸±à¸™à¹ƒà¸”ๆ " "ไม่ว่าจะโดยนัยà¹à¸«à¹ˆà¸‡à¸ªà¸´à¸™à¸„้าหรือà¸à¸²à¸£à¸—ำงานตรงตามวัตถุประสงค์ใดๆ " "ดูรายละเอียดเพิ่มเติมในสัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•สาธารณะทั่วไปของà¸à¸™à¸¹" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "คุณควรได้รับสำเนาของสัà¸à¸à¸²à¸­à¸™à¸¸à¸à¸²à¸•สาธารณะทั่วไปของà¸à¸™à¸¹à¸¡à¸²à¸žà¸£à¹‰à¸­à¸¡à¸à¸±à¸šà¹‚ปรà¹à¸à¸£à¸¡à¸™à¸µà¹‰ " "หาà¸à¸„ุณไม่ได้รับ à¸à¸£à¸¸à¸“าเขียนถึง Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "ไคลเอนต์พื้นโต๊ะระยะไà¸à¸¥ GTK+" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Kitt Tientanopajai https://launchpad.net/~kitty\n" " SiraNokyoongtong https://launchpad.net/~gumara" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "เปิดà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "à¹à¸à¹‰à¹„ขà¸à¸²à¸£à¸•ั้งค่า" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "ใà¸à¸¥à¹‰à¸—ี่สุด" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Tiles" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "อัตโนมัติ" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "ช่่องà¹à¸ªà¸”งผลเต็มจอ" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "à¹à¸—็บตามà¸à¸¥à¸¸à¹ˆà¸¡" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "à¹à¸—็บตามโปรโตคอล" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "à¹à¸—็บà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อทั้งหมด" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "ไม่ใช้à¹à¸—็บ" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "โปรดใช้รูปà¹à¸šà¸š 'à¸à¸§à¹‰à¸²à¸‡xสูง'" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "ล้างรายà¸à¸²à¸£à¸¥à¹ˆà¸²à¸ªà¸¸à¸”à¹à¸¥à¹‰à¸§" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "ปรับà¹à¸•่ง Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "ตัวเลือà¸" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "จำโหมดมุมมองล่าสุดของà¹à¸•่ละà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "บันทึà¸à¸à¸²à¸£à¸•ั้งค่าเมื่อเริ่มà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "à¹à¸–บเครื่องมือลอยล่องหน" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "à¹à¸ªà¸”งà¹à¸—็บเสมอ" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "ซ่อนà¹à¸–บเครื่องมือà¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "à¸à¸²à¸£à¸”ำเนินà¸à¸²à¸£à¹€à¸¡à¸·à¹ˆà¸­à¸”ับเบิลคลิà¸" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "โหมดมุมมองปริยาย" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "อินเทอร์เฟซà¹à¸šà¸šà¹à¸—็บ" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "คุณภาพà¸à¸²à¸£à¸›à¸£à¸±à¸šà¸‚นาด" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "พอร์ต SSH Tunnel ของเครื่องà¸à¸±à¹ˆà¸‡à¸™à¸µà¹‰" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "จำนวนรายà¸à¸²à¸£à¸¥à¹ˆà¸²à¸ªà¸¸à¸”" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "ล้าง" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "ความละเอียด" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "à¹à¸­à¸žà¹€à¸žà¸¥à¹‡à¸•" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "à¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "à¸à¸¸à¸à¹à¸ˆà¸‚องเครื่อง" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "พอดีà¸à¸±à¸šà¸«à¸™à¹‰à¸²à¸•่างอัตโนมัติ" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "ยึดà¹à¸›à¹‰à¸™à¸žà¸´à¸¡à¸žà¹Œ" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "à¹à¸ªà¸”ง/ซ่อน à¹à¸–บเครื่องมือ" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคล SSH ด้วยรหัสผ่่านล้มเหลว: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคล SSH ด้วยà¸à¸¸à¸à¹à¸ˆà¸ªà¸²à¸˜à¸²à¸£à¸“ะล้มเหลว: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "ยังไม่ได้ตั้งค่าà¹à¸Ÿà¹‰à¸¡à¸à¸¸à¸à¹à¸ˆ SSH" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "à¸à¸²à¸£à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคล SSH ด้วยà¸à¸¸à¸à¹à¸ˆà¸ªà¸²à¸˜à¸²à¸£à¸“ะอัตโนมัติล้มเหลว: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคลด้วยรหัสผ่านของ %s à¸à¸±à¸šà¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ %s ..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "à¸à¸³à¸¥à¸±à¸‡à¸¢à¸·à¸™à¸¢à¸±à¸™à¸•ัวบุคคล %s à¸à¸±à¸šà¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ %s ..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "à¸à¸²à¸£à¹€à¸£à¸´à¹ˆà¸¡à¸§à¸²à¸£à¸° SSH ล้มเหลว: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อ SSH tunnel ไปยังปลายทางล้มเหลว: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "à¸à¸²à¸£à¸”ำเนินงาน %s บนเซิร์ฟเวอร์ SSH ล้มเหลว: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "à¸à¸²à¸£à¸‚อใช้à¸à¸²à¸£à¸ªà¹ˆà¸‡à¸•่อพอร์ตล้มเหลว: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "ไม่มีà¸à¸²à¸£à¹‚ต้ตอบจาà¸à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¸§à¸²à¸£à¸° sftp ล้มเหลว: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "à¸à¸²à¸£à¹€à¸£à¸´à¹ˆà¸¡à¸§à¸²à¸£à¸° sftp ล้มเหลว: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "à¹à¸Šà¸—à¸à¸±à¸š %s" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_ส่ง" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_ล้าง" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "เลือà¸à¸•ำà¹à¸«à¸™à¹ˆà¸‡à¸”าวน์โหลด" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ที่จะลบà¹à¸Ÿà¹‰à¸¡à¸—ี่เลือà¸à¸šà¸™à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "เลือà¸à¹à¸Ÿà¹‰à¸¡à¸—ี่จะอัปโหลด" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "อัปโหลดโฟลเดอร์" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "ดาวน์โหลด" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "อัปโหลด" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "ไปยังโฟลเดอร์บ้าน" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "ไปยังโฟลเดอร์à¹à¸¡à¹ˆ" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "à¹à¸ªà¸”งผลโฟลเดอร์ปัจจุบันใหม่" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "ดาวน์โหลดจาà¸à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "อัปโหลดไปยังเซิร์ฟเวอร์" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "ลบà¹à¸Ÿà¹‰à¸¡à¸šà¸™à¹€à¸‹à¸´à¸£à¹Œà¸Ÿà¹€à¸§à¸­à¸£à¹Œ" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "ชื่อà¹à¸Ÿà¹‰à¸¡" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "ขนาด" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "ผู้ใช้" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "สิทธิ์" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "รีโมท" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "โลคอล" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "ความคืบหน้า" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹„ดเรà¸à¸—อรี่ %s ผิดพลาด" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "à¸à¸²à¸£à¹€à¸›à¸´à¸”à¹à¸Ÿà¹‰à¸¡ %s บนเซิร์ฟเวอร์ %s ผิดพลาด" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸Ÿà¹‰à¸¡ %s ผิดพลาด" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "à¸à¸²à¸£à¹€à¸‚ียนà¹à¸Ÿà¹‰à¸¡ %s ผิดพลาด" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "à¸à¸²à¸£à¹€à¸›à¸´à¸”ไดเรà¸à¸—อรี่ %s ผิดพลาด %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹‚ฟลเดอร์ %s ผิดพลาด บนเซิร์ฟเวอร์ %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "à¸à¸²à¸£à¸ªà¸£à¹‰à¸²à¸‡à¹à¸Ÿà¹‰à¸¡ %s บนเซิร์ฟเวอร์ %s ผิดพลาด" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "à¸à¸²à¸£à¹€à¸›à¸´à¸”à¹à¸Ÿà¹‰à¸¡ %s ผิดพลาด" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "à¸à¸²à¸£à¹€à¸‚ียนà¹à¸Ÿà¹‰à¸¡ %s บนเซิร์ฟเวอร์ %s ผิดพลาด" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "à¸à¸²à¸£à¹€à¸›à¸´à¸”ไดเรà¸à¸—อรี่ %s ล้มเหลว %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "à¸à¸²à¸£à¸­à¹ˆà¸²à¸™à¹„ดเรà¸à¸—อรี่ %s ล้มเหลว" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "à¸à¸²à¸£à¸ªà¹ˆà¸‡à¹à¸Ÿà¹‰à¸¡à¸¢à¸±à¸‡à¸­à¸¢à¸¹à¹ˆà¹ƒà¸™à¸£à¸°à¸«à¸§à¹ˆà¸²à¸‡à¸”ำเนินà¸à¸²à¸£\n" "คุณà¹à¸™à¹ˆà¹ƒà¸ˆà¸«à¸£à¸·à¸­à¹„ม่ที่จะยà¸à¹€à¸¥à¸´à¸?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "à¸à¸²à¸£à¸¥à¸š '%s' ล้มเหลว %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Secure File Transfer" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "ปรับขนาดให้พอดีà¸à¸±à¸šà¸‚นาดหน้าต่าง" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "รายà¸à¸²à¸£" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "à¹à¸Ÿà¹‰à¸¡" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "เครื่องมือ" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "ปรับà¹à¸•่ง" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "ประเภท" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "คำบรรยาย" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "เลือà¸à¸à¸¸à¸à¹à¸ˆà¹ƒà¸«à¸¡à¹ˆ" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "à¸à¸£à¸¸à¸“าà¸à¸”à¹à¸›à¹‰à¸™à¹ƒà¸«à¸¡à¹ˆ..." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "ปลั๊à¸à¸­à¸´à¸™ %s ยังไม่ได้ลงทะเบียน" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "เปิดหน้าต่างหลัà¸" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "เปิดใช้à¸à¸²à¸£à¸„้นหาบริà¸à¸²à¸£" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "เชื่อมต่อไปยังพื้นโต๊ะระยะไà¸à¸¥ ผ่านเมนูà¹à¸­à¸žà¹€à¸žà¸¥à¹‡à¸•" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "ค้นพบà¹à¸¥à¹‰à¸§" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "à¸à¸²à¸£à¹€à¸Šà¸·à¹ˆà¸­à¸¡à¸•่อใหม่" FreeRDP-Remmina-356c033/remmina/po/tr.po000066400000000000000000000627311171526373700176570ustar00rootroot00000000000000# Turkish translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 08:57+0000\n" "Last-Translator: Muhammed YÜRÜRDURMAZ \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2010-12-13 05:16+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: tr\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "Uzak masaüstlerine baÄŸlan" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina Uzak Masaüstü BaÄŸlantı Aracı" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "Toplam %i adet" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "'%s' elemanını silmek istediÄŸinizden eminmisiniz ?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "İçeri alınamıyor:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "İçeri al" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Bu protokol dışarı vermeyi desteklemiyor" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Düzenle" #: ../src/remminamain.c:921 msgid "_View" msgstr "_Görünüm" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_Araçlar" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Yardım" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Yeni bir uzak masaüstü dosyası oluÅŸtur" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Seçenekler penceresini aç" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Eklentiler" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "Online Viki" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Hata Ayıklama Penceresi" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "Seçili uzak masaüstü baÄŸlantısına baÄŸlan" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Seçili uzak masaüstü dosyasının bir kopyasını oluÅŸtur" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Seçili uzak masaüstü dosyasını düzenle" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Seçili uzak masaüstü dosyasını sil" #: ../src/remminamain.c:980 msgid "Export" msgstr "Dışarı aktar" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Araç ÇubuÄŸu" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Durum ÇubuÄŸu" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Hızlı arama" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Küçük Araç ÇubuÄŸu Düğmeleri" #: ../src/remminamain.c:1002 msgid "List View" msgstr "Liste Görünümü" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "AÄŸaç Görünümü" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "İsim" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Grup" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Server/Sunucu" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Desteklenen formatlar\n" "* sunucu\n" "* sunucu:port\n" "* [sunucu]:port" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "Desteklenen formatlar\n" "* :port\n" "* sunucu\n" "* sunucu:port\n" "* [sunucu]:port" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Uzak Masaüstü Sunucusunu Seç" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Identity dosyası" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "BulunduÄŸum ağı %s sunucusu bulmak için araÅŸtır" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Parola" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Çözünürlük" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "Pencere boyutunu kullan" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "İstemci çözünürlüğünü kullan" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Özel" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Klavye tuÅŸ haritası" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "Yatay ölçek" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "Dikey ölçek" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "SSH tünellemeyi aktifleÅŸtir" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Loopback adres aracılığıyla tünelle" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Sunucu" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Port %i deki aynı sunucu" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Karakter seti" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "BaÅŸlangıç programı" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "BaÅŸlangıç dizini" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH DoÄŸrulama" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "Kullanıcı adı" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Public Key (otomatik)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "Basit" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "GeliÅŸmiÅŸ" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Öntanımlı ayarlar kaydedildi." #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "Uzak Masaüstü Ayarı" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Öntanımlı" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Profil" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Hızlı BaÄŸlantı" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "İletiÅŸim kuralı" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "%s dosyası bulunamadı" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Aktif pencerede %i aktif baÄŸlantı var. Kapatmak istediÄŸinizdem eminmisiniz?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Pencereyi karşı makinanın çözünürlüğüne göre ayarla" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Tam ekran modunu aç/kapa" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Tab sayfalarını aç/kapa" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "Ölçekli görünümü aç/kapa" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Tüm klavye olaylarını yakala" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "Seçenekler" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "Araçlar" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Pencereyi simge durumuna küçült" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "BaÄŸlantıyı kes" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "'%s' aygıtına baÄŸlanılıyor..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Güvenli Komut Satırı Penceresi Aç..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Güvenli Dosya Aktarım Penceresi Aç..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "'%s' SSH sunucusuna baÄŸlanılıyor..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "'%s' aygıtına SSH tünelleme ile baÄŸlanılıyor..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "%i portuna gelecek SSH tünel istekleri bekleniyor..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "%s komutu SSH sunucu üzerinde bulunamadı" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "%s komutu SSH sunucu üzerinde baÅŸarısız oldu (durum kodu = %i)" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "%s komutunun çalıştırılması baÅŸarısız oldu" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s ÅŸifre" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH parolası" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSH özel anahtar ÅŸifresi" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "%i portuna gelecek %s baÄŸlantıları bekleniyor..." #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Kimlik Denetleme baÅŸarısız oldu. Yeniden baÄŸlanmyı deniyor..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "%s kaydet" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Parolayı kaydet" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA sertifikası" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "İstermci sertifikası" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "İstemci anahtarı" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "SaÄŸlayıcılar:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "Katkıda Bulunanlar:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina özğür yazılımdır. Free Software Foundation tarafından yayınlanan " "GNU General Public Lisans ÅŸartları altında versiyon 2 lisans veya (sizin " "seçiminiz) daha sonraki bir versiyonla yeniden dağıtabilir ve/ya " "deÄŸiÅŸtirebilirsiniz." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Remmina yararlı olucağı düşünülerek dağıtılmaktadır, fakat herhangi bir " "garantimiz yoktur. Ticari Kullanım veya belirli bir amaca uygunluk " "garantisi de yoktur. Detaylar için GNU General Public Lisansa a göz " "atılabilir." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Bu yazılımla beraber Gnu General Public Lisansın bir kopyasını almış " "olmalısınız, aksi halde Free Software Foundation, Inc., 59 Temple Place, " "Suite 330, Boston, MA 02111-1307, USA yazınız." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ Uzak Masaüstü İstemcisi" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Muhammed YÜRÜRDURMAZ https://launchpad.net/~myururdurmaz\n" " Vic https://launchpad.net/~llyzs\n" " ripper https://launchpad.net/~ismail-proturk\n" " zeugma https://launchpad.net/~sunder67" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "BaÄŸlantı aç" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Ayarları düzenle" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "En Yakın" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Desenler" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "İki Çizgili" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hiper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Otomatik" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Kaydırmalı pencere" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Kaydırmalı tam ekran" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Tam ekra görünüm" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Gruplara göre tab" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Protokollere göre tab" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Tüm baÄŸlantılar için tab" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Tab kullanma" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Lütfen 'GENİŞLİKxYÜKSEKLİK' formatını girin" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "GeçmiÅŸ listesi temizlendi" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina Tercihleri" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Seçenekler" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Her baÄŸlantı için son görünüm ÅŸeklini hatırla" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "BaÄŸlantı baÅŸlatılırken ayarları kaydet" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Görünmez kayar araç çubuÄŸu" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "Sekmeleri her zaman göster" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "BaÄŸlantı araç çubuÄŸunu gizle" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "Çift tıklama eylemi" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "Öntanımlı görünüm ÅŸekli" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Tab görünümü" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "Kalite ayarla" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSH tünel yerel portu" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "Kabul edilen en fazla geçmiÅŸ baÄŸlantı öğesi" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "Temizle" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "Çözünürlükler" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Küçük Uygulama" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Klavye" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host tuÅŸu" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Pencereyi otomatik sığdır" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Klavyeyi yakala" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Araç çubuÄŸunu göster / gizle" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSH Parola yetkilendirmesi baÅŸarısız: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSH genel anahtar yetkilendirmesi baÅŸarısız: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "SSH Anahtar dosyası belirtilmemiÅŸ" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSH otomatik genel anahtar yetkilendirmesi baÅŸarısız: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "%s'nin parolası SSH sunucu %s üzerinde kontrol ediliyor..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "%s'nin kimliÄŸi SSH sunucu %s üzerinde kontrol ediliyor..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "SSH oturumu baÅŸarısız: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "SSH Tünel hedefine baÄŸlanılamadı: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "SSH sunucu üzerinde %s çalıştırılamadı: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Port yönlendirme isteÄŸi baÅŸarısız: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Sunucudan hiçbir cevap yok." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "SFTP oturumu oluÅŸturma baÅŸarısız: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "SFTP oturumu baÅŸlatma baÅŸarısız: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - Secure Shell" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "%s ile sohbet" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_Gönder" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_Temizle" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "İndirme yerini seçiniz" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Seçili dosyaları sunucudan silmek istediÄŸinizden eminmisiniz?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Yüklemek için bir dosyayı seç" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Karşıya yükleme klasörü" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "İndir" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "Yükle" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Kullanıcı Ev (Home) dizinine git" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Üst klasöre git" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Åžu anki klasörü yenile" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Sunucudan İndir" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Sunucuya yükle" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Sunucudan dosyaları sil" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Dosya İsmi" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Boyut" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "Kullanıcı" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "İzin" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Uzak" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Yerel" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "İlerleme" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "Klasör oluÅŸturma hatası %s" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "%s dosyasını sunucuda açarken hata oluÅŸtu. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "%s dosyasını oluÅŸtururken hata oluÅŸtu." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "%s dosyasını yazarken hata oluÅŸtu." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "%s klasörünü açmada hata. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "%s klasörünü %s sunucusu üzerinde oluÅŸturmaya çalışırken hata oluÅŸtu" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Sunucu üzerinde %s dosyasını oluÅŸturmada hata. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "%s dosyasını açarken hata oluÅŸtu." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "%s dosyasını yazarken hata oluÅŸtu. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "%s Klasörünü açma baÅŸarısız. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "%s klasörünü okuma baÅŸarısız." #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Åžu anda aktif dosya transferi var.\n" "İptal etmek istediÄŸinizden eminmisiniz?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "%s silme baÅŸarısız. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Güvenli Dosya Aktarımı" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Pencere Boyutunu Sığdır" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "Girdi" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Dosya" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "Araç" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "Tercih" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Tip" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "Açıklama" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Yeni bir tuÅŸ seçin" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "Lütfen yeni tuÅŸa basın" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "%s eklentisi kaydedilmemiÅŸ" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Ana Pencereyi Aç" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Servis KeÅŸfini Aç" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "Uzak masaüstlerine küçük uygulama menüsü aracılığıyla baÄŸlan" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Bulundu" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Yeni BaÄŸlantı" FreeRDP-Remmina-356c033/remmina/po/uk.po000066400000000000000000000736611171526373700176550ustar00rootroot00000000000000# Ukrainian translation for remmina # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the remmina package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-12 08:56+0000\n" "Last-Translator: Сергій Дубик \n" "Language-Team: Ukrainian \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-Launchpad-Export-Date: 2010-12-13 05:17+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: uk\n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "З'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· відаленим комп'ютером" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Клієнт з'єднань з відаленим комп'ютером Remmina" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "УÑього %i" msgstr[1] "УÑього %i" msgstr[2] "УÑього %i" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "Впевнені, що бажаєте видалити '%s' ?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "Ðеможливо імпортувати:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "ІмпортуваннÑ" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "Ðеможливо екÑпортувати цей вид протоколів" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "_Правка" #: ../src/remminamain.c:921 msgid "_View" msgstr "_ВиглÑд" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "_ІнÑтрументи" #: ../src/remminamain.c:923 msgid "_Help" msgstr "_Довідка" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "Створити новий файли з'єднаннÑ" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "Відкрити діалог параметрів програми" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "Модулі" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "База знань (Wiki) в Інтернет" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "Вікно відлагодженнÑ" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "З'єднатиÑÑŒ за налаштуваннÑми обраного файлу віддаленого з'єднаннÑ" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "Створити копію обраного файлу з'єднаннÑ" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "Редагувати обраний файл з'єднаннÑ" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "Видалити обраний файл з'єднаннÑ" #: ../src/remminamain.c:980 msgid "Export" msgstr "ЕкÑпортуваннÑ" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "Панель інÑтрументів" #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "Смужка Ñтану" #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "Швидкий пошук" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "Відбражати малі іконки" #: ../src/remminamain.c:1002 msgid "List View" msgstr "ПереглÑд ÑпиÑком" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "Ієрархічний переглÑд" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "Ðазва" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "Група" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "Сервер" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "ПідтримуютьÑÑ Ñ‚Ð°ÐºÑ– формати\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "ПідтримуютьÑÑ Ñ‚Ð°ÐºÑ– формати\n" "* Ñервер\n" "* Ñервер:порт\n" "* [Ñервер]:порт" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "Введіть адреÑу комп'ютера з котрим з'єднуєтеÑÑŒ" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "Ідентифікувати файл" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "Шукти в мережі Ñервер %s" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "Пароль" #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "Роздільна здатніÑть" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "По розміру вікна" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° Ñервері" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "Ðетипова" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "Розкладка клавіатури (мова)" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "МаÑштабувати горизонтально" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "МаÑштабувати вертикально" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "Увімкнути SSH Тунель" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "Tunnel via Loopback Address" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSH Сервер" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "Той же Ñервер. Порт %i" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "Розкладка клавіатури (мова)" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "ЗапуÑкати програму" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "ÐдреÑа" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "Перевірка прав доÑтупу по SSH" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "КориÑтувач" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "Відкритий ключ (Automatic)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "ПроÑтий" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "Додатково" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "Стандартні Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð¾" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ñ€Ð¾Ð±Ð¾Ñ‡Ð¾Ð³Ð¾ Ñтолу віддаленого комп'ютера" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "Типовий" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "Профіль" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "Швидке з’єднаннÑ" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "Протокол" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "Файл %s відÑутній." #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "" "Ð’ цьому вікні відкрито %i активних з'єднань. Впевнені, що потрібно вийти?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "Зменьшувати до розміру екрану Ñвого комп'ютера" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "Ðа ввеÑÑŒ екран" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "Перемкнути закладки" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "РозтÑгувати під прозмір екрану Ñвого комп'ютера" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "Передавати на віддалений комп'ютер будь-Ñке натиÑÐºÐ°Ð½Ð½Ñ ÐºÐ»Ð°Ð²Ñ–Ñˆ" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "ÐалаштуваннÑ" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "ІнÑтрументи" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "Згорнути вікно" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "Від'єднатиÑÑ" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "Ð’ÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· '%s'..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "Відкрити захищений канал у новому вікні..." #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "Розпочати безпечну передачу файлів..." #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "Ð’ÑтановлюєтьÑÑ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· SSH Ñервером %s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "Ð’ÑтановлюєтьÑÑ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· %s... по SSH протоколу" #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "ÐžÑ‡Ñ–ÐºÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ð° вхідне SSH з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð½Ð° порт %i..." #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "Команда „%s“ не знайдена на SSH-Ñервері" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "Команда „%s“ завершилаÑÑ Ð¿Ð¾Ð¼Ð¸Ð»ÐºÐ¾ÑŽ на SSH-Ñервері (ÑÑ‚Ð°Ñ‚ÑƒÑ = %i)." #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "Помилка при виконанні команди: %s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s Пароль" #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "Пароль SSH" #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "Ключова фраза закритого ключа SSH" #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "ПроÑÐ»ÑƒÑ…Ð¾Ð²ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ð¾Ñ€Ñ‚Ñƒ %i на вхідне %s підключеннÑ…" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "Помилка при перевірці прав доÑтупу. Ще одна Ñпроба..." #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "Зберегти %s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "Зберегти пароль" #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "CA Certificate" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "CA CRL" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "КлієнтÑький Ñертифікат" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "КлієнтÑький ключ" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "Відповідальні:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "УчаÑники розробки:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Клієнт Remmina Ñ” вільним програмним забезпеченнÑм; Ви маєте право поширювати " "його/або змінювати його код з гідно з умовами ліцензії GNU General Public " "License опублікованою компанією Free Software Foundation; згідно з 2ÑŽ або " "будь-Ñкою більш пізньою верÑією цієї ліцензії - на Ваш вибір." #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "" "Програма Remmina поширюєтьÑÑ Ð² вірою в те, що вона буде кориÑна, але без " "БУДЬ-ЯКИХ ГÐРÐÐТІЙ; у тому чиÑлі й без гарантій КОМЕРЦІЙÐОЇ ЦІÐÐОСТІ чи " "ПРИДÐТÐОСТІ ДЛЯ БУДЬ-ЯКОЇ конкретної мети. Більш детально — дивітьÑÑ " "ліцензію GNU General Public License." #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Ви повинні були отримати копію ліцензії GNU General Public License разом з " "цією програмою, Ñкщо цього не ÑталоÑÑ, то напишіть за адреÑою Free Software " "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA." #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+ Клієнт з'єднань з робочим Ñтолом віддаленого комп'ютера" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " Serhey Kusyumoff (Сергій КуÑюмов) https://launchpad.net/~sergemine\n" " Сергій Дубик https://launchpad.net/~dubyk-library" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "Відкрити з'єднаннÑ" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "Редагувати налаштуваннÑ" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Ðайближчий" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Плиткою" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Білінійно" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "Ðвтоматично" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "Вікно з прокруткою" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "Ðа ввеÑÑŒ екран, з переміщеннÑм полоÑою прокрутки" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "Ðа ввеÑÑŒ екран" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "Закладки згідно з групами" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "Закладки за протоколами" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "Ð’ÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð² закладки" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "Ðе викориÑтовувати закладки" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "Будь лаÑка, введіть формат 'ширина x виÑота'." #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "Очищено ÑпиÑок оÑтанніх з'єднань" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÐºÐ»Ñ–Ñ”Ð½Ñ‚Ð° Remmina" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "Параметри" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "Зберігати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду кожного з'єднаннÑ" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "При здійÑÐ½ÐµÐ½Ð½Ñ Ð·'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð·Ð±ÐµÑ€ÐµÐ³Ñ‚Ð¸ налаштуваннÑ" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "Спливаюча панель (Ñк в Windows)" #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "pFD;LB DSLJ,HF;FNB PFRKFLRB" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "Ðе відображати панель з'єднаннÑ" #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "При подвійному натиÑканні:" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "ОÑновний режим переглÑду" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "Закладки" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "ЯкіÑть маÑштабуваннÑ" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "Локальний порт SSH-тунелю" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "КількÑть оÑтанніх елементів" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "ОчиÑтити" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "РоздільніÑть" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "Ðплет панелі GNOME" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "Клавіатура" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "Host-клавіша" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "Ðвтоматично підібрати розмір" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "Захват клавіатури" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "Відображати / Сховати панель" #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° SSH-паролем не вдалаÑÑ: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° публічним SSH-ключем не вдалаÑÑ: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "Ключовий файл SSH ще не вÑтановлено." #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "Ðвтоматична Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ñ–ÐºÐ°Ñ†Ñ–Ñ Ð·Ð° публічним SSH-ключем не вдалаÑÑ: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "ÐŸÑ–Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ñ Ð· паролем %s до SSH-Ñервера %s…" #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "Перевірка автентичноÑті %s на SSH-Ñервері %s…" #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "Помилка при запуÑку SSH-ÑеанÑу: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "Помилка при підключенні до пункту Ð¿Ñ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð² SSH-тунелі: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "Ðе вдалоÑÑ Ð²Ð¸ÐºÐ¾Ð½Ð°Ñ‚Ð¸ „%s“ на SSH-Ñервері: %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "Ðе вдалоÑÑ Ð·Ð°Ð¿Ñ€Ð¾Ñити переадреÑацію порту: %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "Ðемає відповіді від Ñервера." #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "Ðе вдалоÑÑ Ñтворити sftp-ÑеÑÑ–ÑŽ: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "Ðе вдалоÑÑ Ñ–Ð½Ñ–Ñ†Ñ–Ð°Ð»Ñ–Ð·ÑƒÐ²Ð°Ñ‚Ð¸ sftp-ÑеÑÑ–ÑŽ: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH — безпечна оболонка" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "Розмова з %s (текÑÑ‚)" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "_ÐадіÑлати" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "_ОчиÑтити" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "Завантажувати до ..." #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "Точно бажаєте видалити зазначені файли?" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "Оберіть файл Ð´Ð»Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "Тека Ð´Ð»Ñ Ð²Ñ–Ð´Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "ЗавантаженнÑ" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "ВідвантаженнÑ" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "Перейти до Домашньої папки" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "Ðа одну папку вверх" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "Оновити поточну папку" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "Завантажити з Ñервера" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "Відвантажити на Ñервер" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "Видалити файли на Ñервері" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "Ðазва файлу" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "Розмір" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "КориÑтувач" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "Права доÑтупу" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "Віддалений" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "Локальний" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "ВиконаннÑ" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "При Ñтворенні папки %s виникла помилка." #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "Помилка при відкритті файлу %s з Ñервера. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "Помилка при Ñтворенні файлу %s." #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "Помилка при запиÑÑ– файлу %s." #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "Помилка при відкритті теки %s. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "Помилка при Ñтворенні теки %s на Ñервері. %s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "Помилка при Ñтворенні файлу %s на Ñервері. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "Помилка при відкритті файлу %s." #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "Помилка при запиÑÑ– файлу %s на Ñервері. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ теку %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "Помилка при читанні теки. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "" "Ð’ даний момент відбуваєтьÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð° файлів.\n" "Точно бажаєте ÑкаÑувати?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "Ðе вдалоÑÑ Ð²Ð¸Ð»ÑƒÑ‡Ð¸Ñ‚Ð¸ „%s“. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - Безпечна передача файлів" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "Уміщати в вікні" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "ЗапиÑ" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "Файл" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "ІнÑтрумент" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "ÐалаштуваннÑ" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "Тип" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "ОпиÑ" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "" #: ../src/remminakeychooser.c:43 msgid "" msgstr "Ðе обрано" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "Оберіть новий ключ" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "ÐатиÑніть нову клавішу Ð´Ð»Ñ Ð²Ð¸Ð±Ð¾Ñ€Ñƒ ...." #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "Модуль %s не зареєÑтровано." #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "Відкрити головне вікно" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "Ввімкнути Ñлужбу пошуку Ñерверів" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "ПриєднуватиÑÑŒ до відділених робочих Ñтолів через Ðплет панелі" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "Знайдено" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "Ðове з'єднаннÑ" FreeRDP-Remmina-356c033/remmina/po/zh_CN.po000066400000000000000000000776521171526373700202430ustar00rootroot00000000000000# 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: remmina\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-11 23:54+0800\n" "PO-Revision-Date: 2010-12-23 06:14+0000\n" "Last-Translator: Vic \n" "Language-Team: LANGUAGE \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-Launchpad-Export-Date: 2010-12-24 06:08+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: \n" #: ../desktop/remmina.desktop.in.h:1 msgid "Connect to remote desktops" msgstr "连接到远程桌é¢" #: ../desktop/remmina.desktop.in.h:2 ../src/remminamain.c:1157 #: ../src/remminaicon.c:362 ../src/remminaicon.c:363 msgid "Remmina Remote Desktop Client" msgstr "Remmina 远程桌é¢å®¢æˆ·ç«¯" #: ../src/remminamain.c:503 #, c-format msgid "Total %i item." msgid_plural "Total %i items." msgstr[0] "å…±%i项" #: ../src/remminamain.c:573 #, c-format msgid "Are you sure to delete '%s'" msgstr "确认è¦åˆ é™¤%s?" #: ../src/remminamain.c:741 #, c-format msgid "" "Unable to import:\n" "%s" msgstr "" "无法导入:\n" "%s" #: ../src/remminamain.c:770 ../src/remminamain.c:937 msgid "Import" msgstr "导入" #: ../src/remminamain.c:808 msgid "This protocol does not support exporting." msgstr "æ­¤åè®®ä¸æ”¯æŒå¯¼å‡º" #: ../src/remminamain.c:919 msgid "_Connection" msgstr "连接(_C)" #: ../src/remminamain.c:920 msgid "_Edit" msgstr "编辑(_E)" #: ../src/remminamain.c:921 msgid "_View" msgstr "视图(_V)" #: ../src/remminamain.c:922 msgid "_Tools" msgstr "工具(_T)" #: ../src/remminamain.c:923 msgid "_Help" msgstr "帮助(_H)" #: ../src/remminamain.c:926 msgid "Create a new remote desktop file" msgstr "æ–°å»ºä¸€ä¸ªè¿œç¨‹æ¡Œé¢æ–‡ä»¶" #: ../src/remminamain.c:930 msgid "Open the preferences dialog" msgstr "æ‰“å¼€é¦–é€‰é¡¹å¯¹è¯æ¡†" #: ../src/remminamain.c:941 ../src/remminapluginmanager.c:239 msgid "Plugins" msgstr "æ’ä»¶" #: ../src/remminamain.c:945 msgid "Homepage" msgstr "网站" #: ../src/remminamain.c:949 msgid "Online Wiki" msgstr "在线百科" #: ../src/remminamain.c:953 msgid "Debug Window" msgstr "调试窗å£" #: ../src/remminamain.c:965 msgid "Open the connection to the selected remote desktop file" msgstr "æ‰“å¼€é€‰å®šçš„è¿œç¨‹æ¡Œé¢æ–‡ä»¶çš„连接" #: ../src/remminamain.c:969 msgid "Create a copy of the selected remote desktop file" msgstr "ä¸ºé€‰å®šçš„è¿œç¨‹æ¡Œé¢æ–‡ä»¶å»ºç«‹å‰¯æœ¬" #: ../src/remminamain.c:973 msgid "Edit the selected remote desktop file" msgstr "ç¼–è¾‘é€‰å®šçš„è¿œç¨‹æ¡Œé¢æ–‡ä»¶" #: ../src/remminamain.c:977 msgid "Delete the selected remote desktop file" msgstr "åˆ é™¤é€‰å®šçš„è¿œç¨‹æ¡Œé¢æ–‡ä»¶" #: ../src/remminamain.c:980 msgid "Export" msgstr "导出" #: ../src/remminamain.c:987 msgid "Toolbar" msgstr "工具æ " #: ../src/remminamain.c:990 msgid "Statusbar" msgstr "çŠ¶æ€æ " #: ../src/remminamain.c:993 msgid "Quick Search" msgstr "快速查找" #: ../src/remminamain.c:996 msgid "Small Toolbar Buttons" msgstr "工具æ å°æŒ‰é’®" #: ../src/remminamain.c:1002 msgid "List View" msgstr "列表视图" #: ../src/remminamain.c:1003 msgid "Tree View" msgstr "目录视图" #. Profile: Name #: ../src/remminamain.c:1230 ../src/remminafileeditor.c:1286 #: ../src/remminapluginmanager.c:259 msgid "Name" msgstr "åç§°" #. Profile: Group #: ../src/remminamain.c:1243 ../src/remminafileeditor.c:1308 #: ../src/remminaftpclient.c:1020 msgid "Group" msgstr "分组" #: ../src/remminamain.c:1251 ../src/remminafileeditor.c:342 #: ../src/remminafileeditor.c:795 ../src/remminafileeditor.c:808 #: ../src/remminaprotocolwidget.c:1032 msgid "Server" msgstr "æœåС噍" #: ../src/remminafileeditor.c:56 msgid "" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "æ”¯æŒæ ¼å¼\n" "* æœåС噍\n" "* æœåС噍:端å£\n" "* [æœåС噍]:端å£" #: ../src/remminafileeditor.c:63 msgid "" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" msgstr "" "æ”¯æŒæ ¼å¼\n" "* :端å£\n" "* æœåС噍\n" "* æœåС噍:端å£\n" "* [æœåС噍]:端å£" #: ../src/remminafileeditor.c:120 msgid "Choose a Remote Desktop Server" msgstr "è¯·é€‰æ‹©ä¸€ä¸ªè¿œç¨‹æ¡Œé¢æœåС噍" #: ../src/remminafileeditor.c:297 ../src/remminafileeditor.c:304 msgid "Identity file" msgstr "ç§é’¥æ–‡ä»¶" #: ../src/remminafileeditor.c:365 #, c-format msgid "Browse the network to find a %s server" msgstr "æµè§ˆç½‘络查找%sæœåС噍" #: ../src/remminafileeditor.c:387 ../src/remminafileeditor.c:850 #: ../src/remminaprotocolwidget.c:833 ../src/remminainitdialog.c:278 msgid "Password" msgstr "密ç " #: ../src/remminafileeditor.c:428 msgid "Resolution" msgstr "分辨率" #: ../src/remminafileeditor.c:434 msgid "Use window size" msgstr "è·Ÿéšçª—å£å¤§å°" #: ../src/remminafileeditor.c:434 msgid "Use client resolution" msgstr "使用客户机的分辨率" #: ../src/remminafileeditor.c:444 ../src/remminafileeditor.c:775 msgid "Custom" msgstr "指定" #: ../src/remminafileeditor.c:626 msgid "Keyboard mapping" msgstr "键盘映射" #: ../src/remminafileeditor.c:631 ../src/remminascaler.c:138 msgid "Horizontal scale" msgstr "水平缩放比例" #: ../src/remminafileeditor.c:636 ../src/remminascaler.c:145 msgid "Vertical scale" msgstr "垂直缩放比例" #: ../src/remminafileeditor.c:746 msgid "Enable SSH tunnel" msgstr "å¯ç”¨SSH通é“" #: ../src/remminafileeditor.c:753 msgid "Tunnel via loopback address" msgstr "通过loopback地å€å»ºç«‹éš§é“" #. SSH Server group #: ../src/remminafileeditor.c:760 msgid "SSH Server" msgstr "SSHæœåС噍" #: ../src/remminafileeditor.c:766 #, c-format msgid "Same server at port %i" msgstr "相åŒä¸»æœºä¸Šçš„%i端å£" #: ../src/remminafileeditor.c:820 msgid "Character set" msgstr "字符集" #: ../src/remminafileeditor.c:826 msgid "Startup program" msgstr "å¯åŠ¨ç¨‹åº" #: ../src/remminafileeditor.c:835 msgid "Startup path" msgstr "å¯åŠ¨è·¯å¾„" #. SSH Authentication frame #: ../src/remminafileeditor.c:843 msgid "SSH Authentication" msgstr "SSH验è¯" #. Entries #: ../src/remminafileeditor.c:847 ../src/remminainitdialog.c:265 msgid "User name" msgstr "用户å" #: ../src/remminafileeditor.c:857 msgid "Public key (automatic)" msgstr "公钥(自动)" #: ../src/remminafileeditor.c:914 msgid "Basic" msgstr "基本" #: ../src/remminafileeditor.c:921 msgid "Advanced" msgstr "高级" #: ../src/remminafileeditor.c:1115 msgid "Default settings saved." msgstr "默认值已ä¿å­˜" #. Create the editor dialog #: ../src/remminafileeditor.c:1164 msgid "Remote Desktop Preference" msgstr "远程桌é¢è®¾å®š" #. The Set As Default button #: ../src/remminafileeditor.c:1189 msgid "Default" msgstr "默认值" #: ../src/remminafileeditor.c:1283 msgid "Profile" msgstr "档案" #: ../src/remminafileeditor.c:1298 msgid "Quick Connect" msgstr "快速连接" #: ../src/remminafileeditor.c:1320 #, c-format msgid "Use '%s' as subgroup delimiter" msgstr "使用'%s'作为分组分隔符" #. Profile: Protocol #: ../src/remminafileeditor.c:1325 ../src/remminapluginmanager.c:38 msgid "Protocol" msgstr "åè®®" #: ../src/remminafileeditor.c:1384 ../src/remminafileeditor.c:1405 #: ../src/remminaconnectionwindow.c:2421 #, c-format msgid "File %s not found." msgstr "文件%s未找到" #: ../src/remminaconnectionwindow.c:183 #, c-format msgid "" "There are %i active connections in the current window. Are you sure to close?" msgstr "当å‰çª—å£å·²æ‰“å¼€ %i 个连接。确认è¦å…³é—­å—?" #: ../src/remminaconnectionwindow.c:563 msgid "Viewport fullscreen mode" msgstr "视å£å…¨å±æ¨¡å¼" #: ../src/remminaconnectionwindow.c:574 msgid "Scrolled fullscreen mode" msgstr "æ»šåŠ¨å…¨å±æ¨¡å¼" #: ../src/remminaconnectionwindow.c:1177 msgid "Resize the window to fit in remote resolution" msgstr "调整窗å£å¤§å°ä»¥é€‚应远程分辨率" #: ../src/remminaconnectionwindow.c:1188 ../src/remminaprefdialog.c:559 msgid "Toggle fullscreen mode" msgstr "å¯ç”¨å…¨å±æ¨¡å¼" #: ../src/remminaconnectionwindow.c:1229 ../src/remminaprefdialog.c:579 msgid "Switch tab pages" msgstr "è½¬æ¢æ ‡ç­¾é¡µ" #: ../src/remminaconnectionwindow.c:1243 ../src/remminaprefdialog.c:598 msgid "Toggle scaled mode" msgstr "å¯ç”¨å›¾åƒç¼©æ”¾æ¨¡å¼" #: ../src/remminaconnectionwindow.c:1278 msgid "Grab all keyboard events" msgstr "俘获所有键盘事件" #: ../src/remminaconnectionwindow.c:1287 msgid "Preferences" msgstr "首选项" #: ../src/remminaconnectionwindow.c:1295 ../src/remminaconnectionwindow.c:1296 msgid "Tools" msgstr "工具" #: ../src/remminaconnectionwindow.c:1308 ../src/remminaprefdialog.c:618 msgid "Minimize window" msgstr "最å°åŒ–窗å£" #: ../src/remminaconnectionwindow.c:1316 ../src/remminaprefdialog.c:628 msgid "Disconnect" msgstr "æ–­å¼€" #: ../src/remminaprotocolwidget.c:119 #, c-format msgid "Connecting to '%s'..." msgstr "正在连接到%s..." #: ../src/remminaprotocolwidget.c:202 #, c-format msgid "Protocol plugin %s is not installed." msgstr "åè®®æ’ä»¶%s未安装" #: ../src/remminaprotocolwidget.c:240 msgid "Open Secure Shell in New Terminal..." msgstr "打开新的安全命令行终端窗å£" #: ../src/remminaprotocolwidget.c:246 msgid "Open Secure File Transfer..." msgstr "打开安全文件传输" #: ../src/remminaprotocolwidget.c:451 #, c-format msgid "Connecting to SSH server %s..." msgstr "正在连接到SSHæœåС噍%s..." #: ../src/remminaprotocolwidget.c:516 ../src/remminaprotocolwidget.c:686 #, c-format msgid "Connecting to %s through SSH tunnel..." msgstr "正在通过SSH通é“连接到%s..." #: ../src/remminaprotocolwidget.c:560 #, c-format msgid "Waiting for an incoming SSH tunnel at port %i..." msgstr "在端å£%i等待传入的SSH通é“" #: ../src/remminaprotocolwidget.c:609 #, c-format msgid "Command %s not found on SSH server" msgstr "SSHæœåŠ¡å™¨ä¸Šæ‰¾ä¸åˆ°å‘½ä»¤%s" #: ../src/remminaprotocolwidget.c:613 #, c-format msgid "Command %s failed on SSH server (status = %i)." msgstr "SSHæœåС噍è¿è¡Œå‘½ä»¤%s失败(状æ€%i)" #: ../src/remminaprotocolwidget.c:624 #, c-format msgid "Failed to execute command: %s" msgstr "命令è¿è¡Œå¤±è´¥ï¼š%s" #: ../src/remminaprotocolwidget.c:824 #, c-format msgid "%s password" msgstr "%s密ç " #: ../src/remminaprotocolwidget.c:827 ../src/remminassh.c:248 msgid "SSH password" msgstr "SSH密ç " #: ../src/remminaprotocolwidget.c:830 ../src/remminassh.c:252 msgid "SSH private key passphrase" msgstr "SSHç§é’¥å¯†ç " #: ../src/remminaprotocolwidget.c:968 #, c-format msgid "Listening on port %i for an incoming %s connection..." msgstr "在%i端å£ç›‘å¬ä¼ å…¥çš„%s连接" #: ../src/remminaprotocolwidget.c:976 msgid "Authentication failed. Trying to reconnect..." msgstr "验è¯å¤±è´¥ï¼Œå°†é‡æ–°è¿žæŽ¥â€¦â€¦" #: ../src/remminainitdialog.c:205 #, c-format msgid "Save %s" msgstr "ä¿å­˜%s" #: ../src/remminainitdialog.c:289 msgid "Save password" msgstr "ä¿å­˜å¯†ç " #. Buttons for choosing the certificates #: ../src/remminainitdialog.c:388 msgid "CA certificate" msgstr "æ ¹è¯ä¹¦" #: ../src/remminainitdialog.c:389 msgid "CA CRL" msgstr "è¯ä¹¦å¤±æ•ˆåˆ—表(CRL)" #: ../src/remminainitdialog.c:390 msgid "Client certificate" msgstr "客户端è¯ä¹¦" #: ../src/remminainitdialog.c:391 msgid "Client key" msgstr "客户端密钥" #: ../src/remminaabout.c:32 msgid "Maintainers:" msgstr "维护者:" #: ../src/remminaabout.c:35 msgid "Contributors:" msgstr "贡献者:" #: ../src/remminaabout.c:47 msgid "" "Remmina 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." msgstr "" "Remmina是自由软件,你å¯ä»¥éµç…§è‡ªç”±è½¯ä»¶åŸºé‡‘会出版的GNU通用公共许å¯è¯æ¡æ¬¾æ¥ä¿®æ”¹å’Œé‡æ–°å‘布这一程åºã€‚或者用许å¯è¯çš„第二版,或者(根æ®ä½ çš„选择)用任何" "更新的版本。" #: ../src/remminaabout.c:51 msgid "" "Remmina 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." msgstr "å‘布Remmina的目的是希望它有用,但没有任何担ä¿ã€‚甚至没有适åˆç‰¹å®šç›®çš„çš„éšå«çš„æ‹…ä¿ã€‚更详细的情况请å‚阅GNU通用公共许å¯è¯ã€‚" #: ../src/remminaabout.c:55 msgid "" "You should have received a copy of the GNU General Public License along with " "this program; if not, write to the Free Software Foundation, Inc., 59 Temple " "Place, Suite 330, Boston, MA 02111-1307, USA." msgstr "" "你应该已ç»å’Œç¨‹åºä¸€èµ·æ”¶åˆ°ä¸€ä»½GNU通用公共许å¯è¯çš„副本。如果还没有,写信给:The Free Software Foundation, Inc., " "675 Mass Ave, Cambridge, MA02139, USAã€‚è¿˜åº”åŠ ä¸Šå¦‚ä½•å’Œä½ ä¿æŒè”系的信æ¯ã€‚" #: ../src/remminaabout.c:68 msgid "The GTK+ Remote Desktop Client" msgstr "GTK+远程桌é¢å®¢æˆ·ç«¯" #: ../src/remminaabout.c:74 msgid "translator-credits" msgstr "" "Remmina的简体中文翻译由作者本人完æˆ\n" "\n" "Launchpad Contributions:\n" " Vic https://launchpad.net/~llyzs" #: ../src/remminaprefdialog.c:37 msgid "Open connection" msgstr "打开连接" #: ../src/remminaprefdialog.c:38 msgid "Edit settings" msgstr "编辑设置" #: ../src/remminaprefdialog.c:44 msgid "Nearest" msgstr "Nearest" #: ../src/remminaprefdialog.c:45 msgid "Tiles" msgstr "Tiles" #: ../src/remminaprefdialog.c:46 msgid "Bilinear" msgstr "Bilinear" #: ../src/remminaprefdialog.c:47 msgid "Hyper" msgstr "Hyper" #: ../src/remminaprefdialog.c:53 msgid "Automatic" msgstr "自动" #: ../src/remminaprefdialog.c:54 msgid "Scrolled window" msgstr "滚动视窗" #: ../src/remminaprefdialog.c:55 msgid "Scrolled fullscreen" msgstr "滚动全å±" #: ../src/remminaprefdialog.c:56 msgid "Viewport fullscreen" msgstr "视å£å…¨å±" #: ../src/remminaprefdialog.c:62 msgid "Tab by groups" msgstr "按分组" #: ../src/remminaprefdialog.c:63 msgid "Tab by protocols" msgstr "按åè®®" #: ../src/remminaprefdialog.c:64 msgid "Tab all connections" msgstr "全部" #: ../src/remminaprefdialog.c:65 msgid "Do not use tabs" msgstr "ç¦ç”¨" #: ../src/remminaprefdialog.c:150 msgid "Please enter format 'widthxheight'." msgstr "请正确输入“宽x高â€" #: ../src/remminaprefdialog.c:162 msgid "Recent lists cleared." msgstr "最近项已被清除" #. Create the dialog #: ../src/remminaprefdialog.c:320 msgid "Remmina Preferences" msgstr "Remmina首选项" #. Options tab #: ../src/remminaprefdialog.c:337 msgid "Options" msgstr "选项" #: ../src/remminaprefdialog.c:352 msgid "Remember last view mode for each connection" msgstr "è®°ä½æ¯ä¸ªè¿žæŽ¥çš„视窗模å¼" #: ../src/remminaprefdialog.c:358 msgid "Save settings when starting the connection" msgstr "连接时ä¿å­˜è®¾ç½®" #: ../src/remminaprefdialog.c:364 msgid "Invisible floating toolbar" msgstr "éšè—浮动工具æ " #: ../src/remminaprefdialog.c:377 msgid "Always show tabs" msgstr "始终显示选项å¡" #: ../src/remminaprefdialog.c:383 msgid "Hide connection toolbar" msgstr "éšè—连接工具æ " #: ../src/remminaprefdialog.c:389 msgid "Double-click action" msgstr "åŒå‡»åŠ¨ä½œ" #: ../src/remminaprefdialog.c:399 msgid "Default view mode" msgstr "默认视窗模å¼" #: ../src/remminaprefdialog.c:409 msgid "Tab interface" msgstr "标签页界é¢" #: ../src/remminaprefdialog.c:419 msgid "Scale quality" msgstr "缩放质é‡" #: ../src/remminaprefdialog.c:429 msgid "SSH tunnel local port" msgstr "SSHé€šé“æœ¬åœ°ç«¯å£" #: ../src/remminaprefdialog.c:441 msgid "Maximum recent items" msgstr "最近连接项数é‡" #: ../src/remminaprefdialog.c:457 msgid "Clear" msgstr "清除" #. Resolutions tab #: ../src/remminaprefdialog.c:463 msgid "Resolutions" msgstr "分辨率" #. Applet tab #: ../src/remminaprefdialog.c:483 msgid "Applet" msgstr "颿¿å°ç¨‹åº" #: ../src/remminaprefdialog.c:498 msgid "Show new connection on top of the menu" msgstr "在顶部显示新连接èœå•项" #: ../src/remminaprefdialog.c:504 msgid "Hide total count in group menu" msgstr "éšè—分组计数" #: ../src/remminaprefdialog.c:510 msgid "Disable tray icon" msgstr "ç¦ç”¨ç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡" #: ../src/remminaprefdialog.c:516 msgid "Start tray icon automatically" msgstr "自动å¯åŠ¨ç³»ç»Ÿæ‰˜ç›˜å›¾æ ‡" #: ../src/remminaprefdialog.c:523 msgid "Minimize windows to tray" msgstr "最å°åŒ–窗å£åˆ°ç³»ç»Ÿæ‰˜ç›˜" #. Keyboard tab #: ../src/remminaprefdialog.c:534 msgid "Keyboard" msgstr "键盘" #: ../src/remminaprefdialog.c:549 msgid "Host key" msgstr "主机键" #: ../src/remminaprefdialog.c:569 msgid "Auto-fit window" msgstr "自动调整视窗" #: ../src/remminaprefdialog.c:608 msgid "Grab keyboard" msgstr "独å é”®ç›˜" #: ../src/remminaprefdialog.c:638 msgid "Show / hide toolbar" msgstr "显示/éšè—工具æ " #. Terminal tab #: ../src/remminaprefdialog.c:649 msgid "Terminal" msgstr "终端" #: ../src/remminaprefdialog.c:664 msgid "Font" msgstr "字体" #: ../src/remminaprefdialog.c:669 msgid "Use system default font" msgstr "使用系统默认字体" #: ../src/remminaprefdialog.c:694 msgid "Scrollback lines" msgstr "å‘åŽæ»šåŠ¨çš„è¡Œæ•°" #: ../src/remminassh.c:129 #, c-format msgid "SSH password authentication failed: %s" msgstr "SSH密ç éªŒè¯å¤±è´¥: %s" #: ../src/remminassh.c:149 ../src/remminassh.c:157 ../src/remminassh.c:168 #: ../src/remminassh.c:178 #, c-format msgid "SSH public key authentication failed: %s" msgstr "SSH公钥验è¯å¤±è´¥: %s" #: ../src/remminassh.c:150 msgid "SSH Key file not yet set." msgstr "未设置ç§é’¥æ–‡ä»¶" #: ../src/remminassh.c:194 #, c-format msgid "SSH automatic public key authentication failed: %s" msgstr "SSH公钥验è¯å¤±è´¥: %s" #: ../src/remminassh.c:247 #, c-format msgid "Authenticating %s's password to SSH server %s..." msgstr "正在验è¯%s的密ç (SSHæœåС噍%s)..." #: ../src/remminassh.c:251 #, c-format msgid "Authenticating %s's identity to SSH server %s..." msgstr "正在验è¯%s的身份(SSHæœåС噍%s)..." #: ../src/remminassh.c:309 #, c-format msgid "Failed to startup SSH session: %s" msgstr "无法å¯åЍSSH会è¯: %s" #: ../src/remminassh.c:635 #, c-format msgid "Failed to connect to the SSH tunnel destination: %s" msgstr "无法连接到SSH通é“的目的地: %s" #: ../src/remminassh.c:668 #, c-format msgid "Failed to execute %s on SSH server : %%s" msgstr "无法在SSHæœåŠ¡å™¨ä¸Šè¿è¡Œ%s : %%s" #: ../src/remminassh.c:705 ../src/remminassh.c:730 #, c-format msgid "Failed to request port forwarding : %s" msgstr "无法申请端å£è½¬å‘ : %s" #: ../src/remminassh.c:777 msgid "No response from the server." msgstr "æœåŠ¡å™¨æ— å“应。" #: ../src/remminassh.c:1180 #, c-format msgid "Failed to create sftp session: %s" msgstr "无法创建SFTP会è¯: %s" #: ../src/remminassh.c:1185 #, c-format msgid "Failed to initialize sftp session: %s" msgstr "无法åˆå§‹åŒ–SFTP会è¯: %s" #: ../src/remminasshplugin.c:351 msgid "SSH - Secure Shell" msgstr "SSH - 安全Shell连接" #. Title #: ../src/remminachatwindow.c:175 #, c-format msgid "Chat with %s" msgstr "与 %s èŠå¤©" #: ../src/remminachatwindow.c:227 msgid "_Send" msgstr "å‘é€(_S)" #: ../src/remminachatwindow.c:237 msgid "_Clear" msgstr "清除(_C)" #: ../src/remminaftpclient.c:456 msgid "Choose download location" msgstr "选择下载目录" #: ../src/remminaftpclient.c:614 msgid "Are you sure to delete the selected files on server?" msgstr "确认è¦åˆ é™¤æœåŠ¡å™¨ä¸Šçš„æ–‡ä»¶ï¼Ÿ" #: ../src/remminaftpclient.c:671 msgid "Choose a file to upload" msgstr "选择è¦ä¸Šä¼ çš„æ–‡ä»¶" #: ../src/remminaftpclient.c:682 msgid "Upload folder" msgstr "上传文件夹" #: ../src/remminaftpclient.c:747 ../src/remminaftpclient.c:876 msgid "Download" msgstr "下载" #: ../src/remminaftpclient.c:755 ../src/remminaftpclient.c:887 msgid "Upload" msgstr "上传" #: ../src/remminaftpclient.c:857 msgid "Go to home folder" msgstr "跳到主目录" #: ../src/remminaftpclient.c:864 msgid "Go to parent folder" msgstr "跳到上一层目录" #: ../src/remminaftpclient.c:871 msgid "Refresh current folder" msgstr "刷新当å‰ç›®å½•" #: ../src/remminaftpclient.c:878 msgid "Download from server" msgstr "从æœåŠ¡å™¨ä¸‹è½½" #: ../src/remminaftpclient.c:889 msgid "Upload to server" msgstr "上传到æœåС噍" #: ../src/remminaftpclient.c:898 msgid "Delete files on server" msgstr "删除æœåŠ¡å™¨ä¸Šçš„æ–‡ä»¶" #: ../src/remminaftpclient.c:992 ../src/remminaftpclient.c:1064 msgid "File Name" msgstr "文件å" #: ../src/remminaftpclient.c:1005 ../src/remminaftpclient.c:1094 msgid "Size" msgstr "大å°" #: ../src/remminaftpclient.c:1013 msgid "User" msgstr "用户å" #: ../src/remminaftpclient.c:1027 msgid "Permission" msgstr "æƒé™" #: ../src/remminaftpclient.c:1080 msgid "Remote" msgstr "远程" #: ../src/remminaftpclient.c:1087 msgid "Local" msgstr "本地" #: ../src/remminaftpclient.c:1102 msgid "Progress" msgstr "进度" #: ../src/remminasftpclient.c:144 #, c-format msgid "Error creating directory %s." msgstr "创建目录 %s 错误" #: ../src/remminasftpclient.c:155 #, c-format msgid "Error opening file %s on server. %s" msgstr "打开远程文件 %s 错误. %s" #: ../src/remminasftpclient.c:163 #, c-format msgid "Error creating file %s." msgstr "创建文件 %s 错误" #: ../src/remminasftpclient.c:175 #, c-format msgid "Error writing file %s." msgstr "写入文件 %s 错误" #: ../src/remminasftpclient.c:218 #, c-format msgid "Error opening directory %s. %s" msgstr "打开目录 %s 错误. %s" #: ../src/remminasftpclient.c:339 #, c-format msgid "Error creating folder %s on server. %s" msgstr "æœåŠ¡å™¨åˆ›å»ºç›®å½•%s失败。%s" #: ../src/remminasftpclient.c:364 #, c-format msgid "Error creating file %s on server. %s" msgstr "创建远程文件 %s 错误. %s" #: ../src/remminasftpclient.c:372 #, c-format msgid "Error opening file %s." msgstr "打开文件 %s 错误" #: ../src/remminasftpclient.c:384 #, c-format msgid "Error writing file %s on server. %s" msgstr "写入远程文件 %s 错误. %s" #: ../src/remminasftpclient.c:607 ../src/remminasftpclient.c:678 #, c-format msgid "Failed to open directory %s. %s" msgstr "无法打开目录 %s. %s" #: ../src/remminasftpclient.c:625 #, c-format msgid "Failed reading directory. %s" msgstr "无法读å–目录. %s" #: ../src/remminasftpclient.c:743 msgid "" "File transfer currently in progress.\n" "Are you sure to cancel it?" msgstr "æ–‡ä»¶ä¼ è¾“æ­£åœ¨è¿›è¡Œã€‚ç¡®è®¤å–æ¶ˆå—?" #: ../src/remminasftpclient.c:779 #, c-format msgid "Failed to delete '%s'. %s" msgstr "无法删除 %s. %s" #: ../src/remminasftpplugin.c:244 msgid "Show Hidden Files" msgstr "显示éšè—文件" #: ../src/remminasftpplugin.c:252 msgid "SFTP - Secure File Transfer" msgstr "SFTP - 安全文件传输" #: ../src/remminascaler.c:62 msgid "Fit window size" msgstr "适åˆè§†çª—大å°" #: ../src/remminapluginmanager.c:39 msgid "Entry" msgstr "å…¥å£" #: ../src/remminapluginmanager.c:40 msgid "File" msgstr "文件" #: ../src/remminapluginmanager.c:41 msgid "Tool" msgstr "工具" #: ../src/remminapluginmanager.c:42 msgid "Preference" msgstr "首选项" #: ../src/remminapluginmanager.c:266 msgid "Type" msgstr "类型" #: ../src/remminapluginmanager.c:273 msgid "Description" msgstr "æè¿°" #: ../src/remminapluginmanager.c:280 msgid "Version" msgstr "版本" #: ../src/remminakeychooser.c:43 msgid "" msgstr "<æ— >" #: ../src/remminakeychooser.c:71 msgid "Choose a new key" msgstr "更新按键" #: ../src/remminakeychooser.c:85 msgid "Please press the new key..." msgstr "请按新的按键……" #: ../src/remminaexec.c:105 #, c-format msgid "Plugin %s is not registered." msgstr "æ’ä»¶%s未注册。" #: ../src/remminaicon.c:107 msgid "Open Main Window" msgstr "打开主窗å£" #: ../src/remminaicon.c:129 msgid "Enable Service Discovery" msgstr "开坿œåŠ¡ä¾¦æµ‹åŠŸèƒ½" #. Refresh it in case translation is updated #: ../src/remminaicon.c:342 ../src/remminaicon.c:421 msgid "Remmina Applet" msgstr "Remmina颿¿å°ç¨‹åº" #: ../src/remminaicon.c:343 ../src/remminaicon.c:422 msgid "Connect to remote desktops through the applet menu" msgstr "通过å°ç¨‹åºèœå•快速连接到远程桌é¢" #: ../src/remminaappletmenuitem.c:92 msgid "Discovered" msgstr "å·²å‘现" #: ../src/remminaappletmenuitem.c:97 msgid "New Connection" msgstr "新的连接" #~ msgid "Open a quick connection" #~ msgstr "打开一个快速连接" #~ msgid "Quick _Connect To" #~ msgstr "快速连接到(_C)" #~ msgid "RDP - Remote Desktop Protocol" #~ msgstr "RDP - Windows终端æœåŠ¡" #~ msgid "VNC - Virtual Network Computing" #~ msgstr "VNC - 虚拟网络计算" #~ msgid "VNC - Incoming Connection" #~ msgstr "VNC - 接入连接" #~ msgid "Quit Remmina" #~ msgstr "退出Remmina" #~ msgid "Remote Desktop Client" #~ msgstr "远程桌é¢å®¢æˆ·ç«¯" #~ msgid "256 Colors" #~ msgstr "256色" #~ msgid "High Color (15 bit)" #~ msgstr "高彩(15ä½)" #~ msgid "High Color (16 bit)" #~ msgstr "高彩(16ä½)" #~ msgid "True Color (24 bit)" #~ msgstr "真彩(24ä½)" #~ msgid "Poor (Fastest)" #~ msgstr "å·®(最快)" #~ msgid "Best (Slowest)" #~ msgstr "最好(最慢)" #~ msgid "None" #~ msgstr "æ— " #~ msgid "My Home Folder" #~ msgstr "我的主目录" #~ msgid "System Root Folder" #~ msgstr "系统根目录" #~ msgid "Use Client Resolution" #~ msgstr "使用客户机的分辨率" #~ msgid "Enable SSH Tunnel" #~ msgstr "å¯ç”¨SSH通é“" #, c-format #~ msgid "Same Server at Port %i" #~ msgstr "相åŒä¸»æœºä¸Šçš„%i端å£" #~ msgid "Character Set" #~ msgstr "字符集" #~ msgid "User Name" #~ msgstr "用户å" #~ msgid "Identity File" #~ msgstr "ç§é’¥æ–‡ä»¶" #~ msgid "Domain" #~ msgstr "域" #~ msgid "Color Depth" #~ msgstr "色彩" #~ msgid "Share Folder" #~ msgstr "共享目录" #~ msgid "Keyboard Mapping" #~ msgstr "键盘映射" #~ msgid "Client Name" #~ msgstr "客户机åç§°" #~ msgid "Startup Program" #~ msgstr "å¯åŠ¨ç¨‹åº" #~ msgid "Startup Path" #~ msgstr "å¯åŠ¨è·¯å¾„" #~ msgid "Attach to console (Windows 2003 or newer)" #~ msgstr "连接到控制å°(Windows 2003以上)" #~ msgid "Enable bitmap caching" #~ msgstr "使用ä½å›¾æ–‡ä»¶ç¼“å­˜" #~ msgid "Enable compression" #~ msgstr "使用压缩" #~ msgid "Advanced Arguments" #~ msgstr "é«˜çº§å‚æ•°" #~ msgid "Listen on Port" #~ msgstr "监å¬ç«¯å£" #~ msgid "Quality" #~ msgstr "画质" #~ msgid "Show remote cursor" #~ msgstr "显示远程游标" #~ msgid "View Only" #~ msgstr "仅查看" #~ msgid "Disable Server Input" #~ msgstr "ç¦æ­¢æœåŠ¡å™¨ç«¯è¾“å…¥" #~ msgid "Horizontal Scale" #~ msgstr "水平缩放比例" #~ msgid "Vertical Scale" #~ msgstr "垂直缩放比例" #~ msgid "Open Chat..." #~ msgstr "打开èŠå¤©..." #~ msgid "Auto-Fit Window" #~ msgstr "自动调整视窗" #~ msgid "Scrolled Window" #~ msgstr "滚动视窗" #~ msgid "Toggle scrolled window mode" #~ msgstr "å¯ç”¨æ»šåŠ¨è§†çª—æ¨¡å¼" #~ msgid "Scrolled Fullscreen" #~ msgstr "滚动全å±" #~ msgid "Toggle scrolled fullscreen mode" #~ msgstr "å¯ç”¨æ»šåЍ免屿¨¡å¼" #~ msgid "Viewport Fullscreen" #~ msgstr "视å£å…¨å±" #~ msgid "Toggle viewport fullscreen mode" #~ msgstr "å¯ç”¨è§†å£å…¨å±æ¨¡å¼" #~ msgid "Minimize Window" #~ msgstr "最å°åŒ–窗å£" #~ msgid "VNC Password" #~ msgstr "VNC密ç " #~ msgid "Unable to connect to VNC server" #~ msgstr "无法连接到VNCæœåС噍" #, c-format #~ msgid "Couldn't convert '%s' to host address" #~ msgstr "无法解æžä¸»æœº%s的地å€" #, c-format #~ msgid "VNC connection failed: %s" #~ msgstr "VNC连接失败: %s" #~ msgid "Your connection has been rejected." #~ msgstr "连接被拒ç»" #, c-format #~ msgid "Listening on Port %i for an Incoming VNC Connection..." #~ msgstr "正在端å£%i上监å¬VNC接入连接..." #~ msgid "VNC authentication failed. Trying to reconnect..." #~ msgstr "VNC验è¯å¤±è´¥, 釿–°è¿žæŽ¥..." #~ msgid "Open Connection" #~ msgstr "打开连接" #~ msgid "Edit Settings" #~ msgstr "编辑设置" #~ msgid "Remember Last View Mode for Each Connection" #~ msgstr "è®°ä½æ¯ä¸ªè¿žæŽ¥çš„视窗模å¼" #~ msgid "Invisible Floating Toolbar" #~ msgstr "éšè—浮动工具æ " #~ msgid "Double-click Action" #~ msgstr "åŒå‡»åŠ¨ä½œ" #~ msgid "Default View Mode" #~ msgstr "默认视窗模å¼" #~ msgid "Scale Quality" #~ msgstr "缩放质é‡" #~ msgid "SSH Tunnel Local Port" #~ msgstr "SSHé€šé“æœ¬åœ°ç«¯å£" #~ msgid "Maximum Recent Items" #~ msgstr "最近连接项数é‡" #~ msgid "Show Quick Connect on top of the Menu" #~ msgstr "在顶部显示快速连接èœå•项" #~ msgid "Hide Total Count in Group Expander" #~ msgstr "éšè—分组计数" #~ msgid "SSH Password" #~ msgstr "SSH密ç " #~ msgid "SSH Private Key Passphrase" #~ msgstr "SSHç§é’¥å¯†ç " #, c-format #~ msgid "File Transfer: %s" #~ msgstr "文件传输: %s" #~ msgid "" #~ "File transfer currently in progress.\n" #~ "Are you sure to quit?" #~ msgstr "文件传输正在进行。确认退出å—?" #, c-format #~ msgid "Secure File Transfer: %s" #~ msgstr "安全文件传输: %s" #, c-format #~ msgid "Connecting to SFTP server '%s'..." #~ msgstr "正在连接到SFTPæœåС噍%s..." #~ msgid "Fit Window Size" #~ msgstr "适åˆè§†çª—大å°" #~ msgid "_File" #~ msgstr "文件(_F)" #~ msgid "Settings" #~ msgstr "设置" #~ msgid "Scaled Mode" #~ msgstr "图åƒç¼©æ”¾æ¨¡å¼" #~ msgid "Grab Keyboard" #~ msgstr "独å é”®ç›˜" #~ msgid "Minimize" #~ msgstr "最å°åŒ–" #~ msgid "Open Connections in Separated Processes" #~ msgstr "在独立进程中打开连接" #~ msgid "Press Enter key to add new group" #~ msgstr "按回车键增加一个新的分组" #~ msgid "Press Enter key to add new resolution" #~ msgstr "按回车键增加一个新的分辨率" #~ msgid "Quit File Transfer" #~ msgstr "退出文件传输" #~ msgid "Grayscale" #~ msgstr "ç°åº¦" #~ msgid "XDMCP - X Remote Session" #~ msgstr "XDMCP - X远程会è¯" #~ msgid "Share Local Printers" #~ msgstr "å…±äº«æœ¬åœ°æ‰“å°æœº" #~ msgid "Sound" #~ msgstr "音效" #~ msgid "_Action" #~ msgstr "动作(_A)" #~ msgid "Public Key (Automatic)" #~ msgstr "公钥(自动)" #~ msgid "Off" #~ msgstr "å…³" #~ msgid "Please install Xephyr to enable XDMCP feature" #~ msgstr "请安装Xephyr软件包以å¯ç”¨XDMCP功能" #~ msgid "Use Local Cursor" #~ msgstr "使用本地游标" #~ msgid "Save Password" #~ msgstr "ä¿å­˜å¯†ç " #~ msgid "CA Certificate" #~ msgstr "æ ¹è¯ä¹¦" #~ msgid "Client Certificate" #~ msgstr "客户端è¯ä¹¦" #~ msgid "Please install xqproxy on SSH server in order to run XDMCP over SSH" #~ msgstr "请在SSHæœåŠ¡å™¨ç«¯å®‰è£…xqproxy以å¯ç”¨XDMCP over SSH功能" #~ msgid "Do Not Use Tabs" #~ msgstr "ç¦ç”¨" #~ msgid "Tab by Protocols" #~ msgstr "按åè®®" #~ msgid "Tab All Connections" #~ msgstr "全部" #~ msgid "Tab by Groups" #~ msgstr "按分组" #~ msgid "Tab Interface" #~ msgstr "标签页界é¢" #~ msgid "Client Key" #~ msgstr "客户端密钥" #~ msgid "Disconnect After One Session" #~ msgstr "一次会è¯ç»“æŸåŽæ–­å¼€è¿žæŽ¥" #, c-format #~ msgid "Protocol %s is not supported." #~ msgstr "䏿”¯æŒåè®®%s" #~ msgid "Refresh" #~ msgstr "刷新" #~ msgid "Disable Clipboard Sync" #~ msgstr "ç¦ç”¨å‰ªè´´æ¿åŒæ­¥" #~ msgid "Proxy Destination" #~ msgstr "代ç†ç›®çš„地å€" #~ msgid "Disable Encryption" #~ msgstr "ç¦ç”¨åР坆" #~ msgid "Show Remote Cursor" #~ msgstr "显示远程游标" #~ msgid "Use Window Size" #~ msgstr "è·Ÿéšçª—å£å¤§å°" #~ msgid "Tunnel via Loopback Address" #~ msgstr "通过loopback地å€å»ºç«‹éš§é“" #~ msgid "Always Show Tabs" #~ msgstr "始终显示选项å¡" #~ msgid "Hide Connection Toolbar" #~ msgstr "éšè—连接工具æ " #~ msgid "Save Settings When Starting the Connection" #~ msgstr "连接时ä¿å­˜è®¾ç½®" #, c-format #~ msgid "%s Password" #~ msgstr "%s密ç " #~ msgid "Switch Tab Pages" #~ msgstr "è½¬æ¢æ ‡ç­¾é¡µ" #~ msgid "Toggle Fullscreen Mode" #~ msgstr "å¯ç”¨å…¨å±æ¨¡å¼" #~ msgid "Show / Hide Toolbar" #~ msgstr "显示/éšè—工具æ " #~ msgid "Toggle Scaled Mode" #~ msgstr "å¯ç”¨å›¾åƒç¼©æ”¾æ¨¡å¼" #, c-format #~ msgid "Listening on Port %i for an Incoming %s Connection..." #~ msgstr "在%i端å£ç›‘å¬ä¼ å…¥çš„%s连接" #~ msgid "Host Key" #~ msgstr "主机键" #~ msgid "Medium" #~ msgstr "中等" #~ msgid "Good" #~ msgstr "良好" FreeRDP-Remmina-356c033/remmina/remmina.pc.in000066400000000000000000000003131171526373700206210ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: Remmina Description: The GTK+ Remote Desktop Client Version: @VERSION@ Requires: Libs: Cflags: -I${includedir} FreeRDP-Remmina-356c033/remmina/src/000077500000000000000000000000001171526373700170325ustar00rootroot00000000000000FreeRDP-Remmina-356c033/remmina/src/remmina.c000066400000000000000000000144071171526373700206340ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "config.h" #include "remmina_public.h" #include "remmina_main.h" #include "remmina_file_manager.h" #include "remmina_pref.h" #include "remmina_widget_pool.h" #include "remmina_plugin_manager.h" #include "remmina_sftp_plugin.h" #include "remmina_ssh_plugin.h" #include "remmina_exec.h" #include "remmina_icon.h" #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_PTHREAD #include #endif #ifdef HAVE_LIBGCRYPT #include GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif static gboolean remmina_option_about; static gchar *remmina_option_connect; static gchar *remmina_option_edit; static gboolean remmina_option_help; static gboolean remmina_option_new; static gchar *remmina_option_pref; static gchar *remmina_option_plugin; static gboolean remmina_option_quit; static gchar *remmina_option_server; static gchar *remmina_option_protocol; static GOptionEntry remmina_options[] = { { "about", 'a', 0, G_OPTION_ARG_NONE, &remmina_option_about, "Show about dialog", NULL }, { "connect", 'c', 0, G_OPTION_ARG_FILENAME, &remmina_option_connect, "Connect to a .remmina file F", "F" }, { "edit", 'e', 0, G_OPTION_ARG_FILENAME, &remmina_option_edit, "Edit a .remmina file F", "F" }, { "help", '?', G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &remmina_option_help, NULL, NULL }, { "new", 'n', 0, G_OPTION_ARG_NONE, &remmina_option_new, "Create a new connection profile", NULL }, { "pref", 'p', 0, G_OPTION_ARG_STRING, &remmina_option_pref, "Show preference dialog", NULL }, { "plugin", 'x', 0, G_OPTION_ARG_STRING, &remmina_option_plugin, "Execute plugin P", "P" }, { "quit", 'q', 0, G_OPTION_ARG_NONE, &remmina_option_quit, "Quit the application", NULL }, { "server", 's', 0, G_OPTION_ARG_STRING, &remmina_option_server, "Use default server name S", "S" }, { "protocol", 't', 0, G_OPTION_ARG_STRING, &remmina_option_protocol, "Use default protocol T", "T" }, { NULL } }; static gint remmina_on_command_line(GApplication *app, GApplicationCommandLine *cmdline) { gint status = 0; gint argc; gchar **argv; GError *error = NULL; GOptionContext *context; gboolean parsed; gchar *s; gboolean executed = FALSE; remmina_option_about = FALSE; remmina_option_connect = NULL; remmina_option_edit = NULL; remmina_option_help = FALSE; remmina_option_new = FALSE; remmina_option_pref = NULL; remmina_option_plugin = NULL; remmina_option_server = NULL; remmina_option_protocol = NULL; argv = g_application_command_line_get_arguments(cmdline, &argc); context = g_option_context_new("- The GTK+ Remote Desktop Client"); g_option_context_add_main_entries(context, remmina_options, GETTEXT_PACKAGE); g_option_context_set_help_enabled(context, FALSE); parsed = g_option_context_parse(context, &argc, &argv, &error); g_strfreev(argv); if (!parsed) { g_print("option parsing failed: %s\n", error->message); status = 1; } if (remmina_option_quit) { gtk_main_quit(); status = 1; } if (remmina_option_about) { remmina_exec_command(REMMINA_COMMAND_ABOUT, NULL); executed = TRUE; } if (remmina_option_connect) { remmina_exec_command(REMMINA_COMMAND_CONNECT, remmina_option_connect); executed = TRUE; } if (remmina_option_edit) { remmina_exec_command(REMMINA_COMMAND_EDIT, remmina_option_edit); executed = TRUE; } if (remmina_option_help) { s = g_option_context_get_help(context, TRUE, NULL); g_print("%s", s); g_free(s); status = 1; } if (remmina_option_new) { if (remmina_option_server) { s = g_strdup_printf("%s,%s", remmina_option_protocol, remmina_option_server); } else { s = g_strdup(remmina_option_protocol); } remmina_exec_command(REMMINA_COMMAND_NEW, s); g_free(s); executed = TRUE; } if (remmina_option_pref) { remmina_exec_command(REMMINA_COMMAND_PREF, remmina_option_pref); executed = TRUE; } if (remmina_option_plugin) { remmina_exec_command(REMMINA_COMMAND_PLUGIN, remmina_option_plugin); executed = TRUE; } if (!executed) { remmina_exec_command(REMMINA_COMMAND_MAIN, NULL); } g_option_context_free(context); return status; } static void remmina_on_startup(GApplication *app) { remmina_file_manager_init(); remmina_pref_init(); remmina_plugin_manager_init(); remmina_widget_pool_init(); remmina_sftp_plugin_register(); remmina_ssh_plugin_register(); remmina_icon_init(); g_set_application_name("Remmina"); gtk_window_set_default_icon_name("remmina"); gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), REMMINA_DATADIR G_DIR_SEPARATOR_S "icons"); } int main(int argc, char* argv[]) { GApplication* app; int status; bindtextdomain(GETTEXT_PACKAGE, REMMINA_LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); textdomain(GETTEXT_PACKAGE); #ifdef HAVE_PTHREAD g_thread_init (NULL); gdk_threads_init (); #endif #ifdef HAVE_LIBGCRYPT gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); gcry_check_version (NULL); gcry_control (GCRYCTL_DISABLE_SECMEM, 0); gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0); #endif gtk_init(&argc, &argv); app = g_application_new("org.Remmina", G_APPLICATION_HANDLES_COMMAND_LINE); g_signal_connect(app, "startup", G_CALLBACK(remmina_on_startup), NULL); g_signal_connect(app, "command-line", G_CALLBACK(remmina_on_command_line), NULL); g_application_set_inactivity_timeout(app, 10000); status = g_application_run(app, argc, argv); if (status == 0 && !g_application_get_is_remote(app)) { THREADS_ENTER gtk_main(); THREADS_LEAVE } g_object_unref(app); return status; } FreeRDP-Remmina-356c033/remmina/src/remmina_about.c000066400000000000000000000065531171526373700220310ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "config.h" #include "remmina_widget_pool.h" #include "remmina_about.h" void remmina_about_open(GtkWindow* parent) { const gchar* authors[] = { N_("Maintainers:"), "Vic Lee ", "", N_("Contributors:"), "Alex Chateau ", "Alexander Logvinov ", "Harun Trefry ", "Nikolay Botev ", NULL }; const gchar* artists[] = { "Martin Lettner ", NULL }; const gchar* licenses[] = { N_("Remmina 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."), N_("Remmina 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."), N_( "You should have received a copy of the GNU General Public License " "along with this program; if not, write to the Free Software " "Foundation, Inc., 59 Temple Place, Suite 330, " "Boston, MA 02111-1307, USA.") }; gchar* license = g_strjoin("\n\n", _(licenses[0]), _(licenses[1]), _(licenses[2]), NULL); GtkWidget* dialog; dialog = gtk_about_dialog_new(); gtk_about_dialog_set_program_name(GTK_ABOUT_DIALOG(dialog), "Remmina"); gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), VERSION); gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), "Copyright (C) 2009-2010 Vic Lee"); gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), _("The GTK+ Remote Desktop Client")), gtk_about_dialog_set_license( GTK_ABOUT_DIALOG(dialog), license); gtk_about_dialog_set_wrap_license(GTK_ABOUT_DIALOG(dialog), TRUE); gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog), "http://remmina.sourceforge.net"); gtk_about_dialog_set_authors(GTK_ABOUT_DIALOG(dialog), authors); gtk_about_dialog_set_artists(GTK_ABOUT_DIALOG(dialog), artists); gtk_about_dialog_set_translator_credits(GTK_ABOUT_DIALOG(dialog), _("translator-credits")); gtk_about_dialog_set_logo_icon_name(GTK_ABOUT_DIALOG(dialog), "remmina"); if (parent) { gtk_window_set_transient_for(GTK_WINDOW(dialog), parent); gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); } g_signal_connect(dialog, "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_window_present(GTK_WINDOW(dialog)); remmina_widget_pool_register(dialog); g_free(license); } FreeRDP-Remmina-356c033/remmina/src/remmina_about.h000066400000000000000000000017631171526373700220340ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAABOUT_H__ #define __REMMINAABOUT_H__ G_BEGIN_DECLS GdkPixbuf* remmina_about_get_logo(void); void remmina_about_open(GtkWindow *parent); G_END_DECLS #endif /* __REMMINAABOUT_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_applet_menu.c000066400000000000000000000165051171526373700232260ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "remmina_applet_menu_item.h" #include "remmina_applet_menu.h" G_DEFINE_TYPE( RemminaAppletMenu, remmina_applet_menu, GTK_TYPE_MENU) struct _RemminaAppletMenuPriv { gboolean hide_count; }; enum { LAUNCH_ITEM_SIGNAL, EDIT_ITEM_SIGNAL, LAST_SIGNAL }; static guint remmina_applet_menu_signals[LAST_SIGNAL] = { 0 }; static void remmina_applet_menu_destroy(RemminaAppletMenu *menu, gpointer data) { g_free(menu->priv); } static void remmina_applet_menu_class_init(RemminaAppletMenuClass *klass) { remmina_applet_menu_signals[LAUNCH_ITEM_SIGNAL] = g_signal_new("launch-item", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaAppletMenuClass, launch_item), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); remmina_applet_menu_signals[EDIT_ITEM_SIGNAL] = g_signal_new("edit-item", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaAppletMenuClass, edit_item), NULL, NULL, g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, G_TYPE_OBJECT); } static void remmina_applet_menu_init(RemminaAppletMenu *menu) { menu->priv = g_new0(RemminaAppletMenuPriv, 1); g_signal_connect(G_OBJECT(menu), "destroy", G_CALLBACK(remmina_applet_menu_destroy), NULL); } static void remmina_applet_menu_on_item_activate(RemminaAppletMenuItem *menuitem, RemminaAppletMenu *menu) { g_signal_emit(G_OBJECT(menu), remmina_applet_menu_signals[LAUNCH_ITEM_SIGNAL], 0, menuitem); } static GtkWidget* remmina_applet_menu_add_group(GtkWidget *menu, const gchar *group, gint position, RemminaAppletMenuItem *menuitem, GtkWidget **groupmenuitem) { GtkWidget *widget; GtkWidget *image; GtkWidget *submenu; widget = gtk_image_menu_item_new_with_label(group); gtk_widget_show(widget); image = gtk_image_new_from_icon_name( (menuitem->item_type == REMMINA_APPLET_MENU_ITEM_DISCOVERED ? "folder-remote" : "folder"), GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(widget), image); gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(widget), TRUE); g_object_set_data_full(G_OBJECT(widget), "group", g_strdup(group), g_free); g_object_set_data(G_OBJECT(widget), "count", GINT_TO_POINTER(0)); if (groupmenuitem) { *groupmenuitem = widget; } if (position < 0) { gtk_menu_shell_append(GTK_MENU_SHELL(menu), widget); } else { gtk_menu_shell_insert(GTK_MENU_SHELL(menu), widget, position); } submenu = gtk_menu_new(); gtk_widget_show(submenu); gtk_menu_item_set_submenu(GTK_MENU_ITEM(widget), submenu); return submenu; } static void remmina_applet_menu_increase_group_count(GtkWidget *widget) { gint cnt; gchar *s; cnt = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "count")) + 1; g_object_set_data(G_OBJECT(widget), "count", GINT_TO_POINTER(cnt)); s = g_strdup_printf("%s (%i)", (const gchar*) g_object_get_data(G_OBJECT(widget), "group"), cnt); gtk_menu_item_set_label(GTK_MENU_ITEM(widget), s); g_free(s); } void remmina_applet_menu_register_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem) { g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_applet_menu_on_item_activate), menu); } void remmina_applet_menu_add_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem) { GtkWidget *submenu; GtkWidget *groupmenuitem; GtkMenuItem *submenuitem; gchar *s, *p1, *p2; GList *childs, *child; gint position; gint cmp; submenu = GTK_WIDGET(menu); s = g_strdup(menuitem->group); p1 = s; p2 = p1 ? strchr(p1, '/') : NULL; if (p2) *p2++ = '\0'; while (p1 && p1[0]) { groupmenuitem = NULL; childs = gtk_container_get_children(GTK_CONTAINER(submenu)); position = -1; for (child = g_list_first(childs); child; child = g_list_next(child)) { if (!GTK_IS_MENU_ITEM(child->data)) continue; position++; submenuitem = GTK_MENU_ITEM(child->data); if (gtk_menu_item_get_submenu(submenuitem)) { cmp = g_strcmp0(p1, (gchar*) g_object_get_data(G_OBJECT(submenuitem), "group")); if (cmp == 0) { /* Found existing group menu */ submenu = gtk_menu_item_get_submenu(submenuitem); groupmenuitem = GTK_WIDGET(submenuitem); break; } else if (cmp < 0) { submenu = remmina_applet_menu_add_group(submenu, p1, position, menuitem, &groupmenuitem); break; } } else { submenu = remmina_applet_menu_add_group(submenu, p1, position, menuitem, &groupmenuitem); break; } } if (!child) { submenu = remmina_applet_menu_add_group(submenu, p1, -1, menuitem, &groupmenuitem); } g_list_free(childs); if (groupmenuitem && !menu->priv->hide_count) { remmina_applet_menu_increase_group_count(groupmenuitem); } p1 = p2; p2 = p1 ? strchr(p1, '/') : NULL; if (p2) *p2++ = '\0'; } g_free(s); childs = gtk_container_get_children(GTK_CONTAINER(submenu)); position = -1; for (child = g_list_first(childs); child; child = g_list_next(child)) { if (!GTK_IS_MENU_ITEM(child->data)) continue; position++; submenuitem = GTK_MENU_ITEM(child->data); if (gtk_menu_item_get_submenu(submenuitem)) continue; if (!REMMINA_IS_APPLET_MENU_ITEM(submenuitem)) continue; cmp = g_strcmp0(menuitem->name, REMMINA_APPLET_MENU_ITEM(submenuitem)->name); if (cmp <= 0) { gtk_menu_shell_insert(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem), position); break; } } if (!child) { gtk_menu_shell_append(GTK_MENU_SHELL(submenu), GTK_WIDGET(menuitem)); } remmina_applet_menu_register_item(menu, menuitem); } GtkWidget* remmina_applet_menu_new(void) { RemminaAppletMenu *menu; menu = REMMINA_APPLET_MENU(g_object_new(REMMINA_TYPE_APPLET_MENU, NULL)); return GTK_WIDGET(menu); } void remmina_applet_menu_set_hide_count(RemminaAppletMenu *menu, gboolean hide_count) { menu->priv->hide_count = hide_count; } void remmina_applet_menu_populate(RemminaAppletMenu *menu) { GtkWidget *menuitem; gchar dirname[256]; gchar filename[256]; GDir *dir; const gchar *name; g_snprintf(dirname, sizeof(dirname), "%s/.remmina", g_get_home_dir()); dir = g_dir_open(dirname, 0, NULL); if (dir != NULL) { /* Iterate all remote desktop profiles */ while ((name = g_dir_read_name(dir)) != NULL) { if (!g_str_has_suffix(name, ".remmina")) continue; g_snprintf(filename, sizeof(filename), "%s/%s", dirname, name); menuitem = remmina_applet_menu_item_new(REMMINA_APPLET_MENU_ITEM_FILE, filename); remmina_applet_menu_add_item(menu, REMMINA_APPLET_MENU_ITEM(menuitem)); gtk_widget_show(menuitem); } g_dir_close(dir); } } FreeRDP-Remmina-356c033/remmina/src/remmina_applet_menu.h000066400000000000000000000050321171526373700232240ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAAPPLETMENU_H__ #define __REMMINAAPPLETMENU_H__ G_BEGIN_DECLS #define REMMINA_TYPE_APPLET_MENU (remmina_applet_menu_get_type ()) #define REMMINA_APPLET_MENU(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_APPLET_MENU, RemminaAppletMenu)) #define REMMINA_APPLET_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_APPLET_MENU, RemminaAppletMenuClass)) #define REMMINA_IS_APPLET_MENU(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_APPLET_MENU)) #define REMMINA_IS_APPLET_MENU_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_APPLET_MENU)) #define REMMINA_APPLET_MENU_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_APPLET_MENU, RemminaAppletMenuClass)) typedef enum { REMMINA_APPLET_MENU_NEW_CONNECTION_NONE, REMMINA_APPLET_MENU_NEW_CONNECTION_TOP, REMMINA_APPLET_MENU_NEW_CONNECTION_BOTTOM } RemminaAppletMenuNewConnectionType; typedef struct _RemminaAppletMenuPriv RemminaAppletMenuPriv; typedef struct _RemminaAppletMenu { GtkMenu menu; RemminaAppletMenuPriv* priv; } RemminaAppletMenu; typedef struct _RemminaAppletMenuClass { GtkMenuClass parent_class; void (*launch_item)(RemminaAppletMenu* menu); void (*edit_item)(RemminaAppletMenu* menu); } RemminaAppletMenuClass; GType remmina_applet_menu_get_type(void) G_GNUC_CONST; void remmina_applet_menu_register_item(RemminaAppletMenu* menu, RemminaAppletMenuItem* menuitem); void remmina_applet_menu_add_item(RemminaAppletMenu* menu, RemminaAppletMenuItem* menuitem); GtkWidget* remmina_applet_menu_new(void); void remmina_applet_menu_set_hide_count(RemminaAppletMenu* menu, gboolean hide_count); void remmina_applet_menu_populate(RemminaAppletMenu* menu); G_END_DECLS #endif /* __REMMINAAPPLETMENU_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_applet_menu_item.c000066400000000000000000000126301171526373700242370ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "remmina_applet_menu_item.h" G_DEFINE_TYPE( RemminaAppletMenuItem, remmina_applet_menu_item, GTK_TYPE_IMAGE_MENU_ITEM) #define IS_EMPTY(s) ((!s)||(s[0]==0)) static void remmina_applet_menu_item_destroy(RemminaAppletMenuItem* item, gpointer data) { g_free(item->filename); g_free(item->name); g_free(item->group); g_free(item->protocol); g_free(item->server); } static void remmina_applet_menu_item_class_init(RemminaAppletMenuItemClass* klass) { } static void remmina_applet_menu_item_init(RemminaAppletMenuItem* item) { item->filename = NULL; item->name = NULL; item->group = NULL; item->protocol = NULL; item->server = NULL; item->ssh_enabled = FALSE; g_signal_connect(G_OBJECT(item), "destroy", G_CALLBACK(remmina_applet_menu_item_destroy), NULL); } GtkWidget* remmina_applet_menu_item_new(RemminaAppletMenuItemType item_type, ...) { va_list ap; RemminaAppletMenuItem* item; GKeyFile* gkeyfile; GtkWidget* widget; const gchar* iconname; va_start(ap, item_type); item = REMMINA_APPLET_MENU_ITEM(g_object_new(REMMINA_TYPE_APPLET_MENU_ITEM, NULL)); item->item_type = item_type; switch (item_type) { case REMMINA_APPLET_MENU_ITEM_FILE: item->filename = g_strdup(va_arg(ap, const gchar*)); /* Load the file */ gkeyfile = g_key_file_new(); if (!g_key_file_load_from_file(gkeyfile, item->filename, G_KEY_FILE_NONE, NULL)) return NULL; item->name = g_key_file_get_string(gkeyfile, "remmina", "name", NULL); item->group = g_key_file_get_string(gkeyfile, "remmina", "group", NULL); item->protocol = g_key_file_get_string(gkeyfile, "remmina", "protocol", NULL); item->server = g_key_file_get_string(gkeyfile, "remmina", "server", NULL); item->ssh_enabled = g_key_file_get_boolean(gkeyfile, "remmina", "ssh_enabled", NULL); g_key_file_free(gkeyfile); break; case REMMINA_APPLET_MENU_ITEM_DISCOVERED: item->name = g_strdup(va_arg(ap, const gchar *)); item->group = g_strdup(_("Discovered")); item->protocol = g_strdup("VNC"); break; case REMMINA_APPLET_MENU_ITEM_NEW: item->name = g_strdup(_("New Connection")); break; } va_end(ap); /* Create the label */ widget = gtk_label_new(item->name); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_container_add(GTK_CONTAINER(item), widget); /* Create the image */ if (item_type == REMMINA_APPLET_MENU_ITEM_FILE || item_type == REMMINA_APPLET_MENU_ITEM_DISCOVERED) { if (g_strcmp0(item->protocol, "SFTP") == 0) { iconname = "remmina-sftp"; } else if (g_strcmp0(item->protocol, "SSH") == 0) { iconname = "utilities-terminal"; } else if (g_strcmp0(item->protocol, "RDP") == 0) { iconname = (item->ssh_enabled ? "remmina-rdp-ssh" : "remmina-rdp"); } else if (strncmp (item->protocol, "VNC", 3) == 0) { iconname = (item->ssh_enabled ? "remmina-vnc-ssh" : "remmina-vnc"); } else if (g_strcmp0(item->protocol, "XDMCP") == 0) { iconname = (item->ssh_enabled ? "remmina-xdmcp-ssh" : "remmina-xdmcp"); } else if (g_strcmp0(item->protocol, "NX") == 0) { iconname = "remmina-nx"; } else { iconname = "remmina"; } widget = gtk_image_new_from_icon_name(iconname, GTK_ICON_SIZE_MENU); } else { widget = gtk_image_new_from_stock(GTK_STOCK_JUMP_TO, GTK_ICON_SIZE_MENU); } gtk_widget_show(widget); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), widget); gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(item), TRUE); if (item->server) { gtk_widget_set_tooltip_text(GTK_WIDGET(item), item->server); } return GTK_WIDGET(item); } gint remmina_applet_menu_item_compare(gconstpointer a, gconstpointer b, gpointer user_data) { gint cmp; RemminaAppletMenuItem* itema; RemminaAppletMenuItem* itemb; /* Passed in parameters are pointers to pointers */ itema = REMMINA_APPLET_MENU_ITEM(*((void**) a)); itemb = REMMINA_APPLET_MENU_ITEM(*((void**) b)); /* Put ungrouped items to the last */ if (IS_EMPTY(itema->group) && !IS_EMPTY(itemb->group)) return 1; if (!IS_EMPTY(itema->group) && IS_EMPTY(itemb->group)) return -1; /* Put discovered items the last group */ if (itema->item_type == REMMINA_APPLET_MENU_ITEM_DISCOVERED && itemb->item_type != REMMINA_APPLET_MENU_ITEM_DISCOVERED) return 1; if (itema->item_type != REMMINA_APPLET_MENU_ITEM_DISCOVERED && itemb->item_type == REMMINA_APPLET_MENU_ITEM_DISCOVERED) return -1; if (itema->item_type != REMMINA_APPLET_MENU_ITEM_DISCOVERED && !IS_EMPTY(itema->group)) { cmp = g_strcmp0(itema->group, itemb->group); if (cmp != 0) return cmp; } return g_strcmp0(itema->name, itemb->name); } FreeRDP-Remmina-356c033/remmina/src/remmina_applet_menu_item.h000066400000000000000000000046031171526373700242450ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAAPPLETMENUITEM_H__ #define __REMMINAAPPLETMENUITEM_H__ G_BEGIN_DECLS #define REMMINA_TYPE_APPLET_MENU_ITEM (remmina_applet_menu_item_get_type()) #define REMMINA_APPLET_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), REMMINA_TYPE_APPLET_MENU_ITEM, RemminaAppletMenuItem)) #define REMMINA_APPLET_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), REMMINA_TYPE_APPLET_MENU_ITEM, RemminaAppletMenuItemClass)) #define REMMINA_IS_APPLET_MENU_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), REMMINA_TYPE_APPLET_MENU_ITEM)) #define REMMINA_IS_APPLET_MENU_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), REMMINA_TYPE_APPLET_MENU_ITEM)) #define REMMINA_APPLET_MENU_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), REMMINA_TYPE_APPLET_MENU_ITEM, RemminaAppletMenuItemClass)) typedef enum { REMMINA_APPLET_MENU_ITEM_FILE, REMMINA_APPLET_MENU_ITEM_NEW, REMMINA_APPLET_MENU_ITEM_DISCOVERED } RemminaAppletMenuItemType; typedef struct _RemminaAppletMenuItem { GtkImageMenuItem image_menu_item; RemminaAppletMenuItemType item_type; gchar* filename; gchar* name; gchar* group; gchar* protocol; gchar* server; gboolean ssh_enabled; } RemminaAppletMenuItem; typedef struct _RemminaAppletMenuItemClass { GtkImageMenuItemClass parent_class; } RemminaAppletMenuItemClass; GType remmina_applet_menu_item_get_type(void) G_GNUC_CONST; GtkWidget* remmina_applet_menu_item_new(RemminaAppletMenuItemType item_type, ...); gint remmina_applet_menu_item_compare(gconstpointer a, gconstpointer b, gpointer user_data); G_END_DECLS #endif /* __REMMINAAPPLETMENUITEM_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_avahi.c000066400000000000000000000155671171526373700220140ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "config.h" #include "remmina_avahi.h" #ifdef HAVE_LIBAVAHI_CLIENT #include #include #include #include #include struct _RemminaAvahiPriv { AvahiSimplePoll* simple_poll; AvahiClient* client; AvahiServiceBrowser* sb; guint iterate_handler; gboolean has_event; }; static void remmina_avahi_resolve_callback( AvahiServiceResolver* r, AVAHI_GCC_UNUSED AvahiIfIndex interface, AVAHI_GCC_UNUSED AvahiProtocol protocol, AvahiResolverEvent event, const char* name, const char* type, const char* domain, const char* host_name, const AvahiAddress* address, uint16_t port, AvahiStringList* txt, AvahiLookupResultFlags flags, AVAHI_GCC_UNUSED void* userdata) { gchar* key; gchar* value; RemminaAvahi* ga = (RemminaAvahi*) userdata; assert(r); ga->priv->has_event = TRUE; switch (event) { case AVAHI_RESOLVER_FAILURE: g_print("(remmina-applet avahi-resolver) Failed to resolve service '%s' of type '%s' in domain '%s': %s\n", name, type, domain, avahi_strerror(avahi_client_errno(avahi_service_resolver_get_client(r)))); break; case AVAHI_RESOLVER_FOUND: key = g_strdup_printf("%s,%s,%s", name, type, domain); if (g_hash_table_lookup(ga->discovered_services, key)) { g_free(key); break; } value = g_strdup_printf("[%s]:%i", host_name, port); g_hash_table_insert(ga->discovered_services, key, value); /* key and value will be freed with g_free when the has table is freed */ g_print("(remmina-applet avahi-resolver) Added service '%s'\n", value); break; } avahi_service_resolver_free(r); } static void remmina_avahi_browse_callback( AvahiServiceBrowser* b, AvahiIfIndex interface, AvahiProtocol protocol, AvahiBrowserEvent event, const char* name, const char* type, const char* domain, AVAHI_GCC_UNUSED AvahiLookupResultFlags flags, void* userdata) { gchar* key; RemminaAvahi* ga = (RemminaAvahi*) userdata; assert(b); ga->priv->has_event = TRUE; switch (event) { case AVAHI_BROWSER_FAILURE: g_print("(remmina-applet avahi-browser) %s\n", avahi_strerror(avahi_client_errno (avahi_service_browser_get_client (b)))); return; case AVAHI_BROWSER_NEW: key = g_strdup_printf("%s,%s,%s", name, type, domain); if (g_hash_table_lookup(ga->discovered_services, key)) { g_free(key); break; } g_free(key); g_print("(remmina-applet avahi-browser) Found service '%s' of type '%s' in domain '%s'\n", name, type, domain); if (!(avahi_service_resolver_new(ga->priv->client, interface, protocol, name, type, domain, AVAHI_PROTO_UNSPEC, 0, remmina_avahi_resolve_callback, ga))) { g_print("(remmina-applet avahi-browser) Failed to resolve service '%s': %s\n", name, avahi_strerror(avahi_client_errno (ga->priv->client))); } break; case AVAHI_BROWSER_REMOVE: g_print("(remmina-applet avahi-browser) Removed service '%s' of type '%s' in domain '%s'\n", name, type, domain); key = g_strdup_printf("%s,%s,%s", name, type, domain); g_hash_table_remove(ga->discovered_services, key); g_free(key); break; case AVAHI_BROWSER_ALL_FOR_NOW: case AVAHI_BROWSER_CACHE_EXHAUSTED: break; } } static void remmina_avahi_client_callback(AvahiClient* c, AvahiClientState state, AVAHI_GCC_UNUSED void * userdata) { RemminaAvahi* ga = (RemminaAvahi*) userdata; ga->priv->has_event = TRUE; if (state == AVAHI_CLIENT_FAILURE) { g_print("(remmina-applet avahi) Server connection failure: %s\n", avahi_strerror(avahi_client_errno(c))); } } static gboolean remmina_avahi_iterate(RemminaAvahi* ga) { while (TRUE) { /* Call the iteration until no further events */ ga->priv->has_event = FALSE; avahi_simple_poll_iterate(ga->priv->simple_poll, 0); if (!ga->priv->has_event) break; } return TRUE; } RemminaAvahi* remmina_avahi_new(void) { RemminaAvahi* ga; ga = g_new(RemminaAvahi, 1); ga->discovered_services = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); ga->started = FALSE; ga->priv = g_new(RemminaAvahiPriv, 1); ga->priv->simple_poll = NULL; ga->priv->client = NULL; ga->priv->sb = NULL; ga->priv->iterate_handler = 0; ga->priv->has_event = FALSE; return ga; } void remmina_avahi_start(RemminaAvahi* ga) { int error; if (ga->started) return; ga->started = TRUE; ga->priv->simple_poll = avahi_simple_poll_new(); if (!ga->priv->simple_poll) { g_print("Failed to create simple poll object.\n"); return; } ga->priv->client = avahi_client_new(avahi_simple_poll_get(ga->priv->simple_poll), 0, remmina_avahi_client_callback, ga, &error); if (!ga->priv->client) { g_print("Failed to create client: %s\n", avahi_strerror(error)); return; } /* TODO: Customize the default domain here */ ga->priv->sb = avahi_service_browser_new(ga->priv->client, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, "_rfb._tcp", NULL, 0, remmina_avahi_browse_callback, ga); if (!ga->priv->sb) { g_print("Failed to create service browser: %s\n", avahi_strerror(avahi_client_errno(ga->priv->client))); return; } ga->priv->iterate_handler = g_timeout_add(5000, (GSourceFunc) remmina_avahi_iterate, ga); } void remmina_avahi_stop(RemminaAvahi* ga) { g_hash_table_remove_all(ga->discovered_services); if (ga->priv->iterate_handler) { g_source_remove(ga->priv->iterate_handler); ga->priv->iterate_handler = 0; } if (ga->priv->sb) { avahi_service_browser_free(ga->priv->sb); ga->priv->sb = NULL; } if (ga->priv->client) { avahi_client_free(ga->priv->client); ga->priv->client = NULL; } if (ga->priv->simple_poll) { avahi_simple_poll_free(ga->priv->simple_poll); ga->priv->simple_poll = NULL; } ga->started = FALSE; } void remmina_avahi_free(RemminaAvahi* ga) { if (ga == NULL) return; remmina_avahi_stop(ga); g_free(ga->priv); g_hash_table_destroy(ga->discovered_services); g_free(ga); } #else RemminaAvahi* remmina_avahi_new(void) { return NULL; } void remmina_avahi_start(RemminaAvahi* ga) { } void remmina_avahi_stop(RemminaAvahi* ga) { } void remmina_avahi_free(RemminaAvahi* ga) { } #endif FreeRDP-Remmina-356c033/remmina/src/remmina_avahi.h000066400000000000000000000023731171526373700220100ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAAVAHI_H__ #define __REMMINAAVAHI_H__ G_BEGIN_DECLS typedef struct _RemminaAvahiPriv RemminaAvahiPriv; typedef struct _RemminaAvahi { GHashTable *discovered_services; gboolean started; RemminaAvahiPriv *priv; } RemminaAvahi; RemminaAvahi* remmina_avahi_new(void); void remmina_avahi_start(RemminaAvahi* ga); void remmina_avahi_stop(RemminaAvahi* ga); void remmina_avahi_free(RemminaAvahi* ga); G_END_DECLS #endif /* __REMMINAAVAHI_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_chain_button.c000066400000000000000000000114051171526373700233640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "remmina_chain_button.h" G_DEFINE_TYPE (RemminaChainButton, remmina_chain_button, GTK_TYPE_TABLE) static const gchar* line_up_xpm[] = { "9 7 3 1", " c None", ". c #A9A5A2", "+ c #FFFFFF", "..... ", "+++++. ", " +. ", " +. ", " +. ", " +. ", " " }; static const gchar* line_down_xpm[] = { "9 7 3 1", " c None", ". c #FFFFFF", "+ c #A9A5A2", " ", " .+ ", " .+ ", " .+ ", " .+ ", ".....+ ", "+++++ " }; static const gchar* vchain_xpm[] = { "9 24 13 1", " c None", ". c #555753", "+ c #8D8D8E", "@ c #E8E8E9", "# c #8E8E90", "$ c #888A85", "% c #8F8F91", "& c #2E3436", "* c #EEEEEC", "= c #989899", "- c #959597", "; c #9D9D9E", "> c #B9B9BA", " ", " ", " ..... ", " .+@@@#. ", " .@...@. ", " .@. .@. ", " .@. .@. ", " .@. .@. ", " .@.$.@. ", " .%&*$%. ", " .&*$. ", " &*$ ", " &*$ ", " .&*$. ", " .=&*$-. ", " .@.&.@. ", " .@. .@. ", " .@. .@. ", " .@. .@. ", " .@...@. ", " .;@@@>. ", " ..... ", " ", " " }; static const gchar* vchain_broken_xpm[] = { "9 24 13 1", " c None", ". c #555753", "+ c #8D8D8E", "@ c #E8E8E9", "# c #8E8E90", "$ c #888A85", "% c #8F8F91", "& c #2E3436", "* c #EEEEEC", "= c #989899", "- c #959597", "; c #9D9D9E", "> c #B9B9BA", " ..... ", " .+@@@#. ", " .@...@. ", " .@. .@. ", " .@. .@. ", " .@. .@. ", " .@.$.@. ", " .%&*$%. ", " .&*$. ", " &*$ ", " ", " ", " ", " ", " &*$ ", " .&*$. ", " .=&*$-. ", " .@.&.@. ", " .@. .@. ", " .@. .@. ", " .@. .@. ", " .@...@. ", " .;@@@>. ", " ..... " }; enum { CHAIN_TOGGLED_SIGNAL, LAST_SIGNAL }; static guint remmina_chain_button_signals[LAST_SIGNAL] = { 0 }; static void remmina_chain_button_class_init(RemminaChainButtonClass* klass) { remmina_chain_button_signals[CHAIN_TOGGLED_SIGNAL] = g_signal_new("chain-toggled", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaChainButtonClass, chain_toggled), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void remmina_chain_button_update_chained(RemminaChainButton* cb) { GdkPixbuf* pixbuf; pixbuf = gdk_pixbuf_new_from_xpm_data(cb->chained ? vchain_xpm : vchain_broken_xpm); gtk_image_set_from_pixbuf(GTK_IMAGE(cb->chain_image), pixbuf); g_object_unref(pixbuf); } static void remmina_chain_button_on_clicked(GtkWidget* widget, RemminaChainButton* cb) { cb->chained = !cb->chained; remmina_chain_button_update_chained(cb); g_signal_emit(G_OBJECT(cb), remmina_chain_button_signals[CHAIN_TOGGLED_SIGNAL], 0); } static void remmina_chain_button_init(RemminaChainButton* cb) { GtkWidget* widget; GtkWidget* image; GdkPixbuf* pixbuf; gtk_table_resize(GTK_TABLE(cb), 3, 1); pixbuf = gdk_pixbuf_new_from_xpm_data(line_up_xpm); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); gtk_widget_show(image); gtk_table_attach_defaults(GTK_TABLE(cb), image, 0, 1, 0, 1); widget = gtk_button_new(); gtk_widget_show(widget); gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NONE); gtk_table_attach_defaults(GTK_TABLE(cb), widget, 0, 1, 1, 2); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_chain_button_on_clicked), cb); image = gtk_image_new(); gtk_widget_show(image); gtk_container_add(GTK_CONTAINER(widget), image); cb->chain_image = image; pixbuf = gdk_pixbuf_new_from_xpm_data(line_down_xpm); image = gtk_image_new_from_pixbuf(pixbuf); g_object_unref(pixbuf); gtk_widget_show(image); gtk_table_attach_defaults(GTK_TABLE(cb), image, 0, 1, 2, 3); cb->chained = FALSE; } GtkWidget* remmina_chain_button_new(void) { return GTK_WIDGET(g_object_new(REMMINA_TYPE_CHAIN_BUTTON, NULL)); } void remmina_chain_button_set(RemminaChainButton* cb, gboolean chained) { cb->chained = chained; remmina_chain_button_update_chained(cb); g_signal_emit(G_OBJECT(cb), remmina_chain_button_signals[CHAIN_TOGGLED_SIGNAL], 0); } FreeRDP-Remmina-356c033/remmina/src/remmina_chain_button.h000066400000000000000000000041051171526373700233700ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINACHAINBUTTON_H__ #define __REMMINACHAINBUTTON_H__ G_BEGIN_DECLS #define REMMINA_TYPE_CHAIN_BUTTON (remmina_chain_button_get_type ()) #define REMMINA_CHAIN_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_CHAIN_BUTTON, RemminaChainButton)) #define REMMINA_CHAIN_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_CHAIN_BUTTON, RemminaChainButtonClass)) #define REMMINA_IS_CHAIN_BUTTON(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_CHAIN_BUTTON)) #define REMMINA_IS_CHAIN_BUTTON_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_CHAIN_BUTTON)) #define REMMINA_CHAIN_BUTTON_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_CHAIN_BUTTON, RemminaChainButtonClass)) typedef struct _RemminaChainButton { GtkTable table; gboolean chained; GtkWidget* chain_image; } RemminaChainButton; typedef struct _RemminaChainButtonClass { GtkTableClass parent_class; void (* chain_toggled) (RemminaChainButton* cb); } RemminaChainButtonClass; GType remmina_chain_button_get_type(void) G_GNUC_CONST; GtkWidget* remmina_chain_button_new(void); void remmina_chain_button_set (RemminaChainButton* cb, gboolean chained); G_END_DECLS #endif /* __REMMINACHAINBUTTON_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_chat_window.c000066400000000000000000000164671171526373700232320ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "remmina_chat_window.h" G_DEFINE_TYPE( RemminaChatWindow, remmina_chat_window, GTK_TYPE_WINDOW) enum { SEND_SIGNAL, LAST_SIGNAL }; static guint remmina_chat_window_signals[LAST_SIGNAL] = { 0 }; static void remmina_chat_window_class_init(RemminaChatWindowClass* klass) { remmina_chat_window_signals[SEND_SIGNAL] = g_signal_new("send", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaChatWindowClass, send), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); } static void remmina_chat_window_init(RemminaChatWindow* window) { window->history_text = NULL; window->send_text = NULL; } static void remmina_chat_window_clear_send_text(GtkWidget* widget, RemminaChatWindow* window) { GtkTextBuffer* buffer; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->send_text)); gtk_text_buffer_set_text(buffer, "", -1); gtk_widget_grab_focus(window->send_text); } static gboolean remmina_chat_window_scroll_proc(RemminaChatWindow* window) { GtkTextBuffer* buffer; GtkTextIter iter; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->history_text)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(window->history_text), &iter, 0.0, FALSE, 0.0, 0.0); return FALSE; } static void remmina_chat_window_append_text(RemminaChatWindow* window, const gchar* name, const gchar* tagname, const gchar* text) { GtkTextBuffer* buffer; GtkTextIter iter; gchar* ptr; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->history_text)); if (name) { ptr = g_strdup_printf("(%s) ", name); gtk_text_buffer_get_end_iter(buffer, &iter); if (tagname) { gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, ptr, -1, tagname, NULL); } else { gtk_text_buffer_insert(buffer, &iter, ptr, -1); } g_free(ptr); } if (text && text[0] != 0) { gtk_text_buffer_get_end_iter(buffer, &iter); if (text[strlen(text) - 1] == '\n') { gtk_text_buffer_insert(buffer, &iter, text, -1); } else { ptr = g_strdup_printf("%s\n", text); gtk_text_buffer_insert(buffer, &iter, ptr, -1); g_free(ptr); } } /* Use g_idle_add to make the scroll happen after the text has been actually updated */ g_idle_add((GSourceFunc) remmina_chat_window_scroll_proc, window); } static void remmina_chat_window_send(GtkWidget* widget, RemminaChatWindow* window) { GtkTextBuffer* buffer; GtkTextIter start, end; gchar* text; buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(window->send_text)); gtk_text_buffer_get_bounds(buffer, &start, &end); text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); if (!text || text[0] == '\0') return; g_signal_emit_by_name(G_OBJECT(window), "send", text); remmina_chat_window_append_text(window, g_get_user_name(), "sender-foreground", text); g_free(text); remmina_chat_window_clear_send_text(widget, window); } static gboolean remmina_chat_window_send_text_on_key(GtkWidget* widget, GdkEventKey* event, RemminaChatWindow* window) { if (event->keyval == GDK_KEY_Return) { remmina_chat_window_send(widget, window); return TRUE; } return FALSE; } GtkWidget* remmina_chat_window_new(GtkWindow* parent, const gchar* chat_with) { RemminaChatWindow* window; gchar buf[100]; GtkWidget* table; GtkWidget* scrolledwindow; GtkWidget* widget; GtkWidget* image; GtkTextBuffer* buffer; window = REMMINA_CHAT_WINDOW(g_object_new(REMMINA_TYPE_CHAT_WINDOW, NULL)); if (parent) { gtk_window_set_transient_for(GTK_WINDOW(window), parent); } /* Title */ g_snprintf(buf, sizeof(buf), _("Chat with %s"), chat_with); gtk_window_set_title(GTK_WINDOW(window), buf); gtk_window_set_default_size(GTK_WINDOW(window), 450, 300); /* Main container */ table = gtk_table_new(3, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_container_add(GTK_CONTAINER(window), table); /* Chat history */ scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_table_attach_defaults(GTK_TABLE(table), scrolledwindow, 0, 2, 0, 1); widget = gtk_text_view_new(); gtk_widget_show(widget); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), widget); buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); gtk_text_buffer_create_tag(buffer, "sender-foreground", "foreground", "blue", NULL); gtk_text_buffer_create_tag(buffer, "receiver-foreground", "foreground", "red", NULL); window->history_text = widget; /* Chat message to be sent */ scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_table_attach(GTK_TABLE(table), scrolledwindow, 0, 1, 1, 3, GTK_EXPAND | GTK_FILL, GTK_FILL, 0, 0); widget = gtk_text_view_new(); gtk_widget_show(widget); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR); gtk_container_add(GTK_CONTAINER(scrolledwindow), widget); g_signal_connect(G_OBJECT(widget), "key-press-event", G_CALLBACK(remmina_chat_window_send_text_on_key), window); window->send_text = widget; /* Send button */ image = gtk_image_new_from_icon_name("document-send", GTK_ICON_SIZE_BUTTON); gtk_widget_show(image); widget = gtk_button_new_with_mnemonic(_("_Send")); gtk_widget_show(widget); gtk_button_set_image(GTK_BUTTON(widget), image); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 1, 2, 0, 0, 0, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_chat_window_send), window); /* Clear button */ image = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_BUTTON); gtk_widget_show(image); widget = gtk_button_new_with_mnemonic(_("_Clear")); gtk_widget_show(widget); gtk_button_set_image(GTK_BUTTON(widget), image); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 2, 3, 0, 0, 0, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_chat_window_clear_send_text), window); gtk_widget_grab_focus(window->send_text); return GTK_WIDGET(window); } void remmina_chat_window_receive(RemminaChatWindow* window, const gchar* name, const gchar* text) { remmina_chat_window_append_text(window, name, "receiver-foreground", text); } FreeRDP-Remmina-356c033/remmina/src/remmina_chat_window.h000066400000000000000000000041311171526373700232200ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINACHATWINDOW_H__ #define __REMMINACHATWINDOW_H__ G_BEGIN_DECLS #define REMMINA_TYPE_CHAT_WINDOW (remmina_chat_window_get_type ()) #define REMMINA_CHAT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_CHAT_WINDOW, RemminaChatWindow)) #define REMMINA_CHAT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_CHAT_WINDOW, RemminaChatWindowClass)) #define REMMINA_IS_CHAT_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_CHAT_WINDOW)) #define REMMINA_IS_CHAT_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_CHAT_WINDOW)) #define REMMINA_CHAT_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_CHAT_WINDOW, RemminaChatWindowClass)) typedef struct _RemminaChatWindow { GtkWindow window; GtkWidget *history_text; GtkWidget *send_text; } RemminaChatWindow; typedef struct _RemminaChatWindowClass { GtkWindowClass parent_class; void (*send)(RemminaChatWindow *window); } RemminaChatWindowClass; GType remmina_chat_window_get_type(void) G_GNUC_CONST; GtkWidget* remmina_chat_window_new(GtkWindow *parent, const gchar *chat_with); void remmina_chat_window_receive(RemminaChatWindow *window, const gchar *name, const gchar *text); G_END_DECLS #endif /* __REMMINACHATWINDOW_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_connection_window.c000066400000000000000000002424421171526373700244440ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "config.h" #include "remmina_public.h" #include "remmina_file.h" #include "remmina_file_manager.h" #include "remmina_init_dialog.h" #include "remmina_protocol_widget.h" #include "remmina_pref.h" #include "remmina_scrolled_viewport.h" #include "remmina_scaler.h" #include "remmina_widget_pool.h" #include "remmina_connection_window.h" G_DEFINE_TYPE( RemminaConnectionWindow, remmina_connection_window, GTK_TYPE_WINDOW) #define MOTION_TIME 100 /* One process can only have one option popup at a time */ static GtkWidget* scale_option_window = NULL; typedef struct _RemminaConnectionHolder RemminaConnectionHolder; struct _RemminaConnectionWindowPriv { RemminaConnectionHolder* cnnhld; GtkWidget* notebook; guint switch_page_handler; GtkWidget* floating_toolbar; GtkWidget* floating_toolbar_label; gdouble floating_toolbar_opacity; /* To avoid strange event-loop */ guint floating_toolbar_motion_handler; gboolean floating_toolbar_motion_show; gboolean floating_toolbar_motion_visible; GtkWidget* toolbar; /* Toolitems that need to be handled */ GtkToolItem* toolitem_autofit; GtkToolItem* toolitem_fullscreen; GtkToolItem* toolitem_switch_page; GtkToolItem* toolitem_scale; GtkToolItem* toolitem_grab; GtkToolItem* toolitem_preferences; GtkToolItem* toolitem_tools; GtkWidget* scale_option_button; GtkWidget* fullscreen_option_button; GtkWidget* pin_button; gboolean pin_down; gboolean sticky; gint view_mode; }; typedef struct _RemminaConnectionObject { RemminaConnectionHolder* cnnhld; RemminaFile* remmina_file; /* A dummy window which will be realized as a container during initialize, before reparent to the real window */ GtkWidget* window; /* Containers for RemminaProtocolWidget: RemminaProtocolWidget->alignment->viewport...->window */ GtkWidget* proto; GtkWidget* alignment; GtkWidget* viewport; /* Scrolled containers */ GtkWidget* scrolled_container; gboolean connected; } RemminaConnectionObject; struct _RemminaConnectionHolder { RemminaConnectionWindow* cnnwin; gint fullscreen_view_mode; gboolean hostkey_activated; gboolean hostkey_used; }; #define DECLARE_CNNOBJ \ if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return; \ RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); #define DECLARE_CNNOBJ_WITH_RETURN(r) \ if (!cnnhld || !cnnhld->cnnwin || gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)) < 0) return r; \ RemminaConnectionObject* cnnobj = (RemminaConnectionObject*) g_object_get_data ( \ G_OBJECT(gtk_notebook_get_nth_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook), \ gtk_notebook_get_current_page (GTK_NOTEBOOK (cnnhld->cnnwin->priv->notebook)))), "cnnobj"); static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj); static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj, gint view_mode); static void remmina_connection_window_class_init(RemminaConnectionWindowClass* klass) { gtk_rc_parse_string("style \"remmina-small-button-style\"\n" "{\n" " GtkWidget::focus-padding = 0\n" " GtkWidget::focus-line-width = 0\n" " xthickness = 0\n" " ythickness = 0\n" "}\n" "widget \"*.remmina-small-button\" style \"remmina-small-button-style\""); } static void remmina_connection_holder_disconnect(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ /* Notify the RemminaProtocolWidget to disconnect, but not to close the window here. The window will be destroyed in RemminaProtocolWidget "disconnect" signal */ remmina_protocol_widget_close_connection(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); } static void remmina_connection_holder_keyboard_grab(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ if (remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", FALSE)) { gdk_keyboard_grab(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)), TRUE, GDK_CURRENT_TIME); } else { gdk_keyboard_ungrab(GDK_CURRENT_TIME); } } static gboolean remmina_connection_window_delete_event(GtkWidget* widget, GdkEvent* event, gpointer data) { RemminaConnectionHolder* cnnhld = (RemminaConnectionHolder*) data; RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; RemminaConnectionObject* cnnobj; GtkNotebook* notebook = GTK_NOTEBOOK(priv->notebook); GtkWidget* dialog; GtkWidget* w; gint i, n; n = gtk_notebook_get_n_pages(notebook); if (n > 1) { dialog = gtk_message_dialog_new(GTK_WINDOW(cnnhld->cnnwin), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("There are %i active connections in the current window. Are you sure to close?"), n); i = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (i != GTK_RESPONSE_YES) return TRUE; } /* Just in case the connection already closed by the server before clicking yes */ if (GTK_IS_WIDGET(notebook)) { n = gtk_notebook_get_n_pages(notebook); for (i = n - 1; i >= 0; i--) { w = gtk_notebook_get_nth_page(notebook, i); cnnobj = (RemminaConnectionObject*) g_object_get_data(G_OBJECT(w), "cnnobj"); remmina_protocol_widget_close_connection(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); } } return TRUE; } static void remmina_connection_window_destroy(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = REMMINA_CONNECTION_WINDOW(widget)->priv; if (priv->floating_toolbar_motion_handler) { g_source_remove(priv->floating_toolbar_motion_handler); priv->floating_toolbar_motion_handler = 0; } if (priv->floating_toolbar != NULL) { gtk_widget_destroy(priv->floating_toolbar); priv->floating_toolbar = NULL; } if (priv->switch_page_handler) { g_source_remove(priv->switch_page_handler); priv->switch_page_handler = 0; } g_free(priv); } static void remmina_connection_holder_update_toolbar_opacity(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->floating_toolbar_opacity = (1.0 - TOOLBAR_OPACITY_MIN) / ((gdouble) TOOLBAR_OPACITY_LEVEL) * ((gdouble)(TOOLBAR_OPACITY_LEVEL - remmina_file_get_int(cnnobj->remmina_file, "toolbar_opacity", 0))) + TOOLBAR_OPACITY_MIN; if (priv->floating_toolbar) { gtk_window_set_opacity(GTK_WINDOW(priv->floating_toolbar), priv->floating_toolbar_opacity); } } static gboolean remmina_connection_holder_floating_toolbar_motion(RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkRequisition req; gint x, y, t; if (priv->floating_toolbar == NULL) { priv->floating_toolbar_motion_handler = 0; return FALSE; } gtk_widget_size_request(priv->floating_toolbar, &req); gtk_window_get_position(GTK_WINDOW(priv->floating_toolbar), &x, &y); if (priv->floating_toolbar_motion_show || priv->floating_toolbar_motion_visible) { if (priv->floating_toolbar_motion_show) y += 2; else y -= 2; t = (priv->pin_down ? 18 : 2) - req.height; if (y > 0) y = 0; if (y < t) y = t; gtk_window_move(GTK_WINDOW(priv->floating_toolbar), x, y); if (remmina_pref.invisible_toolbar && !priv->pin_down) { gtk_window_set_opacity(GTK_WINDOW(priv->floating_toolbar), (gdouble)(y - t) / (gdouble)(-t) * priv->floating_toolbar_opacity); } if ((priv->floating_toolbar_motion_show && y >= 0) || (!priv->floating_toolbar_motion_show && y <= t)) { priv->floating_toolbar_motion_handler = 0; return FALSE; } } else { gtk_window_move(GTK_WINDOW(priv->floating_toolbar), x, -20 - req.height); priv->floating_toolbar_motion_handler = 0; return FALSE; } return TRUE; } static void remmina_connection_holder_floating_toolbar_update(RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (priv->floating_toolbar_motion_show || priv->floating_toolbar_motion_visible) { if (priv->floating_toolbar_motion_handler) g_source_remove(priv->floating_toolbar_motion_handler); priv->floating_toolbar_motion_handler = g_idle_add( (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); } else { if (priv->floating_toolbar_motion_handler == 0) { priv->floating_toolbar_motion_handler = g_timeout_add(MOTION_TIME, (GSourceFunc) remmina_connection_holder_floating_toolbar_motion, cnnhld); } } } static void remmina_connection_holder_floating_toolbar_show(RemminaConnectionHolder* cnnhld, gboolean show) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (priv->floating_toolbar == NULL) return; priv->floating_toolbar_motion_show = show; remmina_connection_holder_floating_toolbar_update(cnnhld); } static void remmina_connection_holder_floating_toolbar_visible(RemminaConnectionHolder* cnnhld, gboolean visible) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (priv->floating_toolbar == NULL) return; priv->floating_toolbar_motion_visible = visible; remmina_connection_holder_floating_toolbar_update(cnnhld); } static void remmina_connection_holder_get_desktop_size(RemminaConnectionHolder* cnnhld, gint* width, gint* height, gboolean expand) { DECLARE_CNNOBJ RemminaFile* remminafile = cnnobj->remmina_file; RemminaProtocolWidget* gp = REMMINA_PROTOCOL_WIDGET(cnnobj->proto); gboolean scale; scale = remmina_protocol_widget_get_scale(gp); *width = remmina_protocol_widget_get_width(gp); if (scale) { if (remmina_file_get_int(remminafile, "hscale", 0) > 0) { *width = (*width) * remmina_file_get_int(remminafile, "hscale", 0) / 100; } else if (!expand) { *width = 1; } } *height = remmina_protocol_widget_get_height(gp); if (scale) { if (remmina_file_get_int(remminafile, "vscale", 0) > 0) { *height = (*height) * remmina_file_get_int(remminafile, "vscale", 0) / 100; } else if (!expand) { *height = 1; } } } static void remmina_connection_object_set_scrolled_policy(RemminaConnectionObject* cnnobj, GtkScrolledWindow* scrolled_window) { gboolean expand; expand = remmina_protocol_widget_get_expand(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); gtk_scrolled_window_set_policy(scrolled_window, expand ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC, expand ? GTK_POLICY_NEVER : GTK_POLICY_AUTOMATIC); } static gboolean remmina_connection_holder_toolbar_autofit_restore(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ_WITH_RETURN(FALSE) RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; gint width, height; GtkAllocation na, ca, ta; if (cnnobj->connected && GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) { remmina_connection_holder_get_desktop_size(cnnhld, &width, &height, TRUE); gtk_widget_get_allocation(priv->notebook, &na); gtk_widget_get_allocation(cnnobj->scrolled_container, &ca); gtk_widget_get_allocation(priv->toolbar, &ca); gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), MAX(1, width + na.width - ca.width), MAX(1, height + ta.height + na.height - ca.height)); gtk_container_check_resize(GTK_CONTAINER(cnnhld->cnnwin)); } if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) { remmina_connection_object_set_scrolled_policy(cnnobj, GTK_SCROLLED_WINDOW(cnnobj->scrolled_container)); } return FALSE; } static void remmina_connection_holder_toolbar_autofit(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ if (GTK_IS_SCROLLED_WINDOW(cnnobj->scrolled_container)) { if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) != 0) { gtk_window_unmaximize(GTK_WINDOW(cnnhld->cnnwin)); } /* It's tricky to make the toolbars disappear automatically, while keeping scrollable. Please tell me if you know a better way to do this */ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), GTK_POLICY_NEVER, GTK_POLICY_NEVER); g_timeout_add(200, (GSourceFunc) remmina_connection_holder_toolbar_autofit_restore, cnnhld); } } static void remmina_connection_object_init_adjustment(RemminaConnectionObject* cnnobj) { GdkScreen* screen; GtkAdjustment* adj; gint screen_width, screen_height; screen = gdk_screen_get_default(); screen_width = gdk_screen_get_width(screen); screen_height = gdk_screen_get_height(screen); adj = gtk_viewport_get_hadjustment(GTK_VIEWPORT(cnnobj->viewport)); gtk_adjustment_set_page_size(adj, screen_width); adj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(cnnobj->viewport)); gtk_adjustment_set_page_size(adj, screen_height); } static void remmina_connection_holder_check_resize(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ gboolean scroll_required = FALSE; GdkScreen* screen; gint screen_width, screen_height; gint server_width, server_height; remmina_connection_holder_get_desktop_size(cnnhld, &server_width, &server_height, FALSE); screen = gdk_screen_get_default(); screen_width = gdk_screen_get_width(screen); screen_height = gdk_screen_get_height(screen); if (!remmina_protocol_widget_get_expand(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)) && (server_width <= 0 || server_height <= 0 || screen_width < server_width || screen_height < server_height)) { scroll_required = TRUE; } switch (cnnhld->cnnwin->priv->view_mode) { case SCROLLED_FULLSCREEN_MODE: gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), screen_width, screen_height); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cnnobj->scrolled_container), (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER), (scroll_required ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER)); break; case VIEWPORT_FULLSCREEN_MODE: gtk_window_resize (GTK_WINDOW(cnnhld->cnnwin), screen_width, screen_height); gtk_container_set_border_width (GTK_CONTAINER (cnnhld->cnnwin), scroll_required ? 1 : 0); break; case SCROLLED_WINDOW_MODE: if (remmina_file_get_int (cnnobj->remmina_file, "viewmode", AUTO_MODE) == AUTO_MODE) { gtk_window_set_default_size (GTK_WINDOW(cnnhld->cnnwin), MIN (server_width, screen_width), MIN (server_height, screen_height)); if (server_width >= screen_width || server_height >= screen_height) { gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); remmina_file_set_int (cnnobj->remmina_file, "window_maximize", TRUE); } else { remmina_connection_holder_toolbar_autofit (NULL, cnnhld); remmina_file_set_int (cnnobj->remmina_file, "window_maximize", FALSE); } } else { gtk_window_set_default_size (GTK_WINDOW(cnnhld->cnnwin), remmina_file_get_int (cnnobj->remmina_file, "window_width", 640), remmina_file_get_int (cnnobj->remmina_file, "window_height", 480)); if (remmina_file_get_int (cnnobj->remmina_file, "window_maximize", FALSE)) { gtk_window_maximize (GTK_WINDOW(cnnhld->cnnwin)); } } break; default: break; } } static void remmina_connection_holder_set_tooltip(GtkWidget* item, const gchar* tip, guint key1, guint key2) { gchar* s1; gchar* s2; if (remmina_pref.hostkey && key1) { if (key2) { s1 = g_strdup_printf(" (%s + %s,%s)", gdk_keyval_name(remmina_pref.hostkey), gdk_keyval_name(gdk_keyval_to_upper(key1)), gdk_keyval_name(gdk_keyval_to_upper(key2))); } else if (key1 == remmina_pref.hostkey) { s1 = g_strdup_printf(" (%s)", gdk_keyval_name(remmina_pref.hostkey)); } else { s1 = g_strdup_printf(" (%s + %s)", gdk_keyval_name(remmina_pref.hostkey), gdk_keyval_name(gdk_keyval_to_upper(key1))); } } else { s1 = NULL; } s2 = g_strdup_printf("%s%s", tip, s1 ? s1 : ""); gtk_widget_set_tooltip_text(item, s2); g_free(s2); g_free(s1); } static void remmina_connection_holder_toolbar_fullscreen(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { if (gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))) { remmina_connection_holder_create_fullscreen(cnnhld, NULL, cnnhld->fullscreen_view_mode); } else { remmina_connection_holder_create_scrolled(cnnhld, NULL); } } static void remmina_connection_holder_viewport_fullscreen_mode(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; cnnhld->fullscreen_view_mode = VIEWPORT_FULLSCREEN_MODE; remmina_connection_holder_create_fullscreen(cnnhld, NULL, cnnhld->fullscreen_view_mode); } static void remmina_connection_holder_scrolled_fullscreen_mode(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget))) return; cnnhld->fullscreen_view_mode = SCROLLED_FULLSCREEN_MODE; remmina_connection_holder_create_fullscreen(cnnhld, NULL, cnnhld->fullscreen_view_mode); } static void remmina_connection_holder_fullscreen_option_popdown(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->sticky = FALSE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->fullscreen_option_button), FALSE); remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); } static void remmina_connection_holder_toolbar_fullscreen_option(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkWidget* menu; GtkWidget* menuitem; GSList* group; if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) return; priv->sticky = TRUE; menu = gtk_menu_new(); menuitem = gtk_radio_menu_item_new_with_label(NULL, _("Viewport fullscreen mode")); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); if (priv->view_mode == VIEWPORT_FULLSCREEN_MODE) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); } g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(remmina_connection_holder_viewport_fullscreen_mode), cnnhld); menuitem = gtk_radio_menu_item_new_with_label(group, _("Scrolled fullscreen mode")); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); if (priv->view_mode == SCROLLED_FULLSCREEN_MODE) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); } g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(remmina_connection_holder_scrolled_fullscreen_mode), cnnhld); g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_fullscreen_option_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, priv->toolitem_fullscreen, 0, gtk_get_current_event_time()); } static void remmina_connection_holder_update_alignment(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaProtocolWidget* gp = REMMINA_PROTOCOL_WIDGET(cnnobj->proto); RemminaFile* remminafile = cnnobj->remmina_file; gboolean scale, expand; gint gp_width, gp_height; gint width, height; GtkAllocation a; scale = remmina_protocol_widget_get_scale(gp); expand = remmina_protocol_widget_get_expand(gp); gp_width = remmina_protocol_widget_get_width(gp); gp_height = remmina_protocol_widget_get_height(gp); if (scale && remmina_file_get_int(remminafile, "aspectscale", FALSE) && remmina_file_get_int(remminafile, "hscale", 0) == 0) { gtk_widget_get_allocation(cnnobj->alignment, &a); width = a.width; height = a.height; if (width > 1 && height > 1) { if (gp_width * height >= width * gp_height) { gtk_alignment_set(GTK_ALIGNMENT(cnnobj->alignment), 0.5, 0.5, 1.0, (gfloat)(gp_height * width) / (gfloat) gp_width / (gfloat) height); } else { gtk_alignment_set(GTK_ALIGNMENT(cnnobj->alignment), 0.5, 0.5, (gfloat)(gp_width * height) / (gfloat) gp_height / (gfloat) width, 1.0); } } } else { gtk_alignment_set( GTK_ALIGNMENT(cnnobj->alignment), 0.5, 0.5, ((scale && remmina_file_get_int(remminafile, "hscale", 0) == 0) || expand ? 1.0 : 0.0), ((scale && remmina_file_get_int (remminafile, "vscale", 0) == 0) || expand ? 1.0 : 0.0)); } } static void remmina_connection_holder_switch_page_activate(GtkMenuItem* menuitem, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; gint page_num; page_num = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(menuitem), "new-page-num")); gtk_notebook_set_current_page(GTK_NOTEBOOK(priv->notebook), page_num); } static void remmina_connection_holder_toolbar_switch_page_popdown(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->sticky = FALSE; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_switch_page), FALSE); remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); } static void remmina_connection_holder_toolbar_switch_page(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionObject* cnnobj; RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkWidget* menu; GtkWidget* menuitem; GtkWidget* image; GtkWidget* page; gint i, n; if (!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))) return; priv->sticky = TRUE; menu = gtk_menu_new(); n = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->notebook)); for (i = 0; i < n; i++) { page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(priv->notebook), i); if (!page) break; cnnobj = (RemminaConnectionObject*) g_object_get_data(G_OBJECT(page), "cnnobj"); menuitem = gtk_image_menu_item_new_with_label(remmina_file_get_string(cnnobj->remmina_file, "name")); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); image = gtk_image_new_from_icon_name(remmina_file_get_icon_name(cnnobj->remmina_file), GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); g_object_set_data(G_OBJECT(menuitem), "new-page-num", GINT_TO_POINTER(i)); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_connection_holder_switch_page_activate), cnnhld); if (i == gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook))) { gtk_widget_set_sensitive(menuitem, FALSE); } } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_toolbar_switch_page_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } static void remmina_connection_holder_toolbar_scaled_mode(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ gboolean scale; remmina_connection_holder_update_alignment(cnnhld); scale = gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget)); gtk_widget_set_sensitive(GTK_WIDGET(cnnhld->cnnwin->priv->scale_option_button), scale); remmina_protocol_widget_set_scale(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), scale); remmina_file_set_int(cnnobj->remmina_file, "scale", scale); remmina_protocol_widget_call_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, 0); if (cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { remmina_connection_holder_check_resize(cnnhld); } } static void remmina_connection_holder_scale_option_on_scaled(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ remmina_file_set_int(cnnobj->remmina_file, "hscale", REMMINA_SCALER(widget)->hscale); remmina_file_set_int(cnnobj->remmina_file, "vscale", REMMINA_SCALER(widget)->vscale); remmina_file_set_int(cnnobj->remmina_file, "aspectscale", REMMINA_SCALER(widget)->aspectscale); remmina_connection_holder_update_alignment(cnnhld); remmina_protocol_widget_call_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_SCALE, 0); if (cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { remmina_connection_holder_check_resize(cnnhld); } } static void remmina_connection_holder_scale_option_popdown(RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->sticky = FALSE; gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->scale_option_button), FALSE); gdk_keyboard_ungrab(GDK_CURRENT_TIME); gdk_pointer_ungrab(GDK_CURRENT_TIME); if (scale_option_window) { gtk_grab_remove(scale_option_window); gtk_widget_destroy(scale_option_window); scale_option_window = NULL; } remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); } static gboolean remmina_connection_holder_trap_on_button(GtkWidget* widget, GdkEventButton* event, gpointer data) { return TRUE; } static gboolean remmina_connection_holder_scale_option_on_key(GtkWidget* widget, GdkEventKey* event, RemminaConnectionHolder* cnnhld) { switch (event->keyval) { case GDK_KEY_Escape: remmina_connection_holder_scale_option_popdown(cnnhld); return TRUE; } return FALSE; } static gboolean remmina_connection_holder_scale_option_on_button(GtkWidget* widget, GdkEventButton* event, RemminaConnectionHolder* cnnhld) { remmina_connection_holder_scale_option_popdown(cnnhld); return TRUE; } static void remmina_connection_holder_toolbar_scale_option(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; RemminaFile* remminafile = cnnobj->remmina_file; GtkWidget* window; GtkWidget* eventbox; GtkWidget* frame; GtkWidget* scaler; gint x, y; gboolean pushin; if (scale_option_window) { remmina_connection_holder_scale_option_popdown(cnnhld); } else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { window = gtk_window_new(GTK_WINDOW_POPUP); gtk_container_set_border_width(GTK_CONTAINER(window), 0); /* Use an event-box to trap all button clicks events before sending up to the window */ eventbox = gtk_event_box_new(); gtk_widget_show(eventbox); gtk_container_add(GTK_CONTAINER(window), eventbox); gtk_widget_add_events(eventbox, GDK_BUTTON_PRESS_MASK); g_signal_connect(G_OBJECT(eventbox), "button-press-event", G_CALLBACK(remmina_connection_holder_trap_on_button), NULL); frame = gtk_frame_new(NULL); gtk_widget_show(frame); gtk_container_set_border_width(GTK_CONTAINER(frame), 0); gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT); gtk_container_add(GTK_CONTAINER(eventbox), frame); scaler = remmina_scaler_new(); gtk_widget_show(scaler); gtk_widget_set_size_request(scaler, 250, -1); gtk_container_set_border_width(GTK_CONTAINER(scaler), 4); remmina_scaler_set(REMMINA_SCALER(scaler), remmina_file_get_int(remminafile, "hscale", 0), remmina_file_get_int(remminafile, "vscale", 0), remmina_file_get_int(remminafile, "aspectscale", FALSE)); remmina_scaler_set_draw_value(REMMINA_SCALER(scaler), FALSE); gtk_container_add(GTK_CONTAINER(frame), scaler); g_signal_connect(G_OBJECT(scaler), "scaled", G_CALLBACK(remmina_connection_holder_scale_option_on_scaled), cnnhld); g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(remmina_connection_holder_scale_option_on_key), cnnhld); g_signal_connect(G_OBJECT(window), "button-press-event", G_CALLBACK(remmina_connection_holder_scale_option_on_button), cnnhld); gtk_widget_realize(window); remmina_public_popup_position(NULL, &x, &y, &pushin, priv->toolitem_scale); gtk_window_move(GTK_WINDOW(window), x, y); gtk_widget_show(window); gtk_grab_add(window); gdk_pointer_grab(gtk_widget_get_window(window), TRUE, GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK, NULL, NULL, GDK_CURRENT_TIME); gdk_keyboard_grab(gtk_widget_get_window(window), TRUE, GDK_CURRENT_TIME); scale_option_window = window; priv->sticky = TRUE; } } static void remmina_connection_holder_toolbar_preferences_popdown(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->sticky = FALSE; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_preferences), FALSE); remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); } static void remmina_connection_holder_toolbar_tools_popdown(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; priv->sticky = FALSE; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_tools), FALSE); remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); } static void remmina_connection_holder_call_protocol_feature_radio(GtkMenuItem* menuitem, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaProtocolFeature* feature; gpointer value; if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { feature = (RemminaProtocolFeature*) g_object_get_data(G_OBJECT(menuitem), "feature-type"); value = g_object_get_data(G_OBJECT(menuitem), "feature-value"); remmina_file_set_string(cnnobj->remmina_file, (const gchar*) feature->opt2, (const gchar*) value); remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); } } static void remmina_connection_holder_call_protocol_feature_check(GtkMenuItem* menuitem, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaProtocolFeature* feature; gboolean value; feature = (RemminaProtocolFeature*) g_object_get_data(G_OBJECT(menuitem), "feature-type"); value = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); remmina_file_set_int(cnnobj->remmina_file, (const gchar*) feature->opt2, value); remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); } static void remmina_connection_holder_call_protocol_feature_activate(GtkMenuItem* menuitem, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaProtocolFeature* feature; feature = (RemminaProtocolFeature*) g_object_get_data(G_OBJECT(menuitem), "feature-type"); remmina_protocol_widget_call_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); } static void remmina_connection_holder_toolbar_preferences_radio(RemminaConnectionHolder* cnnhld, RemminaFile* remminafile, GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) { GtkWidget* menuitem; GSList* group; gint i; const gchar** list; const gchar* value; group = NULL; value = remmina_file_get_string(remminafile, (const gchar*) feature->opt2); list = (const gchar**) feature->opt3; for (i = 0; list[i]; i += 2) { menuitem = gtk_radio_menu_item_new_with_label(group, g_dgettext(domain, list[i + 1])); group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(menuitem)); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); if (enabled) { g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer) feature); g_object_set_data(G_OBJECT(menuitem), "feature-value", (gpointer) list[i]); if (value && g_strcmp0(list[i], value) == 0) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), TRUE); } g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(remmina_connection_holder_call_protocol_feature_radio), cnnhld); } else { gtk_widget_set_sensitive(menuitem, FALSE); } } } static void remmina_connection_holder_toolbar_preferences_check(RemminaConnectionHolder* cnnhld, RemminaFile* remminafile, GtkWidget* menu, const RemminaProtocolFeature* feature, const gchar* domain, gboolean enabled) { GtkWidget* menuitem; menuitem = gtk_check_menu_item_new_with_label(g_dgettext(domain, (const gchar*) feature->opt3)); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); if (enabled) { g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer) feature); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), remmina_file_get_int(remminafile, (const gchar*) feature->opt2, FALSE)); g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(remmina_connection_holder_call_protocol_feature_check), cnnhld); } else { gtk_widget_set_sensitive(menuitem, FALSE); } } static void remmina_connection_holder_toolbar_preferences(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; const RemminaProtocolFeature* feature; GtkWidget* menu; GtkWidget* menuitem; gboolean separator; const gchar* domain; gboolean enabled; if (!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))) return; priv->sticky = TRUE; separator = FALSE; domain = remmina_protocol_widget_get_domain(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); menu = gtk_menu_new(); for (feature = remmina_protocol_widget_get_features(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); feature && feature->type; feature++) { if (feature->type != REMMINA_PROTOCOL_FEATURE_TYPE_PREF) continue; if (separator) { menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); separator = FALSE; } enabled = remmina_protocol_widget_query_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); switch (GPOINTER_TO_INT(feature->opt1)) { case REMMINA_PROTOCOL_FEATURE_PREF_RADIO: remmina_connection_holder_toolbar_preferences_radio(cnnhld, cnnobj->remmina_file, menu, feature, domain, enabled); separator = TRUE; break; case REMMINA_PROTOCOL_FEATURE_PREF_CHECK: remmina_connection_holder_toolbar_preferences_check(cnnhld, cnnobj->remmina_file, menu, feature, domain, enabled); break; } } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_toolbar_preferences_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } static void remmina_connection_holder_toolbar_tools(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; const RemminaProtocolFeature* feature; GtkWidget* menu; GtkWidget* menuitem; GtkWidget* image; const gchar* domain; gboolean enabled; if (!gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))) return; priv->sticky = TRUE; domain = remmina_protocol_widget_get_domain(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); menu = gtk_menu_new(); for (feature = remmina_protocol_widget_get_features(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); feature && feature->type; feature++) { if (feature->type != REMMINA_PROTOCOL_FEATURE_TYPE_TOOL) continue; if (feature->opt1) { menuitem = gtk_image_menu_item_new_with_label(g_dgettext(domain, (const gchar*) feature->opt1)); if (feature->opt2) { image = gtk_image_new_from_icon_name((const gchar*) feature->opt2, GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); } } else { menuitem = gtk_image_menu_item_new_from_stock((const gchar*) feature->opt2, NULL); } if (feature->opt3) { remmina_connection_holder_set_tooltip(menuitem, "", GPOINTER_TO_UINT(feature->opt3), 0); } gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); enabled = remmina_protocol_widget_query_feature_by_ref(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), feature); if (enabled) { g_object_set_data(G_OBJECT(menuitem), "feature-type", (gpointer) feature); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_connection_holder_call_protocol_feature_activate), cnnhld); } else { gtk_widget_set_sensitive(menuitem, FALSE); } } g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_connection_holder_toolbar_tools_popdown), cnnhld); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, remmina_public_popup_position, widget, 0, gtk_get_current_event_time()); } static void remmina_connection_holder_toolbar_minimize(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); gtk_window_iconify(GTK_WINDOW(cnnhld->cnnwin)); } static void remmina_connection_holder_toolbar_disconnect(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { remmina_connection_holder_disconnect(cnnhld); } static void remmina_connection_holder_toolbar_grab(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ remmina_file_set_int(cnnobj->remmina_file, "keyboard_grab", gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(widget))); remmina_connection_holder_keyboard_grab(cnnhld); } static GtkWidget* remmina_connection_holder_create_toolbar(RemminaConnectionHolder* cnnhld, gint mode) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkWidget* toolbar; GtkToolItem* toolitem; GtkWidget* widget; GtkWidget* arrow; toolbar = gtk_toolbar_new(); gtk_widget_show(toolbar); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolbar), FALSE); if (remmina_pref.small_toolbutton) { gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), GTK_ICON_SIZE_MENU); } /* Auto-Fit */ toolitem = gtk_tool_button_new(NULL, NULL); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-fit-window"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Resize the window to fit in remote resolution"), remmina_pref.shortcutkey_autofit, 0); g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_autofit), cnnhld); priv->toolitem_autofit = toolitem; gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); /* Fullscreen toggle */ toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-fullscreen"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Toggle fullscreen mode"), remmina_pref.shortcutkey_fullscreen, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); priv->toolitem_fullscreen = toolitem; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolitem), mode != SCROLLED_WINDOW_MODE); g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_fullscreen), cnnhld); /* Fullscreen drop-down options */ toolitem = gtk_tool_item_new(); gtk_widget_show(GTK_WIDGET(toolitem)); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); widget = gtk_toggle_button_new(); gtk_widget_show(widget); gtk_container_set_border_width(GTK_CONTAINER(widget), 0); gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(widget), FALSE); if (remmina_pref.small_toolbutton) { gtk_widget_set_name(widget, "remmina-small-button"); } gtk_container_add(GTK_CONTAINER(toolitem), widget); arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); gtk_widget_show(arrow); gtk_container_add(GTK_CONTAINER(widget), arrow); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_fullscreen_option), cnnhld); priv->fullscreen_option_button = widget; if (mode == SCROLLED_WINDOW_MODE) { gtk_widget_set_sensitive(GTK_WIDGET(widget), FALSE); } /* Switch tabs */ toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-switch-page"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Switch tab pages"), remmina_pref.shortcutkey_prevtab, remmina_pref.shortcutkey_nexttab); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_switch_page), cnnhld); priv->toolitem_switch_page = toolitem; toolitem = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "remmina-scale"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Toggle scaled mode"), remmina_pref.shortcutkey_scale, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_scaled_mode), cnnhld); priv->toolitem_scale = toolitem; /* We need a toggle tool button with a popup arrow; and the popup is a window not a menu. GTK+ support neither of them. We need some tricks here... */ toolitem = gtk_tool_item_new(); gtk_widget_show(GTK_WIDGET(toolitem)); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); widget = gtk_toggle_button_new(); gtk_widget_show(widget); gtk_container_set_border_width(GTK_CONTAINER(widget), 0); gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(widget), FALSE); if (remmina_pref.small_toolbutton) { gtk_widget_set_name(widget, "remmina-small-button"); } gtk_container_add(GTK_CONTAINER(toolitem), widget); arrow = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE); gtk_widget_show(arrow); gtk_container_add(GTK_CONTAINER(widget), arrow); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_scale_option), cnnhld); priv->scale_option_button = widget; toolitem = gtk_toggle_tool_button_new(); gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(toolitem), "input-keyboard"); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Grab all keyboard events"), remmina_pref.shortcutkey_grab, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_grab), cnnhld); priv->toolitem_grab = toolitem; toolitem = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_PREFERENCES); gtk_tool_item_set_tooltip_text(toolitem, _("Preferences")); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_preferences), cnnhld); priv->toolitem_preferences = toolitem; toolitem = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_EXECUTE); gtk_tool_button_set_label(GTK_TOOL_BUTTON(toolitem), _("Tools")); gtk_tool_item_set_tooltip_text(toolitem, _("Tools")); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "toggled", G_CALLBACK(remmina_connection_holder_toolbar_tools), cnnhld); priv->toolitem_tools = toolitem; toolitem = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_GOTO_BOTTOM); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Minimize window"), remmina_pref.shortcutkey_minimize, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_minimize), cnnhld); toolitem = gtk_tool_button_new_from_stock(GTK_STOCK_DISCONNECT); remmina_connection_holder_set_tooltip(GTK_WIDGET(toolitem), _("Disconnect"), remmina_pref.shortcutkey_disconnect, 0); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); gtk_widget_show(GTK_WIDGET(toolitem)); g_signal_connect(G_OBJECT(toolitem), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_disconnect), cnnhld); return toolbar; } static void remmina_connection_holder_update_toolbar(RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkToolItem* toolitem; gboolean bval; toolitem = priv->toolitem_autofit; if (toolitem) { if (priv->view_mode != SCROLLED_WINDOW_MODE) { gtk_widget_set_sensitive(GTK_WIDGET(toolitem), FALSE); } else { bval = remmina_protocol_widget_get_expand(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), !bval); } } toolitem = priv->toolitem_switch_page; bval = (gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->notebook)) > 1); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); toolitem = priv->toolitem_scale; bval = remmina_protocol_widget_get_scale(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolitem), bval); gtk_widget_set_sensitive(GTK_WIDGET(priv->scale_option_button), bval); bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_SCALE); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); toolitem = priv->toolitem_grab; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(toolitem), remmina_file_get_int(cnnobj->remmina_file, "keyboard_grab", FALSE)); toolitem = priv->toolitem_preferences; bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_PREF); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); toolitem = priv->toolitem_tools; bval = remmina_protocol_widget_query_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_TOOL); gtk_widget_set_sensitive(GTK_WIDGET(toolitem), bval); gtk_window_set_title(GTK_WINDOW(cnnhld->cnnwin), remmina_file_get_string(cnnobj->remmina_file, "name")); if (priv->floating_toolbar) { gtk_label_set_text(GTK_LABEL(priv->floating_toolbar_label), remmina_file_get_string(cnnobj->remmina_file, "name")); } } static void remmina_connection_holder_showhide_toolbar(RemminaConnectionHolder* cnnhld, gboolean resize) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkRequisition req; gint width, height; if (priv->view_mode == SCROLLED_WINDOW_MODE) { if (resize && (gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) { gtk_window_get_size(GTK_WINDOW(cnnhld->cnnwin), &width, &height); gtk_widget_size_request(priv->toolbar, &req); if (remmina_pref.hide_connection_toolbar) { gtk_widget_hide(priv->toolbar); gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), width, height - req.height); } else { gtk_window_resize(GTK_WINDOW(cnnhld->cnnwin), width, height + req.height); gtk_widget_show(priv->toolbar); } } else { if (remmina_pref.hide_connection_toolbar) { gtk_widget_hide(priv->toolbar); } else { gtk_widget_show(priv->toolbar); } } } } static gboolean remmina_connection_holder_toolbar_enter(GtkWidget* widget, GdkEventCrossing* event, RemminaConnectionHolder* cnnhld) { remmina_connection_holder_floating_toolbar_show(cnnhld, TRUE); return TRUE; } static gboolean remmina_connection_holder_toolbar_leave(GtkWidget* widget, GdkEventCrossing* event, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (!priv->sticky && event->mode == GDK_CROSSING_NORMAL) { remmina_connection_holder_floating_toolbar_show(cnnhld, FALSE); return TRUE; } return FALSE; } static gboolean remmina_connection_window_focus_in(GtkWidget* widget, GdkEventFocus* event, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (priv->floating_toolbar) { remmina_connection_holder_floating_toolbar_visible(cnnhld, TRUE); } return FALSE; } static gboolean remmina_connection_window_focus_out(GtkWidget* widget, GdkEventFocus* event, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ_WITH_RETURN(FALSE) RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; cnnhld->hostkey_activated = FALSE; if (!priv->sticky && priv->floating_toolbar) { remmina_connection_holder_floating_toolbar_visible(cnnhld, FALSE); } if (REMMINA_IS_SCROLLED_VIEWPORT(cnnobj->scrolled_container)) { remmina_scrolled_viewport_remove_motion(REMMINA_SCROLLED_VIEWPORT(cnnobj->scrolled_container)); } remmina_protocol_widget_call_feature_by_type(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), REMMINA_PROTOCOL_FEATURE_TYPE_UNFOCUS, 0); return FALSE; } static gboolean remmina_connection_window_on_enter(GtkWidget* widget, GdkEventCrossing* event, RemminaConnectionHolder* cnnhld) { if (event->detail == GDK_NOTIFY_VIRTUAL || event->detail == GDK_NOTIFY_NONLINEAR || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { remmina_connection_holder_keyboard_grab(cnnhld); } return FALSE; } static gboolean remmina_connection_window_on_leave(GtkWidget* widget, GdkEventCrossing* event, RemminaConnectionHolder* cnnhld) { if (event->detail == GDK_NOTIFY_VIRTUAL || event->detail == GDK_NOTIFY_NONLINEAR || event->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { gdk_keyboard_ungrab(GDK_CURRENT_TIME); } return FALSE; } static gboolean remmina_connection_holder_toolbar_scroll(GtkWidget* widget, GdkEventScroll* event, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ_WITH_RETURN(FALSE) int opacity; opacity = remmina_file_get_int(cnnobj->remmina_file, "toolbar_opacity", 0); switch (event->direction) { case GDK_SCROLL_UP: if (opacity > 0) { remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity - 1); remmina_connection_holder_update_toolbar_opacity(cnnhld); return TRUE; } break; case GDK_SCROLL_DOWN: if (opacity < TOOLBAR_OPACITY_LEVEL) { remmina_file_set_int(cnnobj->remmina_file, "toolbar_opacity", opacity + 1); remmina_connection_holder_update_toolbar_opacity(cnnhld); return TRUE; } break; default: break; } return FALSE; } static void remmina_connection_object_alignment_on_allocate(GtkWidget* widget, GtkAllocation* allocation, RemminaConnectionObject* cnnobj) { remmina_connection_holder_update_alignment(cnnobj->cnnhld); } static gboolean remmina_connection_window_on_configure(GtkWidget* widget, GdkEventConfigure* event, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ_WITH_RETURN(FALSE) RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkRequisition req; gint width, height; gint y; if (cnnhld->cnnwin && gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin)) && cnnhld->cnnwin->priv->view_mode == SCROLLED_WINDOW_MODE) { /* Here we store the window state in real-time */ if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(cnnhld->cnnwin))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) { gtk_window_get_size(GTK_WINDOW(cnnhld->cnnwin), &width, &height); remmina_file_set_int(cnnobj->remmina_file, "window_width", width); remmina_file_set_int(cnnobj->remmina_file, "window_height", height); remmina_file_set_int(cnnobj->remmina_file, "window_maximize", FALSE); } else { remmina_file_set_int(cnnobj->remmina_file, "window_maximize", TRUE); } } if (priv->floating_toolbar) { gtk_widget_size_request(priv->floating_toolbar, &req); gtk_window_get_position(GTK_WINDOW(priv->floating_toolbar), NULL, &y); gtk_window_move(GTK_WINDOW(priv->floating_toolbar), event->x + MAX(0, (event->width - req.width) / 2), y); remmina_connection_holder_floating_toolbar_update(cnnhld); } if (cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { /* Notify window of change so that scroll border can be hidden or shown if needed */ remmina_connection_holder_check_resize(cnnobj->cnnhld); } return FALSE; } static void remmina_connection_holder_update_pin(RemminaConnectionHolder* cnnhld) { if (cnnhld->cnnwin->priv->pin_down) { gtk_button_set_image(GTK_BUTTON(cnnhld->cnnwin->priv->pin_button), gtk_image_new_from_icon_name("remmina-pin-down", GTK_ICON_SIZE_MENU)); } else { gtk_button_set_image(GTK_BUTTON(cnnhld->cnnwin->priv->pin_button), gtk_image_new_from_icon_name("remmina-pin-up", GTK_ICON_SIZE_MENU)); } } static void remmina_connection_holder_toolbar_pin(GtkWidget* widget, RemminaConnectionHolder* cnnhld) { cnnhld->cnnwin->priv->pin_down = !cnnhld->cnnwin->priv->pin_down; remmina_connection_holder_update_pin(cnnhld); } static void remmina_connection_holder_create_floating_toolbar(RemminaConnectionHolder* cnnhld, gint mode) { DECLARE_CNNOBJ RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; GtkWidget* window; GtkWidget* vbox; GtkWidget* widget; GtkWidget* eventbox; GtkWidget* hbox; /* This has to be a popup window to become visible in fullscreen mode */ window = gtk_window_new(GTK_WINDOW_POPUP); vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(window), vbox); widget = remmina_connection_holder_create_toolbar(cnnhld, mode); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); /* The pin button */ widget = gtk_button_new(); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gtk_button_set_relief(GTK_BUTTON(widget), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(widget), FALSE); gtk_widget_set_name(widget, "remmina-small-button"); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_connection_holder_toolbar_pin), cnnhld); priv->pin_button = widget; priv->pin_down = remmina_pref.toolbar_pin_down; remmina_connection_holder_update_pin(cnnhld); /* An event box is required to wrap the label to avoid infinite "leave-enter" event loop */ eventbox = gtk_event_box_new(); gtk_widget_show(eventbox); gtk_box_pack_start(GTK_BOX(hbox), eventbox, TRUE, TRUE, 0); widget = gtk_label_new(remmina_file_get_string(cnnobj->remmina_file, "name")); gtk_label_set_max_width_chars(GTK_LABEL(widget), 50); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(eventbox), widget); priv->floating_toolbar_label = widget; /* The position will be moved in configure event instead during maximizing. Just make it invisible here */ gtk_window_move(GTK_WINDOW(window), 0, -200); gtk_window_set_accept_focus(GTK_WINDOW(window), FALSE); priv->floating_toolbar = window; remmina_connection_holder_update_toolbar_opacity(cnnhld); if (remmina_pref.invisible_toolbar && !priv->pin_down) { gtk_window_set_opacity(GTK_WINDOW(window), 0.0); } g_signal_connect(G_OBJECT(window), "enter-notify-event", G_CALLBACK(remmina_connection_holder_toolbar_enter), cnnhld); g_signal_connect(G_OBJECT(window), "leave-notify-event", G_CALLBACK(remmina_connection_holder_toolbar_leave), cnnhld); g_signal_connect(G_OBJECT(window), "scroll-event", G_CALLBACK(remmina_connection_holder_toolbar_scroll), cnnhld); if (cnnobj->connected) gtk_widget_show(window); } static void remmina_connection_window_init(RemminaConnectionWindow* cnnwin) { RemminaConnectionWindowPriv* priv; priv = g_new0(RemminaConnectionWindowPriv, 1); cnnwin->priv = priv; priv->view_mode = AUTO_MODE; priv->floating_toolbar_opacity = 1.0; gtk_window_set_position(GTK_WINDOW(cnnwin), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(cnnwin), 0); remmina_widget_pool_register(GTK_WIDGET(cnnwin)); } static gboolean remmina_connection_window_state_event(GtkWidget* widget, GdkEventWindowState* event, gpointer user_data) { GdkScreen* screen; screen = gdk_screen_get_default(); if (remmina_pref.minimize_to_tray && (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0 && (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0 && remmina_public_get_current_workspace(screen) == remmina_public_get_window_workspace(GTK_WINDOW(widget)) && gdk_screen_get_number(screen) == gdk_screen_get_number(gtk_widget_get_screen(widget))) { gtk_widget_hide(widget); return TRUE; } return FALSE; } static GtkWidget* remmina_connection_window_new_from_holder(RemminaConnectionHolder* cnnhld) { RemminaConnectionWindow* cnnwin; cnnwin = REMMINA_CONNECTION_WINDOW(g_object_new(REMMINA_TYPE_CONNECTION_WINDOW, NULL)); cnnwin->priv->cnnhld = cnnhld; g_signal_connect(G_OBJECT(cnnwin), "delete-event", G_CALLBACK(remmina_connection_window_delete_event), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "destroy", G_CALLBACK(remmina_connection_window_destroy), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "window-state-event", G_CALLBACK(remmina_connection_window_state_event), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "focus-in-event", G_CALLBACK(remmina_connection_window_focus_in), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "focus-out-event", G_CALLBACK(remmina_connection_window_focus_out), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "enter-notify-event", G_CALLBACK(remmina_connection_window_on_enter), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "leave-notify-event", G_CALLBACK(remmina_connection_window_on_leave), cnnhld); g_signal_connect(G_OBJECT(cnnwin), "configure_event", G_CALLBACK(remmina_connection_window_on_configure), cnnhld); return GTK_WIDGET(cnnwin); } /* This function will be called for the first connection. A tag is set to the window so that * other connections can determine if whether a new tab should be append to the same window */ static void remmina_connection_window_update_tag(RemminaConnectionWindow* cnnwin, RemminaConnectionObject* cnnobj) { gchar* tag; switch (remmina_pref.tab_mode) { case REMMINA_TAB_BY_GROUP: tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "group")); break; case REMMINA_TAB_BY_PROTOCOL: tag = g_strdup(remmina_file_get_string(cnnobj->remmina_file, "protocol")); break; default: tag = NULL; break; } g_object_set_data_full(G_OBJECT(cnnwin), "tag", tag, (GDestroyNotify) g_free); } static void remmina_connection_object_create_scrolled_container(RemminaConnectionObject* cnnobj, gint view_mode) { GtkWidget* container; if (view_mode == VIEWPORT_FULLSCREEN_MODE) { container = remmina_scrolled_viewport_new(); } else { container = gtk_scrolled_window_new(NULL, NULL); remmina_connection_object_set_scrolled_policy(cnnobj, GTK_SCROLLED_WINDOW(container)); gtk_container_set_border_width(GTK_CONTAINER(container), 0); gtk_widget_set_can_focus(container, FALSE); } g_object_set_data(G_OBJECT(container), "cnnobj", cnnobj); gtk_widget_show(container); cnnobj->scrolled_container = container; } static gboolean remmina_connection_holder_grab_focus(gpointer data) { RemminaConnectionObject* cnnobj; GtkNotebook* notebook; GtkWidget* child; if (GTK_IS_WIDGET(data)) { notebook = GTK_NOTEBOOK(data); child = gtk_notebook_get_nth_page(notebook, gtk_notebook_get_current_page(notebook)); cnnobj = g_object_get_data(G_OBJECT(child), "cnnobj"); if (GTK_IS_WIDGET(cnnobj->proto)) { remmina_protocol_widget_grab_focus(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); } } return FALSE; } static void remmina_connection_object_on_close_button_clicked(GtkButton* button, RemminaConnectionObject* cnnobj) { if (REMMINA_IS_PROTOCOL_WIDGET(cnnobj->proto)) { remmina_protocol_widget_close_connection(REMMINA_PROTOCOL_WIDGET(cnnobj->proto)); } } static GtkWidget* remmina_connection_object_create_tab(RemminaConnectionObject* cnnobj) { GtkWidget* hbox; GtkWidget* widget; GtkWidget* button; hbox = gtk_hbox_new(FALSE, 4); gtk_widget_show(hbox); widget = gtk_image_new_from_icon_name(remmina_file_get_icon_name(cnnobj->remmina_file), GTK_ICON_SIZE_MENU); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); widget = gtk_label_new(remmina_file_get_string(cnnobj->remmina_file, "name")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); button = gtk_button_new(); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_button_set_focus_on_click(GTK_BUTTON(button), FALSE); gtk_widget_set_name(button, "remmina-small-button"); gtk_widget_show(button); widget = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(button), widget); gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_connection_object_on_close_button_clicked), cnnobj); return hbox; } static gint remmina_connection_object_append_page(RemminaConnectionObject* cnnobj, GtkNotebook* notebook, GtkWidget* tab, gint view_mode) { gint i; remmina_connection_object_create_scrolled_container(cnnobj, view_mode); i = gtk_notebook_append_page(notebook, cnnobj->scrolled_container, tab); gtk_notebook_set_tab_reorderable(notebook, cnnobj->scrolled_container, TRUE); gtk_notebook_set_tab_detachable(notebook, cnnobj->scrolled_container, TRUE); /* This trick prevents the tab label from being focused */ gtk_widget_set_can_focus(gtk_widget_get_parent(tab), FALSE); return i; } static void remmina_connection_window_initialize_notebook(GtkNotebook* to, GtkNotebook* from, RemminaConnectionObject* cnnobj, gint view_mode) { gint i, n, c; GtkWidget* tab; GtkWidget* widget; if (cnnobj) { /* Initial connection for a newly created window */ tab = remmina_connection_object_create_tab(cnnobj); remmina_connection_object_append_page(cnnobj, to, tab, view_mode); gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); if (cnnobj->window) { gtk_widget_destroy(cnnobj->window); cnnobj->window = NULL; } } else { /* View mode changed. Migrate all existing connections to the new notebook */ c = gtk_notebook_get_current_page(from); n = gtk_notebook_get_n_pages(from); for (i = 0; i < n; i++) { widget = gtk_notebook_get_nth_page(from, i); cnnobj = (RemminaConnectionObject*) g_object_get_data(G_OBJECT(widget), "cnnobj"); tab = remmina_connection_object_create_tab(cnnobj); remmina_connection_object_append_page(cnnobj, to, tab, view_mode); gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); } gtk_notebook_set_current_page(to, c); } } static void remmina_connection_holder_update_notebook(RemminaConnectionHolder* cnnhld) { GtkNotebook* notebook; gint n; if (!cnnhld->cnnwin) return; notebook = GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook); switch (cnnhld->cnnwin->priv->view_mode) { case SCROLLED_WINDOW_MODE: n = gtk_notebook_get_n_pages(notebook); gtk_notebook_set_show_tabs(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); gtk_notebook_set_show_border(notebook, remmina_pref.always_show_tab ? TRUE : n > 1); break; default: gtk_notebook_set_show_tabs(notebook, FALSE); gtk_notebook_set_show_border(notebook, FALSE); break; } } static gboolean remmina_connection_holder_on_switch_page_real(gpointer data) { RemminaConnectionHolder* cnnhld = (RemminaConnectionHolder*) data; RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (GTK_IS_WIDGET(cnnhld->cnnwin)) { remmina_connection_holder_update_toolbar(cnnhld); remmina_connection_holder_grab_focus(priv->notebook); if (cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { remmina_connection_holder_check_resize(cnnhld); } } priv->switch_page_handler = 0; return FALSE; } static void remmina_connection_holder_on_switch_page(GtkNotebook* notebook, GtkWidget* page, guint page_num, RemminaConnectionHolder* cnnhld) { RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; if (!priv->switch_page_handler) { priv->switch_page_handler = g_idle_add(remmina_connection_holder_on_switch_page_real, cnnhld); } } static void remmina_connection_holder_on_page_added(GtkNotebook* notebook, GtkWidget* child, guint page_num, RemminaConnectionHolder* cnnhld) { if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook)) <= 0) { gtk_widget_destroy(GTK_WIDGET(cnnhld->cnnwin)); g_free(cnnhld); } else { remmina_connection_holder_update_notebook(cnnhld); } } GtkNotebook* remmina_connection_holder_on_notebook_create_window(GtkNotebook* notebook, GtkWidget* page, gint x, gint y, gpointer data) { RemminaConnectionWindow* srccnnwin; RemminaConnectionWindow* dstcnnwin; RemminaConnectionObject* cnnobj; gint srcpagenum; GdkWindow* window; srccnnwin = REMMINA_CONNECTION_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(notebook))); window = gdk_display_get_window_at_pointer(gdk_display_get_default(), &x, &y); dstcnnwin = REMMINA_CONNECTION_WINDOW(remmina_widget_pool_find_by_window(REMMINA_TYPE_CONNECTION_WINDOW, window)); if (srccnnwin == dstcnnwin) return NULL; if (gtk_notebook_get_n_pages(GTK_NOTEBOOK(srccnnwin->priv->notebook)) == 1 && !dstcnnwin) return NULL; cnnobj = (RemminaConnectionObject*) g_object_get_data(G_OBJECT(page), "cnnobj"); srcpagenum = gtk_notebook_page_num(GTK_NOTEBOOK(srccnnwin->priv->notebook), cnnobj->scrolled_container); if (dstcnnwin) { cnnobj->cnnhld = dstcnnwin->priv->cnnhld; } else { cnnobj->cnnhld = g_new0(RemminaConnectionHolder, 1); } g_signal_emit_by_name(cnnobj->proto, "connect", cnnobj); gtk_notebook_remove_page(GTK_NOTEBOOK(srccnnwin->priv->notebook), srcpagenum); return NULL; } static GtkWidget* remmina_connection_holder_create_notebook(RemminaConnectionHolder* cnnhld) { GtkWidget* notebook; notebook = gtk_notebook_new(); gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE); gtk_widget_show(notebook); g_signal_connect(G_OBJECT(notebook), "create-window", G_CALLBACK(remmina_connection_holder_on_notebook_create_window), cnnhld); g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(remmina_connection_holder_on_switch_page), cnnhld); g_signal_connect(G_OBJECT(notebook), "page-added", G_CALLBACK(remmina_connection_holder_on_page_added), cnnhld); g_signal_connect(G_OBJECT(notebook), "page-removed", G_CALLBACK(remmina_connection_holder_on_page_added), cnnhld); gtk_widget_set_can_focus(notebook, FALSE); return notebook; } /* Create a scrolled window container */ static void remmina_connection_holder_create_scrolled(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj) { GtkWidget* window; GtkWidget* oldwindow; GtkWidget* vbox; GtkWidget* toolbar; GtkWidget* notebook; gchar* tag; oldwindow = GTK_WIDGET(cnnhld->cnnwin); window = remmina_connection_window_new_from_holder(cnnhld); gtk_widget_realize(window); cnnhld->cnnwin = REMMINA_CONNECTION_WINDOW(window); /* Create the vbox container */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(window), vbox); /* Create the toolbar */ toolbar = remmina_connection_holder_create_toolbar(cnnhld, SCROLLED_WINDOW_MODE); gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0); /* Create the notebook */ notebook = remmina_connection_holder_create_notebook(cnnhld); gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); gtk_container_set_focus_chain(GTK_CONTAINER(vbox), g_list_append(NULL, notebook)); cnnhld->cnnwin->priv->view_mode = SCROLLED_WINDOW_MODE; cnnhld->cnnwin->priv->toolbar = toolbar; cnnhld->cnnwin->priv->notebook = notebook; remmina_connection_window_initialize_notebook(GTK_NOTEBOOK(notebook), (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, SCROLLED_WINDOW_MODE); if (cnnobj) { remmina_connection_window_update_tag(cnnhld->cnnwin, cnnobj); if (remmina_file_get_int(cnnobj->remmina_file, "window_maximize", FALSE)) { gtk_window_maximize(GTK_WINDOW(cnnhld->cnnwin)); } } if (oldwindow) { tag = g_strdup((gchar*) g_object_get_data(G_OBJECT(oldwindow), "tag")); g_object_set_data_full(G_OBJECT(cnnhld->cnnwin), "tag", tag, (GDestroyNotify) g_free); gtk_widget_destroy(oldwindow); } remmina_connection_holder_update_toolbar(cnnhld); remmina_connection_holder_showhide_toolbar(cnnhld, FALSE); remmina_connection_holder_check_resize(cnnhld); gtk_widget_show(GTK_WIDGET(cnnhld->cnnwin)); } static void remmina_connection_holder_create_fullscreen(RemminaConnectionHolder* cnnhld, RemminaConnectionObject* cnnobj, gint view_mode) { GtkWidget* window; GtkWidget* oldwindow; GtkWidget* notebook; GdkColor color; gchar* tag; oldwindow = GTK_WIDGET(cnnhld->cnnwin); window = remmina_connection_window_new_from_holder(cnnhld); gtk_widget_realize(window); cnnhld->cnnwin = REMMINA_CONNECTION_WINDOW(window); if (!view_mode) view_mode = VIEWPORT_FULLSCREEN_MODE; if (view_mode == VIEWPORT_FULLSCREEN_MODE) { gdk_color_parse("black", &color); gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &color); } notebook = remmina_connection_holder_create_notebook(cnnhld); gtk_container_add(GTK_CONTAINER(window), notebook); cnnhld->cnnwin->priv->notebook = notebook; cnnhld->cnnwin->priv->view_mode = view_mode; cnnhld->fullscreen_view_mode = view_mode; remmina_connection_window_initialize_notebook(GTK_NOTEBOOK(notebook), (oldwindow ? GTK_NOTEBOOK(REMMINA_CONNECTION_WINDOW(oldwindow)->priv->notebook) : NULL), cnnobj, view_mode); if (cnnobj) { remmina_connection_window_update_tag(cnnhld->cnnwin, cnnobj); } if (oldwindow) { tag = g_strdup((gchar*) g_object_get_data(G_OBJECT(oldwindow), "tag")); g_object_set_data_full(G_OBJECT(cnnhld->cnnwin), "tag", tag, (GDestroyNotify) g_free); gtk_widget_destroy(oldwindow); } /* Create the floating toolbar */ remmina_connection_holder_create_floating_toolbar(cnnhld, view_mode); remmina_connection_holder_update_toolbar(cnnhld); gtk_window_fullscreen(GTK_WINDOW(window)); remmina_connection_holder_check_resize(cnnhld); gtk_widget_show(window); } static gboolean remmina_connection_window_hostkey_func(RemminaProtocolWidget* gp, guint keyval, gboolean release, RemminaConnectionHolder* cnnhld) { DECLARE_CNNOBJ_WITH_RETURN(FALSE); RemminaConnectionWindowPriv* priv = cnnhld->cnnwin->priv; const RemminaProtocolFeature* feature; gint i; if (release) { if (remmina_pref.hostkey && keyval == remmina_pref.hostkey) { cnnhld->hostkey_activated = FALSE; if (cnnhld->hostkey_used) { return TRUE; } /* If hostkey is released without pressing other keys, we should execute the * shortcut key which is the same as hostkey. Be default, this is grab/ungrab * keyboard */ } else if (cnnhld->hostkey_activated) { /* Trap all key releases when hostkey is pressed */ return TRUE; } else { return FALSE; } } else if (remmina_pref.hostkey && keyval == remmina_pref.hostkey) { cnnhld->hostkey_activated = TRUE; cnnhld->hostkey_used = FALSE; return TRUE; } else if (!cnnhld->hostkey_activated) { return FALSE; } cnnhld->hostkey_used = TRUE; keyval = gdk_keyval_to_lower(keyval); if (keyval == remmina_pref.shortcutkey_fullscreen) { switch (priv->view_mode) { case SCROLLED_WINDOW_MODE: remmina_connection_holder_create_fullscreen( cnnhld, NULL, cnnhld->fullscreen_view_mode ? cnnhld->fullscreen_view_mode : VIEWPORT_FULLSCREEN_MODE); break; case SCROLLED_FULLSCREEN_MODE: case VIEWPORT_FULLSCREEN_MODE: remmina_connection_holder_create_scrolled(cnnhld, NULL); break; default: break; } } else if (keyval == remmina_pref.shortcutkey_autofit) { if (priv->toolitem_autofit && gtk_widget_is_sensitive(GTK_WIDGET(priv->toolitem_autofit))) { remmina_connection_holder_toolbar_autofit(GTK_WIDGET(gp), cnnhld); } } else if (keyval == remmina_pref.shortcutkey_nexttab) { i = gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook)) + 1; if (i >= gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->notebook))) i = 0; gtk_notebook_set_current_page(GTK_NOTEBOOK(priv->notebook), i); } else if (keyval == remmina_pref.shortcutkey_prevtab) { i = gtk_notebook_get_current_page(GTK_NOTEBOOK(priv->notebook)) - 1; if (i < 0) i = gtk_notebook_get_n_pages(GTK_NOTEBOOK(priv->notebook)) - 1; gtk_notebook_set_current_page(GTK_NOTEBOOK(priv->notebook), i); } else if (keyval == remmina_pref.shortcutkey_scale) { if (gtk_widget_is_sensitive(GTK_WIDGET(priv->toolitem_scale))) { gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_scale), !gtk_toggle_tool_button_get_active( GTK_TOGGLE_TOOL_BUTTON( priv->toolitem_scale))); } } else if (keyval == remmina_pref.shortcutkey_grab) { gtk_toggle_tool_button_set_active( GTK_TOGGLE_TOOL_BUTTON(priv->toolitem_grab), !gtk_toggle_tool_button_get_active( GTK_TOGGLE_TOOL_BUTTON( priv->toolitem_grab))); } else if (keyval == remmina_pref.shortcutkey_minimize) { remmina_connection_holder_toolbar_minimize(GTK_WIDGET(gp), cnnhld); } else if (keyval == remmina_pref.shortcutkey_disconnect) { remmina_connection_holder_disconnect(cnnhld); } else if (keyval == remmina_pref.shortcutkey_toolbar) { if (priv->view_mode == SCROLLED_WINDOW_MODE) { remmina_pref.hide_connection_toolbar = !remmina_pref.hide_connection_toolbar; remmina_connection_holder_showhide_toolbar( cnnhld, TRUE); } } else { for (feature = remmina_protocol_widget_get_features( REMMINA_PROTOCOL_WIDGET( cnnobj->proto)); feature && feature->type; feature++) { if (feature->type == REMMINA_PROTOCOL_FEATURE_TYPE_TOOL && GPOINTER_TO_UINT( feature->opt3) == keyval) { remmina_protocol_widget_call_feature_by_ref( REMMINA_PROTOCOL_WIDGET( cnnobj->proto), feature); break; } } } /* Trap all key presses when hostkey is pressed */ return TRUE; } static RemminaConnectionWindow* remmina_connection_window_find(RemminaFile* remminafile) { const gchar* tag; switch (remmina_pref.tab_mode) { case REMMINA_TAB_BY_GROUP: tag = remmina_file_get_string(remminafile, "group"); break; case REMMINA_TAB_BY_PROTOCOL: tag = remmina_file_get_string(remminafile, "protocol"); break; case REMMINA_TAB_ALL: tag = NULL; break; case REMMINA_TAB_NONE: default: return NULL; } return REMMINA_CONNECTION_WINDOW(remmina_widget_pool_find(REMMINA_TYPE_CONNECTION_WINDOW, tag)); } static void remmina_connection_object_on_connect(RemminaProtocolWidget* gp, RemminaConnectionObject* cnnobj) { RemminaConnectionWindow* cnnwin; RemminaConnectionHolder* cnnhld; GtkWidget* tab; gint i; if (!cnnobj->cnnhld) { cnnwin = remmina_connection_window_find(cnnobj->remmina_file); if (cnnwin) { cnnhld = cnnwin->priv->cnnhld; } else { cnnhld = g_new0(RemminaConnectionHolder, 1); } cnnobj->cnnhld = cnnhld; } else { cnnhld = cnnobj->cnnhld; } cnnobj->connected = TRUE; remmina_protocol_widget_set_hostkey_func(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), (RemminaHostkeyFunc) remmina_connection_window_hostkey_func, cnnhld); /* Remember recent list for quick connect */ if (remmina_file_get_filename(cnnobj->remmina_file) == NULL) { remmina_pref_add_recent(remmina_file_get_string(cnnobj->remmina_file, "protocol"), remmina_file_get_string(cnnobj->remmina_file, "server")); } if (!cnnhld->cnnwin) { i = remmina_file_get_int(cnnobj->remmina_file, "viewmode", 0); switch (i) { case SCROLLED_FULLSCREEN_MODE: case VIEWPORT_FULLSCREEN_MODE: remmina_connection_holder_create_fullscreen(cnnhld, cnnobj, i); break; case SCROLLED_WINDOW_MODE: default: remmina_connection_holder_create_scrolled(cnnhld, cnnobj); break; } } else { tab = remmina_connection_object_create_tab(cnnobj); i = remmina_connection_object_append_page(cnnobj, GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), tab, cnnhld->cnnwin->priv->view_mode); gtk_widget_reparent(cnnobj->viewport, cnnobj->scrolled_container); gtk_window_present(GTK_WINDOW(cnnhld->cnnwin)); gtk_notebook_set_current_page(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), i); } remmina_connection_object_init_adjustment(cnnobj); if (cnnhld->cnnwin->priv->floating_toolbar) { gtk_widget_show(cnnhld->cnnwin->priv->floating_toolbar); } } static void remmina_connection_object_on_disconnect(RemminaProtocolWidget* gp, RemminaConnectionObject* cnnobj) { RemminaConnectionHolder* cnnhld = cnnobj->cnnhld; GtkWidget* dialog; cnnobj->connected = FALSE; if (scale_option_window) { gtk_widget_destroy(scale_option_window); scale_option_window = NULL; } if (cnnhld && remmina_pref.save_view_mode) { if (cnnhld->cnnwin) { remmina_file_set_int(cnnobj->remmina_file, "viewmode", cnnhld->cnnwin->priv->view_mode); } if (remmina_pref.save_when_connect) { remmina_file_save_all(cnnobj->remmina_file); } else { remmina_file_save_group(cnnobj->remmina_file, REMMINA_SETTING_GROUP_RUNTIME); } if (cnnhld->cnnwin && remmina_pref.toolbar_pin_down != cnnhld->cnnwin->priv->pin_down) { remmina_pref.toolbar_pin_down = cnnhld->cnnwin->priv->pin_down; remmina_pref_save(); } } remmina_file_free(cnnobj->remmina_file); if (remmina_protocol_widget_has_error(gp)) { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, remmina_protocol_widget_get_error_message(gp), NULL); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); remmina_widget_pool_register(dialog); } if (cnnobj->window) { gtk_widget_destroy(cnnobj->window); cnnobj->window = NULL; } if (cnnhld && cnnhld->cnnwin && cnnobj->scrolled_container) { gtk_notebook_remove_page( GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), gtk_notebook_page_num(GTK_NOTEBOOK(cnnhld->cnnwin->priv->notebook), cnnobj->scrolled_container)); } g_free(cnnobj); } static void remmina_connection_object_on_desktop_resize(RemminaProtocolWidget* gp, RemminaConnectionObject* cnnobj) { if (cnnobj->cnnhld && cnnobj->cnnhld->cnnwin && cnnobj->cnnhld->cnnwin->priv->view_mode != SCROLLED_WINDOW_MODE) { remmina_connection_holder_check_resize(cnnobj->cnnhld); } } static void remmina_connection_object_on_update_align(RemminaProtocolWidget* gp, RemminaConnectionObject* cnnobj) { remmina_connection_holder_update_alignment(cnnobj->cnnhld); } gboolean remmina_connection_window_open_from_filename(const gchar* filename) { RemminaFile* remminafile; GtkWidget* dialog; remminafile = remmina_file_manager_load_file(filename); if (remminafile) { remmina_connection_window_open_from_file(remminafile); return TRUE; } else { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("File %s not found."), filename); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); remmina_widget_pool_register(dialog); return FALSE; } } void remmina_connection_window_open_from_file(RemminaFile* remminafile) { remmina_connection_window_open_from_file_full(remminafile, NULL, NULL, NULL); } GtkWidget* remmina_connection_window_open_from_file_full(RemminaFile* remminafile, GCallback disconnect_cb, gpointer data, guint* handler) { RemminaConnectionObject* cnnobj; GdkColor color; remmina_file_update_screen_resolution(remminafile); cnnobj = g_new0(RemminaConnectionObject, 1); cnnobj->remmina_file = remminafile; /* Create the RemminaProtocolWidget */ cnnobj->proto = remmina_protocol_widget_new(); if (data) { g_object_set_data(G_OBJECT(cnnobj->proto), "user-data", data); } gtk_widget_show(cnnobj->proto); g_signal_connect(G_OBJECT(cnnobj->proto), "connect", G_CALLBACK(remmina_connection_object_on_connect), cnnobj); if (disconnect_cb) { *handler = g_signal_connect(G_OBJECT(cnnobj->proto), "disconnect", disconnect_cb, data); } g_signal_connect(G_OBJECT(cnnobj->proto), "disconnect", G_CALLBACK(remmina_connection_object_on_disconnect), cnnobj); g_signal_connect(G_OBJECT(cnnobj->proto), "desktop-resize", G_CALLBACK(remmina_connection_object_on_desktop_resize), cnnobj); g_signal_connect(G_OBJECT(cnnobj->proto), "update-align", G_CALLBACK(remmina_connection_object_on_update_align), cnnobj); /* Create the alignment to make the RemminaProtocolWidget centered */ cnnobj->alignment = gtk_alignment_new(0.5, 0.5, 1.0, 1.0); gtk_widget_show(cnnobj->alignment); gtk_container_set_border_width(GTK_CONTAINER(cnnobj->alignment), 0); gtk_container_add(GTK_CONTAINER(cnnobj->alignment), cnnobj->proto); g_signal_connect(G_OBJECT(cnnobj->alignment), "size-allocate", G_CALLBACK(remmina_connection_object_alignment_on_allocate), cnnobj); /* Create the viewport to make the RemminaProtocolWidget scrollable */ cnnobj->viewport = gtk_viewport_new(NULL, NULL); gtk_widget_show(cnnobj->viewport); gdk_color_parse("black", &color); gtk_widget_modify_bg(cnnobj->viewport, GTK_STATE_NORMAL, &color); gtk_container_set_border_width(GTK_CONTAINER(cnnobj->viewport), 0); gtk_viewport_set_shadow_type(GTK_VIEWPORT(cnnobj->viewport), GTK_SHADOW_NONE); gtk_container_add(GTK_CONTAINER(cnnobj->viewport), cnnobj->alignment); cnnobj->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_realize(cnnobj->window); gtk_container_add(GTK_CONTAINER(cnnobj->window), cnnobj->viewport); if (!remmina_pref.save_view_mode) remmina_file_set_int(cnnobj->remmina_file, "viewmode", remmina_pref.default_mode); remmina_protocol_widget_open_connection(REMMINA_PROTOCOL_WIDGET(cnnobj->proto), remminafile); return cnnobj->proto; } FreeRDP-Remmina-356c033/remmina/src/remmina_connection_window.h000066400000000000000000000050451171526373700244450ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINACONNECTIONWINDOW_H__ #define __REMMINACONNECTIONWINDOW_H__ #include "remmina_file.h" G_BEGIN_DECLS #define REMMINA_TYPE_CONNECTION_WINDOW (remmina_connection_window_get_type ()) #define REMMINA_CONNECTION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_CONNECTION_WINDOW, RemminaConnectionWindow)) #define REMMINA_CONNECTION_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_CONNECTION_WINDOW, RemminaConnectionWindowClass)) #define REMMINA_IS_CONNECTION_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_CONNECTION_WINDOW)) #define REMMINA_IS_CONNECTION_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_CONNECTION_WINDOW)) #define REMMINA_CONNECTION_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_CONNECTION_WINDOW, RemminaConnectionWindowClass)) typedef struct _RemminaConnectionWindowPriv RemminaConnectionWindowPriv; typedef struct _RemminaConnectionWindow { GtkWindow window; RemminaConnectionWindowPriv* priv; } RemminaConnectionWindow; typedef struct _RemminaConnectionWindowClass { GtkWindowClass parent_class; } RemminaConnectionWindowClass; GType remmina_connection_window_get_type(void) G_GNUC_CONST; /* Open a new connection window for a .remmina file */ gboolean remmina_connection_window_open_from_filename(const gchar* filename); /* Open a new connection window for a given RemminaFile struct. The struct will be freed after the call */ void remmina_connection_window_open_from_file(RemminaFile* remminafile); GtkWidget* remmina_connection_window_open_from_file_full(RemminaFile* remminafile, GCallback disconnect_cb, gpointer data, guint* handler); G_END_DECLS #endif /* __REMMINACONNECTIONWINDOW_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_crypt.c000066400000000000000000000063411171526373700220530ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #ifdef HAVE_LIBGCRYPT #include #endif #include "remmina_pref.h" #include "remmina_crypt.h" #ifdef HAVE_LIBGCRYPT static gboolean remmina_crypt_init(gcry_cipher_hd_t *phd) { guchar* secret; gcry_error_t err; gsize secret_len; secret = g_base64_decode(remmina_pref.secret, &secret_len); if (secret_len < 32) { g_print("secret corrupted\n"); g_free(secret); return FALSE; } err = gcry_cipher_open(phd, GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC, 0); if (err) { g_print("gcry_cipher_open failure: %s\n", gcry_strerror(err)); g_free(secret); return FALSE; } err = gcry_cipher_setkey((*phd), secret, 24); if (err) { g_print("gcry_cipher_setkey failure: %s\n", gcry_strerror(err)); g_free(secret); gcry_cipher_close((*phd)); return FALSE; } err = gcry_cipher_setiv((*phd), secret + 24, 8); if (err) { g_print("gcry_cipher_setiv failure: %s\n", gcry_strerror(err)); g_free(secret); gcry_cipher_close((*phd)); return FALSE; } g_free(secret); return TRUE; } gchar* remmina_crypt_encrypt(const gchar *str) { guchar* buf; gint buf_len; gchar* result; gcry_error_t err; gcry_cipher_hd_t hd; if (!str || str[0] == '\0') return NULL; if (!remmina_crypt_init(&hd)) return NULL; buf_len = strlen(str); /* Pack to 64bit block size, and make sure it's always 0-terminated */ buf_len += 8 - buf_len % 8; buf = (guchar*) g_malloc(buf_len); memset(buf, 0, buf_len); memcpy(buf, str, strlen(str)); err = gcry_cipher_encrypt(hd, buf, buf_len, NULL, 0); if (err) { g_print("gcry_cipher_encrypt failure: %s\n", gcry_strerror(err)); g_free(buf); gcry_cipher_close(hd); return NULL; } result = g_base64_encode(buf, buf_len); g_free(buf); gcry_cipher_close(hd); return result; } gchar* remmina_crypt_decrypt(const gchar *str) { guchar* buf; gsize buf_len; gcry_error_t err; gcry_cipher_hd_t hd; if (!str || str[0] == '\0') return NULL; if (!remmina_crypt_init(&hd)) return NULL; buf = g_base64_decode(str, &buf_len); err = gcry_cipher_decrypt(hd, buf, buf_len, NULL, 0); if (err) { g_print("gcry_cipher_decrypt failure: %s\n", gcry_strerror(err)); g_free(buf); gcry_cipher_close(hd); return NULL; } gcry_cipher_close(hd); /* Just in case */ buf[buf_len - 1] = '\0'; return (gchar*) buf; } #else gchar* remmina_crypt_encrypt(const gchar *str) { return NULL; } gchar* remmina_crypt_decrypt(const gchar *str) { return NULL; } #endif FreeRDP-Remmina-356c033/remmina/src/remmina_crypt.h000066400000000000000000000017741171526373700220650ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINACRYPT_H__ #define __REMMINACRYPT_H__ G_BEGIN_DECLS gchar* remmina_crypt_encrypt(const gchar* str); gchar* remmina_crypt_decrypt(const gchar* str); G_END_DECLS #endif /* __REMMINACRYPT_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_exec.c000066400000000000000000000060411171526373700216330ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include "remmina_main.h" #include "remmina_widget_pool.h" #include "remmina_pref_dialog.h" #include "remmina_file.h" #include "remmina_file_editor.h" #include "remmina_connection_window.h" #include "remmina_about.h" #include "remmina_plugin_manager.h" #include "remmina_exec.h" void remmina_exec_command(RemminaCommandType command, const gchar* data) { gchar* s1; gchar* s2; GtkWidget* widget; RemminaEntryPlugin* plugin; switch (command) { case REMMINA_COMMAND_MAIN: widget = remmina_widget_pool_find(REMMINA_TYPE_MAIN, NULL); if (widget) { gtk_window_present(GTK_WINDOW(widget)); gtk_window_deiconify(GTK_WINDOW(widget)); } else { widget = remmina_main_new(); gtk_widget_show(widget); } break; case REMMINA_COMMAND_PREF: widget = remmina_widget_pool_find(REMMINA_TYPE_PREF_DIALOG, NULL); if (widget) { gtk_window_present(GTK_WINDOW(widget)); } else { widget = remmina_pref_dialog_new(atoi(data)); gtk_widget_show(widget); } break; case REMMINA_COMMAND_NEW: s1 = (data ? strchr(data, ',') : NULL); if (s1) { s1 = g_strdup(data); s2 = strchr(s1, ','); *s2++ = '\0'; widget = remmina_file_editor_new_full(s2, s1); g_free(s1); } else { widget = remmina_file_editor_new_full(NULL, data); } gtk_widget_show(widget); break; case REMMINA_COMMAND_CONNECT: remmina_connection_window_open_from_filename(data); break; case REMMINA_COMMAND_EDIT: widget = remmina_file_editor_new_from_filename(data); if (widget) gtk_widget_show(widget); break; case REMMINA_COMMAND_ABOUT: remmina_about_open(NULL); break; case REMMINA_COMMAND_PLUGIN: plugin = (RemminaEntryPlugin*) remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_ENTRY, data); if (plugin) { plugin->entry_func(); } else { widget = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Plugin %s is not registered."), data); g_signal_connect(G_OBJECT(widget), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(widget); remmina_widget_pool_register(widget); } break; default: break; } } FreeRDP-Remmina-356c033/remmina/src/remmina_exec.h000066400000000000000000000023431171526373700216410ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAEXEC_H__ #define __REMMINAEXEC_H__ G_BEGIN_DECLS typedef enum { REMMINA_COMMAND_NONE = 0, REMMINA_COMMAND_MAIN = 1, REMMINA_COMMAND_PREF = 2, REMMINA_COMMAND_NEW = 3, REMMINA_COMMAND_CONNECT = 4, REMMINA_COMMAND_EDIT = 5, REMMINA_COMMAND_ABOUT = 6, REMMINA_COMMAND_PLUGIN = 7 } RemminaCommandType; void remmina_exec_command(RemminaCommandType command, const gchar* data); G_END_DECLS #endif /* __REMMINAEXEC_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_file.c000066400000000000000000000274351171526373700216400ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "remmina_public.h" #include "remmina_pref.h" #include "remmina_crypt.h" #include "remmina_plugin_manager.h" #include "remmina_file.h" #define MIN_WINDOW_WIDTH 10 #define MIN_WINDOW_HEIGHT 10 struct _RemminaFile { gchar *filename; GHashTable *settings; }; typedef struct _RemminaSetting { const gchar *setting; RemminaSettingGroup group; gboolean encrypted; } RemminaSetting; const RemminaSetting remmina_system_settings[] = { { "resolution_width", REMMINA_SETTING_GROUP_NONE, FALSE }, { "resolution_height", REMMINA_SETTING_GROUP_NONE, FALSE }, { "username", REMMINA_SETTING_GROUP_CREDENTIAL, FALSE }, { "password", REMMINA_SETTING_GROUP_CREDENTIAL, TRUE }, { "cacert", REMMINA_SETTING_GROUP_CREDENTIAL, FALSE }, { "cacrl", REMMINA_SETTING_GROUP_CREDENTIAL, FALSE }, { "clientcert", REMMINA_SETTING_GROUP_CREDENTIAL, FALSE }, { "clientkey", REMMINA_SETTING_GROUP_CREDENTIAL, FALSE }, { "viewmode", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "scale", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "keyboard_grab", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "window_width", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "window_height", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "window_maximize", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { "toolbar_opacity", REMMINA_SETTING_GROUP_RUNTIME, FALSE }, { NULL, 0, FALSE } }; static RemminaSettingGroup remmina_setting_get_group(const gchar *setting, gboolean *encrypted) { gint i; for (i = 0; remmina_system_settings[i].setting; i++) { if (g_strcmp0(setting, remmina_system_settings[i].setting) == 0) { if (encrypted) *encrypted = remmina_system_settings[i].encrypted; return remmina_system_settings[i].group; } } if (encrypted) *encrypted = FALSE; return REMMINA_SETTING_GROUP_PROFILE; } static RemminaFile* remmina_file_new_empty(void) { RemminaFile *remminafile; remminafile = g_new0(RemminaFile, 1); remminafile->settings = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); return remminafile; } RemminaFile* remmina_file_new(void) { RemminaFile *remminafile; /* Try to load from the preference file for default settings first */ remminafile = remmina_file_load(remmina_pref_file); if (remminafile) { g_free(remminafile->filename); remminafile->filename = NULL; } else { remminafile = remmina_file_new_empty(); } return remminafile; } void remmina_file_generate_filename(RemminaFile *remminafile) { GTimeVal gtime; g_free(remminafile->filename); g_get_current_time(>ime); remminafile->filename = g_strdup_printf("%s/.remmina/%li%03li.remmina", g_get_home_dir(), gtime.tv_sec, gtime.tv_usec / 1000); } void remmina_file_set_filename(RemminaFile *remminafile, const gchar *filename) { g_free(remminafile->filename); remminafile->filename = g_strdup(filename); } const gchar* remmina_file_get_filename(RemminaFile *remminafile) { return remminafile->filename; } RemminaFile* remmina_file_copy(const gchar *filename) { RemminaFile *remminafile; remminafile = remmina_file_load(filename); remmina_file_generate_filename(remminafile); return remminafile; } RemminaFile* remmina_file_load(const gchar *filename) { GKeyFile *gkeyfile; RemminaFile *remminafile; gchar **keys; gchar *key; gint i; gchar *s; gboolean encrypted; gkeyfile = g_key_file_new(); if (!g_key_file_load_from_file(gkeyfile, filename, G_KEY_FILE_NONE, NULL)) return NULL; if (g_key_file_has_key(gkeyfile, "remmina", "name", NULL)) { remminafile = remmina_file_new_empty(); remminafile->filename = g_strdup(filename); keys = g_key_file_get_keys(gkeyfile, "remmina", NULL, NULL); if (keys) { for (i = 0; keys[i]; i++) { key = keys[i]; encrypted = FALSE; remmina_setting_get_group(key, &encrypted); if (encrypted) { s = g_key_file_get_string(gkeyfile, "remmina", key, NULL); if (g_strcmp0(s, ".") == 0) { remmina_file_set_string(remminafile, key, s); } else { remmina_file_set_string_ref(remminafile, key, remmina_crypt_decrypt(s)); } g_free(s); } else { remmina_file_set_string_ref(remminafile, key, g_key_file_get_string(gkeyfile, "remmina", key, NULL)); } } g_strfreev(keys); } } else { remminafile = NULL; } g_key_file_free(gkeyfile); return remminafile; } void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value) { remmina_file_set_string_ref(remminafile, setting, g_strdup(value)); } void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting, gchar *value) { if (value) { g_hash_table_insert(remminafile->settings, g_strdup(setting), value); } else { g_hash_table_insert(remminafile->settings, g_strdup(setting), g_strdup("")); } } const gchar* remmina_file_get_string(RemminaFile *remminafile, const gchar *setting) { gchar *value; value = (gchar*) g_hash_table_lookup(remminafile->settings, setting); return value && value[0] ? value : NULL; } gchar* remmina_file_get_secret(RemminaFile *remminafile, const gchar *setting) { RemminaSecretPlugin *plugin; const gchar *cs; plugin = remmina_plugin_manager_get_secret_plugin(); cs = remmina_file_get_string(remminafile, setting); if (plugin && g_strcmp0(cs, ".") == 0) { if (remminafile->filename) { return plugin->get_password(remminafile, setting); } else { return NULL; } } else { return g_strdup(cs); } } void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value) { g_hash_table_insert(remminafile->settings, g_strdup(setting), g_strdup_printf("%i", value)); } gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value) { gchar *value; value = g_hash_table_lookup(remminafile->settings, setting); return value == NULL ? default_value : (value[0] == 't' ? TRUE : atoi(value)); } static void remmina_file_store_group(RemminaFile *remminafile, GKeyFile *gkeyfile, RemminaSettingGroup group) { RemminaSecretPlugin *plugin; GHashTableIter iter; const gchar *key, *value; gchar *s; gboolean encrypted; RemminaSettingGroup g; plugin = remmina_plugin_manager_get_secret_plugin(); g_hash_table_iter_init(&iter, remminafile->settings); while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value)) { encrypted = FALSE; g = remmina_setting_get_group(key, &encrypted); if (g != REMMINA_SETTING_GROUP_NONE && (group == REMMINA_SETTING_GROUP_ALL || group == g)) { if (encrypted) { if (remminafile->filename && g_strcmp0(remminafile->filename, remmina_pref_file)) { if (plugin) { if (value && value[0]) { if (g_strcmp0(value, ".") != 0) { plugin->store_password(remminafile, key, value); } g_key_file_set_string(gkeyfile, "remmina", key, "."); } else { g_key_file_set_string(gkeyfile, "remmina", key, ""); plugin->delete_password(remminafile, key); } } else { if (value && value[0]) { s = remmina_crypt_encrypt(value); g_key_file_set_string(gkeyfile, "remmina", key, s); g_free(s); } else { g_key_file_set_string(gkeyfile, "remmina", key, ""); } } } } else { g_key_file_set_string(gkeyfile, "remmina", key, value); } } } } static GKeyFile* remmina_file_get_keyfile(RemminaFile *remminafile) { GKeyFile *gkeyfile; if (remminafile->filename == NULL) return NULL; gkeyfile = g_key_file_new(); if (!g_key_file_load_from_file(gkeyfile, remminafile->filename, G_KEY_FILE_NONE, NULL)) { /* it will fail if it's a new file, but shouldn't matter. */ } return gkeyfile; } static void remmina_file_save_flush(RemminaFile *remminafile, GKeyFile *gkeyfile) { gchar *content; gsize length = 0; content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remminafile->filename, content, length, NULL); g_free(content); } void remmina_file_save_group(RemminaFile *remminafile, RemminaSettingGroup group) { GKeyFile *gkeyfile; if ((gkeyfile = remmina_file_get_keyfile(remminafile)) == NULL) return; remmina_file_store_group(remminafile, gkeyfile, group); remmina_file_save_flush(remminafile, gkeyfile); g_key_file_free(gkeyfile); } void remmina_file_save_all(RemminaFile *remminafile) { remmina_file_save_group(remminafile, REMMINA_SETTING_GROUP_ALL); } void remmina_file_free(RemminaFile *remminafile) { if (remminafile == NULL) return; g_free(remminafile->filename); g_hash_table_destroy(remminafile->settings); g_free(remminafile); } RemminaFile* remmina_file_dup(RemminaFile *remminafile) { RemminaFile *dupfile; GHashTableIter iter; const gchar *key, *value; dupfile = remmina_file_new_empty(); dupfile->filename = g_strdup(remminafile->filename); g_hash_table_iter_init(&iter, remminafile->settings); while (g_hash_table_iter_next(&iter, (gpointer*) &key, (gpointer*) &value)) { remmina_file_set_string(dupfile, key, value); } return dupfile; } void remmina_file_update_screen_resolution(RemminaFile *remminafile) { GdkScreen *screen; gchar *pos; gchar *resolution; gint x, y; gint monitor; GdkRectangle rect; resolution = g_strdup(remmina_file_get_string(remminafile, "resolution")); if (resolution == NULL || strchr(resolution, 'x') == NULL) { gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL); monitor = gdk_screen_get_monitor_at_point(screen, x, y); gdk_screen_get_monitor_geometry(screen, monitor, &rect); remmina_file_set_int(remminafile, "resolution_width", rect.width); remmina_file_set_int(remminafile, "resolution_height", rect.height); } else { pos = strchr(resolution, 'x'); *pos++ = '\0'; remmina_file_set_int(remminafile, "resolution_width", MAX(100, MIN(4096, atoi(resolution)))); remmina_file_set_int(remminafile, "resolution_height", MAX(100, MIN(4096, atoi(pos)))); } g_free(resolution); } const gchar* remmina_file_get_icon_name(RemminaFile *remminafile) { RemminaProtocolPlugin *plugin; plugin = (RemminaProtocolPlugin *) remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_PROTOCOL, remmina_file_get_string(remminafile, "protocol")); if (!plugin) return "remmina"; return (remmina_file_get_int(remminafile, "ssh_enabled", FALSE) ? plugin->icon_name_ssh : plugin->icon_name); } RemminaFile* remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol) { RemminaFile *tmp; tmp = remmina_file_dup(remminafile); g_free(tmp->filename); tmp->filename = NULL; remmina_file_set_string(tmp, "protocol", new_protocol); return tmp; } void remmina_file_delete(const gchar *filename) { RemminaSecretPlugin *plugin; RemminaFile *remminafile; gint i; remminafile = remmina_file_load(filename); if (remminafile) { plugin = remmina_plugin_manager_get_secret_plugin(); if (plugin) { for (i = 0; remmina_system_settings[i].setting; i++) { if (remmina_system_settings[i].encrypted) { plugin->delete_password(remminafile, remmina_system_settings[i].setting); } } } remmina_file_free(remminafile); } g_unlink(filename); } FreeRDP-Remmina-356c033/remmina/src/remmina_file.h000066400000000000000000000061121171526373700216320ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "remmina/types.h" #ifndef __REMMINAFILE_H__ #define __REMMINAFILE_H__ G_BEGIN_DECLS enum { SSH_AUTH_PASSWORD, SSH_AUTH_PUBLICKEY, SSH_AUTH_AUTO_PUBLICKEY }; typedef enum { REMMINA_SETTING_GROUP_NONE, REMMINA_SETTING_GROUP_PROFILE, REMMINA_SETTING_GROUP_CREDENTIAL, REMMINA_SETTING_GROUP_RUNTIME, REMMINA_SETTING_GROUP_ALL } RemminaSettingGroup; #define TOOLBAR_OPACITY_LEVEL 8 #define TOOLBAR_OPACITY_MIN 0.2 /* Create a empty .remmina file */ RemminaFile* remmina_file_new(void); RemminaFile* remmina_file_copy(const gchar *filename); void remmina_file_generate_filename(RemminaFile *remminafile); void remmina_file_set_filename(RemminaFile *remminafile, const gchar *filename); const gchar* remmina_file_get_filename(RemminaFile *remminafile); /* Load a new .remmina file and return the allocated RemminaFile object */ RemminaFile* remmina_file_load(const gchar *filename); /* Settings get/set functions */ void remmina_file_set_string(RemminaFile *remminafile, const gchar *setting, const gchar *value); void remmina_file_set_string_ref(RemminaFile *remminafile, const gchar *setting, gchar *value); const gchar* remmina_file_get_string(RemminaFile *remminafile, const gchar *setting); gchar* remmina_file_get_secret(RemminaFile *remminafile, const gchar *setting); void remmina_file_set_int(RemminaFile *remminafile, const gchar *setting, gint value); gint remmina_file_get_int(RemminaFile *remminafile, const gchar *setting, gint default_value); /* Create or overwrite the .remmina file */ void remmina_file_save_group(RemminaFile *remminafile, RemminaSettingGroup group); void remmina_file_save_all(RemminaFile *remminafile); /* Free the RemminaFile object */ void remmina_file_free(RemminaFile *remminafile); /* Duplicate a RemminaFile object */ RemminaFile* remmina_file_dup(RemminaFile *remminafile); /* Update the screen width and height members */ void remmina_file_update_screen_resolution(RemminaFile *remminafile); /* Get the protocol icon name */ const gchar* remmina_file_get_icon_name(RemminaFile *remminafile); /* Duplicate a temporary RemminaFile and change the protocol */ RemminaFile* remmina_file_dup_temp_protocol(RemminaFile *remminafile, const gchar *new_protocol); /* Delete a .remmina file */ void remmina_file_delete(const gchar *filename); G_END_DECLS #endif /* __REMMINAFILE_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_file_editor.c000066400000000000000000001346621171526373700232070ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "config.h" #ifdef HAVE_LIBAVAHI_UI #include #endif #include "remmina_public.h" #include "remmina_pref.h" #include "remmina_connection_window.h" #include "remmina_pref_dialog.h" #include "remmina_file.h" #include "remmina_file_manager.h" #include "remmina_ssh.h" #include "remmina_scaler.h" #include "remmina_widget_pool.h" #include "remmina_plugin_manager.h" #include "remmina_icon.h" #include "remmina_file_editor.h" G_DEFINE_TYPE( RemminaFileEditor, remmina_file_editor, GTK_TYPE_DIALOG) static const gchar* charset_list = "ASCII,BIG5," "CP437,CP720,CP737,CP775,CP850,CP852,CP855," "CP857,CP858,CP862,CP866,CP874,CP1125,CP1250," "CP1251,CP1252,CP1253,CP1254,CP1255,CP1256," "CP1257,CP1258," "EUC-JP,EUC-KR,GBK," "ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4," "ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8," "ISO-8859-9,ISO-8859-10,ISO-8859-11,ISO-8859-12," "ISO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16," "KOI8-R,SJIS,UTF-8"; static const gchar* server_tips = N_("" "Supported formats\n" "* server\n" "* server:port\n" "* [server]:port" ""); static const gchar* server_tips2 = N_("" "Supported formats\n" "* :port\n" "* server\n" "* server:port\n" "* [server]:port" ""); struct _RemminaFileEditorPriv { RemminaFile* remmina_file; RemminaProtocolPlugin* plugin; const gchar* avahi_service_type; GtkWidget* name_entry; GtkWidget* group_combo; GtkWidget* protocol_combo; GtkWidget* save_button; GtkWidget* config_box; GtkWidget* config_container; GtkWidget* server_combo; GtkWidget* password_entry; GtkWidget* resolution_auto_radio; GtkWidget* resolution_custom_radio; GtkWidget* resolution_custom_combo; GtkWidget* keymap_combo; GtkWidget* scaler_widget; GtkWidget* ssh_enabled_check; GtkWidget* ssh_loopback_check; GtkWidget* ssh_server_default_radio; GtkWidget* ssh_server_custom_radio; GtkWidget* ssh_server_entry; GtkWidget* ssh_auth_password_radio; GtkWidget* ssh_auth_publickey_radio; GtkWidget* ssh_auth_auto_publickey_radio; GtkWidget* ssh_username_entry; GtkWidget* ssh_privatekey_chooser; GtkWidget* ssh_charset_combo; GHashTable* setting_widgets; }; static void remmina_file_editor_class_init(RemminaFileEditorClass* klass) { } #ifdef HAVE_LIBAVAHI_UI static void remmina_file_editor_browse_avahi(GtkWidget* button, RemminaFileEditor* gfe) { GtkWidget* dialog; gchar* host; dialog = aui_service_dialog_new(_("Choose a Remote Desktop Server"), GTK_WINDOW(gfe), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(gfe)); aui_service_dialog_set_resolve_service (AUI_SERVICE_DIALOG (dialog), TRUE); aui_service_dialog_set_resolve_host_name (AUI_SERVICE_DIALOG (dialog), TRUE); aui_service_dialog_set_browse_service_types (AUI_SERVICE_DIALOG (dialog), gfe->priv->avahi_service_type, NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { host = g_strdup_printf("[%s]:%i", aui_service_dialog_get_host_name (AUI_SERVICE_DIALOG (dialog)), aui_service_dialog_get_port (AUI_SERVICE_DIALOG (dialog))); } else { host = NULL; } gtk_widget_destroy (dialog); if (host) { gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child (GTK_BIN (gfe->priv->server_combo))), host); g_free(host); } } #endif static void remmina_file_editor_on_realize(GtkWidget* widget, gpointer user_data) { RemminaFileEditor* gfe; GtkWidget* defaultwidget; gfe = REMMINA_FILE_EDITOR(widget); defaultwidget = gfe->priv->name_entry; if (defaultwidget) { if (GTK_IS_EDITABLE(defaultwidget)) { gtk_editable_select_region(GTK_EDITABLE(defaultwidget), 0, -1); } gtk_widget_grab_focus(defaultwidget); } } static void remmina_file_editor_destroy(GtkWidget* widget, gpointer data) { remmina_file_free(REMMINA_FILE_EDITOR(widget)->priv->remmina_file); g_hash_table_destroy(REMMINA_FILE_EDITOR(widget)->priv->setting_widgets); g_free(REMMINA_FILE_EDITOR(widget)->priv); } static void remmina_file_editor_button_on_toggled(GtkToggleButton* togglebutton, GtkWidget* widget) { gtk_widget_set_sensitive(widget, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(togglebutton))); } static void remmina_file_editor_create_notebook_container(RemminaFileEditor* gfe) { /* Create the notebook */ gfe->priv->config_container = gtk_notebook_new(); gtk_container_add(GTK_CONTAINER(gfe->priv->config_box), gfe->priv->config_container); gtk_container_set_border_width(GTK_CONTAINER(gfe->priv->config_container), 4); gtk_widget_show(gfe->priv->config_container); } static GtkWidget* remmina_file_editor_create_notebook_tab(RemminaFileEditor* gfe, const gchar* stock_id, const gchar* label, gint rows, gint cols) { GtkWidget* tablabel; GtkWidget* tabbody; GtkWidget* table; GtkWidget* widget; tablabel = gtk_hbox_new(FALSE, 0); gtk_widget_show(tablabel); widget = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU); gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0); gtk_widget_show(widget); widget = gtk_label_new(label); gtk_box_pack_start(GTK_BOX(tablabel), widget, FALSE, FALSE, 0); gtk_widget_show(widget); tabbody = gtk_vbox_new(FALSE, 0); gtk_widget_show(tabbody); gtk_notebook_append_page(GTK_NOTEBOOK(gfe->priv->config_container), tabbody, tablabel); table = gtk_table_new(rows, cols, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 8); gtk_table_set_col_spacings(GTK_TABLE(table), 8); gtk_container_set_border_width(GTK_CONTAINER(table), 15); gtk_box_pack_start(GTK_BOX(tabbody), table, FALSE, FALSE, 0); return table; } #ifdef HAVE_LIBSSH static void remmina_file_editor_ssh_server_custom_radio_on_toggled(GtkToggleButton* togglebutton, RemminaFileEditor* gfe) { gtk_widget_set_sensitive(gfe->priv->ssh_server_entry, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check)) && (gfe->priv->ssh_server_custom_radio == NULL || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_server_custom_radio))) ); } static void remmina_file_editor_ssh_auth_publickey_radio_on_toggled(GtkToggleButton* togglebutton, RemminaFileEditor* gfe) { gboolean b; gchar* s; b = ((!gfe->priv->ssh_enabled_check || gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check))) && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_auth_publickey_radio))); gtk_widget_set_sensitive(gfe->priv->ssh_privatekey_chooser, b); if (b && remmina_file_get_string (gfe->priv->remmina_file, "ssh_privatekey")) { s = remmina_ssh_find_identity (); if (s) { gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (gfe->priv->ssh_privatekey_chooser), s); g_free(s); } } } static void remmina_file_editor_ssh_enabled_check_on_toggled(GtkToggleButton* togglebutton, RemminaFileEditor* gfe) { gboolean enabled = TRUE; if (gfe->priv->ssh_enabled_check) { enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gfe->priv->ssh_enabled_check)); if (gfe->priv->ssh_loopback_check) gtk_widget_set_sensitive(gfe->priv->ssh_loopback_check, enabled); if (gfe->priv->ssh_server_default_radio) gtk_widget_set_sensitive(gfe->priv->ssh_server_default_radio, enabled); if (gfe->priv->ssh_server_custom_radio) gtk_widget_set_sensitive(gfe->priv->ssh_server_custom_radio, enabled); remmina_file_editor_ssh_server_custom_radio_on_toggled(NULL, gfe); gtk_widget_set_sensitive(gfe->priv->ssh_charset_combo, enabled); gtk_widget_set_sensitive(gfe->priv->ssh_username_entry, enabled); gtk_widget_set_sensitive(gfe->priv->ssh_auth_password_radio, enabled); gtk_widget_set_sensitive(gfe->priv->ssh_auth_publickey_radio, enabled); gtk_widget_set_sensitive(gfe->priv->ssh_auth_auto_publickey_radio, enabled); } remmina_file_editor_ssh_auth_publickey_radio_on_toggled(NULL, gfe); if (enabled && gtk_entry_get_text(GTK_ENTRY(gfe->priv->ssh_username_entry)) [0] == '\0') { gtk_entry_set_text(GTK_ENTRY(gfe->priv->ssh_username_entry), g_get_user_name()); } } static void remmina_file_editor_create_ssh_privatekey(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint column) { gchar* s; GtkWidget* widget; GtkWidget* dialog; const gchar* ssh_privatekey; RemminaFileEditorPriv* priv = gfe->priv; widget = gtk_radio_button_new_with_label_from_widget( GTK_RADIO_BUTTON(priv->ssh_auth_password_radio), _("Identity file")); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_file_editor_ssh_auth_publickey_radio_on_toggled), gfe); priv->ssh_auth_publickey_radio = widget; gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, column, column + 1, row, row + 1, GTK_FILL, 0, 0, 0); dialog = gtk_file_chooser_dialog_new (_("Identity file"), GTK_WINDOW(gfe), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); widget = gtk_file_chooser_button_new_with_dialog (dialog); s = g_strdup_printf("%s/.ssh", g_get_home_dir ()); if (g_file_test (s, G_FILE_TEST_IS_DIR)) { gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (widget), s); } g_free(s); gtk_widget_show(widget); gtk_table_attach_defaults (GTK_TABLE(table), widget, column + 1, column + 2, row, row + 1); priv->ssh_privatekey_chooser = widget; ssh_privatekey = remmina_file_get_string (priv->remmina_file, "ssh_privatekey"); if (ssh_privatekey && g_file_test (ssh_privatekey, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS)) { gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->ssh_privatekey_chooser), ssh_privatekey); } else { remmina_file_set_string (priv->remmina_file, "ssh_privatekey", NULL); } } #endif static void remmina_file_editor_create_server(RemminaFileEditor* gfe, const RemminaProtocolSetting* setting, GtkWidget* table, gint row) { RemminaProtocolPlugin* plugin = gfe->priv->plugin; GtkWidget* widget; #ifdef HAVE_LIBAVAHI_UI GtkWidget* hbox; #endif gchar* s; widget = gtk_label_new(_("Server")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0); s = remmina_pref_get_recent(plugin->name); widget = remmina_public_create_combo_entry(s, remmina_file_get_string(gfe->priv->remmina_file, "server"), TRUE); gtk_widget_show(widget); gtk_widget_set_tooltip_markup(widget, _(server_tips)); gtk_entry_set_activates_default(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(widget))), TRUE); gfe->priv->server_combo = widget; g_free(s); #ifdef HAVE_LIBAVAHI_UI if (setting->opt1) { gfe->priv->avahi_service_type = (const gchar*) setting->opt1; hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show(hbox); gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); widget = gtk_button_new_with_label ("..."); s = g_strdup_printf(_("Browse the network to find a %s server"), plugin->name); gtk_widget_set_tooltip_text (widget, s); g_free(s); gtk_widget_show(widget); gtk_box_pack_start (GTK_BOX (hbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_browse_avahi), gfe); gtk_table_attach_defaults (GTK_TABLE(table), hbox, 1, 2, row, row + 1); } else #endif { gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, row, row + 1); } } static void remmina_file_editor_create_password(RemminaFileEditor* gfe, GtkWidget* table, gint row) { GtkWidget* widget; gchar* s; widget = gtk_label_new(_("Password")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, row, row + 1); gtk_entry_set_max_length(GTK_ENTRY(widget), 100); gtk_entry_set_visibility(GTK_ENTRY(widget), FALSE); gfe->priv->password_entry = widget; s = remmina_file_get_secret(gfe->priv->remmina_file, "password"); if (s) { gtk_entry_set_text(GTK_ENTRY(widget), s); g_free(s); } } static void remmina_file_editor_update_resolution(GtkWidget* widget, RemminaFileEditor* gfe) { remmina_public_load_combo_text_d(gfe->priv->resolution_custom_combo, remmina_pref.resolutions, remmina_file_get_string(gfe->priv->remmina_file, "resolution"), NULL); } static void remmina_file_editor_browse_resolution(GtkWidget* button, RemminaFileEditor* gfe) { GtkWidget* widget; widget = remmina_pref_dialog_new(REMMINA_PREF_RESOLUTIONS_TAB); gtk_widget_show(widget); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_file_editor_update_resolution), gfe); } static void remmina_file_editor_create_resolution(RemminaFileEditor* gfe, const RemminaProtocolSetting* setting, GtkWidget* table, gint row) { GtkWidget* widget; GtkWidget* hbox; const gchar* resolution; widget = gtk_label_new(_("Resolution")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = gtk_radio_button_new_with_label(NULL, setting->opt1 ? _("Use window size") : _("Use client resolution")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, row, row + 1); gfe->priv->resolution_auto_radio = widget; hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, row + 1, row + 2); widget = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(gfe->priv->resolution_auto_radio), _("Custom")); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); gfe->priv->resolution_custom_radio = widget; resolution = remmina_file_get_string(gfe->priv->remmina_file, "resolution"); widget = remmina_public_create_combo_text_d(remmina_pref.resolutions, resolution, NULL); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); gfe->priv->resolution_custom_combo = widget; widget = gtk_button_new_with_label("..."); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_browse_resolution), gfe); g_signal_connect(G_OBJECT(gfe->priv->resolution_custom_radio), "toggled", G_CALLBACK(remmina_file_editor_button_on_toggled), gfe->priv->resolution_custom_combo); if (!resolution || strchr(resolution, 'x') == NULL) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->priv->resolution_auto_radio), TRUE); gtk_widget_set_sensitive(gfe->priv->resolution_custom_combo, FALSE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gfe->priv->resolution_custom_radio), TRUE); } } static GtkWidget* remmina_file_editor_create_text(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint col, const gchar* label, const gchar* value) { GtkWidget* widget; widget = gtk_label_new(label); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, col + 1, col + 2, row, row + 1); gtk_entry_set_max_length(GTK_ENTRY(widget), 300); if (value) gtk_entry_set_text(GTK_ENTRY(widget), value); return widget; } static GtkWidget* remmina_file_editor_create_select(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint col, const gchar* label, const gpointer* list, const gchar* value) { GtkWidget* widget; widget = gtk_label_new(label); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = remmina_public_create_combo_map(list, value, FALSE, gfe->priv->plugin->domain); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, col + 1, col + 2, row, row + 1); return widget; } static GtkWidget* remmina_file_editor_create_combo(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint col, const gchar* label, const gchar* list, const gchar* value) { GtkWidget* widget; widget = gtk_label_new(label); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = remmina_public_create_combo_entry(list, value, FALSE); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, col + 1, col + 2, row, row + 1); return widget; } static GtkWidget* remmina_file_editor_create_check(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint col, const gchar* label, gboolean value) { GtkWidget* widget; widget = gtk_check_button_new_with_label(label); gtk_widget_show(widget); if (row >= 0) gtk_table_attach_defaults(GTK_TABLE(table), widget, col, col + 2, row, row + 1); else gtk_box_pack_start(GTK_BOX(table), widget, TRUE, TRUE, 0); if (value) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE); return widget; } static GtkWidget* remmina_file_editor_create_chooser(RemminaFileEditor* gfe, GtkWidget* table, gint row, gint col, const gchar* label, const gchar* value, gint type) { GtkWidget* check; GtkWidget* widget; GtkWidget* hbox; widget = gtk_label_new(label); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, col, col + 1, row, row + 1, GTK_FILL, 0, 0, 0); hbox = gtk_hbox_new(FALSE, 0); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, col + 1, col + 2, row, row + 1); check = gtk_check_button_new(); gtk_widget_show(check); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check), (value && value[0] == '/')); gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0); widget = gtk_file_chooser_button_new(label, type); gtk_widget_show(widget); if (value) { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), value); } gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(check), "toggled", G_CALLBACK(remmina_file_editor_button_on_toggled), widget); remmina_file_editor_button_on_toggled(GTK_TOGGLE_BUTTON(check), widget); return widget; } static void remmina_file_editor_create_settings(RemminaFileEditor* gfe, GtkWidget* table, const RemminaProtocolSetting* settings) { RemminaFileEditorPriv* priv = gfe->priv; GtkWidget* hbox = NULL; GtkWidget* widget; gint row = 0; gchar** strarr; while (settings->type != REMMINA_PROTOCOL_SETTING_TYPE_END) { if (settings->compact) { if (hbox == NULL) { hbox = gtk_hbox_new(TRUE, 0); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 2, row, row + 1); } } switch (settings->type) { case REMMINA_PROTOCOL_SETTING_TYPE_SERVER: remmina_file_editor_create_server(gfe, settings, table, row); break; case REMMINA_PROTOCOL_SETTING_TYPE_PASSWORD: remmina_file_editor_create_password(gfe, table, row); break; case REMMINA_PROTOCOL_SETTING_TYPE_RESOLUTION: remmina_file_editor_create_resolution(gfe, settings, table, row); row++; break; case REMMINA_PROTOCOL_SETTING_TYPE_KEYMAP: strarr = remmina_pref_keymap_groups(); priv->keymap_combo = remmina_file_editor_create_select(gfe, table, row, 0, _("Keyboard mapping"), (const gpointer*) strarr, remmina_file_get_string(priv->remmina_file, "keymap")); g_strfreev(strarr); break; case REMMINA_PROTOCOL_SETTING_TYPE_SCALE: widget = gtk_label_new(_("Horizontal scale")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = gtk_label_new(_("Vertical scale")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, row + 1, row + 2, GTK_FILL, 0, 0, 0); widget = remmina_scaler_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, row, row + 2); remmina_scaler_set(REMMINA_SCALER(widget), remmina_file_get_int(priv->remmina_file, "hscale", 0), remmina_file_get_int(priv->remmina_file, "vscale", 0), remmina_file_get_int(priv->remmina_file, "aspectscale", FALSE)); priv->scaler_widget = widget; row++; break; case REMMINA_PROTOCOL_SETTING_TYPE_TEXT: widget = remmina_file_editor_create_text(gfe, table, row, 0, g_dgettext(priv->plugin->domain, settings->label), remmina_file_get_string(priv->remmina_file, settings->name)); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; case REMMINA_PROTOCOL_SETTING_TYPE_SELECT: widget = remmina_file_editor_create_select(gfe, table, row, 0, g_dgettext(priv->plugin->domain, settings->label), (const gpointer*) settings->opt1, remmina_file_get_string(priv->remmina_file, settings->name)); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; case REMMINA_PROTOCOL_SETTING_TYPE_COMBO: widget = remmina_file_editor_create_combo(gfe, table, row, 0, g_dgettext(priv->plugin->domain, settings->label), (const gchar*) settings->opt1, remmina_file_get_string(priv->remmina_file, settings->name)); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; case REMMINA_PROTOCOL_SETTING_TYPE_CHECK: widget = remmina_file_editor_create_check(gfe, (hbox ? hbox : table), (hbox ? -1 : row), 0, g_dgettext (priv->plugin->domain, settings->label), remmina_file_get_int (priv->remmina_file, (gchar*) settings->name, FALSE)); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; case REMMINA_PROTOCOL_SETTING_TYPE_FILE: widget = remmina_file_editor_create_chooser (gfe, table, row, 0, g_dgettext (priv->plugin->domain, settings->label), remmina_file_get_string (priv->remmina_file, settings->name), GTK_FILE_CHOOSER_ACTION_OPEN); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; case REMMINA_PROTOCOL_SETTING_TYPE_FOLDER: widget = remmina_file_editor_create_chooser (gfe, table, row, 0, g_dgettext (priv->plugin->domain, settings->label), remmina_file_get_string (priv->remmina_file, settings->name), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); g_hash_table_insert(priv->setting_widgets, (gchar*) settings->name, widget); break; default: break; } if (!settings->compact) { hbox = NULL; row++; } settings++; } gtk_table_resize(GTK_TABLE(table), row, 2); } static void remmina_file_editor_create_ssh_tab(RemminaFileEditor* gfe, RemminaProtocolSSHSetting ssh_setting) { #ifdef HAVE_LIBSSH RemminaFileEditorPriv* priv = gfe->priv; GtkWidget* table; GtkWidget* hbox; GtkWidget* widget; const gchar* cs; gchar* s; gint row = 0; if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_NONE) return; /* The SSH tab (implementation) */ if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH || ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP) { s = remmina_public_combo_get_active_text (GTK_COMBO_BOX (priv->protocol_combo)); table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_AUTHENTICATION, (s ? s : "SSH"), 8, 3); g_free(s); } else { table = remmina_file_editor_create_notebook_tab (gfe, GTK_STOCK_DIALOG_AUTHENTICATION, "SSH", 9, 3); hbox = gtk_hbox_new (TRUE, 0); gtk_widget_show(hbox); gtk_table_attach_defaults (GTK_TABLE(table), hbox, 0, 3, 0, 1); row++; widget = gtk_check_button_new_with_label (_("Enable SSH tunnel")); gtk_widget_show(widget); gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_file_editor_ssh_enabled_check_on_toggled), gfe); priv->ssh_enabled_check = widget; widget = gtk_check_button_new_with_label (_("Tunnel via loopback address")); gtk_widget_show(widget); gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 0); priv->ssh_loopback_check = widget; } /* SSH Server group */ remmina_public_create_group (GTK_TABLE(table), _("SSH Server"), row, 3, 3); row++; switch (ssh_setting) { case REMMINA_PROTOCOL_SSH_SETTING_TUNNEL: s = g_strdup_printf(_("Same server at port %i"), DEFAULT_SSH_PORT); widget = gtk_radio_button_new_with_label (NULL, s); g_free(s); gtk_widget_show(widget); gtk_table_attach_defaults (GTK_TABLE(table), widget, 1, 3, row, row + 1); priv->ssh_server_default_radio = widget; row++; widget = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(priv->ssh_server_default_radio), _("Custom")); gtk_widget_show(widget); gtk_table_attach (GTK_TABLE(table), widget, 1, 2, row, row + 1, GTK_FILL, 0, 0, 0); g_signal_connect(G_OBJECT(widget), "toggled", G_CALLBACK(remmina_file_editor_ssh_server_custom_radio_on_toggled), gfe); priv->ssh_server_custom_radio = widget; widget = gtk_entry_new (); gtk_widget_show(widget); gtk_entry_set_max_length (GTK_ENTRY(widget), 100); gtk_widget_set_tooltip_markup (widget, _(server_tips2)); gtk_table_attach_defaults (GTK_TABLE(table), widget, 2, 3, row, row + 1); priv->ssh_server_entry = widget; row++; break; case REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL: priv->ssh_server_default_radio = NULL; priv->ssh_server_custom_radio = NULL; priv->ssh_server_entry = remmina_file_editor_create_text (gfe, table, row, 1, _("Server"), NULL); gtk_widget_set_tooltip_markup (priv->ssh_server_entry, _(server_tips)); row++; break; case REMMINA_PROTOCOL_SSH_SETTING_SSH: case REMMINA_PROTOCOL_SSH_SETTING_SFTP: priv->ssh_server_default_radio = NULL; priv->ssh_server_custom_radio = NULL; priv->ssh_server_entry = NULL; s = remmina_pref_get_recent ("SFTP"); priv->server_combo = remmina_file_editor_create_combo (gfe, table, row, 1, _("Server"), s, remmina_file_get_string (priv->remmina_file, "server")); gtk_widget_set_tooltip_markup (priv->server_combo, _(server_tips)); gtk_entry_set_activates_default (GTK_ENTRY(gtk_bin_get_child (GTK_BIN (priv->server_combo))), TRUE); g_free(s); row++; break; default: break; } priv->ssh_charset_combo = remmina_file_editor_create_combo (gfe, table, row, 1, _("Character set"), charset_list, remmina_file_get_string (priv->remmina_file, "ssh_charset")); row++; if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SSH) { widget = remmina_file_editor_create_text (gfe, table, row, 1, _("Startup program"), NULL); cs = remmina_file_get_string (priv->remmina_file, "exec"); gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs : ""); g_hash_table_insert(priv->setting_widgets, "exec", widget); row++; } else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_SFTP) { widget = remmina_file_editor_create_text (gfe, table, row, 1, _("Startup path"), NULL); cs = remmina_file_get_string (priv->remmina_file, "execpath"); gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs : ""); g_hash_table_insert(priv->setting_widgets, "execpath", widget); row++; } /* SSH Authentication frame */ remmina_public_create_group (GTK_TABLE(table), _("SSH Authentication"), row, 5, 3); row++; priv->ssh_username_entry = remmina_file_editor_create_text (gfe, table, row, 1, _("User name"), NULL); row++; widget = gtk_radio_button_new_with_label (NULL, _("Password")); gtk_widget_show(widget); gtk_table_attach_defaults (GTK_TABLE(table), widget, 1, 3, row, row + 1); priv->ssh_auth_password_radio = widget; row++; widget = gtk_radio_button_new_with_label_from_widget ( GTK_RADIO_BUTTON(priv->ssh_auth_password_radio), _("Public key (automatic)")); gtk_widget_show(widget); gtk_table_attach_defaults (GTK_TABLE(table), widget, 1, 3, row, row + 1); priv->ssh_auth_auto_publickey_radio = widget; row++; remmina_file_editor_create_ssh_privatekey (gfe, table, row, 1); row++; /* Set the values */ cs = remmina_file_get_string (priv->remmina_file, "ssh_server"); if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_TUNNEL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->ssh_enabled_check), remmina_file_get_int (priv->remmina_file, "ssh_enabled", FALSE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->ssh_loopback_check), remmina_file_get_int (priv->remmina_file, "ssh_loopback", FALSE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(cs ? priv->ssh_server_custom_radio : priv->ssh_server_default_radio), TRUE); gtk_entry_set_text(GTK_ENTRY(priv->ssh_server_entry), cs ? cs : ""); } else if (ssh_setting == REMMINA_PROTOCOL_SSH_SETTING_REVERSE_TUNNEL) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->ssh_enabled_check), remmina_file_get_int (priv->remmina_file, "ssh_enabled", FALSE)); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->ssh_loopback_check), remmina_file_get_int (priv->remmina_file, "ssh_loopback", FALSE)); gtk_entry_set_text(GTK_ENTRY(priv->ssh_server_entry), cs ? cs : ""); } cs = remmina_file_get_string (priv->remmina_file, "ssh_username"); gtk_entry_set_text(GTK_ENTRY(priv->ssh_username_entry), cs ? cs : ""); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON( remmina_file_get_int (priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_PUBLICKEY ? priv->ssh_auth_publickey_radio : remmina_file_get_int (priv->remmina_file, "ssh_auth", 0) == SSH_AUTH_AUTO_PUBLICKEY ? priv->ssh_auth_auto_publickey_radio : priv->ssh_auth_password_radio), TRUE); remmina_file_editor_ssh_enabled_check_on_toggled (NULL, gfe); #endif } static void remmina_file_editor_create_all_settings(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv = gfe->priv; GtkWidget* table; remmina_file_editor_create_notebook_container(gfe); /* The Basic tab */ if (priv->plugin->basic_settings) { table = remmina_file_editor_create_notebook_tab(gfe, GTK_STOCK_INFO, _("Basic"), 20, 2); remmina_file_editor_create_settings(gfe, table, priv->plugin->basic_settings); } /* The Advanced tab */ if (priv->plugin->advanced_settings) { table = remmina_file_editor_create_notebook_tab(gfe, GTK_STOCK_DIALOG_WARNING, _("Advanced"), 20, 2); remmina_file_editor_create_settings(gfe, table, priv->plugin->advanced_settings); } /* The SSH tab */ remmina_file_editor_create_ssh_tab(gfe, priv->plugin->ssh_setting); } static void remmina_file_editor_protocol_combo_on_changed(GtkComboBox* combo, RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv = gfe->priv; gchar* protocol; if (priv->config_container) { gtk_container_remove(GTK_CONTAINER(priv->config_box), priv->config_container); priv->config_container = NULL; } priv->server_combo = NULL; priv->password_entry = NULL; priv->resolution_auto_radio = NULL; priv->resolution_custom_radio = NULL; priv->resolution_custom_combo = NULL; priv->keymap_combo = NULL; priv->scaler_widget = NULL; priv->ssh_enabled_check = NULL; priv->ssh_loopback_check = NULL; priv->ssh_server_default_radio = NULL; priv->ssh_server_custom_radio = NULL; priv->ssh_server_entry = NULL; priv->ssh_username_entry = NULL; priv->ssh_auth_password_radio = NULL; priv->ssh_auth_publickey_radio = NULL; priv->ssh_auth_auto_publickey_radio = NULL; priv->ssh_privatekey_chooser = NULL; priv->ssh_charset_combo = NULL; g_hash_table_remove_all(priv->setting_widgets); protocol = remmina_public_combo_get_active_text(combo); if (protocol) { priv->plugin = (RemminaProtocolPlugin*) remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_PROTOCOL, protocol); g_free(protocol); remmina_file_editor_create_all_settings(gfe); } } static void remmina_file_editor_update_ssh(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv = gfe->priv; gboolean ssh_enabled; if (priv->ssh_charset_combo) { remmina_file_set_string_ref(priv->remmina_file, "ssh_charset", remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->ssh_charset_combo))); } if (g_strcmp0(remmina_file_get_string(priv->remmina_file, "protocol"), "SFTP") == 0 || g_strcmp0(remmina_file_get_string(priv->remmina_file, "protocol"), "SSH") == 0) { ssh_enabled = TRUE; } else { ssh_enabled = (priv->ssh_enabled_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_enabled_check)) : FALSE); remmina_file_set_int( priv->remmina_file, "ssh_loopback", (priv->ssh_loopback_check ? gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->ssh_loopback_check)) : FALSE)); } remmina_file_set_int(priv->remmina_file, "ssh_enabled", ssh_enabled); remmina_file_set_string(priv->remmina_file, "ssh_username", (ssh_enabled ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_username_entry)) : NULL)); remmina_file_set_string( priv->remmina_file, "ssh_server", (ssh_enabled && priv->ssh_server_entry && (priv->ssh_server_custom_radio == NULL || gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(priv->ssh_server_custom_radio))) ? gtk_entry_get_text(GTK_ENTRY(priv->ssh_server_entry)) : NULL)); remmina_file_set_int( priv->remmina_file, "ssh_auth", (priv->ssh_auth_publickey_radio && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(priv->ssh_auth_publickey_radio)) ? SSH_AUTH_PUBLICKEY : priv->ssh_auth_auto_publickey_radio && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(priv->ssh_auth_auto_publickey_radio)) ? SSH_AUTH_AUTO_PUBLICKEY : SSH_AUTH_PASSWORD)); remmina_file_set_string( priv->remmina_file, "ssh_privatekey", (priv->ssh_privatekey_chooser ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(priv->ssh_privatekey_chooser)) : NULL)); } static void remmina_file_editor_update_settings(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv = gfe->priv; GHashTableIter iter; gpointer key, value; g_hash_table_iter_init(&iter, priv->setting_widgets); while (g_hash_table_iter_next(&iter, &key, &value)) { if (GTK_IS_ENTRY(value)) { remmina_file_set_string(priv->remmina_file, (gchar*) key, gtk_entry_get_text(GTK_ENTRY(value))); } else if (GTK_IS_COMBO_BOX(value)) { remmina_file_set_string_ref(priv->remmina_file, (gchar*) key, remmina_public_combo_get_active_text(GTK_COMBO_BOX(value))); } else if (GTK_IS_FILE_CHOOSER(value)) { remmina_file_set_string( priv->remmina_file, (gchar*) key, gtk_widget_get_sensitive(GTK_WIDGET(value)) ? gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(value)) : NULL); } else if (GTK_IS_TOGGLE_BUTTON(value)) { remmina_file_set_int(priv->remmina_file, (gchar*) key, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(value))); } } } static void remmina_file_editor_update(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv = gfe->priv; remmina_file_set_string(priv->remmina_file, "name", gtk_entry_get_text(GTK_ENTRY(priv->name_entry))); remmina_file_set_string_ref(priv->remmina_file, "group", (priv->group_combo ? remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->group_combo)) : NULL)); remmina_file_set_string_ref(priv->remmina_file, "protocol", remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->protocol_combo))); remmina_file_set_string_ref(priv->remmina_file, "server", (priv->server_combo ? remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->server_combo)) : NULL)); remmina_file_set_string(priv->remmina_file, "password", (priv->password_entry ? gtk_entry_get_text(GTK_ENTRY(priv->password_entry)) : NULL)); if (priv->resolution_auto_radio) { remmina_file_set_string_ref( priv->remmina_file, "resolution", (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->resolution_auto_radio)) ? NULL : remmina_public_combo_get_active_text( GTK_COMBO_BOX(priv->resolution_custom_combo)))); } if (priv->keymap_combo) { remmina_file_set_string_ref(priv->remmina_file, "keymap", remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->keymap_combo))); } if (priv->scaler_widget) { remmina_file_set_int(priv->remmina_file, "hscale", REMMINA_SCALER(priv->scaler_widget)->hscale); remmina_file_set_int(priv->remmina_file, "vscale", REMMINA_SCALER(priv->scaler_widget)->vscale); remmina_file_set_int(priv->remmina_file, "aspectscale", REMMINA_SCALER(priv->scaler_widget)->aspectscale); } remmina_file_editor_update_ssh(gfe); remmina_file_editor_update_settings(gfe); } static void remmina_file_editor_on_default(GtkWidget* button, RemminaFileEditor* gfe) { RemminaFile* gf; GtkWidget* dialog; remmina_file_editor_update(gfe); gf = remmina_file_dup(gfe->priv->remmina_file); remmina_file_set_filename(gf, remmina_pref_file); /* Clear properties that should never be default */ remmina_file_set_string(gf, "name", NULL); remmina_file_set_string(gf, "server", NULL); remmina_file_set_string(gf, "password", NULL); remmina_file_save_all(gf); remmina_file_free(gf); dialog = gtk_message_dialog_new(GTK_WINDOW(gfe), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("Default settings saved.")); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } static void remmina_file_editor_on_save(GtkWidget* button, RemminaFileEditor* gfe) { remmina_file_editor_update(gfe); remmina_file_save_all(gfe->priv->remmina_file); remmina_icon_populate_menu(); gtk_widget_destroy(GTK_WIDGET(gfe)); } static void remmina_file_editor_on_connect(GtkWidget* button, RemminaFileEditor* gfe) { RemminaFile* gf; remmina_file_editor_update(gfe); if (remmina_pref.save_when_connect) { remmina_file_save_all(gfe->priv->remmina_file); remmina_icon_populate_menu(); } gf = remmina_file_dup(gfe->priv->remmina_file); /* Put server into name for Quick Connect */ if (remmina_file_get_filename(gf) == NULL) { remmina_file_set_string(gf, "name", remmina_file_get_string(gf, "server")); } gtk_widget_destroy(GTK_WIDGET(gfe)); remmina_connection_window_open_from_file(gf); } static void remmina_file_editor_on_cancel(GtkWidget* button, RemminaFileEditor* gfe) { gtk_widget_destroy(GTK_WIDGET(gfe)); } static void remmina_file_editor_init(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv; GtkWidget* widget; priv = g_new0(RemminaFileEditorPriv, 1); gfe->priv = priv; /* Create the editor dialog */ gtk_window_set_title(GTK_WINDOW(gfe), _("Remote Desktop Preference")); widget = gtk_dialog_add_button(GTK_DIALOG(gfe), GTK_STOCK_SAVE, GTK_RESPONSE_APPLY); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_on_save), gfe); gtk_widget_set_sensitive(widget, FALSE); priv->save_button = widget; widget = gtk_dialog_add_button(GTK_DIALOG(gfe), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_on_cancel), gfe); widget = gtk_dialog_add_button(GTK_DIALOG(gfe), GTK_STOCK_CONNECT, GTK_RESPONSE_OK); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_on_connect), gfe); gtk_dialog_set_alternative_button_order(GTK_DIALOG(gfe), GTK_RESPONSE_OK, GTK_RESPONSE_APPLY, GTK_RESPONSE_CANCEL, -1); gtk_dialog_set_default_response(GTK_DIALOG(gfe), GTK_RESPONSE_OK); gtk_window_set_default_size(GTK_WINDOW(gfe), 450, 500); g_signal_connect(G_OBJECT(gfe), "destroy", G_CALLBACK(remmina_file_editor_destroy), NULL); g_signal_connect(G_OBJECT(gfe), "realize", G_CALLBACK(remmina_file_editor_on_realize), NULL); /* The Set As Default button */ widget = gtk_button_new_with_label(_("Default")); gtk_widget_show(widget); gtk_button_set_image(GTK_BUTTON(widget), gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_BUTTON)); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(gfe))), widget, FALSE, TRUE, 0); gtk_button_box_set_child_secondary(GTK_BUTTON_BOX(gtk_dialog_get_action_area(GTK_DIALOG(gfe))), widget, TRUE); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_file_editor_on_default), gfe); priv->setting_widgets = g_hash_table_new(g_str_hash, g_str_equal); remmina_widget_pool_register(GTK_WIDGET(gfe)); } static gboolean remmina_file_editor_iterate_protocol(gchar* protocol, RemminaPlugin* plugin, gpointer data) { RemminaFileEditor* gfe = REMMINA_FILE_EDITOR(data); GtkListStore* store; GtkTreeIter iter; gboolean first; store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(gfe->priv->protocol_combo))); first = !gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, protocol, 1, g_dgettext(plugin->domain, plugin->description), 2, ((RemminaProtocolPlugin*) plugin)->icon_name, -1); if (first || g_strcmp0(protocol, remmina_file_get_string(gfe->priv->remmina_file, "protocol")) == 0) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(gfe->priv->protocol_combo), &iter); } return FALSE; } static void remmina_file_editor_check_profile(RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv; priv = gfe->priv; if (remmina_file_get_filename(priv->remmina_file)) { gtk_widget_set_sensitive(priv->group_combo, TRUE); gtk_widget_set_sensitive(priv->save_button, TRUE); } } static void remmina_file_editor_name_on_changed(GtkEditable* editable, RemminaFileEditor* gfe) { RemminaFileEditorPriv* priv; priv = gfe->priv; if (remmina_file_get_filename(priv->remmina_file) == NULL) { remmina_file_generate_filename(priv->remmina_file); remmina_file_editor_check_profile(gfe); } } GtkWidget* remmina_file_editor_new_from_file(RemminaFile* remminafile) { RemminaFileEditor* gfe; RemminaFileEditorPriv* priv; GtkWidget* table; GtkWidget* widget; gchar* groups; gchar* s; const gchar* cs; gfe = REMMINA_FILE_EDITOR(g_object_new(REMMINA_TYPE_FILE_EDITOR, NULL)); priv = gfe->priv; priv->remmina_file = remminafile; if (remmina_file_get_filename(remminafile) == NULL) { gtk_dialog_set_response_sensitive(GTK_DIALOG(gfe), GTK_RESPONSE_APPLY, FALSE); } /* Create the Profile group on the top (for name and protocol) */ table = gtk_table_new(4, 3, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 8); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), table, FALSE, FALSE, 2); remmina_public_create_group(GTK_TABLE(table), _("Profile"), 0, 4, 3); /* Profile: Name */ widget = gtk_label_new(_("Name")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 1, 2); gtk_entry_set_max_length(GTK_ENTRY(widget), 100); priv->name_entry = widget; if (remmina_file_get_filename(remminafile) == NULL) { gtk_entry_set_text(GTK_ENTRY(widget), _("Quick Connect")); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(remmina_file_editor_name_on_changed), gfe); } else { cs = remmina_file_get_string(remminafile, "name"); gtk_entry_set_text(GTK_ENTRY(widget), cs ? cs : ""); } /* Profile: Group */ widget = gtk_label_new(_("Group")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 2, 3, GTK_FILL, 0, 0, 0); groups = remmina_file_manager_get_groups(); priv->group_combo = remmina_public_create_combo_entry(groups, remmina_file_get_string(remminafile, "group"), FALSE); g_free(groups); gtk_widget_show(priv->group_combo); gtk_table_attach_defaults(GTK_TABLE(table), priv->group_combo, 2, 3, 2, 3); gtk_widget_set_sensitive(priv->group_combo, FALSE); s = g_strdup_printf(_("Use '%s' as subgroup delimiter"), "/"); gtk_widget_set_tooltip_text(priv->group_combo, s); g_free(s); /* Profile: Protocol */ widget = gtk_label_new(_("Protocol")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 3, 4, GTK_FILL, 0, 0, 0); widget = remmina_public_create_combo(TRUE); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 2, 3, 3, 4); priv->protocol_combo = widget; remmina_plugin_manager_for_each_plugin(REMMINA_PLUGIN_TYPE_PROTOCOL, remmina_file_editor_iterate_protocol, gfe); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(remmina_file_editor_protocol_combo_on_changed), gfe); /* Create the Preference frame */ widget = gtk_event_box_new(); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(gfe))), widget, TRUE, TRUE, 2); priv->config_box = widget; priv->config_container = NULL; remmina_file_editor_protocol_combo_on_changed(GTK_COMBO_BOX(priv->protocol_combo), gfe); remmina_file_editor_check_profile(gfe); return GTK_WIDGET(gfe); } GtkWidget* remmina_file_editor_new(void) { return remmina_file_editor_new_full(NULL, NULL); } GtkWidget* remmina_file_editor_new_full(const gchar* server, const gchar* protocol) { RemminaFile* remminafile; remminafile = remmina_file_new(); if (server) remmina_file_set_string(remminafile, "server", server); if (protocol) remmina_file_set_string(remminafile, "protocol", protocol); return remmina_file_editor_new_from_file(remminafile); } GtkWidget* remmina_file_editor_new_copy(const gchar* filename) { RemminaFile* remminafile; GtkWidget* dialog; remminafile = remmina_file_copy(filename); if (remminafile) { return remmina_file_editor_new_from_file(remminafile); } else { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("File %s not found."), filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return NULL; } } GtkWidget* remmina_file_editor_new_from_filename(const gchar* filename) { RemminaFile* remminafile; GtkWidget* dialog; remminafile = remmina_file_manager_load_file(filename); if (remminafile) { return remmina_file_editor_new_from_file(remminafile); } else { dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, _("File %s not found."), filename); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); return NULL; } } FreeRDP-Remmina-356c033/remmina/src/remmina_file_editor.h000066400000000000000000000044741171526373700232110ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAFILEEDIOR_H__ #define __REMMINAFILEEDIOR_H__ G_BEGIN_DECLS #define REMMINA_TYPE_FILE_EDITOR (remmina_file_editor_get_type ()) #define REMMINA_FILE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditor)) #define REMMINA_FILE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditorClass)) #define REMMINA_IS_FILE_EDITOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_FILE_EDITOR)) #define REMMINA_IS_FILE_EDITOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_FILE_EDITOR)) #define REMMINA_FILE_EDITOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_FILE_EDITOR, RemminaFileEditorClass)) typedef struct _RemminaFileEditorPriv RemminaFileEditorPriv; typedef struct _RemminaFileEditor { GtkDialog dialog; RemminaFileEditorPriv* priv; } RemminaFileEditor; typedef struct _RemminaFileEditorClass { GtkDialogClass parent_class; } RemminaFileEditorClass; GType remmina_file_editor_get_type(void) G_GNUC_CONST; /* Base constructor */ GtkWidget* remmina_file_editor_new_from_file(RemminaFile* remminafile); /* Create new file */ GtkWidget* remmina_file_editor_new(void); GtkWidget* remmina_file_editor_new_full(const gchar* server, const gchar* protocol); GtkWidget* remmina_file_editor_new_copy(const gchar* filename); /* Open existing file */ GtkWidget* remmina_file_editor_new_from_filename(const gchar* filename); G_END_DECLS #endif /* __REMMINAFILEEDIOR_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_file_manager.c000066400000000000000000000125361171526373700233260ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_public.h" #include "remmina_string_array.h" #include "remmina_plugin_manager.h" #include "remmina_file_manager.h" void remmina_file_manager_init(void) { gchar dirname[MAX_PATH_LEN]; g_snprintf(dirname, MAX_PATH_LEN, "%s/.remmina", g_get_home_dir()); g_mkdir_with_parents(dirname, 0700); } gint remmina_file_manager_iterate(GFunc func, gpointer user_data) { gchar dirname[MAX_PATH_LEN]; gchar filename[MAX_PATH_LEN]; GDir* dir; const gchar* name; RemminaFile* remminafile; gint n; g_snprintf(dirname, MAX_PATH_LEN, "%s/.remmina", g_get_home_dir()); dir = g_dir_open(dirname, 0, NULL); if (dir == NULL) return 0; n = 0; while ((name = g_dir_read_name(dir)) != NULL) { if (!g_str_has_suffix(name, ".remmina")) continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name); remminafile = remmina_file_load(filename); if (remminafile) { (*func)(remminafile, user_data); remmina_file_free(remminafile); n++; } } g_dir_close(dir); return n; } gchar* remmina_file_manager_get_groups(void) { gchar dirname[MAX_PATH_LEN]; gchar filename[MAX_PATH_LEN]; GDir* dir; const gchar* name; RemminaFile* remminafile; RemminaStringArray* array; const gchar* group; gchar* groups; array = remmina_string_array_new(); g_snprintf(dirname, MAX_PATH_LEN, "%s/.remmina", g_get_home_dir()); dir = g_dir_open(dirname, 0, NULL); if (dir == NULL) return 0; while ((name = g_dir_read_name(dir)) != NULL) { if (!g_str_has_suffix(name, ".remmina")) continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name); remminafile = remmina_file_load(filename); group = remmina_file_get_string(remminafile, "group"); if (group && remmina_string_array_find(array, group) < 0) { remmina_string_array_add(array, group); } remmina_file_free(remminafile); } g_dir_close(dir); remmina_string_array_sort(array); groups = remmina_string_array_to_string(array); remmina_string_array_free(array); return groups; } static void remmina_file_manager_add_group(GNode* node, const gchar* group) { gint cmp; gchar* p1; gchar* p2; GNode* child; gboolean found; RemminaGroupData* data; if (group == NULL || group[0] == '\0') return; p1 = g_strdup(group); p2 = strchr(p1, '/'); if (p2) *p2++ = '\0'; found = FALSE; for (child = g_node_first_child(node); child; child = g_node_next_sibling(child)) { cmp = g_strcmp0(((RemminaGroupData*) child->data)->name, p1); if (cmp == 0) { found = TRUE; break; } if (cmp > 0) break; } if (!found) { data = g_new0(RemminaGroupData, 1); data->name = p1; if (node->data) { data->group = g_strdup_printf("%s/%s", ((RemminaGroupData*) node->data)->group, p1); } else { data->group = g_strdup(p1); } if (child) { child = g_node_insert_data_before(node, child, data); } else { child = g_node_append_data(node, data); } } remmina_file_manager_add_group(child, p2); if (found) { g_free(p1); } } GNode* remmina_file_manager_get_group_tree(void) { gchar dirname[MAX_PATH_LEN]; gchar filename[MAX_PATH_LEN]; GDir* dir; const gchar* name; RemminaFile* remminafile; const gchar* group; GNode* root; root = g_node_new(NULL); g_snprintf(dirname, MAX_PATH_LEN, "%s/.remmina", g_get_home_dir()); dir = g_dir_open(dirname, 0, NULL); if (dir == NULL) return root; while ((name = g_dir_read_name(dir)) != NULL) { if (!g_str_has_suffix(name, ".remmina")) continue; g_snprintf(filename, MAX_PATH_LEN, "%s/%s", dirname, name); remminafile = remmina_file_load(filename); group = remmina_file_get_string(remminafile, "group"); remmina_file_manager_add_group(root, group); remmina_file_free(remminafile); } g_dir_close(dir); return root; } void remmina_file_manager_free_group_tree(GNode* node) { RemminaGroupData* data; GNode* child; if (!node) return; data = (RemminaGroupData*) node->data; if (data) { g_free(data->name); g_free(data->group); g_free(data); node->data = NULL; } for (child = g_node_first_child(node); child; child = g_node_next_sibling(child)) { remmina_file_manager_free_group_tree(child); } g_node_unlink(node); } RemminaFile* remmina_file_manager_load_file(const gchar* filename) { RemminaFile* remminafile = NULL; RemminaFilePlugin* plugin; gchar* p; if ((p = strrchr(filename, '.')) != NULL && g_strcmp0(p + 1, "remmina") == 0) { remminafile = remmina_file_load(filename); } else { plugin = remmina_plugin_manager_get_import_file_handler(filename); if (plugin) { remminafile = plugin->import_func(filename); } } return remminafile; } FreeRDP-Remmina-356c033/remmina/src/remmina_file_manager.h000066400000000000000000000027531171526373700233330ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAFILEMANAGER_H__ #define __REMMINAFILEMANAGER_H__ #include "remmina_file.h" G_BEGIN_DECLS typedef struct _RemminaGroupData { gchar *name; gchar *group; } RemminaGroupData; /* Initialize */ void remmina_file_manager_init(void); /* Iterate all .remmina connections in the home directory */ gint remmina_file_manager_iterate(GFunc func, gpointer user_data); /* Get a list of groups */ gchar* remmina_file_manager_get_groups(void); GNode* remmina_file_manager_get_group_tree(void); void remmina_file_manager_free_group_tree(GNode *node); /* Load or import a file */ RemminaFile* remmina_file_manager_load_file(const gchar *filename); G_END_DECLS #endif /* __REMMINAFILEMANAGER_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_ftp_client.c000066400000000000000000001223761171526373700230500ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #define _FILE_OFFSET_BITS 64 #include #include #include #include "remmina_public.h" #include "remmina_pref.h" #include "remmina_marshals.h" #include "remmina_file.h" #include "remmina_ftp_client.h" /* -------------------- RemminaCellRendererPixbuf ----------------------- */ /* A tiny cell renderer that extends the default pixbuf cell render to accept activation */ #define REMMINA_TYPE_CELL_RENDERER_PIXBUF \ (remmina_cell_renderer_pixbuf_get_type ()) #define REMMINA_CELL_RENDERER_PIXBUF(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_CELL_RENDERER_PIXBUF, RemminaCellRendererPixbuf)) #define REMMINA_CELL_RENDERER_PIXBUF_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_CELL_RENDERER_PIXBUF, RemminaCellRendererPixbufClass)) #define REMMINA_IS_CELL_RENDERER_PIXBUF(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_CELL_RENDERER_PIXBUF)) typedef struct _RemminaCellRendererPixbuf { GtkCellRendererPixbuf renderer; } RemminaCellRendererPixbuf; typedef struct _RemminaCellRendererPixbufClass { GtkCellRendererPixbufClass parent_class; void (*activate)(RemminaCellRendererPixbuf *renderer); } RemminaCellRendererPixbufClass; GType remmina_cell_renderer_pixbuf_get_type(void) G_GNUC_CONST; G_DEFINE_TYPE(RemminaCellRendererPixbuf, remmina_cell_renderer_pixbuf, GTK_TYPE_CELL_RENDERER_PIXBUF) static guint remmina_cell_renderer_pixbuf_signals[1] = { 0 }; #if GTK_VERSION == 2 static gboolean remmina_cell_renderer_pixbuf_activate(GtkCellRenderer *renderer, GdkEvent *event, GtkWidget *widget, const gchar *path, GdkRectangle *background_area, GdkRectangle *cell_area, GtkCellRendererState flags) #elif GTK_VERSION == 3 static gboolean remmina_cell_renderer_pixbuf_activate(GtkCellRenderer *renderer, GdkEvent *event, GtkWidget *widget, const gchar *path, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) #endif { g_signal_emit(G_OBJECT(renderer), remmina_cell_renderer_pixbuf_signals[0], 0, path); return TRUE; } static void remmina_cell_renderer_pixbuf_class_init(RemminaCellRendererPixbufClass *klass) { GtkCellRendererClass *renderer_class = GTK_CELL_RENDERER_CLASS(klass); renderer_class->activate = remmina_cell_renderer_pixbuf_activate; remmina_cell_renderer_pixbuf_signals[0] = g_signal_new("activate", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaCellRendererPixbufClass, activate), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); } static void remmina_cell_renderer_pixbuf_init(RemminaCellRendererPixbuf *renderer) { g_object_set(G_OBJECT(renderer), "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); } static GtkCellRenderer* remmina_cell_renderer_pixbuf_new(void) { GtkCellRenderer *renderer; renderer = GTK_CELL_RENDERER(g_object_new(REMMINA_TYPE_CELL_RENDERER_PIXBUF, NULL)); return renderer; } /* --------------------- RemminaFTPClient ----------------------------*/ G_DEFINE_TYPE( RemminaFTPClient, remmina_ftp_client, GTK_TYPE_VBOX) #define BUSY_CURSOR \ if (GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET (client)))) \ { \ gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (client)), gdk_cursor_new (GDK_WATCH));\ gdk_flush (); \ } #define NORMAL_CURSOR \ if (GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET (client)))) \ { \ gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (client)), NULL); \ } struct _RemminaFTPClientPriv { GtkWidget *directory_combo; GtkWidget *vpaned; GtkTreeModel *file_list_model; GtkTreeModel *file_list_filter; GtkTreeModel *file_list_sort; GtkWidget *file_list_view; gboolean file_list_show_hidden; GtkTreeModel *task_list_model; GtkWidget *task_list_view; gchar *current_directory; gchar *working_directory; GtkWidget *file_action_widgets[10]; gboolean sensitive; }; static gint remmina_ftp_client_taskid = 1; enum { OPEN_DIR_SIGNAL, NEW_TASK_SIGNAL, CANCEL_TASK_SIGNAL, DELETE_FILE_SIGNAL, LAST_SIGNAL }; static guint remmina_ftp_client_signals[LAST_SIGNAL] = { 0 }; static void remmina_ftp_client_class_init(RemminaFTPClientClass *klass) { remmina_ftp_client_signals[OPEN_DIR_SIGNAL] = g_signal_new("open-dir", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaFTPClientClass, open_dir), NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); remmina_ftp_client_signals[NEW_TASK_SIGNAL] = g_signal_new("new-task", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaFTPClientClass, new_task), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); remmina_ftp_client_signals[CANCEL_TASK_SIGNAL] = g_signal_new("cancel-task", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaFTPClientClass, cancel_task), NULL, NULL, remmina_marshal_BOOLEAN__INT, G_TYPE_BOOLEAN, 1, G_TYPE_INT); remmina_ftp_client_signals[DELETE_FILE_SIGNAL] = g_signal_new("delete-file", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaFTPClientClass, delete_file), NULL, NULL, remmina_marshal_BOOLEAN__INT_STRING, G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_STRING); } static void remmina_ftp_client_destroy(RemminaFTPClient *client, gpointer data) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; g_free(priv->current_directory); g_free(priv->working_directory); g_free(priv); } static void remmina_ftp_client_cell_data_filetype_pixbuf(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gint type; /* Same as REMMINA_FTP_TASK_COLUMN_TYPE */ gtk_tree_model_get(model, iter, REMMINA_FTP_FILE_COLUMN_TYPE, &type, -1); switch (type) { case REMMINA_FTP_FILE_TYPE_DIR: g_object_set(renderer, "stock-id", GTK_STOCK_DIRECTORY, NULL); break; default: g_object_set(renderer, "stock-id", GTK_STOCK_FILE, NULL); break; } } static void remmina_ftp_client_cell_data_progress_pixbuf(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gint tasktype, status; gtk_tree_model_get(model, iter, REMMINA_FTP_TASK_COLUMN_TASKTYPE, &tasktype, REMMINA_FTP_TASK_COLUMN_STATUS, &status, -1); switch (status) { case REMMINA_FTP_TASK_STATUS_WAIT: g_object_set(renderer, "stock-id", GTK_STOCK_MEDIA_PAUSE, NULL); break; case REMMINA_FTP_TASK_STATUS_RUN: g_object_set(renderer, "stock-id", (tasktype == REMMINA_FTP_TASK_TYPE_UPLOAD ? GTK_STOCK_GO_UP : GTK_STOCK_GO_DOWN), NULL); break; case REMMINA_FTP_TASK_STATUS_FINISH: g_object_set(renderer, "stock-id", GTK_STOCK_YES, NULL); break; case REMMINA_FTP_TASK_STATUS_ERROR: g_object_set(renderer, "stock-id", GTK_STOCK_NO, NULL); break; } } static gchar* remmina_ftp_client_size_to_str(gfloat size) { gchar *str; if (size < 1024.0) { str = g_strdup_printf("%i", (gint) size); } else if (size < 1024.0 * 1024.0) { str = g_strdup_printf("%iK", (gint)(size / 1024.0)); } else if (size < 1024.0 * 1024.0 * 1024.0) { str = g_strdup_printf("%.1fM", size / 1024.0 / 1024.0); } else { str = g_strdup_printf("%.1fG", size / 1024.0 / 1024.0 / 1024.0); } return str; } static void remmina_ftp_client_cell_data_size(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gfloat size; gchar *str; gtk_tree_model_get(model, iter, REMMINA_FTP_FILE_COLUMN_SIZE, &size, -1); str = remmina_ftp_client_size_to_str(size); g_object_set(renderer, "text", str, NULL); g_object_set(renderer, "xalign", 1.0, NULL); g_free(str); } static void remmina_ftp_client_cell_data_permission(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gint permission; gchar buf[11]; gtk_tree_model_get(model, iter, REMMINA_FTP_FILE_COLUMN_PERMISSION, &permission, -1); buf[0] = (permission & 040000 ? 'd' : '-'); buf[1] = (permission & 0400 ? 'r' : '-'); buf[2] = (permission & 0200 ? 'w' : '-'); buf[3] = (permission & 0100 ? 'x' : '-'); buf[4] = (permission & 040 ? 'r' : '-'); buf[5] = (permission & 020 ? 'w' : '-'); buf[6] = (permission & 010 ? 'x' : '-'); buf[7] = (permission & 04 ? 'r' : '-'); buf[8] = (permission & 02 ? 'w' : '-'); buf[9] = (permission & 01 ? 'x' : '-'); buf[10] = '\0'; g_object_set(renderer, "text", buf, NULL); } static void remmina_ftp_client_cell_data_size_progress(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gint status; gfloat size, donesize; gchar *strsize, *strdonesize, *str; gtk_tree_model_get(model, iter, REMMINA_FTP_TASK_COLUMN_STATUS, &status, REMMINA_FTP_TASK_COLUMN_SIZE, &size, REMMINA_FTP_TASK_COLUMN_DONESIZE, &donesize, -1); if (status == REMMINA_FTP_TASK_STATUS_FINISH) { str = remmina_ftp_client_size_to_str(size); } else { strsize = remmina_ftp_client_size_to_str(size); strdonesize = remmina_ftp_client_size_to_str(donesize); str = g_strdup_printf("%s / %s", strdonesize, strsize); g_free(strsize); g_free(strdonesize); } g_object_set(renderer, "text", str, NULL); g_object_set(renderer, "xalign", 1.0, NULL); g_free(str); } static void remmina_ftp_client_cell_data_progress(GtkTreeViewColumn *col, GtkCellRenderer *renderer, GtkTreeModel *model, GtkTreeIter *iter, gpointer user_data) { gint status; gfloat size, donesize; gint progress; gtk_tree_model_get(model, iter, REMMINA_FTP_TASK_COLUMN_STATUS, &status, REMMINA_FTP_TASK_COLUMN_SIZE, &size, REMMINA_FTP_TASK_COLUMN_DONESIZE, &donesize, -1); if (status == REMMINA_FTP_TASK_STATUS_FINISH) { progress = 100; } else { if (size <= 1) { progress = 0; } else { progress = (gint)(donesize / size * 100); if (progress > 99) progress = 99; } } g_object_set(renderer, "value", progress, NULL); } static void remmina_ftp_client_open_dir(RemminaFTPClient *client, const gchar *dir) { BUSY_CURSOR g_signal_emit(G_OBJECT(client), remmina_ftp_client_signals[OPEN_DIR_SIGNAL], 0, dir); NORMAL_CURSOR } static void remmina_ftp_client_dir_on_activate(GtkWidget *widget, RemminaFTPClient *client) { remmina_ftp_client_open_dir(client, gtk_entry_get_text(GTK_ENTRY(widget))); } static void remmina_ftp_client_dir_on_changed(GtkWidget *widget, RemminaFTPClient *client) { GtkWidget *entry = gtk_bin_get_child(GTK_BIN(widget)); if (!gtk_widget_is_focus(entry)) { gtk_widget_grab_focus(entry); /* If the text was changed but the entry is not the focus, it should be changed by the drop-down list. Not sure this will always work in the future, but it works right now :) */ remmina_ftp_client_open_dir(client, gtk_entry_get_text(GTK_ENTRY(entry))); } } static void remmina_ftp_client_set_file_action_sensitive(RemminaFTPClient *client, gboolean sensitive) { gint i; for (i = 0; client->priv->file_action_widgets[i]; i++) { gtk_widget_set_sensitive(client->priv->file_action_widgets[i], sensitive); } client->priv->sensitive = sensitive; } static void remmina_ftp_client_file_selection_on_changed(GtkTreeSelection *selection, RemminaFTPClient *client) { GList *list; list = gtk_tree_selection_get_selected_rows(selection, NULL); remmina_ftp_client_set_file_action_sensitive(client, (list ? TRUE : FALSE)); g_list_free(list); } static gchar* remmina_ftp_client_get_download_dir(RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkWidget *dialog; gchar *localdir = NULL; dialog = gtk_file_chooser_dialog_new(_("Choose download location"), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); if (priv->working_directory) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), priv->working_directory); } if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { g_free(priv->working_directory); priv->working_directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); localdir = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); } gtk_widget_destroy(dialog); return localdir; } static void remmina_ftp_client_download(RemminaFTPClient *client, GtkTreeIter *piter, const gchar *localdir) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkListStore *store = GTK_LIST_STORE(priv->task_list_model); GtkTreeIter iter; gint type; gchar *name; gfloat size; gtk_tree_model_get(priv->file_list_sort, piter, REMMINA_FTP_FILE_COLUMN_TYPE, &type, REMMINA_FTP_FILE_COLUMN_NAME, &name, REMMINA_FTP_FILE_COLUMN_SIZE, &size, -1); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, REMMINA_FTP_TASK_COLUMN_TYPE, type, REMMINA_FTP_TASK_COLUMN_NAME, name, REMMINA_FTP_TASK_COLUMN_SIZE, size, REMMINA_FTP_TASK_COLUMN_TASKID, remmina_ftp_client_taskid++, REMMINA_FTP_TASK_COLUMN_TASKTYPE, REMMINA_FTP_TASK_TYPE_DOWNLOAD, REMMINA_FTP_TASK_COLUMN_REMOTEDIR, priv->current_directory, REMMINA_FTP_TASK_COLUMN_LOCALDIR, localdir, REMMINA_FTP_TASK_COLUMN_STATUS, REMMINA_FTP_TASK_STATUS_WAIT, REMMINA_FTP_TASK_COLUMN_DONESIZE, 0.0, REMMINA_FTP_TASK_COLUMN_TOOLTIP, NULL, -1); g_free(name); g_signal_emit(G_OBJECT(client), remmina_ftp_client_signals[NEW_TASK_SIGNAL], 0); } static gboolean remmina_ftp_client_task_list_on_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkTreeIter iter; GtkTreePath *path = NULL; gchar *tmp; if (!gtk_tree_view_get_tooltip_context(GTK_TREE_VIEW(priv->task_list_view), &x, &y, keyboard_tip, NULL, &path, &iter)) { return FALSE; } gtk_tree_model_get(priv->task_list_model, &iter, REMMINA_FTP_TASK_COLUMN_TOOLTIP, &tmp, -1); if (!tmp) return FALSE; gtk_tooltip_set_text(tooltip, tmp); gtk_tree_view_set_tooltip_row(GTK_TREE_VIEW(priv->task_list_view), tooltip, path); gtk_tree_path_free(path); g_free(tmp); return TRUE; } static void remmina_ftp_client_action_parent(GObject *object, RemminaFTPClient *client) { remmina_ftp_client_open_dir(client, ".."); } static void remmina_ftp_client_action_home(GObject *object, RemminaFTPClient *client) { remmina_ftp_client_open_dir(client, NULL); } static void remmina_ftp_client_action_refresh(GObject *object, RemminaFTPClient *client) { remmina_ftp_client_open_dir(client, "."); } static void remmina_ftp_client_action_download(GObject *object, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkTreeSelection *selection; gchar *localdir; GList *list, *list_iter; GtkTreeIter iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_list_view)); if (!selection) return; list = gtk_tree_selection_get_selected_rows(selection, NULL); if (!list) return; localdir = remmina_ftp_client_get_download_dir(client); if (!localdir) { g_list_free(list); return; } list_iter = g_list_first(list); while (list_iter) { gtk_tree_model_get_iter(priv->file_list_sort, &iter, (GtkTreePath*) list_iter->data); remmina_ftp_client_download(client, &iter, localdir); list_iter = g_list_next(list_iter); } g_list_free(list); g_free(localdir); } static void remmina_ftp_client_action_delete(GObject *object, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkWidget *dialog; GtkTreeSelection *selection; GList *list, *list_iter; GtkTreeIter iter; gint type; gchar *name; gchar *path; gint response; gboolean ret = TRUE; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_list_view)); if (!selection) return; list = gtk_tree_selection_get_selected_rows(selection, NULL); if (!list) return; dialog = gtk_message_dialog_new(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Are you sure to delete the selected files on server?")); response = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (response != GTK_RESPONSE_YES) return; BUSY_CURSOR list_iter = g_list_first(list); while (list_iter) { gtk_tree_model_get_iter(priv->file_list_sort, &iter, (GtkTreePath*) list_iter->data); gtk_tree_model_get(priv->file_list_sort, &iter, REMMINA_FTP_FILE_COLUMN_TYPE, &type, REMMINA_FTP_FILE_COLUMN_NAME, &name, -1); path = remmina_public_combine_path(priv->current_directory, name); g_signal_emit(G_OBJECT(client), remmina_ftp_client_signals[DELETE_FILE_SIGNAL], 0, type, path, &ret); g_free(name); g_free(path); if (!ret) break; list_iter = g_list_next(list_iter); } g_list_free(list); NORMAL_CURSOR if (ret) { remmina_ftp_client_action_refresh(object, client); } } static void remmina_ftp_client_upload_folder_on_toggled(GtkToggleButton *togglebutton, GtkWidget *widget) { gtk_file_chooser_set_action( GTK_FILE_CHOOSER(widget), gtk_toggle_button_get_active(togglebutton) ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER : GTK_FILE_CHOOSER_ACTION_OPEN); } static void remmina_ftp_client_action_upload(GObject *object, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkListStore *store = GTK_LIST_STORE(priv->task_list_model); GtkTreeIter iter; GtkWidget *dialog; GtkWidget *upload_folder_check; gint type; GSList *files = NULL; GSList *element; gchar *path; gchar *dir, *name; struct stat st; dialog = gtk_file_chooser_dialog_new(_("Choose a file to upload"), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(client))), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); if (priv->working_directory) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), priv->working_directory); } upload_folder_check = gtk_check_button_new_with_label(_("Upload folder")); gtk_widget_show(upload_folder_check); g_signal_connect(G_OBJECT(upload_folder_check), "toggled", G_CALLBACK(remmina_ftp_client_upload_folder_on_toggled), dialog); gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), upload_folder_check); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { g_free(priv->working_directory); priv->working_directory = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog)); files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); } type = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(upload_folder_check)) ? REMMINA_FTP_FILE_TYPE_DIR : REMMINA_FTP_FILE_TYPE_FILE; gtk_widget_destroy(dialog); if (!files) return; for (element = files; element; element = element->next) { path = (gchar*) element->data; if (g_stat(path, &st) < 0) continue; name = g_strrstr(path, "/"); if (name) { *name++ = '\0'; dir = path; } else { name = path; dir = NULL; } gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, REMMINA_FTP_TASK_COLUMN_TYPE, type, REMMINA_FTP_TASK_COLUMN_NAME, name, REMMINA_FTP_TASK_COLUMN_SIZE, (gfloat) st.st_size, REMMINA_FTP_TASK_COLUMN_TASKID, remmina_ftp_client_taskid++, REMMINA_FTP_TASK_COLUMN_TASKTYPE, REMMINA_FTP_TASK_TYPE_UPLOAD, REMMINA_FTP_TASK_COLUMN_REMOTEDIR, priv->current_directory, REMMINA_FTP_TASK_COLUMN_LOCALDIR, dir, REMMINA_FTP_TASK_COLUMN_STATUS, REMMINA_FTP_TASK_STATUS_WAIT, REMMINA_FTP_TASK_COLUMN_DONESIZE, 0.0, REMMINA_FTP_TASK_COLUMN_TOOLTIP, NULL, -1); g_free(path); } g_slist_free(files); g_signal_emit(G_OBJECT(client), remmina_ftp_client_signals[NEW_TASK_SIGNAL], 0); } static void remmina_ftp_client_popup_menu(RemminaFTPClient *client, GdkEventButton *event) { GtkWidget *menu; GtkWidget *menuitem; GtkWidget *image; menu = gtk_menu_new(); menuitem = gtk_image_menu_item_new_with_label(_("Download")); gtk_widget_show(menuitem); image = gtk_image_new_from_icon_name("document-save", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_ftp_client_action_download), client); menuitem = gtk_image_menu_item_new_with_label(_("Upload")); gtk_widget_show(menuitem); image = gtk_image_new_from_icon_name("document-send", GTK_ICON_SIZE_MENU); gtk_widget_show(image); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_ftp_client_action_upload), client); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_DELETE, NULL); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_ftp_client_action_delete), client); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button, event->time); } static gboolean remmina_ftp_client_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GList *list; GtkTreeIter iter; gint type; gchar *name; gchar *localdir; if (event->button == 3) { remmina_ftp_client_popup_menu(client, event); } else if (event->button == 1 && event->type == GDK_2BUTTON_PRESS) { list = gtk_tree_selection_get_selected_rows( gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_list_view)), NULL); if (list) { gtk_tree_model_get_iter(priv->file_list_sort, &iter, (GtkTreePath*) list->data); gtk_tree_model_get(priv->file_list_sort, &iter, REMMINA_FTP_FILE_COLUMN_TYPE, &type, REMMINA_FTP_FILE_COLUMN_NAME, &name, -1); switch (type) { case REMMINA_FTP_FILE_TYPE_DIR: remmina_ftp_client_open_dir(client, name); break; case REMMINA_FTP_FILE_TYPE_FILE: default: localdir = remmina_ftp_client_get_download_dir(client); if (localdir) { remmina_ftp_client_download(client, &iter, localdir); g_free(localdir); } break; } g_list_free(list); g_free(name); } } return FALSE; } static void remmina_ftp_client_task_list_cell_on_activate(GtkCellRenderer *renderer, gchar *path, RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkTreeIter iter; GtkTreePath *treepath; gint taskid; gboolean ret = FALSE; treepath = gtk_tree_path_new_from_string(path); gtk_tree_model_get_iter(priv->task_list_model, &iter, treepath); gtk_tree_path_free(treepath); gtk_tree_model_get(priv->task_list_model, &iter, REMMINA_FTP_TASK_COLUMN_TASKID, &taskid, -1); g_signal_emit(G_OBJECT(client), remmina_ftp_client_signals[CANCEL_TASK_SIGNAL], 0, taskid, &ret); if (ret) { gtk_list_store_remove(GTK_LIST_STORE(priv->task_list_model), &iter); } } static void remmina_ftp_client_create_toolbar(RemminaFTPClient *client) { GtkWidget *box; GtkWidget *button; GtkWidget *image; gint i = 0; box = gtk_hbutton_box_new(); gtk_widget_show(box); gtk_button_box_set_layout(GTK_BUTTON_BOX(box), GTK_BUTTONBOX_START); gtk_box_pack_start(GTK_BOX(client), box, FALSE, TRUE, 0); button = gtk_button_new_from_stock(GTK_STOCK_HOME); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Go to home folder")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_home), client); button = gtk_button_new_from_stock(GTK_STOCK_GO_UP); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Go to parent folder")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_parent), client); button = gtk_button_new_from_stock(GTK_STOCK_REFRESH); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Refresh current folder")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_refresh), client); button = gtk_button_new_with_label(_("Download")); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Download from server")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); image = gtk_image_new_from_icon_name("document-save", GTK_ICON_SIZE_BUTTON); gtk_button_set_image(GTK_BUTTON(button), image); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_download), client); client->priv->file_action_widgets[i++] = button; button = gtk_button_new_with_label(_("Upload")); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Upload to server")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); image = gtk_image_new_from_icon_name("document-send", GTK_ICON_SIZE_BUTTON); gtk_button_set_image(GTK_BUTTON(button), image); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_upload), client); button = gtk_button_new_from_stock(GTK_STOCK_DELETE); gtk_widget_show(button); gtk_widget_set_tooltip_text(button, _("Delete files on server")); gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(remmina_ftp_client_action_delete), client); client->priv->file_action_widgets[i++] = button; } void remmina_ftp_client_set_show_hidden(RemminaFTPClient *client, gboolean show_hidden) { client->priv->file_list_show_hidden = show_hidden; gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(client->priv->file_list_filter)); } static gboolean remmina_ftp_client_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, RemminaFTPClient *client) { gchar *name; gboolean result = TRUE; if (client->priv->file_list_show_hidden) return TRUE; gtk_tree_model_get(model, iter, REMMINA_FTP_FILE_COLUMN_NAME, &name, -1); if (name && name[0] == '.') { result = FALSE; } g_free(name); return result; } static void remmina_ftp_client_init(RemminaFTPClient *client) { RemminaFTPClientPriv *priv; GtkWidget *vpaned; GtkWidget *scrolledwindow; GtkWidget *widget; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *vbox; priv = g_new0(RemminaFTPClientPriv, 1); client->priv = priv; /* Main container */ gtk_box_set_homogeneous(GTK_BOX(client), FALSE); gtk_box_set_spacing(GTK_BOX(client), 4); /* Toolbar */ remmina_ftp_client_create_toolbar(client); /* The Paned to separate File List and Task List */ vpaned = gtk_vpaned_new(); gtk_widget_show(vpaned); gtk_box_pack_start(GTK_BOX(client), vpaned, TRUE, TRUE, 0); priv->vpaned = vpaned; /* Remote */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_paned_pack1(GTK_PANED(vpaned), vbox, TRUE, FALSE); /* Remote Directory */ widget = gtk_combo_box_text_new_with_entry(); gtk_widget_show(widget); gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(widget), "/"); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, TRUE, 0); priv->directory_combo = widget; /* Remote File List */ scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); widget = gtk_tree_view_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(scrolledwindow), widget); gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), GTK_SELECTION_MULTIPLE); priv->file_list_view = widget; /* Remote File List - Columns */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("File Name")); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_FILE_COLUMN_NAME_SORT); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_filetype_pixbuf, NULL, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", REMMINA_FTP_FILE_COLUMN_NAME); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->file_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer, NULL); gtk_tree_view_column_set_alignment(column, 1.0); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_size, NULL, NULL); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_FILE_COLUMN_SIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->file_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("User"), renderer, "text", REMMINA_FTP_FILE_COLUMN_USER, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_FILE_COLUMN_USER); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->file_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Group"), renderer, "text", REMMINA_FTP_FILE_COLUMN_GROUP, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_FILE_COLUMN_GROUP); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->file_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Permission"), renderer, "text", REMMINA_FTP_FILE_COLUMN_PERMISSION, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_permission, NULL, NULL); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_FILE_COLUMN_PERMISSION); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->file_list_view), column); /* Remote File List - Model */ priv->file_list_model = GTK_TREE_MODEL( gtk_list_store_new(REMMINA_FTP_FILE_N_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_STRING)); priv->file_list_filter = gtk_tree_model_filter_new(priv->file_list_model, NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(priv->file_list_filter), (GtkTreeModelFilterVisibleFunc) remmina_ftp_client_filter_visible_func, client, NULL); priv->file_list_sort = gtk_tree_model_sort_new_with_model(priv->file_list_filter); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(priv->file_list_sort), REMMINA_FTP_FILE_COLUMN_NAME_SORT, GTK_SORT_ASCENDING); gtk_tree_view_set_model(GTK_TREE_VIEW(priv->file_list_view), priv->file_list_sort); /* Task List */ scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); gtk_paned_pack2(GTK_PANED(vpaned), scrolledwindow, FALSE, TRUE); widget = gtk_tree_view_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(scrolledwindow), widget); g_object_set(widget, "has-tooltip", TRUE, NULL); priv->task_list_view = widget; /* Task List - Columns */ column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("File Name")); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_expand(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_TASK_COLUMN_NAME); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_progress_pixbuf, NULL, NULL); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_filetype_pixbuf, NULL, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", REMMINA_FTP_FILE_COLUMN_NAME); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Remote"), renderer, "text", REMMINA_FTP_TASK_COLUMN_REMOTEDIR, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_TASK_COLUMN_REMOTEDIR); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Local"), renderer, "text", REMMINA_FTP_TASK_COLUMN_LOCALDIR, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_TASK_COLUMN_LOCALDIR); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Size"), renderer, NULL); gtk_tree_view_column_set_alignment(column, 1.0); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_size_progress, NULL, NULL); gtk_tree_view_column_set_sort_column_id(column, REMMINA_FTP_TASK_COLUMN_SIZE); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); renderer = gtk_cell_renderer_progress_new(); column = gtk_tree_view_column_new_with_attributes(_("Progress"), renderer, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_cell_data_func(column, renderer, remmina_ftp_client_cell_data_progress, NULL, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); renderer = remmina_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, NULL); g_object_set(G_OBJECT(renderer), "stock-id", GTK_STOCK_CANCEL, NULL); gtk_tree_view_column_set_resizable(column, FALSE); gtk_tree_view_append_column(GTK_TREE_VIEW(priv->task_list_view), column); g_signal_connect(G_OBJECT(renderer), "activate", G_CALLBACK(remmina_ftp_client_task_list_cell_on_activate), client); /* Task List - Model */ priv->task_list_model = GTK_TREE_MODEL( gtk_list_store_new(REMMINA_FTP_TASK_N_COLUMNS, G_TYPE_INT, G_TYPE_STRING, G_TYPE_FLOAT, G_TYPE_INT, G_TYPE_INT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INT, G_TYPE_FLOAT, G_TYPE_STRING)); gtk_tree_view_set_model(GTK_TREE_VIEW(priv->task_list_view), priv->task_list_model); /* Setup the internal signals */ g_signal_connect(G_OBJECT(client), "destroy", G_CALLBACK(remmina_ftp_client_destroy), NULL); g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(priv->directory_combo))), "activate", G_CALLBACK(remmina_ftp_client_dir_on_activate), client); g_signal_connect(G_OBJECT(priv->directory_combo), "changed", G_CALLBACK(remmina_ftp_client_dir_on_changed), client); g_signal_connect(G_OBJECT(priv->file_list_view), "button-press-event", G_CALLBACK(remmina_ftp_client_file_list_on_button_press), client); g_signal_connect(G_OBJECT(gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->file_list_view))), "changed", G_CALLBACK(remmina_ftp_client_file_selection_on_changed), client); g_signal_connect(G_OBJECT(priv->task_list_view), "query-tooltip", G_CALLBACK(remmina_ftp_client_task_list_on_query_tooltip), client); } GtkWidget* remmina_ftp_client_new(void) { RemminaFTPClient *client; client = REMMINA_FTP_CLIENT(g_object_new(REMMINA_TYPE_FTP_CLIENT, NULL)); return GTK_WIDGET(client); } void remmina_ftp_client_save_state(RemminaFTPClient *client, RemminaFile *remminafile) { gint pos; pos = gtk_paned_get_position(GTK_PANED(client->priv->vpaned)); remmina_file_set_int(remminafile, "ftp_vpanedpos", pos); } void remmina_ftp_client_load_state(RemminaFTPClient *client, RemminaFile *remminafile) { gint pos; GtkAllocation a; pos = remmina_file_get_int(remminafile, "ftp_vpanedpos", 0); if (pos) { gtk_widget_get_allocation(client->priv->vpaned, &a); if (a.height > 0 && pos > a.height - 60) { pos = a.height - 60; } gtk_paned_set_position(GTK_PANED(client->priv->vpaned), pos); } } void remmina_ftp_client_clear_file_list(RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; gtk_list_store_clear(GTK_LIST_STORE(priv->file_list_model)); remmina_ftp_client_set_file_action_sensitive(client, FALSE); } void remmina_ftp_client_add_file(RemminaFTPClient *client, ...) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkListStore *store = GTK_LIST_STORE (priv->file_list_model); GtkTreeIter iter; va_list args; gint type; gchar *name; gchar *ptr; va_start (args, client); gtk_list_store_append (store, &iter); gtk_list_store_set_valist (store, &iter, args); va_end (args); gtk_tree_model_get (GTK_TREE_MODEL(store), &iter, REMMINA_FTP_FILE_COLUMN_TYPE, &type, REMMINA_FTP_FILE_COLUMN_NAME, &name, -1); ptr = g_strdup_printf("%i%s", type, name); gtk_list_store_set (store, &iter, REMMINA_FTP_FILE_COLUMN_NAME_SORT, ptr, -1); g_free(ptr); g_free(name); } void remmina_ftp_client_set_dir(RemminaFTPClient *client, const gchar *dir) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkTreeModel *model; GtkTreeIter iter; gboolean ret; gchar *t; if (priv->current_directory && g_strcmp0(priv->current_directory, dir) == 0) return; model = gtk_combo_box_get_model(GTK_COMBO_BOX(priv->directory_combo)); for (ret = gtk_tree_model_get_iter_first(model, &iter); ret; ret = gtk_tree_model_iter_next(model, &iter)) { gtk_tree_model_get(model, &iter, 0, &t, -1); if (g_strcmp0(t, dir) == 0) { gtk_list_store_remove(GTK_LIST_STORE(model), &iter); g_free(t); break; } g_free(t); } gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(priv->directory_combo), dir); gtk_combo_box_set_active(GTK_COMBO_BOX(priv->directory_combo), 0); g_free(priv->current_directory); priv->current_directory = g_strdup(dir); } gchar* remmina_ftp_client_get_dir(RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; return g_strdup(priv->current_directory); } RemminaFTPTask* remmina_ftp_client_get_waiting_task(RemminaFTPClient *client) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkTreePath *path; GtkTreeIter iter; RemminaFTPTask task; if (!gtk_tree_model_get_iter_first(priv->task_list_model, &iter)) return NULL; while (1) { gtk_tree_model_get(priv->task_list_model, &iter, REMMINA_FTP_TASK_COLUMN_TYPE, &task.type, REMMINA_FTP_TASK_COLUMN_NAME, &task.name, REMMINA_FTP_TASK_COLUMN_SIZE, &task.size, REMMINA_FTP_TASK_COLUMN_TASKID, &task.taskid, REMMINA_FTP_TASK_COLUMN_TASKTYPE, &task.tasktype, REMMINA_FTP_TASK_COLUMN_REMOTEDIR, &task.remotedir, REMMINA_FTP_TASK_COLUMN_LOCALDIR, &task.localdir, REMMINA_FTP_TASK_COLUMN_STATUS, &task.status, REMMINA_FTP_TASK_COLUMN_DONESIZE, &task.donesize, REMMINA_FTP_TASK_COLUMN_TOOLTIP, &task.tooltip, -1); if (task.status == REMMINA_FTP_TASK_STATUS_WAIT) { path = gtk_tree_model_get_path(priv->task_list_model, &iter); task.rowref = gtk_tree_row_reference_new(priv->task_list_model, path); gtk_tree_path_free(path); return (RemminaFTPTask*) g_memdup(&task, sizeof(RemminaFTPTask)); } if (!gtk_tree_model_iter_next(priv->task_list_model, &iter)) break; } return NULL; } void remmina_ftp_client_update_task(RemminaFTPClient *client, RemminaFTPTask* task) { RemminaFTPClientPriv *priv = (RemminaFTPClientPriv*) client->priv; GtkListStore *store = GTK_LIST_STORE(priv->task_list_model); GtkTreePath *path; GtkTreeIter iter; path = gtk_tree_row_reference_get_path(task->rowref); if (path == NULL) return; gtk_tree_model_get_iter(priv->task_list_model, &iter, path); gtk_tree_path_free(path); gtk_list_store_set(store, &iter, REMMINA_FTP_TASK_COLUMN_SIZE, task->size, REMMINA_FTP_TASK_COLUMN_STATUS, task->status, REMMINA_FTP_TASK_COLUMN_DONESIZE, task->donesize, REMMINA_FTP_TASK_COLUMN_TOOLTIP, task->tooltip, -1); } void remmina_ftp_task_free(RemminaFTPTask *task) { if (task) { g_free(task->name); g_free(task->remotedir); g_free(task->localdir); g_free(task->tooltip); g_free(task); } } FreeRDP-Remmina-356c033/remmina/src/remmina_ftp_client.h000066400000000000000000000105461171526373700230500ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAFTPCLIENT_H__ #define __REMMINAFTPCLIENT_H__ G_BEGIN_DECLS #define REMMINA_TYPE_FTP_CLIENT (remmina_ftp_client_get_type ()) #define REMMINA_FTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_FTP_CLIENT, RemminaFTPClient)) #define REMMINA_FTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_FTP_CLIENT, RemminaFTPClientClass)) #define REMMINA_IS_FTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_FTP_CLIENT)) #define REMMINA_IS_FTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_FTP_CLIENT)) #define REMMINA_FTP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_FTP_CLIENT, RemminaFTPClientClass)) typedef struct _RemminaFTPClientPriv RemminaFTPClientPriv; typedef struct _RemminaFTPClient { GtkVBox vbox; RemminaFTPClientPriv *priv; } RemminaFTPClient; typedef struct _RemminaFTPClientClass { GtkVBoxClass parent_class; void (*open_dir)(RemminaFTPClient *client); void (*new_task)(RemminaFTPClient *client); void (*cancel_task)(RemminaFTPClient *client); void (*delete_file)(RemminaFTPClient *client); } RemminaFTPClientClass; GType remmina_ftp_client_get_type(void) G_GNUC_CONST; enum { REMMINA_FTP_FILE_TYPE_DIR, REMMINA_FTP_FILE_TYPE_FILE, REMMINA_FTP_FILE_N_TYPES, }; enum { REMMINA_FTP_FILE_COLUMN_TYPE, REMMINA_FTP_FILE_COLUMN_NAME, REMMINA_FTP_FILE_COLUMN_SIZE, REMMINA_FTP_FILE_COLUMN_USER, REMMINA_FTP_FILE_COLUMN_GROUP, REMMINA_FTP_FILE_COLUMN_PERMISSION, REMMINA_FTP_FILE_COLUMN_NAME_SORT, /* Auto populate */ REMMINA_FTP_FILE_N_COLUMNS }; enum { REMMINA_FTP_TASK_TYPE_DOWNLOAD, REMMINA_FTP_TASK_TYPE_UPLOAD, REMMINA_FTP_TASK_N_TYPES }; enum { REMMINA_FTP_TASK_STATUS_WAIT, REMMINA_FTP_TASK_STATUS_RUN, REMMINA_FTP_TASK_STATUS_FINISH, REMMINA_FTP_TASK_STATUS_ERROR, REMMINA_FTP_TASK_N_STATUSES }; enum { REMMINA_FTP_TASK_COLUMN_TYPE, REMMINA_FTP_TASK_COLUMN_NAME, REMMINA_FTP_TASK_COLUMN_SIZE, REMMINA_FTP_TASK_COLUMN_TASKID, REMMINA_FTP_TASK_COLUMN_TASKTYPE, REMMINA_FTP_TASK_COLUMN_REMOTEDIR, REMMINA_FTP_TASK_COLUMN_LOCALDIR, REMMINA_FTP_TASK_COLUMN_STATUS, REMMINA_FTP_TASK_COLUMN_DONESIZE, REMMINA_FTP_TASK_COLUMN_TOOLTIP, REMMINA_FTP_TASK_N_COLUMNS }; typedef struct _RemminaFTPTask { /* Read-only */ gint type; gchar *name; gint taskid; gint tasktype; gchar *remotedir; gchar *localdir; GtkTreeRowReference *rowref; /* Updatable */ gfloat size; gint status; gfloat donesize; gchar *tooltip; } RemminaFTPTask; GtkWidget* remmina_ftp_client_new(void); void remmina_ftp_client_save_state(RemminaFTPClient *client, RemminaFile *remminafile); void remmina_ftp_client_load_state(RemminaFTPClient *client, RemminaFile *remminafile); void remmina_ftp_client_set_show_hidden(RemminaFTPClient *client, gboolean show_hidden); void remmina_ftp_client_clear_file_list(RemminaFTPClient *client); /* column, value, ..., -1 */ void remmina_ftp_client_add_file(RemminaFTPClient *client, ...); /* Set the current directory. Should be called by opendir signal handler */ void remmina_ftp_client_set_dir(RemminaFTPClient *client, const gchar *dir); /* Get the current directory as newly allocated string */ gchar* remmina_ftp_client_get_dir(RemminaFTPClient *client); /* Get the next waiting task */ RemminaFTPTask* remmina_ftp_client_get_waiting_task(RemminaFTPClient *client); /* Update the task */ void remmina_ftp_client_update_task(RemminaFTPClient *client, RemminaFTPTask* task); /* Free the RemminaFTPTask object */ void remmina_ftp_task_free(RemminaFTPTask *task); G_END_DECLS #endif /* __REMMINAFTPCLIENT_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_icon.c000066400000000000000000000335461171526373700216510ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include "remmina_widget_pool.h" #include "remmina_pref.h" #include "remmina_exec.h" #include "remmina_avahi.h" #include "remmina_applet_menu_item.h" #include "remmina_applet_menu.h" #include "remmina_connection_window.h" #include "remmina_icon.h" #ifdef HAVE_LIBAPPINDICATOR #include #endif typedef struct _RemminaIcon { #ifdef HAVE_LIBAPPINDICATOR AppIndicator *icon; #else GtkStatusIcon *icon; #endif RemminaAvahi *avahi; guint32 popup_time; gchar *autostart_file; } RemminaIcon; static RemminaIcon remmina_icon = { 0 }; static void remmina_icon_destroy(void) { if (remmina_icon.icon) { #ifdef HAVE_LIBAPPINDICATOR app_indicator_set_status (remmina_icon.icon, APP_INDICATOR_STATUS_PASSIVE); #else gtk_status_icon_set_visible(remmina_icon.icon, FALSE); #endif remmina_widget_pool_hold(FALSE); } if (remmina_icon.avahi) { remmina_avahi_free(remmina_icon.avahi); remmina_icon.avahi = NULL; } if (remmina_icon.autostart_file) { g_free(remmina_icon.autostart_file); remmina_icon.autostart_file = NULL; } } static void remmina_icon_main(void) { remmina_exec_command(REMMINA_COMMAND_MAIN, NULL); } static void remmina_icon_preferences(void) { remmina_exec_command(REMMINA_COMMAND_PREF, "2"); } static void remmina_icon_about(void) { remmina_exec_command(REMMINA_COMMAND_ABOUT, NULL); } static void remmina_icon_enable_avahi(GtkCheckMenuItem *checkmenuitem, gpointer data) { if (!remmina_icon.avahi) return; if (gtk_check_menu_item_get_active(checkmenuitem)) { remmina_pref.applet_enable_avahi = TRUE; if (!remmina_icon.avahi->started) remmina_avahi_start(remmina_icon.avahi); } else { remmina_pref.applet_enable_avahi = FALSE; remmina_avahi_stop(remmina_icon.avahi); } remmina_pref_save(); } static void remmina_icon_populate_additional_menu_item(GtkWidget *menu) { GtkWidget *menuitem; menuitem = gtk_image_menu_item_new_with_label(_("Open Main Window")); gtk_widget_show(menuitem); gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), gtk_image_new_from_icon_name("remmina", GTK_ICON_SIZE_MENU)); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_icon_main), NULL); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_icon_preferences), NULL); menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_icon_about), NULL); menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); #ifdef HAVE_LIBAVAHI_CLIENT menuitem = gtk_check_menu_item_new_with_label (_("Enable Service Discovery")); if (remmina_pref.applet_enable_avahi) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), TRUE); } gtk_widget_show(menuitem); g_signal_connect(G_OBJECT(menuitem), "toggled", G_CALLBACK(remmina_icon_enable_avahi), NULL); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); #endif menuitem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_widget_show(menuitem); gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_icon_destroy), NULL); } static void remmina_icon_on_launch_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data) { gchar *s; switch (menuitem->item_type) { case REMMINA_APPLET_MENU_ITEM_NEW: remmina_exec_command(REMMINA_COMMAND_NEW, NULL); break; case REMMINA_APPLET_MENU_ITEM_FILE: remmina_exec_command(REMMINA_COMMAND_CONNECT, menuitem->filename); break; case REMMINA_APPLET_MENU_ITEM_DISCOVERED: s = g_strdup_printf("%s,%s", menuitem->protocol, menuitem->name); remmina_exec_command(REMMINA_COMMAND_NEW, s); g_free(s); break; } } static void remmina_icon_on_edit_item(RemminaAppletMenu *menu, RemminaAppletMenuItem *menuitem, gpointer data) { gchar *s; switch (menuitem->item_type) { case REMMINA_APPLET_MENU_ITEM_NEW: remmina_exec_command(REMMINA_COMMAND_NEW, NULL); break; case REMMINA_APPLET_MENU_ITEM_FILE: remmina_exec_command(REMMINA_COMMAND_EDIT, menuitem->filename); break; case REMMINA_APPLET_MENU_ITEM_DISCOVERED: s = g_strdup_printf("%s,%s", menuitem->protocol, menuitem->name); remmina_exec_command(REMMINA_COMMAND_NEW, s); g_free(s); break; } } static void remmina_icon_on_activate_window(GtkMenuItem *menuitem, GtkWidget *widget) { if (GTK_IS_WINDOW(widget)) { gtk_window_present(GTK_WINDOW(widget)); gtk_window_deiconify(GTK_WINDOW(widget)); } } static gboolean remmina_icon_foreach_window(GtkWidget *widget, gpointer data) { GtkWidget *popup_menu = GTK_WIDGET(data); GtkWidget *menuitem; GdkScreen *screen; gint screen_number; if (G_TYPE_CHECK_INSTANCE_TYPE(widget, REMMINA_TYPE_CONNECTION_WINDOW)) { screen = gdk_screen_get_default(); screen_number = gdk_screen_get_number(screen); if (screen_number == gdk_screen_get_number(gtk_window_get_screen(GTK_WINDOW(widget)))) { menuitem = gtk_menu_item_new_with_label(gtk_window_get_title(GTK_WINDOW(widget))); gtk_widget_show(menuitem); gtk_menu_shell_prepend(GTK_MENU_SHELL(popup_menu), menuitem); g_signal_connect(G_OBJECT(menuitem), "activate", G_CALLBACK(remmina_icon_on_activate_window), widget); return TRUE; } } return FALSE; } static void remmina_icon_populate_extra_menu_item(GtkWidget *menu) { GtkWidget *menuitem; gboolean new_ontop; GHashTableIter iter; gchar *tmp; gint n; new_ontop = remmina_pref.applet_new_ontop; /* Iterate all discovered services from Avahi */ if (remmina_icon.avahi) { g_hash_table_iter_init(&iter, remmina_icon.avahi->discovered_services); while (g_hash_table_iter_next(&iter, NULL, (gpointer*) &tmp)) { menuitem = remmina_applet_menu_item_new(REMMINA_APPLET_MENU_ITEM_DISCOVERED, tmp); gtk_widget_show(menuitem); remmina_applet_menu_add_item(REMMINA_APPLET_MENU(menu), REMMINA_APPLET_MENU_ITEM(menuitem)); } } /* Separator */ menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); if (new_ontop) { gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem); } else { gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } /* New Connection */ menuitem = remmina_applet_menu_item_new(REMMINA_APPLET_MENU_ITEM_NEW); gtk_widget_show(menuitem); remmina_applet_menu_register_item(REMMINA_APPLET_MENU(menu), REMMINA_APPLET_MENU_ITEM(menuitem)); if (new_ontop) { gtk_menu_shell_prepend(GTK_MENU_SHELL(menu), menuitem); } else { gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); } /* Existing window */ if (remmina_pref.minimize_to_tray) { n = remmina_widget_pool_foreach(remmina_icon_foreach_window, menu); if (n > 0) { /* Separator */ menuitem = gtk_separator_menu_item_new(); gtk_widget_show(menuitem); gtk_menu_shell_insert(GTK_MENU_SHELL(menu), menuitem, n); } } g_signal_connect(G_OBJECT(menu), "launch-item", G_CALLBACK(remmina_icon_on_launch_item), NULL); g_signal_connect(G_OBJECT(menu), "edit-item", G_CALLBACK(remmina_icon_on_edit_item), NULL); } #ifdef HAVE_LIBAPPINDICATOR void remmina_icon_populate_menu (void) { GtkWidget *menu; GtkWidget *menuitem; menu = remmina_applet_menu_new (); app_indicator_set_menu (remmina_icon.icon, GTK_MENU (menu)); remmina_applet_menu_set_hide_count (REMMINA_APPLET_MENU (menu), remmina_pref.applet_hide_count); remmina_applet_menu_populate (REMMINA_APPLET_MENU (menu)); remmina_icon_populate_extra_menu_item (menu); menuitem = gtk_separator_menu_item_new (); gtk_widget_show(menuitem); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menuitem); remmina_icon_populate_additional_menu_item (menu); } #else void remmina_icon_populate_menu(void) { } static void remmina_icon_popdown_menu(GtkWidget *widget, gpointer data) { if (gtk_get_current_event_time() - remmina_icon.popup_time <= 500) { remmina_exec_command(REMMINA_COMMAND_MAIN, NULL); } } static void remmina_icon_on_activate(GtkStatusIcon *icon, gpointer user_data) { GtkWidget *menu; gint button, event_time; remmina_icon.popup_time = gtk_get_current_event_time(); menu = remmina_applet_menu_new(); remmina_applet_menu_set_hide_count(REMMINA_APPLET_MENU(menu), remmina_pref.applet_hide_count); remmina_applet_menu_populate(REMMINA_APPLET_MENU(menu)); remmina_icon_populate_extra_menu_item(menu); button = 0; event_time = gtk_get_current_event_time(); g_signal_connect(G_OBJECT(menu), "deactivate", G_CALLBACK(remmina_icon_popdown_menu), NULL); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, remmina_icon.icon, button, event_time); } static void remmina_icon_on_popup_menu(GtkStatusIcon *icon, guint button, guint activate_time, gpointer user_data) { GtkWidget *menu; menu = gtk_menu_new(); remmina_icon_populate_additional_menu_item(menu); gtk_menu_popup(GTK_MENU(menu), NULL, NULL, gtk_status_icon_position_menu, remmina_icon.icon, button, activate_time); } #endif static void remmina_icon_save_autostart_file(GKeyFile *gkeyfile) { gchar *content; gsize length; content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_icon.autostart_file, content, length, NULL); g_free(content); } static void remmina_icon_create_autostart_file(void) { GKeyFile *gkeyfile; if (!g_file_test(remmina_icon.autostart_file, G_FILE_TEST_EXISTS)) { gkeyfile = g_key_file_new(); g_key_file_set_string(gkeyfile, "Desktop Entry", "Version", "1.0"); g_key_file_set_string(gkeyfile, "Desktop Entry", "Name", _("Remmina Applet")); g_key_file_set_string(gkeyfile, "Desktop Entry", "Comment", _("Connect to remote desktops through the applet menu")); g_key_file_set_string(gkeyfile, "Desktop Entry", "Icon", "remmina"); g_key_file_set_string(gkeyfile, "Desktop Entry", "Exec", "remmina -i"); g_key_file_set_boolean(gkeyfile, "Desktop Entry", "Terminal", FALSE); g_key_file_set_string(gkeyfile, "Desktop Entry", "Type", "Application"); g_key_file_set_boolean(gkeyfile, "Desktop Entry", "Hidden", TRUE); remmina_icon_save_autostart_file(gkeyfile); g_key_file_free(gkeyfile); } } void remmina_icon_init(void) { if (!remmina_icon.icon && !remmina_pref.disable_tray_icon) { #ifdef HAVE_LIBAPPINDICATOR remmina_icon.icon = app_indicator_new ("remmina-icon", "remmina", APP_INDICATOR_CATEGORY_OTHER); app_indicator_set_status (remmina_icon.icon, APP_INDICATOR_STATUS_ACTIVE); remmina_icon_populate_menu (); #else remmina_icon.icon = gtk_status_icon_new_from_icon_name("remmina"); gtk_status_icon_set_title(remmina_icon.icon, _("Remmina Remote Desktop Client")); gtk_status_icon_set_tooltip_text(remmina_icon.icon, _("Remmina Remote Desktop Client")); g_signal_connect(G_OBJECT(remmina_icon.icon), "popup-menu", G_CALLBACK(remmina_icon_on_popup_menu), NULL); g_signal_connect(G_OBJECT(remmina_icon.icon), "activate", G_CALLBACK(remmina_icon_on_activate), NULL); #endif remmina_widget_pool_hold(TRUE); } else if (remmina_icon.icon) { #ifdef HAVE_LIBAPPINDICATOR app_indicator_set_status (remmina_icon.icon, remmina_pref.disable_tray_icon ? APP_INDICATOR_STATUS_PASSIVE : APP_INDICATOR_STATUS_ACTIVE); #else gtk_status_icon_set_visible(remmina_icon.icon, !remmina_pref.disable_tray_icon); #endif remmina_widget_pool_hold(!remmina_pref.disable_tray_icon); } if (!remmina_icon.avahi) { remmina_icon.avahi = remmina_avahi_new(); } if (remmina_icon.avahi) { if (remmina_pref.applet_enable_avahi) { if (!remmina_icon.avahi->started) remmina_avahi_start(remmina_icon.avahi); } else { remmina_avahi_stop(remmina_icon.avahi); } } if (!remmina_icon.autostart_file) { remmina_icon.autostart_file = g_strdup_printf("%s/.config/autostart/remmina-applet.desktop", g_get_home_dir()); remmina_icon_create_autostart_file(); } } gboolean remmina_icon_is_autostart(void) { GKeyFile *gkeyfile; gboolean b; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_icon.autostart_file, G_KEY_FILE_NONE, NULL); b = !g_key_file_get_boolean(gkeyfile, "Desktop Entry", "Hidden", NULL); g_key_file_free(gkeyfile); return b; } void remmina_icon_set_autostart(gboolean autostart) { GKeyFile *gkeyfile; gboolean b; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_icon.autostart_file, G_KEY_FILE_NONE, NULL); b = !g_key_file_get_boolean(gkeyfile, "Desktop Entry", "Hidden", NULL); if (b != autostart) { g_key_file_set_boolean(gkeyfile, "Desktop Entry", "Hidden", !autostart); /* Refresh it in case translation is updated */ g_key_file_set_string(gkeyfile, "Desktop Entry", "Name", _("Remmina Applet")); g_key_file_set_string(gkeyfile, "Desktop Entry", "Comment", _("Connect to remote desktops through the applet menu")); remmina_icon_save_autostart_file(gkeyfile); } g_key_file_free(gkeyfile); } FreeRDP-Remmina-356c033/remmina/src/remmina_icon.h000066400000000000000000000020731171526373700216450ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAICON_H__ #define __REMMINAICON_H__ G_BEGIN_DECLS void remmina_icon_init(void); gboolean remmina_icon_is_autostart(void); void remmina_icon_set_autostart(gboolean autostart); void remmina_icon_populate_menu(void); G_END_DECLS #endif /* __REMMINAICON_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_init_dialog.c000066400000000000000000000435371171526373700232040ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_widget_pool.h" #include "remmina_init_dialog.h" G_DEFINE_TYPE( RemminaInitDialog, remmina_init_dialog, GTK_TYPE_DIALOG) static void remmina_init_dialog_class_init(RemminaInitDialogClass *klass) { } static void remmina_init_dialog_destroy(RemminaInitDialog *dialog, gpointer data) { g_free(dialog->title); g_free(dialog->status); g_free(dialog->username); g_free(dialog->domain); g_free(dialog->password); g_free(dialog->cacert); g_free(dialog->cacrl); g_free(dialog->clientcert); g_free(dialog->clientkey); } static void remmina_init_dialog_init(RemminaInitDialog *dialog) { GtkWidget *hbox; GtkWidget *widget; dialog->image = NULL; dialog->content_vbox = NULL; dialog->status_label = NULL; dialog->mode = REMMINA_INIT_MODE_CONNECTING; dialog->title = NULL; dialog->status = NULL; dialog->username = NULL; dialog->domain = NULL; dialog->password = NULL; dialog->save_password = FALSE; dialog->cacert = NULL; dialog->cacrl = NULL; dialog->clientcert = NULL; dialog->clientkey = NULL; gtk_dialog_add_buttons(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL); gtk_dialog_set_alternative_button_order(GTK_DIALOG(dialog), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_OK); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ALWAYS); gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); /**** Create the dialog content from here ****/ /* Create top-level hbox */ hbox = gtk_hbox_new(FALSE, 4); gtk_widget_show(hbox); gtk_container_set_border_width(GTK_CONTAINER(hbox), 15); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), hbox, TRUE, TRUE, 0); /* Icon */ widget = gtk_image_new_from_stock(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 4); dialog->image = widget; /* Create vbox for other dialog content */ widget = gtk_vbox_new(FALSE, 4); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 4); dialog->content_vbox = widget; /* Entries */ widget = gtk_label_new(dialog->title); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(dialog->content_vbox), widget, TRUE, TRUE, 4); dialog->status_label = widget; g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(remmina_init_dialog_destroy), NULL); remmina_widget_pool_register(GTK_WIDGET(dialog)); } static void remmina_init_dialog_connecting(RemminaInitDialog *dialog) { gtk_label_set_text(GTK_LABEL(dialog->status_label), (dialog->status ? dialog->status : dialog->title)); gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, FALSE); dialog->mode = REMMINA_INIT_MODE_CONNECTING; } GtkWidget* remmina_init_dialog_new(const gchar *title_format, ...) { RemminaInitDialog *dialog; va_list args; dialog = REMMINA_INIT_DIALOG (g_object_new (REMMINA_TYPE_INIT_DIALOG, NULL)); va_start (args, title_format); dialog->title = g_strdup_vprintf (title_format, args); va_end (args); gtk_window_set_title (GTK_WINDOW(dialog), dialog->title); remmina_init_dialog_connecting (dialog); return GTK_WIDGET (dialog); } void remmina_init_dialog_set_status(RemminaInitDialog *dialog, const gchar *status_format, ...) { va_list args; if (status_format) { if (dialog->status) g_free(dialog->status); va_start(args, status_format); dialog->status = g_strdup_vprintf(status_format, args); va_end(args); gtk_label_set_text(GTK_LABEL(dialog->status_label), dialog->status); } } void remmina_init_dialog_set_status_temp(RemminaInitDialog *dialog, const gchar *status_format, ...) { gchar* s; va_list args; if (status_format) { va_start(args, status_format); s = g_strdup_vprintf(status_format, args); va_end(args); gtk_label_set_text(GTK_LABEL (dialog->status_label), s); g_free(s); } } gint remmina_init_dialog_authpwd(RemminaInitDialog *dialog, const gchar *label, gboolean allow_save) { GtkWidget *table; GtkWidget *password_entry; GtkWidget *save_password_check; GtkWidget *widget; gint ret; gchar *s; gtk_label_set_text(GTK_LABEL(dialog->status_label), (dialog->status ? dialog->status : dialog->title)); /* Create table */ table = gtk_table_new(2, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 8); gtk_table_set_col_spacings(GTK_TABLE(table), 8); /* Icon */ gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); /* Entries */ widget = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); password_entry = gtk_entry_new(); gtk_widget_show(password_entry); gtk_table_attach_defaults(GTK_TABLE(table), password_entry, 1, 2, 0, 1); gtk_entry_set_max_length(GTK_ENTRY(password_entry), 100); gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); gtk_entry_set_activates_default(GTK_ENTRY(password_entry), TRUE); s = g_strdup_printf(_("Save %s"), label); save_password_check = gtk_check_button_new_with_label(s); g_free(s); gtk_widget_show(save_password_check); gtk_table_attach_defaults(GTK_TABLE(table), save_password_check, 0, 2, 1, 2); if (allow_save) { if (dialog->save_password) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(save_password_check), TRUE); } else { gtk_widget_set_sensitive(save_password_check, FALSE); } /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), table, TRUE, TRUE, 4); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, TRUE); gtk_widget_grab_focus(password_entry); dialog->mode = REMMINA_INIT_MODE_AUTHPWD; /* Now run it */ ret = gtk_dialog_run(GTK_DIALOG(dialog)); if (ret == GTK_RESPONSE_OK) { dialog->password = g_strdup(gtk_entry_get_text(GTK_ENTRY(password_entry))); dialog->save_password = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(save_password_check)); } gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), table); remmina_init_dialog_connecting(dialog); return ret; } gint remmina_init_dialog_authuserpwd(RemminaInitDialog *dialog, gboolean want_domain, const gchar *default_username, const gchar *default_domain, gboolean allow_save) { GtkWidget *table; GtkWidget *username_entry; GtkWidget *password_entry; GtkWidget *domain_entry = NULL; GtkWidget *save_password_check; GtkWidget *widget; gint ret; gtk_label_set_text(GTK_LABEL(dialog->status_label), (dialog->status ? dialog->status : dialog->title)); /* Create table */ table = gtk_table_new(4, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 8); gtk_table_set_col_spacings(GTK_TABLE(table), 8); /* Icon */ gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); /* Entries */ widget = gtk_label_new(_("User name")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); username_entry = gtk_entry_new(); gtk_widget_show(username_entry); gtk_table_attach_defaults(GTK_TABLE(table), username_entry, 1, 2, 0, 1); gtk_entry_set_max_length(GTK_ENTRY(username_entry), 100); if (default_username && default_username[0] != '\0') { gtk_entry_set_text(GTK_ENTRY(username_entry), default_username); } widget = gtk_label_new(_("Password")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); password_entry = gtk_entry_new(); gtk_widget_show(password_entry); gtk_table_attach_defaults(GTK_TABLE(table), password_entry, 1, 2, 1, 2); gtk_entry_set_max_length(GTK_ENTRY(password_entry), 100); gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE); gtk_entry_set_activates_default(GTK_ENTRY(password_entry), TRUE); save_password_check = gtk_check_button_new_with_label(_("Save password")); gtk_widget_show(save_password_check); gtk_table_attach_defaults(GTK_TABLE(table), save_password_check, 0, 2, 2, 3); if (allow_save) { if (dialog->save_password) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(save_password_check), TRUE); } else { gtk_widget_set_sensitive(save_password_check, FALSE); } if (want_domain) { widget = gtk_label_new(_("Domain")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); domain_entry = gtk_entry_new(); gtk_widget_show(domain_entry); gtk_table_attach_defaults(GTK_TABLE(table), domain_entry, 1, 2, 3, 4); gtk_entry_set_max_length(GTK_ENTRY(domain_entry), 100); if (default_domain && default_domain[0] != '\0') { gtk_entry_set_text(GTK_ENTRY(domain_entry), default_domain); } } /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), table, TRUE, TRUE, 4); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, TRUE); if (default_username && default_username[0] != '\0') { gtk_widget_grab_focus(password_entry); } else { gtk_widget_grab_focus(username_entry); } dialog->mode = REMMINA_INIT_MODE_AUTHUSERPWD; /* Now run it */ ret = gtk_dialog_run(GTK_DIALOG(dialog)); if (ret == GTK_RESPONSE_OK) { dialog->username = g_strdup(gtk_entry_get_text(GTK_ENTRY(username_entry))); dialog->password = g_strdup(gtk_entry_get_text(GTK_ENTRY(password_entry))); dialog->save_password = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(save_password_check)); if (want_domain) dialog->domain = g_strdup(gtk_entry_get_text(GTK_ENTRY(domain_entry))); } gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), table); remmina_init_dialog_connecting(dialog); return ret; } gint remmina_init_dialog_certificate(RemminaInitDialog* dialog, const gchar* subject, const gchar* issuer, const gchar* fingerprint) { gint status; GtkWidget* table; GtkWidget* widget; gtk_label_set_text(GTK_LABEL(dialog->status_label), "Certificate Details:"); /* Create table */ table = gtk_table_new(5, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 8); gtk_table_set_col_spacings(GTK_TABLE(table), 8); /* Icon */ gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); /* Entries */ widget = gtk_label_new(_("Subject:")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); widget = gtk_label_new(subject); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 0, 1, GTK_FILL, 0, 0, 0); widget = gtk_label_new(_("Issuer:")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); widget = gtk_label_new(issuer); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 1, 2, GTK_FILL, 0, 0, 0); widget = gtk_label_new(_("Fingerprint:")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); widget = gtk_label_new(fingerprint); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 1, 2, 2, 3, GTK_FILL, 0, 0, 0); widget = gtk_label_new(_("Accept Certificate?")); gtk_misc_set_alignment(GTK_MISC(widget), 1.0, 0.5); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(table), widget, 0, 2, 3, 4, GTK_FILL, 0, 0, 0); /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), table, TRUE, TRUE, 4); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, TRUE); dialog->mode = REMMINA_INIT_MODE_CERTIFICATE; /* Now run it */ status = gtk_dialog_run(GTK_DIALOG(dialog)); if (status == GTK_RESPONSE_OK) { } gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), table); return status; } static GtkWidget* remmina_init_dialog_create_file_button(GtkTable *table, const gchar *label, gint row, const gchar *filename) { GtkWidget *widget; gchar *pkidir; widget = gtk_label_new(label); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_table_attach(table, widget, 0, 1, row, row + 1, GTK_FILL, 0, 0, 0); widget = gtk_file_chooser_button_new(label, GTK_FILE_CHOOSER_ACTION_OPEN); gtk_file_chooser_button_set_width_chars(GTK_FILE_CHOOSER_BUTTON(widget), 25); gtk_widget_show(widget); gtk_table_attach_defaults(table, widget, 1, 2, row, row + 1); if (filename && filename[0] != '\0') { gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(widget), filename); } else { pkidir = g_strdup_printf("%s/.pki", g_get_home_dir()); if (g_file_test(pkidir, G_FILE_TEST_IS_DIR)) { gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widget), pkidir); } g_free(pkidir); } return widget; } gint remmina_init_dialog_authx509(RemminaInitDialog *dialog, const gchar *cacert, const gchar *cacrl, const gchar *clientcert, const gchar *clientkey) { GtkWidget *table; GtkWidget *cacert_button; GtkWidget *cacrl_button; GtkWidget *clientcert_button; GtkWidget *clientkey_button; gint ret; gtk_label_set_text(GTK_LABEL(dialog->status_label), (dialog->status ? dialog->status : dialog->title)); /* Create table */ table = gtk_table_new(4, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 8); gtk_table_set_col_spacings(GTK_TABLE(table), 8); /* Icon */ gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_AUTHENTICATION, GTK_ICON_SIZE_DIALOG); /* Buttons for choosing the certificates */ cacert_button = remmina_init_dialog_create_file_button(GTK_TABLE(table), _("CA certificate"), 0, cacert); cacrl_button = remmina_init_dialog_create_file_button(GTK_TABLE(table), _("CA CRL"), 1, cacrl); clientcert_button = remmina_init_dialog_create_file_button(GTK_TABLE(table), _("Client certificate"), 2, clientcert); clientkey_button = remmina_init_dialog_create_file_button(GTK_TABLE(table), _("Client key"), 3, clientkey); /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), table, TRUE, TRUE, 4); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, TRUE); dialog->mode = REMMINA_INIT_MODE_AUTHX509; /* Now run it */ ret = gtk_dialog_run(GTK_DIALOG(dialog)); if (ret == GTK_RESPONSE_OK) { dialog->cacert = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(cacert_button)); dialog->cacrl = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(cacrl_button)); dialog->clientcert = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(clientcert_button)); dialog->clientkey = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(clientkey_button)); } gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), table); remmina_init_dialog_connecting(dialog); return ret; } static gint remmina_init_dialog_serverkey_confirm(RemminaInitDialog *dialog, const gchar *serverkey, const gchar *prompt) { GtkWidget *vbox; GtkWidget *widget; gint ret; gtk_label_set_text(GTK_LABEL(dialog->status_label), (dialog->status ? dialog->status : dialog->title)); /* Create vbox */ vbox = gtk_vbox_new(FALSE, 4); gtk_widget_show(vbox); /* Icon */ gtk_image_set_from_stock(GTK_IMAGE(dialog->image), GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG); /* Entries */ widget = gtk_label_new(prompt); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 4); widget = gtk_label_new(serverkey); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 4); widget = gtk_label_new(_("Do you trust the new public key?")); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 4); /* Pack it into the dialog */ gtk_box_pack_start(GTK_BOX(dialog->content_vbox), vbox, TRUE, TRUE, 4); gtk_dialog_set_response_sensitive(GTK_DIALOG(dialog), GTK_RESPONSE_OK, TRUE); dialog->mode = REMMINA_INIT_MODE_SERVERKEY_CONFIRM; /* Now run it */ ret = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_container_remove(GTK_CONTAINER(dialog->content_vbox), vbox); remmina_init_dialog_connecting(dialog); return ret; } gint remmina_init_dialog_serverkey_unknown(RemminaInitDialog *dialog, const gchar *serverkey) { return remmina_init_dialog_serverkey_confirm(dialog, serverkey, _("The server is unknown. The public key fingerprint is:")); } gint remmina_init_dialog_serverkey_changed(RemminaInitDialog *dialog, const gchar *serverkey) { return remmina_init_dialog_serverkey_confirm(dialog, serverkey, _("WARNING: The server has changed its public key. This means either you are under attack,\n" "or the administrator has changed the key. The new public key fingerprint is:")); } FreeRDP-Remmina-356c033/remmina/src/remmina_init_dialog.h000066400000000000000000000065561171526373700232110ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAINITDIALG_H__ #define __REMMINAINITDIALG_H__ G_BEGIN_DECLS #define REMMINA_TYPE_INIT_DIALOG (remmina_init_dialog_get_type ()) #define REMMINA_INIT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_INIT_DIALOG, RemminaInitDialog)) #define REMMINA_INIT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_INIT_DIALOG, RemminaInitDialogClass)) #define REMMINA_IS_INIT_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_INIT_DIALOG)) #define REMMINA_IS_INIT_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_INIT_DIALOG)) #define REMMINA_INIT_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_INIT_DIALOG, RemminaInitDialogClass)) enum { REMMINA_INIT_MODE_CONNECTING, REMMINA_INIT_MODE_AUTHPWD, REMMINA_INIT_MODE_AUTHUSERPWD, REMMINA_INIT_MODE_AUTHX509, REMMINA_INIT_MODE_SERVERKEY_CONFIRM, REMMINA_INIT_MODE_CERTIFICATE }; typedef struct _RemminaInitDialog { GtkDialog dialog; GtkWidget *image; GtkWidget *content_vbox; GtkWidget *status_label; gint mode; gchar *title; gchar *status; gchar *username; gchar *domain; gchar *password; gboolean save_password; gchar *cacert; gchar *cacrl; gchar *clientcert; gchar *clientkey; } RemminaInitDialog; typedef struct _RemminaInitDialogClass { GtkDialogClass parent_class; } RemminaInitDialogClass; GType remmina_init_dialog_get_type(void) G_GNUC_CONST; GtkWidget* remmina_init_dialog_new(const gchar *title_format, ...); void remmina_init_dialog_set_status(RemminaInitDialog *dialog, const gchar *status_format, ...); void remmina_init_dialog_set_status_temp(RemminaInitDialog *dialog, const gchar *status_format, ...); /* Run authentication. Return GTK_RESPONSE_OK or GTK_RESPONSE_CANCEL. Caller is blocked. */ gint remmina_init_dialog_authpwd(RemminaInitDialog *dialog, const gchar *label, gboolean allow_save); gint remmina_init_dialog_authuserpwd(RemminaInitDialog *dialog, gboolean want_domain, const gchar *default_username, const gchar *default_domain, gboolean allow_save); gint remmina_init_dialog_certificate(RemminaInitDialog* dialog, const gchar* subject, const gchar* issuer, const gchar* fingerprint); gint remmina_init_dialog_authx509(RemminaInitDialog *dialog, const gchar *cacert, const gchar *cacrl, const gchar *clientcert, const gchar *clientkey); gint remmina_init_dialog_serverkey_unknown(RemminaInitDialog *dialog, const gchar *serverkey); gint remmina_init_dialog_serverkey_changed(RemminaInitDialog *dialog, const gchar *serverkey); G_END_DECLS #endif /* __REMMINAINITDIALG_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_key_chooser.c000066400000000000000000000063661171526373700232330ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_key_chooser.h" G_DEFINE_TYPE( RemminaKeyChooser, remmina_key_chooser, GTK_TYPE_BUTTON) static void remmina_key_chooser_class_init(RemminaKeyChooserClass *klass) { } static void remmina_key_chooser_update_label(RemminaKeyChooser *kc) { gchar *s; if (kc->keyval) { s = gdk_keyval_name(gdk_keyval_to_upper(kc->keyval)); } else { s = _(""); } gtk_button_set_label(GTK_BUTTON(kc), s); } void remmina_key_chooser_set_keyval(RemminaKeyChooser *kc, guint keyval) { kc->keyval = keyval; remmina_key_chooser_update_label(kc); } static gboolean remmina_key_chooser_dialog_on_key_press(GtkWidget *widget, GdkEventKey *event, RemminaKeyChooser *kc) { remmina_key_chooser_set_keyval(kc, gdk_keyval_to_lower(event->keyval)); gtk_dialog_response(GTK_DIALOG(gtk_widget_get_toplevel(widget)), GTK_RESPONSE_OK); return TRUE; } static void remmina_key_chooser_on_clicked(RemminaKeyChooser *kc, gpointer data) { GtkWidget *dialog; GtkWidget *eventbox; GtkWidget *widget; gint ret; dialog = gtk_dialog_new_with_buttons(_("Choose a new key"), GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(kc))), GTK_DIALOG_MODAL, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_REMOVE, GTK_RESPONSE_REJECT, NULL); eventbox = gtk_event_box_new(); gtk_widget_show(eventbox); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), eventbox, TRUE, TRUE, 0); gtk_widget_add_events(eventbox, GDK_KEY_PRESS_MASK); g_signal_connect(G_OBJECT(eventbox), "key-press-event", G_CALLBACK(remmina_key_chooser_dialog_on_key_press), kc); gtk_widget_set_can_focus(eventbox, TRUE); widget = gtk_label_new(_("Please press the new key...")); gtk_misc_set_alignment(GTK_MISC(widget), 0.5, 0.5); gtk_widget_set_size_request(widget, 250, 150); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(eventbox), widget); gtk_widget_grab_focus(eventbox); ret = gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); if (ret == GTK_RESPONSE_REJECT) { remmina_key_chooser_set_keyval(kc, 0); } } static void remmina_key_chooser_init(RemminaKeyChooser *kc) { remmina_key_chooser_set_keyval(kc, 0); g_signal_connect(G_OBJECT(kc), "clicked", G_CALLBACK(remmina_key_chooser_on_clicked), NULL); } GtkWidget* remmina_key_chooser_new(guint keyval) { RemminaKeyChooser *kc; kc = REMMINA_KEY_CHOOSER(g_object_new(REMMINA_TYPE_KEY_CHOOSER, NULL)); remmina_key_chooser_set_keyval(kc, keyval); return GTK_WIDGET(kc); } FreeRDP-Remmina-356c033/remmina/src/remmina_key_chooser.h000066400000000000000000000037241171526373700232330ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAKEYCHOOSER_H__ #define __REMMINAKEYCHOOSER_H__ G_BEGIN_DECLS #define REMMINA_TYPE_KEY_CHOOSER (remmina_key_chooser_get_type ()) #define REMMINA_KEY_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_KEY_CHOOSER, RemminaKeyChooser)) #define REMMINA_KEY_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_KEY_CHOOSER, RemminaKeyChooserClass)) #define REMMINA_IS_KEY_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_KEY_CHOOSER)) #define REMMINA_IS_KEY_CHOOSER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_KEY_CHOOSER)) #define REMMINA_KEY_CHOOSER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_KEY_CHOOSER, RemminaKeyChooserClass)) typedef struct _RemminaKeyChooser { GtkButton button; guint keyval; } RemminaKeyChooser; typedef struct _RemminaKeyChooserClass { GtkButtonClass parent_class; } RemminaKeyChooserClass; GType remmina_key_chooser_get_type(void) G_GNUC_CONST; GtkWidget* remmina_key_chooser_new(guint keyval); void remmina_key_chooser_set_keyval(RemminaKeyChooser *kc, guint keyval); G_END_DECLS #endif /* __REMMINAKEYCHOOSER_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_log.c000066400000000000000000000107501171526373700214720ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_public.h" #include "remmina_log.h" /***** Define the log window GUI *****/ #define REMMINA_TYPE_LOG_WINDOW (remmina_log_window_get_type ()) #define REMMINA_LOG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindow)) #define REMMINA_LOG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindowClass)) #define REMMINA_IS_LOG_WINDOW(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_LOG_WINDOW)) #define REMMINA_IS_LOG_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_LOG_WINDOW)) #define REMMINA_LOG_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_LOG_WINDOW, RemminaLogWindowClass)) typedef struct _RemminaLogWindow { GtkWindow window; GtkWidget *log_view; GtkTextBuffer *log_buffer; } RemminaLogWindow; typedef struct _RemminaLogWindowClass { GtkWindowClass parent_class; } RemminaLogWindowClass; GType remmina_log_window_get_type(void) G_GNUC_CONST; G_DEFINE_TYPE(RemminaLogWindow, remmina_log_window, GTK_TYPE_WINDOW) static void remmina_log_window_class_init(RemminaLogWindowClass *klass) { } static void remmina_log_window_init(RemminaLogWindow *logwin) { GtkWidget *scrolledwindow; GtkWidget *widget; gtk_container_set_border_width(GTK_CONTAINER(logwin), 4); scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); gtk_container_add(GTK_CONTAINER(logwin), scrolledwindow); widget = gtk_text_view_new(); gtk_widget_show(widget); gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(widget), GTK_WRAP_WORD_CHAR); gtk_text_view_set_editable(GTK_TEXT_VIEW(widget), FALSE); gtk_container_add(GTK_CONTAINER(scrolledwindow), widget); logwin->log_view = widget; logwin->log_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(widget)); } static GtkWidget* remmina_log_window_new(void) { return GTK_WIDGET(g_object_new(REMMINA_TYPE_LOG_WINDOW, NULL)); } /* We will always only have one log window per instance */ static GtkWidget *log_window = NULL; static void remmina_log_end(GtkWidget *widget, gpointer data) { log_window = NULL; } void remmina_log_start(void) { if (log_window) { gtk_window_present(GTK_WINDOW(log_window)); } else { log_window = remmina_log_window_new(); gtk_window_set_default_size(GTK_WINDOW(log_window), 640, 480); g_signal_connect(G_OBJECT(log_window), "destroy", G_CALLBACK(remmina_log_end), NULL); gtk_widget_show(log_window); } } gboolean remmina_log_running(void) { return (log_window != NULL); } static gboolean remmina_log_scroll_to_end(gpointer data) { GtkTextIter iter; if (log_window) { gtk_text_buffer_get_end_iter(REMMINA_LOG_WINDOW (log_window)->log_buffer, &iter); gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(REMMINA_LOG_WINDOW (log_window)->log_view), &iter, 0.0, FALSE, 0.0, 0.0); } return FALSE; } static gboolean remmina_log_print_real(gpointer data) { GtkTextIter iter; if (log_window) { gtk_text_buffer_get_end_iter(REMMINA_LOG_WINDOW (log_window)->log_buffer, &iter); gtk_text_buffer_insert(REMMINA_LOG_WINDOW (log_window)->log_buffer, &iter, (const gchar*) data, -1); IDLE_ADD(remmina_log_scroll_to_end, NULL); } g_free(data); return FALSE; } void remmina_log_print(const gchar *text) { if (!log_window) return; IDLE_ADD(remmina_log_print_real, g_strdup(text)); } void remmina_log_printf(const gchar *fmt, ...) { va_list args; gchar *text; if (!log_window) return; va_start (args, fmt); text = g_strdup_vprintf (fmt, args); va_end (args); IDLE_ADD (remmina_log_print_real, text); } FreeRDP-Remmina-356c033/remmina/src/remmina_log.h000066400000000000000000000020611171526373700214730ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINALOG_H__ #define __REMMINALOG_H__ G_BEGIN_DECLS void remmina_log_start(void); gboolean remmina_log_running(void); void remmina_log_print(const gchar *text); void remmina_log_printf(const gchar *fmt, ...); G_END_DECLS #endif /* __REMMINALOG_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_main.c000066400000000000000000001177561171526373700216530ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include "remmina_string_array.h" #include "remmina_public.h" #include "remmina_file.h" #include "remmina_file_manager.h" #include "remmina_file_editor.h" #include "remmina_connection_window.h" #include "remmina_about.h" #include "remmina_pref.h" #include "remmina_pref_dialog.h" #include "remmina_widget_pool.h" #include "remmina_plugin_manager.h" #include "remmina_log.h" #include "remmina_icon.h" #include "remmina_main.h" G_DEFINE_TYPE( RemminaMain, remmina_main, GTK_TYPE_WINDOW) struct _RemminaMainPriv { GtkWidget *file_list; GtkTreeModel *file_model; GtkTreeModel *file_model_filter; GtkTreeModel *file_model_sort; GtkUIManager *uimanager; GtkWidget *toolbar; GtkWidget *statusbar; GtkToolItem *quick_search_separator; GtkToolItem *quick_search_item; GtkWidget *quick_search_entry; GtkTreeViewColumn *group_column; GtkActionGroup *main_group; GtkActionGroup *file_sensitive_group; gboolean initialized; gchar *selected_filename; gchar *selected_name; RemminaStringArray *expanded_group; }; static void remmina_main_class_init(RemminaMainClass *klass) { } enum { PROTOCOL_COLUMN, NAME_COLUMN, GROUP_COLUMN, SERVER_COLUMN, FILENAME_COLUMN, N_COLUMNS }; static GtkTargetEntry remmina_drop_types[] = { { "text/uri-list", 0, 1 } }; static void remmina_main_save_size(RemminaMain *remminamain) { if ((gdk_window_get_state(gtk_widget_get_window(GTK_WIDGET(remminamain))) & GDK_WINDOW_STATE_MAXIMIZED) == 0) { gtk_window_get_size(GTK_WINDOW(remminamain), &remmina_pref.main_width, &remmina_pref.main_height); remmina_pref.main_maximize = FALSE; } else { remmina_pref.main_maximize = TRUE; } } static void remmina_main_save_expanded_group_func(GtkTreeView *tree_view, GtkTreePath *path, RemminaMain *remminamain) { GtkTreeIter iter; gchar *group; gtk_tree_model_get_iter(remminamain->priv->file_model_sort, &iter, path); gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, GROUP_COLUMN, &group, -1); if (group) { remmina_string_array_add(remminamain->priv->expanded_group, group); g_free(group); } } static void remmina_main_save_expanded_group(RemminaMain *remminamain) { if (GTK_IS_TREE_STORE(remminamain->priv->file_model)) { if (remminamain->priv->expanded_group) { remmina_string_array_free(remminamain->priv->expanded_group); } remminamain->priv->expanded_group = remmina_string_array_new(); gtk_tree_view_map_expanded_rows(GTK_TREE_VIEW(remminamain->priv->file_list), (GtkTreeViewMappingFunc) remmina_main_save_expanded_group_func, remminamain); } } static gboolean remmina_main_on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { RemminaMain *remminamain; remminamain = REMMINA_MAIN(widget); remmina_main_save_size(remminamain); remmina_main_save_expanded_group(remminamain); g_free(remmina_pref.expanded_group); remmina_pref.expanded_group = remmina_string_array_to_string(remminamain->priv->expanded_group); remmina_string_array_free(remminamain->priv->expanded_group); remminamain->priv->expanded_group = NULL; remmina_pref_save(); return FALSE; } static void remmina_main_destroy(GtkWidget *widget, gpointer data) { g_free(REMMINA_MAIN(widget)->priv->selected_filename); g_free(REMMINA_MAIN(widget)->priv->selected_name); g_free(REMMINA_MAIN(widget)->priv); } static void remmina_main_clear_selection_data(RemminaMain *remminamain) { g_free(remminamain->priv->selected_filename); g_free(remminamain->priv->selected_name); remminamain->priv->selected_filename = NULL; remminamain->priv->selected_name = NULL; gtk_action_group_set_sensitive(remminamain->priv->file_sensitive_group, FALSE); } static gboolean remmina_main_selection_func(GtkTreeSelection *selection, GtkTreeModel *model, GtkTreePath *path, gboolean path_currently_selected, gpointer user_data) { RemminaMain *remminamain; guint context_id; GtkTreeIter iter; gchar buf[1000]; remminamain = (RemminaMain*) user_data; if (path_currently_selected) return TRUE; if (!gtk_tree_model_get_iter(model, &iter, path)) return TRUE; remmina_main_clear_selection_data(remminamain); gtk_tree_model_get(model, &iter, NAME_COLUMN, &remminamain->priv->selected_name, FILENAME_COLUMN, &remminamain->priv->selected_filename, -1); context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(remminamain->priv->statusbar), "status"); gtk_statusbar_pop(GTK_STATUSBAR(remminamain->priv->statusbar), context_id); if (remminamain->priv->selected_filename) { gtk_action_group_set_sensitive(remminamain->priv->file_sensitive_group, TRUE); g_snprintf(buf, sizeof(buf), "%s (%s)", remminamain->priv->selected_name, remminamain->priv->selected_filename); gtk_statusbar_push(GTK_STATUSBAR(remminamain->priv->statusbar), context_id, buf); } else { gtk_statusbar_push(GTK_STATUSBAR(remminamain->priv->statusbar), context_id, remminamain->priv->selected_name); } return TRUE; } static void remmina_main_load_file_list_callback(gpointer data, gpointer user_data) { RemminaMain *remminamain; GtkTreeIter iter; GtkListStore *store; RemminaFile *remminafile; remminafile = (RemminaFile*) data; remminamain = (RemminaMain*) user_data; store = GTK_LIST_STORE(remminamain->priv->file_model); gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, PROTOCOL_COLUMN, remmina_file_get_icon_name(remminafile), NAME_COLUMN, remmina_file_get_string(remminafile, "name"), GROUP_COLUMN, remmina_file_get_string(remminafile, "group"), SERVER_COLUMN, remmina_file_get_string(remminafile, "server"), FILENAME_COLUMN, remmina_file_get_filename(remminafile), -1); } static gboolean remmina_main_load_file_tree_traverse(GNode *node, GtkTreeStore *store, GtkTreeIter *parent) { GtkTreeIter *iter; RemminaGroupData *data; GNode *child; iter = NULL; if (node->data) { data = (RemminaGroupData*) node->data; iter = g_new0(GtkTreeIter, 1); gtk_tree_store_append(store, iter, parent); gtk_tree_store_set(store, iter, PROTOCOL_COLUMN, GTK_STOCK_DIRECTORY, NAME_COLUMN, data->name, GROUP_COLUMN, data->group, FILENAME_COLUMN, NULL, -1); } for (child = g_node_first_child(node); child; child = g_node_next_sibling(child)) { remmina_main_load_file_tree_traverse(child, store, iter); } g_free(iter); return FALSE; } static void remmina_main_load_file_tree_group(GtkTreeStore *store) { GNode *root; root = remmina_file_manager_get_group_tree(); remmina_main_load_file_tree_traverse(root, store, NULL); remmina_file_manager_free_group_tree(root); } static void remmina_main_expand_group_traverse(RemminaMain *remminamain, GtkTreeIter *iter) { GtkTreeModel *tree; gboolean ret; gchar *group, *filename; GtkTreeIter child; GtkTreePath *path; tree = remminamain->priv->file_model_sort; ret = TRUE; while (ret) { gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1); if (filename == NULL) { if (remmina_string_array_find(remminamain->priv->expanded_group, group) >= 0) { path = gtk_tree_model_get_path(tree, iter); gtk_tree_view_expand_row(GTK_TREE_VIEW(remminamain->priv->file_list), path, FALSE); gtk_tree_path_free(path); } if (gtk_tree_model_iter_children(tree, &child, iter)) { remmina_main_expand_group_traverse(remminamain, &child); } } g_free(group); g_free(filename); ret = gtk_tree_model_iter_next(tree, iter); } } static void remmina_main_expand_group(RemminaMain *remminamain) { GtkTreeIter iter; if (gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter)) { remmina_main_expand_group_traverse(remminamain, &iter); } } static gboolean remmina_main_load_file_tree_find(GtkTreeModel *tree, GtkTreeIter *iter, const gchar *match_group) { gboolean ret, match; gchar *group, *filename; GtkTreeIter child; match = FALSE; ret = TRUE; while (ret) { gtk_tree_model_get(tree, iter, GROUP_COLUMN, &group, FILENAME_COLUMN, &filename, -1); match = (filename == NULL && g_strcmp0(group, match_group) == 0); g_free(group); g_free(filename); if (match) break; if (gtk_tree_model_iter_children(tree, &child, iter)) { match = remmina_main_load_file_tree_find(tree, &child, match_group); if (match) { memcpy(iter, &child, sizeof(GtkTreeIter)); break; } } ret = gtk_tree_model_iter_next(tree, iter); } return match; } static void remmina_main_load_file_tree_callback(gpointer data, gpointer user_data) { RemminaMain *remminamain; GtkTreeIter iter, child; GtkTreeStore *store; RemminaFile *remminafile; gboolean found; remminafile = (RemminaFile*) data; remminamain = (RemminaMain*) user_data; store = GTK_TREE_STORE(remminamain->priv->file_model); found = FALSE; if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter)) { found = remmina_main_load_file_tree_find(GTK_TREE_MODEL(store), &iter, remmina_file_get_string(remminafile, "group")); } gtk_tree_store_append(store, &child, (found ? &iter : NULL)); gtk_tree_store_set(store, &child, PROTOCOL_COLUMN, remmina_file_get_icon_name(remminafile), NAME_COLUMN, remmina_file_get_string(remminafile, "name"), GROUP_COLUMN, remmina_file_get_string(remminafile, "group"), SERVER_COLUMN, remmina_file_get_string(remminafile, "server"), FILENAME_COLUMN, remmina_file_get_filename(remminafile), -1); } static void remmina_main_file_model_on_sort(GtkTreeSortable *sortable, RemminaMain *remminamain) { gint columnid; GtkSortType order; gtk_tree_sortable_get_sort_column_id(sortable, &columnid, &order); remmina_pref.main_sort_column_id = columnid; remmina_pref.main_sort_order = order; remmina_pref_save(); } static gboolean remmina_main_filter_visible_func(GtkTreeModel *model, GtkTreeIter *iter, RemminaMain *remminamain) { gchar *text; gchar *protocol, *name, *group, *server, *s; gboolean result = TRUE; if (!remmina_pref.show_quick_search) return TRUE; text = g_ascii_strdown(gtk_entry_get_text(GTK_ENTRY(remminamain->priv->quick_search_entry)), -1); if (text && text[0]) { gtk_tree_model_get(model, iter, PROTOCOL_COLUMN, &protocol, NAME_COLUMN, &name, GROUP_COLUMN, &group, SERVER_COLUMN, &server, -1); if (g_strcmp0(protocol, GTK_STOCK_DIRECTORY) != 0) { s = g_ascii_strdown(name ? name : "", -1); g_free(name); name = s; s = g_ascii_strdown(group ? group : "", -1); g_free(group); group = s; s = g_ascii_strdown(server ? server : "", -1); g_free(server); server = s; result = (strstr(name, text) || strstr(server, text) || strstr(group, text)); } g_free(protocol); g_free(name); g_free(group); g_free(server); } g_free(text); return result; } static void remmina_main_select_file(RemminaMain *remminamain, const gchar *filename) { GtkTreeIter iter; GtkTreePath *path; gchar *item_filename; gboolean cmp; if (!gtk_tree_model_get_iter_first(remminamain->priv->file_model_sort, &iter)) return; while (1) { gtk_tree_model_get(remminamain->priv->file_model_sort, &iter, FILENAME_COLUMN, &item_filename, -1); cmp = g_strcmp0(item_filename, filename); g_free(item_filename); if (cmp == 0) { gtk_tree_selection_select_iter(gtk_tree_view_get_selection(GTK_TREE_VIEW(remminamain->priv->file_list)), &iter); path = gtk_tree_model_get_path(remminamain->priv->file_model_sort, &iter); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(remminamain->priv->file_list), path, NULL, TRUE, 0.5, 0.0); gtk_tree_path_free(path); return; } if (!gtk_tree_model_iter_next(remminamain->priv->file_model_sort, &iter)) return; } } static void remmina_main_load_files(RemminaMain *remminamain, gboolean refresh) { GtkTreeModel *filter; GtkTreeModel *sort; gint n; gchar buf[200]; guint context_id; if (refresh) { remmina_main_save_expanded_group(remminamain); } switch (remmina_pref.view_file_mode) { case REMMINA_VIEW_FILE_TREE: gtk_tree_view_column_set_visible(remminamain->priv->group_column, FALSE); remminamain->priv->file_model = GTK_TREE_MODEL( gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING)); remmina_main_load_file_tree_group(GTK_TREE_STORE(remminamain->priv->file_model)); n = remmina_file_manager_iterate(remmina_main_load_file_tree_callback, remminamain); break; case REMMINA_VIEW_FILE_LIST: default: gtk_tree_view_column_set_visible(remminamain->priv->group_column, TRUE); remminamain->priv->file_model = GTK_TREE_MODEL( gtk_list_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING)); n = remmina_file_manager_iterate(remmina_main_load_file_list_callback, remminamain); break; } filter = gtk_tree_model_filter_new(remminamain->priv->file_model, NULL); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter), (GtkTreeModelFilterVisibleFunc) remmina_main_filter_visible_func, remminamain, NULL); remminamain->priv->file_model_filter = filter; sort = gtk_tree_model_sort_new_with_model(filter); remminamain->priv->file_model_sort = sort; gtk_tree_view_set_model(GTK_TREE_VIEW(remminamain->priv->file_list), sort); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(sort), remmina_pref.main_sort_column_id, remmina_pref.main_sort_order); g_signal_connect(G_OBJECT(sort), "sort-column-changed", G_CALLBACK(remmina_main_file_model_on_sort), remminamain); remmina_main_expand_group(remminamain); if (remminamain->priv->selected_filename) { remmina_main_select_file(remminamain, remminamain->priv->selected_filename); } g_snprintf(buf, 200, ngettext("Total %i item.", "Total %i items.", n), n); context_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(remminamain->priv->statusbar), "status"); gtk_statusbar_pop(GTK_STATUSBAR(remminamain->priv->statusbar), context_id); gtk_statusbar_push(GTK_STATUSBAR(remminamain->priv->statusbar), context_id, buf); } static void remmina_main_action_connection_connect(GtkAction *action, RemminaMain *remminamain) { remmina_connection_window_open_from_filename(remminamain->priv->selected_filename); } static void remmina_main_file_editor_destroy(GtkWidget *widget, RemminaMain *remminamain) { if (GTK_IS_WIDGET(remminamain)) { remmina_main_load_files(remminamain, TRUE); } } static void remmina_main_action_connection_new(GtkAction *action, RemminaMain *remminamain) { GtkWidget *widget; widget = remmina_file_editor_new(); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain); gtk_widget_show(widget); } static void remmina_main_action_connection_copy(GtkAction *action, RemminaMain *remminamain) { GtkWidget *widget; if (remminamain->priv->selected_filename == NULL) return; widget = remmina_file_editor_new_copy(remminamain->priv->selected_filename); if (widget) { g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain); gtk_widget_show(widget); } } static void remmina_main_action_connection_edit(GtkAction *action, RemminaMain *remminamain) { GtkWidget *widget; if (remminamain->priv->selected_filename == NULL) return; widget = remmina_file_editor_new_from_filename(remminamain->priv->selected_filename); if (widget) { g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_main_file_editor_destroy), remminamain); gtk_widget_show(widget); } } static void remmina_main_action_connection_delete(GtkAction *action, RemminaMain *remminamain) { GtkWidget *dialog; if (remminamain->priv->selected_filename == NULL) return; dialog = gtk_message_dialog_new(GTK_WINDOW(remminamain), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("Are you sure to delete '%s'"), remminamain->priv->selected_name); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { remmina_file_delete(remminamain->priv->selected_filename); remmina_icon_populate_menu(); remmina_main_load_files(remminamain, TRUE); } gtk_widget_destroy(dialog); remmina_main_clear_selection_data(remminamain); } static void remmina_main_action_edit_preferences(GtkAction *action, RemminaMain *remminamain) { GtkWidget *widget; widget = remmina_pref_dialog_new(0); gtk_widget_show(widget); } static void remmina_main_action_connection_close(GtkAction *action, RemminaMain *remminamain) { gtk_widget_destroy(GTK_WIDGET(remminamain)); } static void remmina_main_action_view_toolbar(GtkToggleAction *action, RemminaMain *remminamain) { gboolean toggled; toggled = gtk_toggle_action_get_active(action); if (toggled) { gtk_widget_show(remminamain->priv->toolbar); } else { gtk_widget_hide(remminamain->priv->toolbar); } if (remminamain->priv->initialized) { remmina_pref.hide_toolbar = !toggled; remmina_pref_save(); } } static void remmina_main_action_view_quick_search(GtkToggleAction *action, RemminaMain *remminamain) { gboolean toggled; toggled = gtk_toggle_action_get_active(action); if (toggled) { gtk_entry_set_text(GTK_ENTRY(remminamain->priv->quick_search_entry), ""); gtk_widget_show(GTK_WIDGET(remminamain->priv->quick_search_separator)); gtk_widget_show(GTK_WIDGET(remminamain->priv->quick_search_item)); gtk_widget_grab_focus(remminamain->priv->quick_search_entry); } else { gtk_widget_hide(GTK_WIDGET(remminamain->priv->quick_search_separator)); gtk_widget_hide(GTK_WIDGET(remminamain->priv->quick_search_item)); } if (remminamain->priv->initialized) { remmina_pref.show_quick_search = toggled; remmina_pref_save(); if (!toggled) { gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter)); gtk_tree_view_expand_all(GTK_TREE_VIEW(remminamain->priv->file_list)); } } } static void remmina_main_action_view_statusbar(GtkToggleAction *action, RemminaMain *remminamain) { gboolean toggled; toggled = gtk_toggle_action_get_active(action); if (toggled) { gtk_widget_show(remminamain->priv->statusbar); } else { gtk_widget_hide(remminamain->priv->statusbar); } if (remminamain->priv->initialized) { remmina_pref.hide_statusbar = !toggled; remmina_pref_save(); } } static void remmina_main_action_view_small_toolbutton(GtkToggleAction *action, RemminaMain *remminamain) { gboolean toggled; toggled = gtk_toggle_action_get_active(action); if (toggled) { gtk_toolbar_set_icon_size(GTK_TOOLBAR(remminamain->priv->toolbar), GTK_ICON_SIZE_MENU); } else { gtk_toolbar_unset_icon_size(GTK_TOOLBAR(remminamain->priv->toolbar)); } if (remminamain->priv->initialized) { remmina_pref.small_toolbutton = toggled; remmina_pref_save(); } } static void remmina_main_action_view_file_mode(GtkRadioAction *action, GtkRadioAction *current, RemminaMain *remminamain) { remmina_pref.view_file_mode = gtk_radio_action_get_current_value(action); remmina_pref_save(); remmina_main_load_files(remminamain, TRUE); } static void remmina_main_import_file_list(RemminaMain *remminamain, GSList *files) { GtkWidget *dlg; GSList *element; gchar *path; RemminaFilePlugin *plugin; GString *err; RemminaFile *remminafile = NULL; gboolean imported; err = g_string_new(NULL); imported = FALSE; for (element = files; element; element = element->next) { path = (gchar*) element->data; plugin = remmina_plugin_manager_get_import_file_handler(path); if (plugin && (remminafile = plugin->import_func(path)) != NULL && remmina_file_get_string(remminafile, "name")) { remmina_file_generate_filename(remminafile); remmina_file_save_all(remminafile); imported = TRUE; } else { g_string_append(err, path); g_string_append_c(err, '\n'); } if (remminafile) { remmina_file_free(remminafile); remminafile = NULL; } g_free(path); } g_slist_free(files); if (err->len > 0) { dlg = gtk_message_dialog_new(GTK_WINDOW(remminamain), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Unable to import:\n%s"), err->str); g_signal_connect(G_OBJECT(dlg), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dlg); } g_string_free(err, TRUE); if (imported) { remmina_main_load_files(remminamain, TRUE); } } static void remmina_main_action_tools_import_on_response(GtkDialog *dialog, gint response_id, RemminaMain *remminamain) { GSList *files; if (response_id == GTK_RESPONSE_ACCEPT) { files = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(dialog)); remmina_main_import_file_list(remminamain, files); } gtk_widget_destroy(GTK_WIDGET(dialog)); } static void remmina_main_action_tools_import(GtkAction *action, RemminaMain *remminamain) { GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new(_("Import"), GTK_WINDOW(remminamain), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(dialog), TRUE); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(remmina_main_action_tools_import_on_response), remminamain); gtk_widget_show(dialog); } static void remmina_main_action_tools_export(GtkAction *action, RemminaMain *remminamain) { RemminaFilePlugin *plugin; RemminaFile *remminafile; GtkWidget *dialog; if (remminamain->priv->selected_filename == NULL) return; remminafile = remmina_file_load(remminamain->priv->selected_filename); if (remminafile == NULL) return; plugin = remmina_plugin_manager_get_export_file_handler(remminafile); if (plugin) { dialog = gtk_file_chooser_dialog_new(plugin->export_hints, GTK_WINDOW(remminamain), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { plugin->export_func(remminafile, gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog))); } gtk_widget_destroy(dialog); } else { dialog = gtk_message_dialog_new(GTK_WINDOW(remminamain), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("This protocol does not support exporting.")); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); gtk_widget_show(dialog); } remmina_file_free(remminafile); } static void remmina_main_action_tools_plugins(GtkAction *action, RemminaMain *remminamain) { remmina_plugin_manager_show(GTK_WINDOW(remminamain)); } static void remmina_main_action_tools_addition(GtkAction *action, RemminaMain *remminamain) { RemminaToolPlugin *plugin; plugin = (RemminaToolPlugin *) remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_TOOL, gtk_action_get_name(action)); if (plugin) { plugin->exec_func(); } } static void remmina_main_action_help_homepage(GtkAction *action, RemminaMain *remminamain) { g_app_info_launch_default_for_uri("http://remmina.sourceforge.net", NULL, NULL); } static void remmina_main_action_help_wiki(GtkAction *action, RemminaMain *remminamain) { g_app_info_launch_default_for_uri("http://sourceforge.net/apps/mediawiki/remmina/", NULL, NULL); } static void remmina_main_action_help_debug(GtkAction *action, RemminaMain *remminamain) { remmina_log_start(); } static void remmina_main_action_help_about(GtkAction *action, RemminaMain *remminamain) { remmina_about_open(GTK_WINDOW(remminamain)); } static const gchar *remmina_main_ui_xml = "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " ""; static const GtkActionEntry remmina_main_ui_menu_entries[] = { { "Connection", NULL, N_("_Connection") }, { "Edit", NULL, N_("_Edit") }, { "View", NULL, N_("_View") }, { "Tools", NULL, N_("_Tools") }, { "Help", NULL, N_("_Help") }, { "ConnectionNew", GTK_STOCK_NEW, NULL, "N", N_("Create a new remote desktop file"), G_CALLBACK( remmina_main_action_connection_new) }, { "EditPreferences", GTK_STOCK_PREFERENCES, NULL, "P", N_("Open the preferences dialog"), G_CALLBACK( remmina_main_action_edit_preferences) }, { "ConnectionClose", GTK_STOCK_CLOSE, NULL, "X", NULL, G_CALLBACK(remmina_main_action_connection_close) }, { "ToolsImport", NULL, N_("Import"), NULL, NULL, G_CALLBACK(remmina_main_action_tools_import) }, { "ToolsPlugins", NULL, N_("Plugins"), NULL, NULL, G_CALLBACK(remmina_main_action_tools_plugins) }, { "HelpHomepage", NULL, N_("Homepage"), NULL, NULL, G_CALLBACK(remmina_main_action_help_homepage) }, { "HelpWiki", NULL, N_("Online Wiki"), NULL, NULL, G_CALLBACK(remmina_main_action_help_wiki) }, { "HelpDebug", NULL, N_("Debug Window"), NULL, NULL, G_CALLBACK(remmina_main_action_help_debug) }, { "HelpAbout", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(remmina_main_action_help_about) } }; static const GtkActionEntry remmina_main_ui_file_sensitive_menu_entries[] = { { "ConnectionConnect", GTK_STOCK_CONNECT, NULL, "O", N_("Open the connection to the selected remote desktop file"), G_CALLBACK(remmina_main_action_connection_connect) }, { "ConnectionCopy", GTK_STOCK_COPY, NULL, "C", N_("Create a copy of the selected remote desktop file"), G_CALLBACK( remmina_main_action_connection_copy) }, { "ConnectionEdit", GTK_STOCK_EDIT, NULL, "E", N_("Edit the selected remote desktop file"), G_CALLBACK( remmina_main_action_connection_edit) }, { "ConnectionDelete", GTK_STOCK_DELETE, NULL, "D", N_("Delete the selected remote desktop file"), G_CALLBACK( remmina_main_action_connection_delete) }, { "ToolsExport", NULL, N_("Export"), NULL, NULL, G_CALLBACK(remmina_main_action_tools_export) } }; static const GtkToggleActionEntry remmina_main_ui_toggle_menu_entries[] = { { "ViewToolbar", NULL, N_("Toolbar"), NULL, NULL, G_CALLBACK(remmina_main_action_view_toolbar), TRUE }, { "ViewStatusbar", NULL, N_("Statusbar"), NULL, NULL, G_CALLBACK(remmina_main_action_view_statusbar), TRUE }, { "ViewQuickSearch", NULL, N_("Quick Search"), NULL, NULL, G_CALLBACK(remmina_main_action_view_quick_search), FALSE }, { "ViewSmallToolbutton", NULL, N_("Small Toolbar Buttons"), NULL, NULL, G_CALLBACK(remmina_main_action_view_small_toolbutton), FALSE } }; static const GtkRadioActionEntry remmina_main_ui_view_file_mode_entries[] = { { "ViewFileList", NULL, N_("List View"), NULL, NULL, REMMINA_VIEW_FILE_LIST }, { "ViewFileTree", NULL, N_("Tree View"), NULL, NULL, REMMINA_VIEW_FILE_TREE } }; static gboolean remmina_main_file_list_on_button_press(GtkWidget *widget, GdkEventButton *event, RemminaMain *remminamain) { GtkWidget *popup; if (event->button == 3) { popup = gtk_ui_manager_get_widget(remminamain->priv->uimanager, "/PopupMenu"); if (popup) { gtk_menu_popup(GTK_MENU(popup), NULL, NULL, NULL, NULL, event->button, event->time); } } else if (event->type == GDK_2BUTTON_PRESS && remminamain->priv->selected_filename) { switch (remmina_pref.default_action) { case REMMINA_ACTION_EDIT: remmina_main_action_connection_edit(NULL, remminamain); break; case REMMINA_ACTION_CONNECT: default: remmina_main_action_connection_connect(NULL, remminamain); break; } } return FALSE; } static void remmina_main_quick_search_on_icon_press(GtkEntry *entry, GtkEntryIconPosition icon_pos, GdkEvent *event, RemminaMain *remminamain) { if (icon_pos == GTK_ENTRY_ICON_SECONDARY) { gtk_entry_set_text(entry, ""); } } static void remmina_main_quick_search_on_changed(GtkEditable *editable, RemminaMain *remminamain) { gtk_tree_model_filter_refilter(GTK_TREE_MODEL_FILTER(remminamain->priv->file_model_filter)); gtk_tree_view_expand_all(GTK_TREE_VIEW(remminamain->priv->file_list)); } static void remmina_main_create_quick_search(RemminaMain *remminamain) { GtkWidget *widget; GValue val = { 0 }; remminamain->priv->quick_search_separator = gtk_separator_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(remminamain->priv->toolbar), remminamain->priv->quick_search_separator, -1); remminamain->priv->quick_search_item = gtk_tool_item_new(); gtk_toolbar_insert(GTK_TOOLBAR(remminamain->priv->toolbar), remminamain->priv->quick_search_item, -1); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_entry_set_icon_from_stock(GTK_ENTRY(widget), GTK_ENTRY_ICON_PRIMARY, GTK_STOCK_FIND); gtk_entry_set_icon_from_stock(GTK_ENTRY(widget), GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); gtk_entry_set_width_chars(GTK_ENTRY(widget), 25); gtk_container_add(GTK_CONTAINER(remminamain->priv->quick_search_item), widget); g_value_init(&val, G_TYPE_BOOLEAN); g_value_set_boolean(&val, FALSE); g_object_set_property(G_OBJECT(widget), "primary-icon-activatable", &val); g_value_unset(&val); g_signal_connect(G_OBJECT(widget), "icon-press", G_CALLBACK(remmina_main_quick_search_on_icon_press), remminamain); g_signal_connect(G_OBJECT(widget), "changed", G_CALLBACK(remmina_main_quick_search_on_changed), remminamain); remminamain->priv->quick_search_entry = widget; } static void remmina_main_on_drag_data_received(RemminaMain *remminamain, GdkDragContext *drag_context, gint x, gint y, GtkSelectionData *data, guint info, guint time, gpointer user_data) { gchar **uris; GSList *files = NULL; gint i; uris = g_uri_list_extract_uris((const gchar *) gtk_selection_data_get_data(data)); for (i = 0; uris[i]; i++) { if (strncmp(uris[i], "file://", 7) != 0) continue; files = g_slist_append(files, g_strdup(uris[i] + 7)); } g_strfreev(uris); remmina_main_import_file_list(remminamain, files); } static gboolean remmina_main_add_tool_plugin(gchar *name, RemminaPlugin *plugin, gpointer data) { RemminaMain *remminamain = REMMINA_MAIN(data); guint merge_id; GtkAction *action; merge_id = gtk_ui_manager_new_merge_id(remminamain->priv->uimanager); action = gtk_action_new(name, plugin->description, NULL, NULL); gtk_action_group_add_action(remminamain->priv->main_group, action); g_signal_connect(G_OBJECT(action), "activate", G_CALLBACK(remmina_main_action_tools_addition), remminamain); g_object_unref(action); gtk_ui_manager_add_ui(remminamain->priv->uimanager, merge_id, "/MenuBar/ToolsMenu/ToolsAdditions", name, name, GTK_UI_MANAGER_MENUITEM, FALSE); return FALSE; } static gboolean remmina_main_on_window_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data) { GdkScreen *screen; screen = gdk_screen_get_default(); if (remmina_pref.minimize_to_tray && (event->changed_mask & GDK_WINDOW_STATE_ICONIFIED) != 0 && (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED) != 0 && remmina_public_get_current_workspace(screen) == remmina_public_get_window_workspace(GTK_WINDOW(widget)) && gdk_screen_get_number(screen) == gdk_screen_get_number(gtk_widget_get_screen(widget))) { gtk_widget_hide(widget); return TRUE; } return FALSE; } static void remmina_main_init(RemminaMain *remminamain) { RemminaMainPriv *priv; GtkWidget *vbox; GtkWidget *menubar; GtkUIManager *uimanager; GtkActionGroup *action_group; GtkWidget *scrolledwindow; GtkWidget *tree; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GError *error; priv = g_new0(RemminaMainPriv, 1); remminamain->priv = priv; remminamain->priv->expanded_group = remmina_string_array_new_from_string(remmina_pref.expanded_group); /* Create main window */ g_signal_connect(G_OBJECT(remminamain), "delete-event", G_CALLBACK(remmina_main_on_delete_event), NULL); g_signal_connect(G_OBJECT(remminamain), "destroy", G_CALLBACK(remmina_main_destroy), NULL); g_signal_connect(G_OBJECT(remminamain), "window-state-event", G_CALLBACK(remmina_main_on_window_state_event), NULL); gtk_container_set_border_width(GTK_CONTAINER(remminamain), 0); gtk_window_set_title(GTK_WINDOW(remminamain), _("Remmina Remote Desktop Client")); gtk_window_set_default_size(GTK_WINDOW(remminamain), remmina_pref.main_width, remmina_pref.main_height); gtk_window_set_position(GTK_WINDOW(remminamain), GTK_WIN_POS_CENTER); if (remmina_pref.main_maximize) { gtk_window_maximize(GTK_WINDOW(remminamain)); } /* Create the main container */ vbox = gtk_vbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(remminamain), vbox); gtk_widget_show(vbox); /* Create the menubar and toolbar */ uimanager = gtk_ui_manager_new(); priv->uimanager = uimanager; action_group = gtk_action_group_new("RemminaMainActions"); gtk_action_group_set_translation_domain(action_group, NULL); gtk_action_group_add_actions(action_group, remmina_main_ui_menu_entries, G_N_ELEMENTS(remmina_main_ui_menu_entries), remminamain); gtk_action_group_add_toggle_actions(action_group, remmina_main_ui_toggle_menu_entries, G_N_ELEMENTS(remmina_main_ui_toggle_menu_entries), remminamain); gtk_action_group_add_radio_actions(action_group, remmina_main_ui_view_file_mode_entries, G_N_ELEMENTS(remmina_main_ui_view_file_mode_entries), remmina_pref.view_file_mode, G_CALLBACK(remmina_main_action_view_file_mode), remminamain); gtk_ui_manager_insert_action_group(uimanager, action_group, 0); g_object_unref(action_group); priv->main_group = action_group; action_group = gtk_action_group_new("RemminaMainFileSensitiveActions"); gtk_action_group_set_translation_domain(action_group, NULL); gtk_action_group_add_actions(action_group, remmina_main_ui_file_sensitive_menu_entries, G_N_ELEMENTS(remmina_main_ui_file_sensitive_menu_entries), remminamain); gtk_ui_manager_insert_action_group(uimanager, action_group, 0); g_object_unref(action_group); priv->file_sensitive_group = action_group; error = NULL; gtk_ui_manager_add_ui_from_string(uimanager, remmina_main_ui_xml, -1, &error); if (error) { g_message("building menus failed: %s", error->message); g_error_free(error); } remmina_plugin_manager_for_each_plugin(REMMINA_PLUGIN_TYPE_TOOL, remmina_main_add_tool_plugin, remminamain); menubar = gtk_ui_manager_get_widget(uimanager, "/MenuBar"); gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0); priv->toolbar = gtk_ui_manager_get_widget(uimanager, "/ToolBar"); gtk_box_pack_start(GTK_BOX(vbox), priv->toolbar, FALSE, FALSE, 0); remmina_main_create_quick_search(remminamain); gtk_window_add_accel_group(GTK_WINDOW(remminamain), gtk_ui_manager_get_accel_group(uimanager)); gtk_action_group_set_sensitive(priv->file_sensitive_group, FALSE); /* Create the scrolled window for the file list */ scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); /* Create the remmina file list */ tree = gtk_tree_view_new(); column = gtk_tree_view_column_new(); gtk_tree_view_column_set_title(column, _("Name")); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, NAME_COLUMN); renderer = gtk_cell_renderer_pixbuf_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "icon-name", PROTOCOL_COLUMN); g_object_set(G_OBJECT(renderer), "stock-size", GTK_ICON_SIZE_LARGE_TOOLBAR, NULL); renderer = gtk_cell_renderer_text_new(); gtk_tree_view_column_pack_start(column, renderer, FALSE); gtk_tree_view_column_add_attribute(column, renderer, "text", NAME_COLUMN); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Group"), renderer, "text", GROUP_COLUMN, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, GROUP_COLUMN); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); priv->group_column = column; renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Server"), renderer, "text", SERVER_COLUMN, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, SERVER_COLUMN); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); gtk_container_add(GTK_CONTAINER(scrolledwindow), tree); gtk_widget_show(tree); gtk_tree_selection_set_select_function(gtk_tree_view_get_selection(GTK_TREE_VIEW(tree)), remmina_main_selection_func, remminamain, NULL); g_signal_connect(G_OBJECT(tree), "button-press-event", G_CALLBACK(remmina_main_file_list_on_button_press), remminamain); priv->file_list = tree; /* Create statusbar */ priv->statusbar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(vbox), priv->statusbar, FALSE, FALSE, 0); gtk_widget_show(priv->statusbar); /* Prepare the data */ remmina_main_load_files(remminamain, FALSE); /* Load the preferences */ if (remmina_pref.hide_toolbar) { gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtk_action_group_get_action(priv->main_group, "ViewToolbar")), FALSE); } if (remmina_pref.hide_statusbar) { gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtk_action_group_get_action(priv->main_group, "ViewStatusbar")), FALSE); } if (remmina_pref.show_quick_search) { gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(gtk_action_group_get_action(priv->main_group, "ViewQuickSearch")), TRUE); } if (remmina_pref.small_toolbutton) { gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(gtk_action_group_get_action(priv->main_group, "ViewSmallToolbutton")), TRUE); } /* Drag-n-drop support */ gtk_drag_dest_set(GTK_WIDGET(remminamain), GTK_DEST_DEFAULT_ALL, remmina_drop_types, 1, GDK_ACTION_COPY); g_signal_connect(G_OBJECT(remminamain), "drag-data-received", G_CALLBACK(remmina_main_on_drag_data_received), NULL); priv->initialized = TRUE; remmina_widget_pool_register(GTK_WIDGET(remminamain)); } GtkWidget* remmina_main_new(void) { RemminaMain *window; window = REMMINA_MAIN(g_object_new(REMMINA_TYPE_MAIN, NULL)); return GTK_WIDGET(window); } FreeRDP-Remmina-356c033/remmina/src/remmina_main.h000066400000000000000000000035101171526373700216360ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAMAIN_H__ #define __REMMINAMAIN_H__ G_BEGIN_DECLS #define REMMINA_TYPE_MAIN (remmina_main_get_type ()) #define REMMINA_MAIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_MAIN, RemminaMain)) #define REMMINA_MAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_MAIN, RemminaMainClass)) #define REMMINA_IS_MAIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_MAIN)) #define REMMINA_IS_MAIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_MAIN)) #define REMMINA_MAIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_MAIN, RemminaMainClass)) typedef struct _RemminaMainPriv RemminaMainPriv; typedef struct _RemminaMain { GtkWindow window; RemminaMainPriv *priv; } RemminaMain; typedef struct _RemminaMainClass { GtkWindowClass parent_class; } RemminaMainClass; GType remmina_main_get_type(void) G_GNUC_CONST; /* Create the main Remmina window */ GtkWidget* remmina_main_new(void); G_END_DECLS #endif /* __REMMINAMAIN_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_marshals.c000066400000000000000000000115601171526373700225230ustar00rootroot00000000000000#include #ifdef G_ENABLE_DEBUG #define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) #define g_marshal_value_peek_char(v) g_value_get_char (v) #define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) #define g_marshal_value_peek_int(v) g_value_get_int (v) #define g_marshal_value_peek_uint(v) g_value_get_uint (v) #define g_marshal_value_peek_long(v) g_value_get_long (v) #define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) #define g_marshal_value_peek_int64(v) g_value_get_int64 (v) #define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) #define g_marshal_value_peek_enum(v) g_value_get_enum (v) #define g_marshal_value_peek_flags(v) g_value_get_flags (v) #define g_marshal_value_peek_float(v) g_value_get_float (v) #define g_marshal_value_peek_double(v) g_value_get_double (v) #define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) #define g_marshal_value_peek_param(v) g_value_get_param (v) #define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) #define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) #define g_marshal_value_peek_object(v) g_value_get_object (v) #else /* !G_ENABLE_DEBUG */ /* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. * Do not access GValues directly in your code. Instead, use the * g_value_get_*() functions */ #define g_marshal_value_peek_boolean(v) (v)->data[0].v_int #define g_marshal_value_peek_char(v) (v)->data[0].v_int #define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint #define g_marshal_value_peek_int(v) (v)->data[0].v_int #define g_marshal_value_peek_uint(v) (v)->data[0].v_uint #define g_marshal_value_peek_long(v) (v)->data[0].v_long #define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong #define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 #define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 #define g_marshal_value_peek_enum(v) (v)->data[0].v_long #define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong #define g_marshal_value_peek_float(v) (v)->data[0].v_float #define g_marshal_value_peek_double(v) (v)->data[0].v_double #define g_marshal_value_peek_string(v) (v)->data[0].v_pointer #define g_marshal_value_peek_param(v) (v)->data[0].v_pointer #define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer #define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer #define g_marshal_value_peek_object(v) (v)->data[0].v_pointer #endif /* !G_ENABLE_DEBUG */ /* BOOLEAN:INT (remminamarshals.list:4) */ void remmina_marshal_BOOLEAN__INT (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__INT) (gpointer data1, gint arg_1, gpointer data2); register GMarshalFunc_BOOLEAN__INT callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 2); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__INT) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int(param_values + 1) , data2); g_value_set_boolean (return_value, v_return); } /* BOOLEAN:INT,STRING (remminamarshals.list:5) */ void remmina_marshal_BOOLEAN__INT_STRING (GClosure *closure, GValue *return_value G_GNUC_UNUSED, guint n_param_values, const GValue *param_values, gpointer invocation_hint G_GNUC_UNUSED, gpointer marshal_data) { typedef gboolean (*GMarshalFunc_BOOLEAN__INT_STRING) (gpointer data1, gint arg_1, gpointer arg_2, gpointer data2); register GMarshalFunc_BOOLEAN__INT_STRING callback; register GCClosure *cc = (GCClosure*) closure; register gpointer data1, data2; gboolean v_return; g_return_if_fail (return_value != NULL); g_return_if_fail (n_param_values == 3); if (G_CCLOSURE_SWAP_DATA (closure)) { data1 = closure->data; data2 = g_value_peek_pointer (param_values + 0); } else { data1 = g_value_peek_pointer (param_values + 0); data2 = closure->data; } callback = (GMarshalFunc_BOOLEAN__INT_STRING) (marshal_data ? marshal_data : cc->callback); v_return = callback (data1, g_marshal_value_peek_int (param_values + 1), g_marshal_value_peek_string (param_values + 2), data2); g_value_set_boolean (return_value, v_return); } FreeRDP-Remmina-356c033/remmina/src/remmina_marshals.h000066400000000000000000000012051171526373700225230ustar00rootroot00000000000000#ifndef __remmina_marshal_MARSHAL_H__ #define __remmina_marshal_MARSHAL_H__ #include G_BEGIN_DECLS /* BOOLEAN:INT (remminamarshals.list:4) */ extern void remmina_marshal_BOOLEAN__INT(GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); /* BOOLEAN:INT,STRING (remminamarshals.list:5) */ extern void remmina_marshal_BOOLEAN__INT_STRING(GClosure *closure, GValue *return_value, guint n_param_values, const GValue *param_values, gpointer invocation_hint, gpointer marshal_data); G_END_DECLS #endif /* __remmina_marshal_MARSHAL_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_marshals.list000066400000000000000000000004471171526373700232560ustar00rootroot00000000000000# Use glib-genmarshal to generate remminamarshals.h and remminamarshals.c: # $ glib-genmarshal --header --prefix=remmina_marshal remminamarshals.list > remminamarshals.h # $ glib-genmarshal --body --prefix=remmina_marshal remminamarshals.list > remminamarshals.c BOOLEAN:INT BOOLEAN:INT,STRING FreeRDP-Remmina-356c033/remmina/src/remmina_plugin_manager.c000066400000000000000000000235451171526373700237070ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include "remmina_public.h" #include "remmina_file.h" #include "remmina_pref.h" #include "remmina_protocol_widget.h" #include "remmina_log.h" #include "remmina_widget_pool.h" #include "remmina_connection_window.h" #include "remmina_plugin_manager.h" static GPtrArray* remmina_plugin_table = NULL; /* There can be only one secret plugin loaded */ static RemminaSecretPlugin *remmina_secret_plugin = NULL; static const gchar *remmina_plugin_type_name[] = { N_("Protocol"), N_("Entry"), N_("File"), N_("Tool"), N_("Preference"), N_("Secret"), NULL }; static gint remmina_plugin_manager_compare_func(RemminaPlugin **a, RemminaPlugin **b) { return g_strcmp0((*a)->name, (*b)->name); } static gboolean remmina_plugin_manager_register_plugin(RemminaPlugin *plugin) { if (plugin->type == REMMINA_PLUGIN_TYPE_SECRET) { if (remmina_secret_plugin) { g_print("Remmina plugin %s (type=%s) bypassed.\n", plugin->name, _(remmina_plugin_type_name[plugin->type])); return FALSE; } remmina_secret_plugin = (RemminaSecretPlugin*) plugin; } g_ptr_array_add(remmina_plugin_table, plugin); g_ptr_array_sort(remmina_plugin_table, (GCompareFunc) remmina_plugin_manager_compare_func); g_print("Remmina plugin %s (type=%s) registered.\n", plugin->name, _(remmina_plugin_type_name[plugin->type])); return TRUE; } RemminaPluginService remmina_plugin_manager_service = { remmina_plugin_manager_register_plugin, remmina_protocol_widget_get_width, remmina_protocol_widget_set_width, remmina_protocol_widget_get_height, remmina_protocol_widget_set_height, remmina_protocol_widget_get_scale, remmina_protocol_widget_get_expand, remmina_protocol_widget_set_expand, remmina_protocol_widget_has_error, remmina_protocol_widget_set_error, remmina_protocol_widget_is_closed, remmina_protocol_widget_get_file, remmina_protocol_widget_emit_signal, remmina_protocol_widget_register_hostkey, remmina_protocol_widget_start_direct_tunnel, remmina_protocol_widget_start_reverse_tunnel, remmina_protocol_widget_start_xport_tunnel, remmina_protocol_widget_set_display, remmina_protocol_widget_close_connection, remmina_protocol_widget_init_authpwd, remmina_protocol_widget_init_authuserpwd, remmina_protocol_widget_init_certificate, remmina_protocol_widget_init_get_username, remmina_protocol_widget_init_get_password, remmina_protocol_widget_init_get_domain, remmina_protocol_widget_init_authx509, remmina_protocol_widget_init_get_cacert, remmina_protocol_widget_init_get_cacrl, remmina_protocol_widget_init_get_clientcert, remmina_protocol_widget_init_get_clientkey, remmina_protocol_widget_init_save_cred, remmina_protocol_widget_init_show_listen, remmina_protocol_widget_init_show_retry, remmina_protocol_widget_init_show, remmina_protocol_widget_init_hide, remmina_protocol_widget_ssh_exec, remmina_protocol_widget_chat_open, remmina_protocol_widget_chat_close, remmina_protocol_widget_chat_receive, remmina_file_new, remmina_file_get_filename, remmina_file_set_string, remmina_file_get_string, remmina_file_get_secret, remmina_file_set_int, remmina_file_get_int, remmina_pref_set_value, remmina_pref_get_value, remmina_pref_get_scale_quality, remmina_pref_get_sshtunnel_port, remmina_pref_keymap_get_keyval, remmina_log_print, remmina_log_printf, remmina_widget_pool_register, remmina_connection_window_open_from_file_full, remmina_public_get_server_port }; static void remmina_plugin_manager_load_plugin(const gchar *name) { GModule *module; RemminaPluginEntryFunc entry; module = g_module_open(name, G_MODULE_BIND_LAZY | G_MODULE_BIND_LOCAL); if (!module) { g_print("Failed to load plugin: %s.\n", name); return; } if (!g_module_symbol(module, "remmina_plugin_entry", (gpointer*) &entry)) { g_print("Failed to locate plugin entry: %s.\n", name); return; } if (!entry(&remmina_plugin_manager_service)) { g_print("Plugin entry returned false: %s.\n", name); return; } /* We don't close the module because we will need it throughout the process lifetime */ } void remmina_plugin_manager_init(void) { GDir *dir; const gchar *name, *ptr; gchar *fullpath; remmina_plugin_table = g_ptr_array_new(); if (!g_module_supported()) { g_print("Dynamic loading of plugins is not supported in this platform!\n"); return; } dir = g_dir_open(REMMINA_PLUGINDIR, 0, NULL); if (dir == NULL) return; while ((name = g_dir_read_name(dir)) != NULL) { if ((ptr = strrchr(name, '.')) == NULL) continue; ptr++; if (g_strcmp0(ptr, G_MODULE_SUFFIX) != 0) continue; fullpath = g_strdup_printf(REMMINA_PLUGINDIR "/%s", name); remmina_plugin_manager_load_plugin(fullpath); g_free(fullpath); } g_dir_close(dir); } RemminaPlugin* remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name) { RemminaPlugin *plugin; gint i; for (i = 0; i < remmina_plugin_table->len; i++) { plugin = (RemminaPlugin *) g_ptr_array_index(remmina_plugin_table, i); if (plugin->type == type && g_strcmp0(plugin->name, name) == 0) { return plugin; } } g_print("Plugin not found (type=%i, name=%s)\n", type, name); return NULL; } void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data) { RemminaPlugin *plugin; gint i; for (i = 0; i < remmina_plugin_table->len; i++) { plugin = (RemminaPlugin *) g_ptr_array_index(remmina_plugin_table, i); if (plugin->type == type) { func((gchar *) plugin->name, plugin, data); } } } static gboolean remmina_plugin_manager_show_for_each(RemminaPlugin *plugin, GtkListStore *store) { GtkTreeIter iter; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, plugin->name, 1, _(remmina_plugin_type_name[plugin->type]), 2, g_dgettext(plugin->domain, plugin->description), 3, plugin->version, -1); return FALSE; } void remmina_plugin_manager_show(GtkWindow *parent) { GtkWidget *dialog; GtkWidget *scrolledwindow; GtkWidget *tree; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkListStore *store; dialog = gtk_dialog_new_with_buttons(_("Plugins"), parent, GTK_DIALOG_MODAL, GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), dialog); gtk_window_set_default_size(GTK_WINDOW(dialog), 500, 350); scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolledwindow); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), scrolledwindow, TRUE, TRUE, 0); tree = gtk_tree_view_new(); gtk_container_add(GTK_CONTAINER(scrolledwindow), tree); gtk_widget_show(tree); store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); g_ptr_array_foreach(remmina_plugin_table, (GFunc) remmina_plugin_manager_show_for_each, store); gtk_tree_view_set_model(GTK_TREE_VIEW(tree), GTK_TREE_MODEL(store)); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Name"), renderer, "text", 0, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, 0); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Type"), renderer, "text", 1, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, 1); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Description"), renderer, "text", 2, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, 2); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); renderer = gtk_cell_renderer_text_new(); column = gtk_tree_view_column_new_with_attributes(_("Version"), renderer, "text", 3, NULL); gtk_tree_view_column_set_resizable(column, TRUE); gtk_tree_view_column_set_sort_column_id(column, 3); gtk_tree_view_append_column(GTK_TREE_VIEW(tree), column); gtk_widget_show(dialog); } RemminaFilePlugin* remmina_plugin_manager_get_import_file_handler(const gchar *file) { RemminaFilePlugin *plugin; gint i; for (i = 0; i < remmina_plugin_table->len; i++) { plugin = (RemminaFilePlugin *) g_ptr_array_index(remmina_plugin_table, i); if (plugin->type != REMMINA_PLUGIN_TYPE_FILE) continue; if (plugin->import_test_func(file)) { return plugin; } } return NULL; } RemminaFilePlugin* remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile) { RemminaFilePlugin *plugin; gint i; for (i = 0; i < remmina_plugin_table->len; i++) { plugin = (RemminaFilePlugin *) g_ptr_array_index(remmina_plugin_table, i); if (plugin->type != REMMINA_PLUGIN_TYPE_FILE) continue; if (plugin->export_test_func(remminafile)) { return plugin; } } return NULL; } RemminaSecretPlugin* remmina_plugin_manager_get_secret_plugin(void) { return remmina_secret_plugin; } FreeRDP-Remmina-356c033/remmina/src/remmina_plugin_manager.h000066400000000000000000000032031171526373700237010ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPLUGINMANAGER_H__ #define __REMMINAPLUGINMANAGER_H__ #include "remmina/plugin.h" G_BEGIN_DECLS typedef gboolean (*RemminaPluginFunc)(gchar *name, RemminaPlugin *plugin, gpointer data); void remmina_plugin_manager_init(void); RemminaPlugin* remmina_plugin_manager_get_plugin(RemminaPluginType type, const gchar *name); void remmina_plugin_manager_for_each_plugin(RemminaPluginType type, RemminaPluginFunc func, gpointer data); void remmina_plugin_manager_show(GtkWindow *parent); RemminaFilePlugin* remmina_plugin_manager_get_import_file_handler(const gchar *file); RemminaFilePlugin* remmina_plugin_manager_get_export_file_handler(RemminaFile *remminafile); RemminaSecretPlugin* remmina_plugin_manager_get_secret_plugin(void); extern RemminaPluginService remmina_plugin_manager_service; G_END_DECLS #endif /* __REMMINAPLUGINMANAGER_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_pref.c000066400000000000000000000562721171526373700216560ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include #include "remmina_string_array.h" #include "remmina_pref.h" const gchar *default_resolutions = "640x480,800x600,1024x768,1152x864,1280x960,1400x1050"; gchar *remmina_pref_file; RemminaPref remmina_pref; gchar *remmina_keymap_file; static GHashTable *remmina_keymap_table = NULL; /* We could customize this further if there are more requirements */ static const gchar *default_keymap_data = "# Please check gdk/gdkkeysyms.h for a full list of all key names or hex key values\n" "\n" "[Map Meta Keys]\n" "Super_L = Meta_L\n" "Super_R = Meta_R\n" "Meta_L = Super_L\n" "Meta_R = Super_R\n"; static void remmina_pref_gen_secret(void) { guchar s[32]; gint i; GTimeVal gtime; GKeyFile *gkeyfile; gchar *content; gsize length; g_get_current_time(>ime); srand(gtime.tv_sec); for (i = 0; i < 32; i++) { s[i] = (guchar)(rand() % 256); } remmina_pref.secret = g_base64_encode(s, 32); gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); g_key_file_set_string(gkeyfile, "remmina_pref", "secret", remmina_pref.secret); content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_pref_file, content, length, NULL); g_key_file_free(gkeyfile); g_free(content); } static guint remmina_pref_get_keyval_from_str(const gchar *str) { guint k; if (!str) return 0; k = gdk_keyval_from_name(str); if (!k) { if (sscanf(str, "%x", &k) < 1) k = 0; } return k; } static void remmina_pref_init_keymap(void) { GKeyFile *gkeyfile; gchar **groups; gchar **gptr; gchar **keys; gchar **kptr; gsize nkeys; gchar *value; guint *table; guint *tableptr; guint k1, k2; if (remmina_keymap_table) g_hash_table_destroy(remmina_keymap_table); remmina_keymap_table = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); gkeyfile = g_key_file_new(); if (!g_key_file_load_from_file(gkeyfile, remmina_keymap_file, G_KEY_FILE_NONE, NULL)) { if (!g_key_file_load_from_data(gkeyfile, default_keymap_data, strlen(default_keymap_data), G_KEY_FILE_NONE, NULL)) { g_print("Failed to initialize keymap table\n"); g_key_file_free(gkeyfile); return; } } groups = g_key_file_get_groups(gkeyfile, NULL); gptr = groups; while (*gptr) { keys = g_key_file_get_keys(gkeyfile, *gptr, &nkeys, NULL); table = g_new0(guint, nkeys * 2 + 1); g_hash_table_insert(remmina_keymap_table, g_strdup(*gptr), table); kptr = keys; tableptr = table; while (*kptr) { k1 = remmina_pref_get_keyval_from_str(*kptr); if (k1) { value = g_key_file_get_string(gkeyfile, *gptr, *kptr, NULL); k2 = remmina_pref_get_keyval_from_str(value); g_free(value); *tableptr++ = k1; *tableptr++ = k2; } kptr++; } g_strfreev(keys); gptr++; } g_strfreev(groups); } void remmina_pref_init(void) { GKeyFile *gkeyfile; remmina_pref_file = g_strdup_printf("%s/.remmina/remmina.pref", g_get_home_dir()); remmina_keymap_file = g_strdup_printf("%s/.remmina/remmina.keymap", g_get_home_dir()); gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); if (g_key_file_has_key(gkeyfile, "remmina_pref", "save_view_mode", NULL)) remmina_pref.save_view_mode = g_key_file_get_boolean(gkeyfile, "remmina_pref", "save_view_mode", NULL); else remmina_pref.save_view_mode = TRUE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "save_when_connect", NULL)) remmina_pref.save_when_connect = g_key_file_get_boolean(gkeyfile, "remmina_pref", "save_when_connect", NULL); else remmina_pref.save_when_connect = TRUE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "invisible_toolbar", NULL)) remmina_pref.invisible_toolbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "invisible_toolbar", NULL); else remmina_pref.invisible_toolbar = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "always_show_tab", NULL)) remmina_pref.always_show_tab = g_key_file_get_boolean(gkeyfile, "remmina_pref", "always_show_tab", NULL); else remmina_pref.always_show_tab = TRUE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_connection_toolbar", NULL)) remmina_pref.hide_connection_toolbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "hide_connection_toolbar", NULL); else remmina_pref.hide_connection_toolbar = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "default_action", NULL)) remmina_pref.default_action = g_key_file_get_integer(gkeyfile, "remmina_pref", "default_action", NULL); else remmina_pref.default_action = REMMINA_ACTION_CONNECT; if (g_key_file_has_key(gkeyfile, "remmina_pref", "scale_quality", NULL)) remmina_pref.scale_quality = g_key_file_get_integer(gkeyfile, "remmina_pref", "scale_quality", NULL); else remmina_pref.scale_quality = GDK_INTERP_HYPER; if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_toolbar", NULL)) remmina_pref.hide_toolbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "hide_toolbar", NULL); else remmina_pref.hide_toolbar = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "hide_statusbar", NULL)) remmina_pref.hide_statusbar = g_key_file_get_boolean(gkeyfile, "remmina_pref", "hide_statusbar", NULL); else remmina_pref.hide_statusbar = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "show_quick_search", NULL)) remmina_pref.show_quick_search = g_key_file_get_boolean(gkeyfile, "remmina_pref", "show_quick_search", NULL); else remmina_pref.show_quick_search = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "small_toolbutton", NULL)) remmina_pref.small_toolbutton = g_key_file_get_boolean(gkeyfile, "remmina_pref", "small_toolbutton", NULL); else remmina_pref.small_toolbutton = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "view_file_mode", NULL)) remmina_pref.view_file_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "view_file_mode", NULL); else remmina_pref.view_file_mode = REMMINA_VIEW_FILE_LIST; if (g_key_file_has_key(gkeyfile, "remmina_pref", "resolutions", NULL)) remmina_pref.resolutions = g_key_file_get_string(gkeyfile, "remmina_pref", "resolutions", NULL); else remmina_pref.resolutions = g_strdup(default_resolutions); if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_width", NULL)) remmina_pref.main_width = MAX(600, g_key_file_get_integer(gkeyfile, "remmina_pref", "main_width", NULL)); else remmina_pref.main_width = 600; if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_height", NULL)) remmina_pref.main_height = MAX(400, g_key_file_get_integer(gkeyfile, "remmina_pref", "main_height", NULL)); else remmina_pref.main_height = 400; if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_maximize", NULL)) remmina_pref.main_maximize = g_key_file_get_boolean(gkeyfile, "remmina_pref", "main_maximize", NULL); else remmina_pref.main_maximize = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_sort_column_id", NULL)) remmina_pref.main_sort_column_id = g_key_file_get_integer(gkeyfile, "remmina_pref", "main_sort_column_id", NULL); else remmina_pref.main_sort_column_id = 1; if (g_key_file_has_key(gkeyfile, "remmina_pref", "main_sort_order", NULL)) remmina_pref.main_sort_order = g_key_file_get_integer(gkeyfile, "remmina_pref", "main_sort_order", NULL); else remmina_pref.main_sort_order = 0; if (g_key_file_has_key(gkeyfile, "remmina_pref", "expanded_group", NULL)) remmina_pref.expanded_group = g_key_file_get_string(gkeyfile, "remmina_pref", "expanded_group", NULL); else remmina_pref.expanded_group = g_strdup(""); if (g_key_file_has_key(gkeyfile, "remmina_pref", "toolbar_pin_down", NULL)) remmina_pref.toolbar_pin_down = g_key_file_get_boolean(gkeyfile, "remmina_pref", "toolbar_pin_down", NULL); else remmina_pref.toolbar_pin_down = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "sshtunnel_port", NULL)) remmina_pref.sshtunnel_port = g_key_file_get_integer(gkeyfile, "remmina_pref", "sshtunnel_port", NULL); else remmina_pref.sshtunnel_port = DEFAULT_SSHTUNNEL_PORT; if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_new_ontop", NULL)) remmina_pref.applet_new_ontop = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_new_ontop", NULL); else remmina_pref.applet_new_ontop = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_hide_count", NULL)) remmina_pref.applet_hide_count = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_hide_count", NULL); else remmina_pref.applet_hide_count = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "applet_enable_avahi", NULL)) remmina_pref.applet_enable_avahi = g_key_file_get_boolean(gkeyfile, "remmina_pref", "applet_enable_avahi", NULL); else remmina_pref.applet_enable_avahi = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "disable_tray_icon", NULL)) remmina_pref.disable_tray_icon = g_key_file_get_boolean(gkeyfile, "remmina_pref", "disable_tray_icon", NULL); else remmina_pref.disable_tray_icon = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "minimize_to_tray", NULL)) remmina_pref.minimize_to_tray = g_key_file_get_boolean(gkeyfile, "remmina_pref", "minimize_to_tray", NULL); else remmina_pref.minimize_to_tray = FALSE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "recent_maximum", NULL)) remmina_pref.recent_maximum = g_key_file_get_integer(gkeyfile, "remmina_pref", "recent_maximum", NULL); else remmina_pref.recent_maximum = 10; if (g_key_file_has_key(gkeyfile, "remmina_pref", "default_mode", NULL)) remmina_pref.default_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "default_mode", NULL); else remmina_pref.default_mode = 0; if (g_key_file_has_key(gkeyfile, "remmina_pref", "tab_mode", NULL)) remmina_pref.tab_mode = g_key_file_get_integer(gkeyfile, "remmina_pref", "tab_mode", NULL); else remmina_pref.tab_mode = 0; if (g_key_file_has_key(gkeyfile, "remmina_pref", "auto_scroll_step", NULL)) remmina_pref.auto_scroll_step = g_key_file_get_integer(gkeyfile, "remmina_pref", "auto_scroll_step", NULL); else remmina_pref.auto_scroll_step = 10; if (g_key_file_has_key(gkeyfile, "remmina_pref", "hostkey", NULL)) remmina_pref.hostkey = g_key_file_get_integer(gkeyfile, "remmina_pref", "hostkey", NULL); else remmina_pref.hostkey = GDK_KEY_Control_R; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_fullscreen", NULL)) remmina_pref.shortcutkey_fullscreen = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_fullscreen", NULL); else remmina_pref.shortcutkey_fullscreen = GDK_KEY_f; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_autofit", NULL)) remmina_pref.shortcutkey_autofit = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_autofit", NULL); else remmina_pref.shortcutkey_autofit = GDK_KEY_1; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_nexttab", NULL)) remmina_pref.shortcutkey_nexttab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_nexttab", NULL); else remmina_pref.shortcutkey_nexttab = GDK_KEY_Right; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_prevtab", NULL)) remmina_pref.shortcutkey_prevtab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_prevtab", NULL); else remmina_pref.shortcutkey_prevtab = GDK_KEY_Left; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_scale", NULL)) remmina_pref.shortcutkey_scale = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_scale", NULL); else remmina_pref.shortcutkey_scale = GDK_KEY_s; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_grab", NULL)) remmina_pref.shortcutkey_grab = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_grab", NULL); else remmina_pref.shortcutkey_grab = GDK_KEY_Control_R; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_minimize", NULL)) remmina_pref.shortcutkey_minimize = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_minimize", NULL); else remmina_pref.shortcutkey_minimize = GDK_KEY_F9; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_disconnect", NULL)) remmina_pref.shortcutkey_disconnect = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_disconnect", NULL); else remmina_pref.shortcutkey_disconnect = GDK_KEY_F4; if (g_key_file_has_key(gkeyfile, "remmina_pref", "shortcutkey_toolbar", NULL)) remmina_pref.shortcutkey_toolbar = g_key_file_get_integer(gkeyfile, "remmina_pref", "shortcutkey_toolbar", NULL); else remmina_pref.shortcutkey_toolbar = GDK_KEY_t; if (g_key_file_has_key(gkeyfile, "remmina_pref", "secret", NULL)) remmina_pref.secret = g_key_file_get_string(gkeyfile, "remmina_pref", "secret", NULL); else remmina_pref.secret = NULL; if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_font", NULL)) remmina_pref.vte_font = g_key_file_get_string(gkeyfile, "remmina_pref", "vte_font", NULL); else remmina_pref.vte_font = NULL; if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_allow_bold_text", NULL)) remmina_pref.vte_allow_bold_text = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_allow_bold_text", NULL); else remmina_pref.vte_allow_bold_text = TRUE; if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_lines", NULL)) remmina_pref.vte_lines = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_lines", NULL); else remmina_pref.vte_lines = 512; if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_shortcutkey_copy", NULL)) remmina_pref.vte_shortcutkey_copy = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_shortcutkey_copy", NULL); else remmina_pref.vte_shortcutkey_copy = GDK_KEY_c; if (g_key_file_has_key(gkeyfile, "remmina_pref", "vte_shortcutkey_paste", NULL)) remmina_pref.vte_shortcutkey_paste = g_key_file_get_integer(gkeyfile, "remmina_pref", "vte_shortcutkey_paste", NULL); else remmina_pref.vte_shortcutkey_paste = GDK_KEY_v; g_key_file_free(gkeyfile); if (remmina_pref.secret == NULL) remmina_pref_gen_secret(); remmina_pref_init_keymap(); } void remmina_pref_save(void) { GKeyFile *gkeyfile; gchar *content; gsize length; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); g_key_file_set_boolean(gkeyfile, "remmina_pref", "save_view_mode", remmina_pref.save_view_mode); g_key_file_set_boolean(gkeyfile, "remmina_pref", "save_when_connect", remmina_pref.save_when_connect); g_key_file_set_boolean(gkeyfile, "remmina_pref", "invisible_toolbar", remmina_pref.invisible_toolbar); g_key_file_set_boolean(gkeyfile, "remmina_pref", "always_show_tab", remmina_pref.always_show_tab); g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_connection_toolbar", remmina_pref.hide_connection_toolbar); g_key_file_set_integer(gkeyfile, "remmina_pref", "default_action", remmina_pref.default_action); g_key_file_set_integer(gkeyfile, "remmina_pref", "scale_quality", remmina_pref.scale_quality); g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_toolbar", remmina_pref.hide_toolbar); g_key_file_set_boolean(gkeyfile, "remmina_pref", "hide_statusbar", remmina_pref.hide_statusbar); g_key_file_set_boolean(gkeyfile, "remmina_pref", "show_quick_search", remmina_pref.show_quick_search); g_key_file_set_boolean(gkeyfile, "remmina_pref", "small_toolbutton", remmina_pref.small_toolbutton); g_key_file_set_integer(gkeyfile, "remmina_pref", "view_file_mode", remmina_pref.view_file_mode); g_key_file_set_string(gkeyfile, "remmina_pref", "resolutions", remmina_pref.resolutions); g_key_file_set_integer(gkeyfile, "remmina_pref", "main_width", remmina_pref.main_width); g_key_file_set_integer(gkeyfile, "remmina_pref", "main_height", remmina_pref.main_height); g_key_file_set_boolean(gkeyfile, "remmina_pref", "main_maximize", remmina_pref.main_maximize); g_key_file_set_integer(gkeyfile, "remmina_pref", "main_sort_column_id", remmina_pref.main_sort_column_id); g_key_file_set_integer(gkeyfile, "remmina_pref", "main_sort_order", remmina_pref.main_sort_order); g_key_file_set_string(gkeyfile, "remmina_pref", "expanded_group", remmina_pref.expanded_group); g_key_file_set_boolean(gkeyfile, "remmina_pref", "toolbar_pin_down", remmina_pref.toolbar_pin_down); g_key_file_set_integer(gkeyfile, "remmina_pref", "sshtunnel_port", remmina_pref.sshtunnel_port); g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_new_ontop", remmina_pref.applet_new_ontop); g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_hide_count", remmina_pref.applet_hide_count); g_key_file_set_boolean(gkeyfile, "remmina_pref", "applet_enable_avahi", remmina_pref.applet_enable_avahi); g_key_file_set_boolean(gkeyfile, "remmina_pref", "disable_tray_icon", remmina_pref.disable_tray_icon); g_key_file_set_boolean(gkeyfile, "remmina_pref", "minimize_to_tray", remmina_pref.minimize_to_tray); g_key_file_set_integer(gkeyfile, "remmina_pref", "recent_maximum", remmina_pref.recent_maximum); g_key_file_set_integer(gkeyfile, "remmina_pref", "default_mode", remmina_pref.default_mode); g_key_file_set_integer(gkeyfile, "remmina_pref", "tab_mode", remmina_pref.tab_mode); g_key_file_set_integer(gkeyfile, "remmina_pref", "auto_scroll_step", remmina_pref.auto_scroll_step); g_key_file_set_integer(gkeyfile, "remmina_pref", "hostkey", remmina_pref.hostkey); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_fullscreen", remmina_pref.shortcutkey_fullscreen); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_autofit", remmina_pref.shortcutkey_autofit); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_nexttab", remmina_pref.shortcutkey_nexttab); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_prevtab", remmina_pref.shortcutkey_prevtab); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_scale", remmina_pref.shortcutkey_scale); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_grab", remmina_pref.shortcutkey_grab); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_minimize", remmina_pref.shortcutkey_minimize); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_disconnect", remmina_pref.shortcutkey_disconnect); g_key_file_set_integer(gkeyfile, "remmina_pref", "shortcutkey_toolbar", remmina_pref.shortcutkey_toolbar); g_key_file_set_string(gkeyfile, "remmina_pref", "vte_font", remmina_pref.vte_font ? remmina_pref.vte_font : ""); g_key_file_set_boolean(gkeyfile, "remmina_pref", "vte_allow_bold_text", remmina_pref.vte_allow_bold_text); g_key_file_set_integer(gkeyfile, "remmina_pref", "vte_lines", remmina_pref.vte_lines); content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_pref_file, content, length, NULL); g_key_file_free(gkeyfile); g_free(content); } void remmina_pref_add_recent(const gchar *protocol, const gchar *server) { RemminaStringArray *array; GKeyFile *gkeyfile; gchar key[20]; gchar *val; gchar *content; gsize length; if (remmina_pref.recent_maximum <= 0 || server == NULL || server[0] == 0) return; /* Load original value into memory */ gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); g_snprintf(key, sizeof(key), "recent_%s", protocol); array = remmina_string_array_new_from_allocated_string(g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL)); /* Add the new value */ remmina_string_array_remove(array, server); while (array->len >= remmina_pref.recent_maximum) { remmina_string_array_remove_index(array, 0); } remmina_string_array_add(array, server); /* Save */ val = remmina_string_array_to_string(array); g_key_file_set_string(gkeyfile, "remmina_pref", key, val); g_free(val); content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_pref_file, content, length, NULL); g_key_file_free(gkeyfile); g_free(content); } gchar* remmina_pref_get_recent(const gchar *protocol) { GKeyFile *gkeyfile; gchar key[20]; gchar *val; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); g_snprintf(key, sizeof(key), "recent_%s", protocol); val = g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL); g_key_file_free(gkeyfile); return val; } void remmina_pref_clear_recent(void) { GKeyFile *gkeyfile; gchar **keys; gint i; gchar *content; gsize length; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); keys = g_key_file_get_keys(gkeyfile, "remmina_pref", NULL, NULL); if (keys) { for (i = 0; keys[i]; i++) { if (strncmp(keys[i], "recent_", 7) == 0) { g_key_file_set_string(gkeyfile, "remmina_pref", keys[i], ""); } } g_strfreev(keys); } content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_pref_file, content, length, NULL); g_key_file_free(gkeyfile); g_free(content); } guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval) { guint *table; gint i; if (!keymap || keymap[0] == '\0') return keyval; table = (guint*) g_hash_table_lookup(remmina_keymap_table, keymap); if (!table) return keyval; for (i = 0; table[i] > 0; i += 2) { if (table[i] == keyval) return table[i + 1]; } return keyval; } gchar** remmina_pref_keymap_groups(void) { GList *list; guint len; gchar **keys; guint i; list = g_hash_table_get_keys(remmina_keymap_table); len = g_list_length(list); keys = g_new0 (gchar*, (len + 1) * 2 + 1); keys[0] = g_strdup(""); keys[1] = g_strdup(""); for (i = 0; i < len; i++) { keys[(i + 1) * 2] = g_strdup((gchar*) g_list_nth_data(list, i)); keys[(i + 1) * 2 + 1] = g_strdup((gchar*) g_list_nth_data(list, i)); } g_list_free(list); return keys; } gint remmina_pref_get_scale_quality(void) { return remmina_pref.scale_quality; } gint remmina_pref_get_sshtunnel_port(void) { return remmina_pref.sshtunnel_port; } void remmina_pref_set_value(const gchar *key, const gchar *value) { GKeyFile *gkeyfile; gchar *content; gsize length; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); g_key_file_set_string(gkeyfile, "remmina_pref", key, value); content = g_key_file_to_data(gkeyfile, &length, NULL); g_file_set_contents(remmina_pref_file, content, length, NULL); g_key_file_free(gkeyfile); g_free(content); } gchar* remmina_pref_get_value(const gchar *key) { GKeyFile *gkeyfile; gchar *value; gkeyfile = g_key_file_new(); g_key_file_load_from_file(gkeyfile, remmina_pref_file, G_KEY_FILE_NONE, NULL); value = g_key_file_get_string(gkeyfile, "remmina_pref", key, NULL); g_key_file_free(gkeyfile); return value; } FreeRDP-Remmina-356c033/remmina/src/remmina_pref.h000066400000000000000000000064341171526373700216560ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPREF_H__ #define __REMMINAPREF_H__ /* * Remmina Perference Loader */ G_BEGIN_DECLS enum { REMMINA_VIEW_FILE_LIST, REMMINA_VIEW_FILE_TREE }; enum { REMMINA_ACTION_CONNECT = 0, REMMINA_ACTION_EDIT = 1 }; enum { AUTO_MODE = 0, SCROLLED_WINDOW_MODE = 1, FULLSCREEN_MODE = 2, SCROLLED_FULLSCREEN_MODE = 3, VIEWPORT_FULLSCREEN_MODE = 4 }; enum { REMMINA_TAB_BY_GROUP = 0, REMMINA_TAB_BY_PROTOCOL = 1, REMMINA_TAB_ALL = 8, REMMINA_TAB_NONE = 9 }; typedef struct _RemminaPref { /* In RemminaPrefDialog */ gboolean save_view_mode; gboolean save_when_connect; gboolean invisible_toolbar; gboolean always_show_tab; gboolean hide_connection_toolbar; gint default_action; gint scale_quality; gchar *resolutions; gint sshtunnel_port; gint recent_maximum; gint default_mode; gint tab_mode; gint auto_scroll_step; gboolean applet_new_ontop; gboolean applet_hide_count; gboolean applet_enable_avahi; gboolean disable_tray_icon; gboolean minimize_to_tray; guint hostkey; guint shortcutkey_fullscreen; guint shortcutkey_autofit; guint shortcutkey_nexttab; guint shortcutkey_prevtab; guint shortcutkey_scale; guint shortcutkey_grab; guint shortcutkey_minimize; guint shortcutkey_disconnect; guint shortcutkey_toolbar; /* In View menu */ gboolean hide_toolbar; gboolean hide_statusbar; gboolean show_quick_search; gboolean small_toolbutton; gint view_file_mode; /* Auto */ gint main_width; gint main_height; gboolean main_maximize; gint main_sort_column_id; gint main_sort_order; gchar *expanded_group; gboolean toolbar_pin_down; /* Crypto */ gchar *secret; /* VTE */ gchar *vte_font; gboolean vte_allow_bold_text; gint vte_lines; guint vte_shortcutkey_copy; guint vte_shortcutkey_paste; } RemminaPref; #define DEFAULT_SSHTUNNEL_PORT 4732 #define DEFAULT_SSH_PORT 22 extern const gchar *default_resolutions; extern gchar *remmina_pref_file; extern RemminaPref remmina_pref; void remmina_pref_init(void); void remmina_pref_save(void); void remmina_pref_add_recent(const gchar *protocol, const gchar *server); gchar* remmina_pref_get_recent(const gchar *protocol); void remmina_pref_clear_recent(void); guint remmina_pref_keymap_get_keyval(const gchar *keymap, guint keyval); gchar** remmina_pref_keymap_groups(void); gint remmina_pref_get_scale_quality(void); gint remmina_pref_get_sshtunnel_port(void); void remmina_pref_set_value(const gchar *key, const gchar *value); gchar* remmina_pref_get_value(const gchar *key); G_END_DECLS #endif /* __REMMINAPREF_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_pref_dialog.c000066400000000000000000000705661171526373700231770ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "remmina_public.h" #include "remmina_string_list.h" #include "remmina_widget_pool.h" #include "remmina_key_chooser.h" #include "remmina_plugin_manager.h" #include "remmina_icon.h" #include "remmina_pref.h" #include "remmina_pref_dialog.h" G_DEFINE_TYPE( RemminaPrefDialog, remmina_pref_dialog, GTK_TYPE_DIALOG) static const gpointer default_action_list[] = { "0", N_("Open connection"), "1", N_("Edit settings"), NULL }; static const gpointer scale_quality_list[] = { "0", N_("Nearest"), "1", N_("Tiles"), "2", N_("Bilinear"), "3", N_("Hyper"), NULL }; static const gpointer default_mode_list[] = { "0", N_("Automatic"), "1", N_("Scrolled window"), "3", N_("Scrolled fullscreen"), "4", N_("Viewport fullscreen"), NULL }; static const gpointer tab_mode_list[] = { "0", N_("Tab by groups"), "1", N_("Tab by protocols"), "8", N_("Tab all connections"), "9", N_("Do not use tabs"), NULL }; struct _RemminaPrefDialogPriv { GtkWidget *notebook; GtkWidget *save_view_mode_check; GtkWidget *save_when_connect_check; GtkWidget *invisible_toolbar_check; GtkWidget *always_show_tab_check; GtkWidget *hide_connection_toolbar_check; GtkWidget *default_action_combo; GtkWidget *default_mode_combo; GtkWidget *tab_mode_combo; GtkWidget *scale_quality_combo; GtkWidget *sshtunnel_port_entry; GtkWidget *auto_scroll_step_entry; GtkWidget *recent_maximum_entry; GtkWidget *resolutions_list; GtkWidget *applet_new_ontop_check; GtkWidget *applet_hide_count_check; GtkWidget *disable_tray_icon_check; GtkWidget *autostart_tray_icon_check; GtkWidget *minimize_to_tray_check; GtkWidget *hostkey_chooser; GtkWidget *shortcutkey_fullscreen_chooser; GtkWidget *shortcutkey_autofit_chooser; GtkWidget *shortcutkey_nexttab_chooser; GtkWidget *shortcutkey_prevtab_chooser; GtkWidget *shortcutkey_scale_chooser; GtkWidget *shortcutkey_grab_chooser; GtkWidget *shortcutkey_minimize_chooser; GtkWidget *shortcutkey_disconnect_chooser; GtkWidget *shortcutkey_toolbar_chooser; GtkWidget *vte_font_check; GtkWidget *vte_font_button; GtkWidget *vte_allow_bold_text_check; GtkWidget *vte_lines_entry; GtkWidget *vte_shortcutkey_copy_chooser; GtkWidget *vte_shortcutkey_paste_chooser; }; static void remmina_pref_dialog_class_init(RemminaPrefDialogClass *klass) { } static gboolean remmina_pref_resolution_validation_func(const gchar *new_str, gchar **error) { gint i; gint width, height; gboolean splitted; gboolean result; width = 0; height = 0; splitted = FALSE; result = TRUE; for (i = 0; new_str[i] != '\0'; i++) { if (new_str[i] == 'x') { if (splitted) { result = FALSE; break; } splitted = TRUE; continue; } if (new_str[i] < '0' || new_str[i] > '9') { result = FALSE; break; } if (splitted) { height = 1; } else { width = 1; } } if (width == 0 || height == 0) result = FALSE; if (!result) *error = g_strdup(_("Please enter format 'widthxheight'.")); return result; } static void remmina_pref_dialog_clear_recent(GtkWidget *widget, gpointer data) { GtkWidget *dialog; remmina_pref_clear_recent(); dialog = gtk_message_dialog_new(GTK_WINDOW(data), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, _("Recent lists cleared.")); gtk_dialog_run(GTK_DIALOG(dialog)); gtk_widget_destroy(dialog); } static void remmina_pref_dialog_on_close_clicked(GtkWidget *widget, RemminaPrefDialog *dialog) { gtk_widget_destroy(GTK_WIDGET(dialog)); } static void remmina_pref_dialog_destroy(GtkWidget *widget, gpointer data) { gchar *s; gboolean b; RemminaPrefDialogPriv *priv = REMMINA_PREF_DIALOG(widget)->priv; remmina_pref.save_view_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->save_view_mode_check)); remmina_pref.save_when_connect = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->save_when_connect_check)); remmina_pref.invisible_toolbar = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->invisible_toolbar_check)); remmina_pref.always_show_tab = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->always_show_tab_check)); remmina_pref.hide_connection_toolbar = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(priv->hide_connection_toolbar_check)); s = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->default_action_combo)); remmina_pref.default_action = atoi(s); g_free(s); s = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->default_mode_combo)); remmina_pref.default_mode = atoi(s); g_free(s); s = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->tab_mode_combo)); remmina_pref.tab_mode = atoi(s); g_free(s); s = remmina_public_combo_get_active_text(GTK_COMBO_BOX(priv->scale_quality_combo)); remmina_pref.scale_quality = atoi(s); g_free(s); remmina_pref.sshtunnel_port = atoi(gtk_entry_get_text(GTK_ENTRY(priv->sshtunnel_port_entry))); if (remmina_pref.sshtunnel_port <= 0) remmina_pref.sshtunnel_port = DEFAULT_SSHTUNNEL_PORT; remmina_pref.auto_scroll_step = atoi(gtk_entry_get_text(GTK_ENTRY(priv->auto_scroll_step_entry))); if (remmina_pref.auto_scroll_step < 10) remmina_pref.auto_scroll_step = 10; else if (remmina_pref.auto_scroll_step > 500) remmina_pref.auto_scroll_step = 500; remmina_pref.recent_maximum = atoi(gtk_entry_get_text(GTK_ENTRY(priv->recent_maximum_entry))); if (remmina_pref.recent_maximum < 0) remmina_pref.recent_maximum = 0; g_free(remmina_pref.resolutions); s = remmina_string_list_get_text(REMMINA_STRING_LIST(priv->resolutions_list)); if (s[0] == '\0') s = g_strdup(default_resolutions); remmina_pref.resolutions = s; remmina_pref.applet_new_ontop = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->applet_new_ontop_check)); remmina_pref.applet_hide_count = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->applet_hide_count_check)); b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->disable_tray_icon_check)); if (remmina_pref.disable_tray_icon != b) { remmina_pref.disable_tray_icon = b; remmina_icon_init(); } if (b) { remmina_pref.minimize_to_tray = FALSE; } else { remmina_pref.minimize_to_tray = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->minimize_to_tray_check)); } if (b) { b = FALSE; } else { b = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->autostart_tray_icon_check)); } remmina_icon_set_autostart(b); remmina_pref.hostkey = REMMINA_KEY_CHOOSER(priv->hostkey_chooser)->keyval; remmina_pref.shortcutkey_fullscreen = REMMINA_KEY_CHOOSER(priv->shortcutkey_fullscreen_chooser)->keyval; remmina_pref.shortcutkey_autofit = REMMINA_KEY_CHOOSER(priv->shortcutkey_autofit_chooser)->keyval; remmina_pref.shortcutkey_nexttab = REMMINA_KEY_CHOOSER(priv->shortcutkey_nexttab_chooser)->keyval; remmina_pref.shortcutkey_prevtab = REMMINA_KEY_CHOOSER(priv->shortcutkey_prevtab_chooser)->keyval; remmina_pref.shortcutkey_scale = REMMINA_KEY_CHOOSER(priv->shortcutkey_scale_chooser)->keyval; remmina_pref.shortcutkey_grab = REMMINA_KEY_CHOOSER(priv->shortcutkey_grab_chooser)->keyval; remmina_pref.shortcutkey_minimize = REMMINA_KEY_CHOOSER(priv->shortcutkey_minimize_chooser)->keyval; remmina_pref.shortcutkey_disconnect = REMMINA_KEY_CHOOSER(priv->shortcutkey_disconnect_chooser)->keyval; remmina_pref.shortcutkey_toolbar = REMMINA_KEY_CHOOSER(priv->shortcutkey_toolbar_chooser)->keyval; g_free(remmina_pref.vte_font); if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->vte_font_check))) { remmina_pref.vte_font = NULL; } else { remmina_pref.vte_font = g_strdup(gtk_font_button_get_font_name(GTK_FONT_BUTTON(priv->vte_font_button))); } remmina_pref.vte_allow_bold_text = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(priv->vte_allow_bold_text_check)); remmina_pref.vte_lines = atoi(gtk_entry_get_text(GTK_ENTRY(priv->vte_lines_entry))); remmina_pref.vte_shortcutkey_copy = REMMINA_KEY_CHOOSER(priv->vte_shortcutkey_copy_chooser)->keyval; remmina_pref.vte_shortcutkey_paste = REMMINA_KEY_CHOOSER(priv->vte_shortcutkey_paste_chooser)->keyval; remmina_pref_save(); g_free(priv); } static gboolean remmina_pref_dialog_add_pref_plugin(gchar *name, RemminaPlugin *plugin, gpointer data) { RemminaPrefDialogPriv *priv; RemminaPrefPlugin *pref_plugin; GtkWidget *vbox; GtkWidget *widget; priv = REMMINA_PREF_DIALOG(data)->priv; pref_plugin = (RemminaPrefPlugin *) plugin; widget = gtk_label_new(pref_plugin->pref_label); gtk_widget_show(widget); vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_notebook_append_page(GTK_NOTEBOOK(priv->notebook), vbox, widget); widget = pref_plugin->get_pref_body(); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); return FALSE; } static void remmina_pref_dialog_vte_font_on_toggled(GtkWidget *widget, RemminaPrefDialog *dialog) { gtk_widget_set_sensitive(dialog->priv->vte_font_button, !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))); } static void remmina_pref_dialog_disable_tray_icon_on_toggled(GtkWidget *widget, RemminaPrefDialog *dialog) { gboolean b; b = !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)); gtk_widget_set_sensitive(dialog->priv->autostart_tray_icon_check, b); gtk_widget_set_sensitive(dialog->priv->minimize_to_tray_check, b); } static void remmina_pref_dialog_init(RemminaPrefDialog *dialog) { RemminaPrefDialogPriv *priv; GtkWidget *notebook; GtkWidget *tablabel; GtkWidget *vbox; GtkWidget *hbox; GtkWidget *table; GtkWidget *widget; gchar buf[100]; priv = g_new(RemminaPrefDialogPriv, 1); dialog->priv = priv; /* Create the dialog */ gtk_window_set_title(GTK_WINDOW(dialog), _("Remmina Preferences")); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); widget = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_pref_dialog_on_close_clicked), dialog); gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_CLOSE); g_signal_connect(G_OBJECT(dialog), "destroy", G_CALLBACK(remmina_pref_dialog_destroy), NULL); /* Create the notebook */ notebook = gtk_notebook_new(); gtk_widget_show(notebook); gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), notebook, TRUE, TRUE, 4); gtk_container_set_border_width(GTK_CONTAINER(notebook), 4); priv->notebook = notebook; /* Options tab */ tablabel = gtk_label_new(_("Options")); gtk_widget_show(tablabel); /* Options body */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, tablabel); table = gtk_table_new(12, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); widget = gtk_check_button_new_with_label(_("Remember last view mode for each connection")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 0, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.save_view_mode); priv->save_view_mode_check = widget; widget = gtk_check_button_new_with_label(_("Save settings when starting the connection")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 1, 2); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.save_when_connect); priv->save_when_connect_check = widget; widget = gtk_check_button_new_with_label(_("Invisible toolbar in fullscreen mode")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 2, 3); if (gtk_widget_is_composited(GTK_WIDGET(dialog))) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.invisible_toolbar); } else { gtk_widget_set_sensitive(widget, FALSE); } priv->invisible_toolbar_check = widget; widget = gtk_check_button_new_with_label(_("Always show tabs")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 3, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.always_show_tab); priv->always_show_tab_check = widget; widget = gtk_check_button_new_with_label(_("Hide toolbar in tabbed interface")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 4, 5); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.hide_connection_toolbar); priv->hide_connection_toolbar_check = widget; widget = gtk_label_new(_("Double-click action")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 5, 6); widget = remmina_public_create_combo_mapint(default_action_list, remmina_pref.default_action, FALSE, NULL); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 5, 6); priv->default_action_combo = widget; widget = gtk_label_new(_("Default view mode")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 6, 7); widget = remmina_public_create_combo_mapint(default_mode_list, remmina_pref.default_mode, FALSE, NULL); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 6, 7); priv->default_mode_combo = widget; widget = gtk_label_new(_("Tab interface")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 7, 8); widget = remmina_public_create_combo_mapint(tab_mode_list, remmina_pref.tab_mode, FALSE, NULL); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 7, 8); priv->tab_mode_combo = widget; widget = gtk_label_new(_("Scale quality")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 8, 9); widget = remmina_public_create_combo_mapint(scale_quality_list, remmina_pref.scale_quality, FALSE, NULL); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 8, 9); priv->scale_quality_combo = widget; widget = gtk_label_new(_("SSH tunnel local port")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 9, 10); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 9, 10); gtk_entry_set_max_length(GTK_ENTRY(widget), 5); g_snprintf(buf, sizeof(buf), "%i", remmina_pref.sshtunnel_port); gtk_entry_set_text(GTK_ENTRY(widget), buf); priv->sshtunnel_port_entry = widget; widget = gtk_label_new(_("Auto scroll step size")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 10, 11); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 10, 11); gtk_entry_set_max_length(GTK_ENTRY(widget), 3); g_snprintf(buf, sizeof(buf), "%i", remmina_pref.auto_scroll_step); gtk_entry_set_text(GTK_ENTRY(widget), buf); priv->auto_scroll_step_entry = widget; widget = gtk_label_new(_("Maximum recent items")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 1, 11, 12); hbox = gtk_hbox_new(FALSE, 2); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 11, 12); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); gtk_entry_set_max_length(GTK_ENTRY(widget), 2); g_snprintf(buf, sizeof(buf), "%i", remmina_pref.recent_maximum); gtk_entry_set_text(GTK_ENTRY(widget), buf); priv->recent_maximum_entry = widget; widget = gtk_button_new_with_label(_("Clear")); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_pref_dialog_clear_recent), dialog); /* Resolutions tab */ tablabel = gtk_label_new(_("Resolutions")); gtk_widget_show(tablabel); /* Resolutions body */ vbox = gtk_vbox_new(FALSE, 2); gtk_widget_show(vbox); gtk_container_set_border_width(GTK_CONTAINER(vbox), 8); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, tablabel); widget = remmina_string_list_new(); gtk_widget_show(widget); gtk_container_set_border_width(GTK_CONTAINER(widget), 8); gtk_widget_set_size_request(widget, 350, -1); remmina_string_list_set_validation_func(REMMINA_STRING_LIST(widget), remmina_pref_resolution_validation_func); gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); remmina_string_list_set_text(REMMINA_STRING_LIST(widget), remmina_pref.resolutions); priv->resolutions_list = widget; /* Applet tab */ tablabel = gtk_label_new(_("Applet")); gtk_widget_show(tablabel); /* Applet body */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, tablabel); table = gtk_table_new(5, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); widget = gtk_check_button_new_with_label(_("Show new connection on top of the menu")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 0, 1); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.applet_new_ontop); priv->applet_new_ontop_check = widget; widget = gtk_check_button_new_with_label(_("Hide total count in group menu")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 1, 2); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.applet_hide_count); priv->applet_hide_count_check = widget; widget = gtk_check_button_new_with_label(_("Disable tray icon")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 2, 3); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.disable_tray_icon); priv->disable_tray_icon_check = widget; widget = gtk_check_button_new_with_label(_("Start tray icon automatically")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 3, 4); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_icon_is_autostart()); gtk_widget_set_sensitive(widget, !remmina_pref.disable_tray_icon); priv->autostart_tray_icon_check = widget; widget = gtk_check_button_new_with_label(_("Minimize windows to tray")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 0, 2, 4, 5); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.minimize_to_tray); gtk_widget_set_sensitive(widget, !remmina_pref.disable_tray_icon); priv->minimize_to_tray_check = widget; g_signal_connect(G_OBJECT(priv->disable_tray_icon_check), "toggled", G_CALLBACK(remmina_pref_dialog_disable_tray_icon_on_toggled), dialog); /* Keyboard tab */ tablabel = gtk_label_new(_("Keyboard")); gtk_widget_show(tablabel); /* Keyboard body */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, tablabel); table = gtk_table_new(9, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); widget = gtk_label_new(_("Host key")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.hostkey); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 0, 1); priv->hostkey_chooser = widget; widget = gtk_label_new(_("Toggle fullscreen mode")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 1, 2, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_fullscreen); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 1, 2); priv->shortcutkey_fullscreen_chooser = widget; widget = gtk_label_new(_("Auto-fit window")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 2, 3, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_autofit); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 2, 3); priv->shortcutkey_autofit_chooser = widget; widget = gtk_label_new(_("Switch tab pages")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); hbox = gtk_hbox_new(TRUE, 2); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 3, 4); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_prevtab); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); priv->shortcutkey_prevtab_chooser = widget; widget = remmina_key_chooser_new(remmina_pref.shortcutkey_nexttab); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); priv->shortcutkey_nexttab_chooser = widget; widget = gtk_label_new(_("Toggle scaled mode")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 4, 5, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_scale); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 4, 5); priv->shortcutkey_scale_chooser = widget; widget = gtk_label_new(_("Grab keyboard")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 5, 6, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_grab); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 5, 6); priv->shortcutkey_grab_chooser = widget; widget = gtk_label_new(_("Minimize window")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 6, 7, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_minimize); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 6, 7); priv->shortcutkey_minimize_chooser = widget; widget = gtk_label_new(_("Disconnect")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 7, 8, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_disconnect); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 7, 8); priv->shortcutkey_disconnect_chooser = widget; widget = gtk_label_new(_("Show / hide toolbar")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 8, 9, GTK_FILL, 0, 0, 0); widget = remmina_key_chooser_new(remmina_pref.shortcutkey_toolbar); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 8, 9); priv->shortcutkey_toolbar_chooser = widget; /* Terminal tab */ tablabel = gtk_label_new(_("Terminal")); gtk_widget_show(tablabel); /* Terminal body */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, tablabel); table = gtk_table_new(6, 2, FALSE); gtk_widget_show(table); gtk_table_set_row_spacings(GTK_TABLE(table), 4); gtk_table_set_col_spacings(GTK_TABLE(table), 4); gtk_container_set_border_width(GTK_CONTAINER(table), 8); gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0); widget = gtk_label_new(_("Font")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 0, 1, GTK_FILL, 0, 0, 0); widget = gtk_check_button_new_with_label(_("Use system default font")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 0, 1); priv->vte_font_check = widget; if (!(remmina_pref.vte_font && remmina_pref.vte_font[0])) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE); } widget = gtk_font_button_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 1, 2); priv->vte_font_button = widget; if (remmina_pref.vte_font && remmina_pref.vte_font[0]) { gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), remmina_pref.vte_font); } else { gtk_font_button_set_font_name(GTK_FONT_BUTTON(widget), "Monospace 12"); gtk_widget_set_sensitive(widget, FALSE); } g_signal_connect(G_OBJECT(priv->vte_font_check), "toggled", G_CALLBACK(remmina_pref_dialog_vte_font_on_toggled), dialog); widget = gtk_check_button_new_with_label(_("Allow bold text")); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 2, 3); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), remmina_pref.vte_allow_bold_text); priv->vte_allow_bold_text_check = widget; widget = gtk_label_new(_("Scrollback lines")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 3, 4, GTK_FILL, 0, 0, 0); widget = gtk_entry_new(); gtk_widget_show(widget); gtk_table_attach_defaults(GTK_TABLE(table), widget, 1, 2, 3, 4); gtk_entry_set_max_length(GTK_ENTRY(widget), 5); g_snprintf(buf, sizeof(buf), "%i", remmina_pref.vte_lines); gtk_entry_set_text(GTK_ENTRY(widget), buf); priv->vte_lines_entry = widget; widget = gtk_label_new(_("Keyboard")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_table_attach(GTK_TABLE(table), widget, 0, 1, 4, 5, GTK_FILL, 0, 0, 0); hbox = gtk_hbox_new(FALSE, 2); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 4, 5); widget = gtk_label_new(_("Copy")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_set_size_request(widget, 100, -1); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); g_snprintf(buf, sizeof(buf), "%s + ", _("Host key")); widget = gtk_label_new(buf); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 1.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); widget = remmina_key_chooser_new(remmina_pref.vte_shortcutkey_copy); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); priv->vte_shortcutkey_copy_chooser = widget; hbox = gtk_hbox_new(FALSE, 2); gtk_widget_show(hbox); gtk_table_attach_defaults(GTK_TABLE(table), hbox, 1, 2, 5, 6); widget = gtk_label_new(_("Paste")); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); gtk_widget_set_size_request(widget, 100, -1); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); widget = gtk_label_new(buf); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 1.0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0); widget = remmina_key_chooser_new(remmina_pref.vte_shortcutkey_paste); gtk_widget_show(widget); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); priv->vte_shortcutkey_paste_chooser = widget; remmina_plugin_manager_for_each_plugin(REMMINA_PLUGIN_TYPE_PREF, remmina_pref_dialog_add_pref_plugin, dialog); remmina_widget_pool_register(GTK_WIDGET(dialog)); } GtkWidget* remmina_pref_dialog_new(gint default_tab) { RemminaPrefDialog *dialog; dialog = REMMINA_PREF_DIALOG(g_object_new(REMMINA_TYPE_PREF_DIALOG, NULL)); if (default_tab > 0) gtk_notebook_set_current_page(GTK_NOTEBOOK(dialog->priv->notebook), default_tab); return GTK_WIDGET(dialog); } FreeRDP-Remmina-356c033/remmina/src/remmina_pref_dialog.h000066400000000000000000000041541171526373700231720ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPREFDIALOG_H__ #define __REMMINAPREFDIALOG_H__ /* * Remmina Perference Dialog */ G_BEGIN_DECLS #define REMMINA_TYPE_PREF_DIALOG (remmina_pref_dialog_get_type ()) #define REMMINA_PREF_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_PREF_DIALOG, RemminaPrefDialog)) #define REMMINA_PREF_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_PREF_DIALOG, RemminaPrefDialogClass)) #define REMMINA_IS_PREF_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_PREF_DIALOG)) #define REMMINA_IS_PREF_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_PREF_DIALOG)) #define REMMINA_PREF_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_PREF_DIALOG, RemminaPrefDialogClass)) typedef struct _RemminaPrefDialogPriv RemminaPrefDialogPriv; typedef struct _RemminaPrefDialog { GtkDialog dialog; RemminaPrefDialogPriv *priv; } RemminaPrefDialog; typedef struct _RemminaPrefDialogClass { GtkDialogClass parent_class; } RemminaPrefDialogClass; GType remmina_pref_dialog_get_type(void) G_GNUC_CONST; enum { REMMINA_PREF_OPTIONS_TAB = 0, REMMINA_PREF_RESOLUTIONS_TAB = 1, REMMINA_PREF_APPLET_TAB = 2 }; GtkWidget* remmina_pref_dialog_new(gint default_tab); G_END_DECLS #endif /* __REMMINAPREFDIALOG_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_protocol_widget.c000066400000000000000000000661671171526373700241320ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include #include "config.h" #include "remmina_public.h" #include "remmina_pref.h" #include "remmina_ssh.h" #include "remmina_chat_window.h" #include "remmina_plugin_manager.h" #include "remmina_connection_window.h" #include "remmina_protocol_widget.h" struct _RemminaProtocolWidgetPriv { GtkWidget* init_dialog; RemminaFile* remmina_file; RemminaProtocolPlugin* plugin; RemminaProtocolFeature* features; gint width; gint height; gboolean scale; gboolean expand; gboolean has_error; gchar* error_message; RemminaSSHTunnel* ssh_tunnel; RemminaTunnelInitFunc init_func; GtkWidget* chat_window; gboolean closed; RemminaHostkeyFunc hostkey_func; gpointer hostkey_func_data; }; G_DEFINE_TYPE(RemminaProtocolWidget, remmina_protocol_widget, GTK_TYPE_EVENT_BOX) enum { CONNECT_SIGNAL, DISCONNECT_SIGNAL, DESKTOP_RESIZE_SIGNAL, UPDATE_ALIGN_SIGNAL, LAST_SIGNAL }; typedef struct _RemminaProtocolWidgetSignalData { RemminaProtocolWidget* gp; const gchar* signal_name; } RemminaProtocolWidgetSignalData; static guint remmina_protocol_widget_signals[LAST_SIGNAL] = { 0 }; static void remmina_protocol_widget_class_init(RemminaProtocolWidgetClass *klass) { remmina_protocol_widget_signals[CONNECT_SIGNAL] = g_signal_new("connect", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, connect), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); remmina_protocol_widget_signals[DISCONNECT_SIGNAL] = g_signal_new("disconnect", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, disconnect), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); remmina_protocol_widget_signals[DESKTOP_RESIZE_SIGNAL] = g_signal_new("desktop-resize", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, desktop_resize), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); remmina_protocol_widget_signals[UPDATE_ALIGN_SIGNAL] = g_signal_new("update-align", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaProtocolWidgetClass, update_align), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static void remmina_protocol_widget_init_cancel(RemminaInitDialog *dialog, gint response_id, RemminaProtocolWidget* gp) { if ((response_id == GTK_RESPONSE_CANCEL || response_id == GTK_RESPONSE_DELETE_EVENT) && dialog->mode == REMMINA_INIT_MODE_CONNECTING) { remmina_protocol_widget_close_connection(gp); } } static void remmina_protocol_widget_show_init_dialog(RemminaProtocolWidget* gp, const gchar *name) { if (gp->priv->init_dialog) { gtk_widget_destroy(gp->priv->init_dialog); } gp->priv->init_dialog = remmina_init_dialog_new(_("Connecting to '%s'..."), (name ? name : "*")); g_signal_connect(G_OBJECT(gp->priv->init_dialog), "response", G_CALLBACK(remmina_protocol_widget_init_cancel), gp); gtk_widget_show(gp->priv->init_dialog); } static void remmina_protocol_widget_hide_init_dialog(RemminaProtocolWidget* gp) { if (gp->priv->init_dialog && GTK_IS_WIDGET(gp->priv->init_dialog)) gtk_widget_destroy(gp->priv->init_dialog); gp->priv->init_dialog = NULL; } static void remmina_protocol_widget_destroy(RemminaProtocolWidget* gp, gpointer data) { remmina_protocol_widget_hide_init_dialog(gp); g_free(gp->priv->features); g_free(gp->priv->error_message); g_free(gp->priv); } static void remmina_protocol_widget_connect(RemminaProtocolWidget* gp, gpointer data) { #ifdef HAVE_LIBSSH if (gp->priv->ssh_tunnel) { remmina_ssh_tunnel_cancel_accept (gp->priv->ssh_tunnel); } #endif remmina_protocol_widget_hide_init_dialog(gp); } static void remmina_protocol_widget_disconnect(RemminaProtocolWidget* gp, gpointer data) { remmina_protocol_widget_hide_init_dialog(gp); } void remmina_protocol_widget_grab_focus(RemminaProtocolWidget* gp) { GtkWidget* child; child = gtk_bin_get_child(GTK_BIN(gp)); if (child) { gtk_widget_set_can_focus(child, TRUE); gtk_widget_grab_focus(child); } } static void remmina_protocol_widget_init(RemminaProtocolWidget* gp) { RemminaProtocolWidgetPriv *priv; priv = g_new0(RemminaProtocolWidgetPriv, 1); gp->priv = priv; g_signal_connect(G_OBJECT(gp), "destroy", G_CALLBACK(remmina_protocol_widget_destroy), NULL); g_signal_connect(G_OBJECT(gp), "connect", G_CALLBACK(remmina_protocol_widget_connect), NULL); g_signal_connect(G_OBJECT(gp), "disconnect", G_CALLBACK(remmina_protocol_widget_disconnect), NULL); } void remmina_protocol_widget_open_connection_real(gpointer data) { RemminaProtocolWidget* gp = REMMINA_PROTOCOL_WIDGET(data); RemminaProtocolPlugin* plugin; RemminaFile* remminafile = gp->priv->remmina_file; RemminaProtocolFeature* feature; gint num_plugin; gint num_ssh; /* Locate the protocol plugin */ plugin = (RemminaProtocolPlugin*) remmina_plugin_manager_get_plugin(REMMINA_PLUGIN_TYPE_PROTOCOL, remmina_file_get_string(remminafile, "protocol")); if (!plugin || !plugin->init || !plugin->open_connection) { remmina_protocol_widget_set_error(gp, _("Protocol plugin %s is not installed."), remmina_file_get_string(remminafile, "protocol")); remmina_protocol_widget_close_connection(gp); return; } plugin->init(gp); gp->priv->plugin = plugin; for (num_plugin = 0, feature = (RemminaProtocolFeature*) plugin->features; feature && feature->type; num_plugin++, feature++) { } num_ssh = 0; #ifdef HAVE_LIBSSH if (remmina_file_get_int(gp->priv->remmina_file, "ssh_enabled", FALSE)) { num_ssh += 2; } #endif if (num_plugin + num_ssh == 0) { gp->priv->features = NULL; } else { gp->priv->features = g_new0(RemminaProtocolFeature, num_plugin + num_ssh + 1); feature = gp->priv->features; if (plugin->features) { memcpy(feature, plugin->features, sizeof(RemminaProtocolFeature) * num_plugin); feature += num_plugin; } #ifdef HAVE_LIBSSH if (num_ssh) { feature->type = REMMINA_PROTOCOL_FEATURE_TYPE_TOOL; feature->id = REMMINA_PROTOCOL_FEATURE_TOOL_SSH; feature->opt1 = _("Open Secure Shell in New Terminal..."); feature->opt2 = "utilities-terminal"; feature++; feature->type = REMMINA_PROTOCOL_FEATURE_TYPE_TOOL; feature->id = REMMINA_PROTOCOL_FEATURE_TOOL_SFTP; feature->opt1 = _("Open Secure File Transfer..."); feature->opt2 = "folder-remote"; feature++; } feature->type = REMMINA_PROTOCOL_FEATURE_TYPE_END; #endif } if (!plugin->open_connection(gp)) { remmina_protocol_widget_close_connection(gp); } } void remmina_protocol_widget_open_connection(RemminaProtocolWidget* gp, RemminaFile* remminafile) { gp->priv->remmina_file = remminafile; gp->priv->scale = remmina_file_get_int(remminafile, "scale", FALSE); remmina_protocol_widget_show_init_dialog(gp, remmina_file_get_string(remminafile, "name")); remmina_protocol_widget_open_connection_real(gp); } gboolean remmina_protocol_widget_close_connection(RemminaProtocolWidget* gp) { if (!GTK_IS_WIDGET(gp) || gp->priv->closed) return FALSE; gp->priv->closed = TRUE; gdk_keyboard_ungrab(GDK_CURRENT_TIME); if (gp->priv->chat_window) { gtk_widget_destroy(gp->priv->chat_window); gp->priv->chat_window = NULL; } #ifdef HAVE_LIBSSH if (gp->priv->ssh_tunnel) { remmina_ssh_tunnel_free(gp->priv->ssh_tunnel); gp->priv->ssh_tunnel = NULL; } #endif if (!gp->priv->plugin || !gp->priv->plugin->close_connection) { remmina_protocol_widget_emit_signal(gp, "disconnect"); return FALSE; } return gp->priv->plugin->close_connection(gp); } static gboolean remmina_protocol_widget_emit_signal_timeout(gpointer user_data) { RemminaProtocolWidgetSignalData* data = (RemminaProtocolWidgetSignalData*) user_data; g_signal_emit_by_name(G_OBJECT(data->gp), data->signal_name); g_free(data); return FALSE; } void remmina_protocol_widget_emit_signal(RemminaProtocolWidget* gp, const gchar* signal_name) { RemminaProtocolWidgetSignalData* data; data = g_new(RemminaProtocolWidgetSignalData, 1); data->gp = gp; data->signal_name = signal_name; TIMEOUT_ADD(0, remmina_protocol_widget_emit_signal_timeout, data); } const RemminaProtocolFeature* remmina_protocol_widget_get_features(RemminaProtocolWidget* gp) { return gp->priv->features; } const gchar* remmina_protocol_widget_get_domain(RemminaProtocolWidget* gp) { return gp->priv->plugin->domain; } gboolean remmina_protocol_widget_query_feature_by_type(RemminaProtocolWidget* gp, RemminaProtocolFeatureType type) { const RemminaProtocolFeature *feature; #ifdef HAVE_LIBSSH if (type == REMMINA_PROTOCOL_FEATURE_TYPE_TOOL && remmina_file_get_int (gp->priv->remmina_file, "ssh_enabled", FALSE)) { return TRUE; } #endif for (feature = gp->priv->plugin->features; feature && feature->type; feature++) { if (feature->type == type) return TRUE; } return FALSE; } gboolean remmina_protocol_widget_query_feature_by_ref(RemminaProtocolWidget* gp, const RemminaProtocolFeature *feature) { return gp->priv->plugin->query_feature(gp, feature); } void remmina_protocol_widget_call_feature_by_type(RemminaProtocolWidget* gp, RemminaProtocolFeatureType type, gint id) { const RemminaProtocolFeature *feature; for (feature = gp->priv->plugin->features; feature && feature->type; feature++) { if (feature->type == type && (id == 0 || feature->id == id)) { remmina_protocol_widget_call_feature_by_ref(gp, feature); break; } } } void remmina_protocol_widget_call_feature_by_ref(RemminaProtocolWidget* gp, const RemminaProtocolFeature *feature) { switch (feature->id) { #ifdef HAVE_LIBSSH case REMMINA_PROTOCOL_FEATURE_TOOL_SSH: if (gp->priv->ssh_tunnel) { remmina_connection_window_open_from_file_full ( remmina_file_dup_temp_protocol (gp->priv->remmina_file, "SSH"), NULL, gp->priv->ssh_tunnel, NULL); return; } break; case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP: if (gp->priv->ssh_tunnel) { remmina_connection_window_open_from_file_full ( remmina_file_dup_temp_protocol (gp->priv->remmina_file, "SFTP"), NULL, gp->priv->ssh_tunnel, NULL); return; } break; #endif default: break; } gp->priv->plugin->call_feature(gp, feature); } static gboolean remmina_protocol_widget_on_key_press(GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget* gp) { if (gp->priv->hostkey_func) { return gp->priv->hostkey_func(gp, event->keyval, FALSE, gp->priv->hostkey_func_data); } return FALSE; } static gboolean remmina_protocol_widget_on_key_release(GtkWidget *widget, GdkEventKey *event, RemminaProtocolWidget* gp) { if (gp->priv->hostkey_func) { return gp->priv->hostkey_func(gp, event->keyval, TRUE, gp->priv->hostkey_func_data); } return FALSE; } void remmina_protocol_widget_register_hostkey(RemminaProtocolWidget* gp, GtkWidget *widget) { g_signal_connect(G_OBJECT(widget), "key-press-event", G_CALLBACK(remmina_protocol_widget_on_key_press), gp); g_signal_connect(G_OBJECT(widget), "key-release-event", G_CALLBACK(remmina_protocol_widget_on_key_release), gp); } void remmina_protocol_widget_set_hostkey_func(RemminaProtocolWidget* gp, RemminaHostkeyFunc func, gpointer data) { gp->priv->hostkey_func = func; gp->priv->hostkey_func_data = data; } #ifdef HAVE_LIBSSH static gboolean remmina_protocol_widget_init_tunnel (RemminaProtocolWidget* gp) { RemminaSSHTunnel *tunnel; gint ret; /* Reuse existing SSH connection if it's reconnecting to destination */ if (gp->priv->ssh_tunnel == NULL) { tunnel = remmina_ssh_tunnel_new_from_file (gp->priv->remmina_file); THREADS_ENTER remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog), _("Connecting to SSH server %s..."), REMMINA_SSH (tunnel)->server); THREADS_LEAVE if (!remmina_ssh_init_session (REMMINA_SSH (tunnel))) { remmina_protocol_widget_set_error (gp, REMMINA_SSH (tunnel)->error); remmina_ssh_tunnel_free (tunnel); return FALSE; } ret = remmina_ssh_auth_gui (REMMINA_SSH (tunnel), REMMINA_INIT_DIALOG (gp->priv->init_dialog), TRUE); if (ret <= 0) { if (ret == 0) { remmina_protocol_widget_set_error (gp, REMMINA_SSH (tunnel)->error); } remmina_ssh_tunnel_free (tunnel); return FALSE; } gp->priv->ssh_tunnel = tunnel; } return TRUE; } #endif gchar* remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget* gp, gint default_port, gboolean port_plus) { const gchar *server; gchar *host, *dest; gint port; server = remmina_file_get_string(gp->priv->remmina_file, "server"); if (!server) { return g_strdup(""); } remmina_public_get_server_port(server, default_port, &host, &port); if (port_plus && port < 100) { /* Protocols like VNC supports using instance number :0, :1, etc as port number. */ port += default_port; } #ifdef HAVE_LIBSSH if (!remmina_file_get_int (gp->priv->remmina_file, "ssh_enabled", FALSE)) { dest = g_strdup_printf("[%s]:%i", host, port); g_free(host); return dest; } if (!remmina_protocol_widget_init_tunnel (gp)) { g_free(host); return NULL; } THREADS_ENTER remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog), _("Connecting to %s through SSH tunnel..."), server); THREADS_LEAVE if (remmina_file_get_int (gp->priv->remmina_file, "ssh_loopback", FALSE)) { g_free(host); host = g_strdup ("127.0.0.1"); } if (!remmina_ssh_tunnel_open (gp->priv->ssh_tunnel, host, port, remmina_pref.sshtunnel_port)) { g_free(host); remmina_protocol_widget_set_error (gp, REMMINA_SSH (gp->priv->ssh_tunnel)->error); return NULL; } g_free(host); return g_strdup_printf("127.0.0.1:%i", remmina_pref.sshtunnel_port); #else dest = g_strdup_printf("[%s]:%i", host, port); g_free(host); return dest; #endif } gboolean remmina_protocol_widget_start_reverse_tunnel(RemminaProtocolWidget* gp, gint local_port) { #ifdef HAVE_LIBSSH if (!remmina_file_get_int (gp->priv->remmina_file, "ssh_enabled", FALSE)) { return TRUE; } if (!remmina_protocol_widget_init_tunnel (gp)) { return FALSE; } THREADS_ENTER remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog), _("Waiting for an incoming SSH tunnel at port %i..."), remmina_file_get_int (gp->priv->remmina_file, "listenport", 0)); THREADS_LEAVE if (!remmina_ssh_tunnel_reverse (gp->priv->ssh_tunnel, remmina_file_get_int (gp->priv->remmina_file, "listenport", 0), local_port)) { remmina_protocol_widget_set_error (gp, REMMINA_SSH (gp->priv->ssh_tunnel)->error); return FALSE; } #endif return TRUE; } gboolean remmina_protocol_widget_ssh_exec(RemminaProtocolWidget* gp, gboolean wait, const gchar *fmt, ...) { #ifdef HAVE_LIBSSH RemminaSSHTunnel *tunnel = gp->priv->ssh_tunnel; ssh_channel channel; gint status; gboolean ret = FALSE; gchar *cmd, *ptr; va_list args; if ((channel = channel_new (REMMINA_SSH (tunnel)->session)) == NULL) { return FALSE; } va_start (args, fmt); cmd = g_strdup_vprintf (fmt, args); va_end (args); if (channel_open_session (channel) == SSH_OK && channel_request_exec (channel, cmd) == SSH_OK) { if (wait) { channel_send_eof (channel); status = channel_get_exit_status (channel); ptr = strchr (cmd, ' '); if (ptr) *ptr = '\0'; switch (status) { case 0: ret = TRUE; break; case 127: remmina_ssh_set_application_error (REMMINA_SSH (tunnel), _("Command %s not found on SSH server"), cmd); break; default: remmina_ssh_set_application_error (REMMINA_SSH (tunnel), _("Command %s failed on SSH server (status = %i)."), cmd,status); break; } } else { ret = TRUE; } } else { remmina_ssh_set_error (REMMINA_SSH (tunnel), _("Failed to execute command: %s")); } g_free(cmd); if (wait) channel_close (channel); channel_free (channel); return ret; #else return FALSE; #endif } #ifdef HAVE_LIBSSH static gboolean remmina_protocol_widget_tunnel_init_callback (RemminaSSHTunnel *tunnel, gpointer data) { RemminaProtocolWidget* gp = REMMINA_PROTOCOL_WIDGET (data); gchar *server; gint port; gboolean ret; remmina_public_get_server_port (remmina_file_get_string (gp->priv->remmina_file, "server"), 177, &server, &port); ret = ((RemminaXPortTunnelInitFunc) gp->priv->init_func) (gp, tunnel->remotedisplay, (tunnel->bindlocalhost ? "localhost" : server), port); g_free(server); return ret; } static gboolean remmina_protocol_widget_tunnel_connect_callback(RemminaSSHTunnel* tunnel, gpointer data) { return TRUE; } static gboolean remmina_protocol_widget_tunnel_disconnect_callback(RemminaSSHTunnel* tunnel, gpointer data) { RemminaProtocolWidget* gp = REMMINA_PROTOCOL_WIDGET (data); if (REMMINA_SSH (tunnel)->error) { remmina_protocol_widget_set_error (gp, "%s", REMMINA_SSH (tunnel)->error); } IDLE_ADD ((GSourceFunc) remmina_protocol_widget_close_connection, gp); return TRUE; } #endif gboolean remmina_protocol_widget_start_xport_tunnel(RemminaProtocolWidget* gp, RemminaXPortTunnelInitFunc init_func) { #ifdef HAVE_LIBSSH gboolean bindlocalhost; gchar *server; if (!remmina_protocol_widget_init_tunnel (gp)) return FALSE; THREADS_ENTER remmina_init_dialog_set_status (REMMINA_INIT_DIALOG (gp->priv->init_dialog), _("Connecting to %s through SSH tunnel..."), remmina_file_get_string (gp->priv->remmina_file, "server")); THREADS_LEAVE gp->priv->init_func = init_func; gp->priv->ssh_tunnel->init_func = remmina_protocol_widget_tunnel_init_callback; gp->priv->ssh_tunnel->connect_func = remmina_protocol_widget_tunnel_connect_callback; gp->priv->ssh_tunnel->disconnect_func = remmina_protocol_widget_tunnel_disconnect_callback; gp->priv->ssh_tunnel->callback_data = gp; remmina_public_get_server_port (remmina_file_get_string (gp->priv->remmina_file, "server"), 0, &server, NULL); bindlocalhost = (g_strcmp0(REMMINA_SSH (gp->priv->ssh_tunnel)->server, server) == 0); g_free(server); if (!remmina_ssh_tunnel_xport (gp->priv->ssh_tunnel, bindlocalhost)) { remmina_protocol_widget_set_error (gp, "Failed to open channel : %s", ssh_get_error (REMMINA_SSH (gp->priv->ssh_tunnel)->session)); return FALSE; } return TRUE; #else return FALSE; #endif } void remmina_protocol_widget_set_display(RemminaProtocolWidget* gp, gint display) { #ifdef HAVE_LIBSSH if (gp->priv->ssh_tunnel->localdisplay) g_free(gp->priv->ssh_tunnel->localdisplay); gp->priv->ssh_tunnel->localdisplay = g_strdup_printf("unix:%i", display); #endif } GtkWidget* remmina_protocol_widget_get_init_dialog(RemminaProtocolWidget* gp) { return gp->priv->init_dialog; } gint remmina_protocol_widget_get_width(RemminaProtocolWidget* gp) { return gp->priv->width; } void remmina_protocol_widget_set_width(RemminaProtocolWidget* gp, gint width) { gp->priv->width = width; } gint remmina_protocol_widget_get_height(RemminaProtocolWidget* gp) { return gp->priv->height; } void remmina_protocol_widget_set_height(RemminaProtocolWidget* gp, gint height) { gp->priv->height = height; } gboolean remmina_protocol_widget_get_scale(RemminaProtocolWidget* gp) { return gp->priv->scale; } void remmina_protocol_widget_set_scale(RemminaProtocolWidget* gp, gboolean scale) { gp->priv->scale = scale; } gboolean remmina_protocol_widget_get_expand(RemminaProtocolWidget* gp) { return gp->priv->expand; } void remmina_protocol_widget_set_expand(RemminaProtocolWidget* gp, gboolean expand) { gp->priv->expand = expand; } gboolean remmina_protocol_widget_has_error(RemminaProtocolWidget* gp) { return gp->priv->has_error; } gchar* remmina_protocol_widget_get_error_message(RemminaProtocolWidget* gp) { return gp->priv->error_message; } void remmina_protocol_widget_set_error(RemminaProtocolWidget* gp, const gchar *fmt, ...) { va_list args; if (gp->priv->error_message) g_free(gp->priv->error_message); va_start (args, fmt); gp->priv->error_message = g_strdup_vprintf (fmt, args); va_end (args); gp->priv->has_error = TRUE; } gboolean remmina_protocol_widget_is_closed(RemminaProtocolWidget* gp) { return gp->priv->closed; } RemminaFile* remmina_protocol_widget_get_file(RemminaProtocolWidget* gp) { return gp->priv->remmina_file; } gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget* gp, RemminaAuthpwdType authpwd_type) { RemminaFile* remminafile = gp->priv->remmina_file; gchar* s; gint ret; switch (authpwd_type) { case REMMINA_AUTHPWD_TYPE_PROTOCOL: s = g_strdup_printf(_("%s password"), remmina_file_get_string(remminafile, "protocol")); break; case REMMINA_AUTHPWD_TYPE_SSH_PWD: s = g_strdup(_("SSH password")); break; case REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY: s = g_strdup(_("SSH private key passphrase")); break; default: s = g_strdup(_("Password")); break; } ret = remmina_init_dialog_authpwd( REMMINA_INIT_DIALOG(gp->priv->init_dialog), s, remmina_file_get_filename(remminafile) != NULL && authpwd_type != REMMINA_AUTHPWD_TYPE_SSH_PWD && authpwd_type != REMMINA_AUTHPWD_TYPE_SSH_PRIVKEY); g_free(s); return ret; } gint remmina_protocol_widget_init_authuserpwd(RemminaProtocolWidget* gp, gboolean want_domain) { RemminaFile* remminafile = gp->priv->remmina_file; return remmina_init_dialog_authuserpwd(REMMINA_INIT_DIALOG(gp->priv->init_dialog), want_domain, remmina_file_get_string(remminafile, "username"), want_domain ? remmina_file_get_string(remminafile, "domain") : NULL, (remmina_file_get_filename(remminafile) != NULL)); } gint remmina_protocol_widget_init_certificate(RemminaProtocolWidget* gp, const gchar* subject, const gchar* issuer, const gchar* fingerprint) { return remmina_init_dialog_certificate(REMMINA_INIT_DIALOG(gp->priv->init_dialog), subject, issuer, fingerprint); } gchar* remmina_protocol_widget_init_get_username(RemminaProtocolWidget* gp) { return g_strdup(REMMINA_INIT_DIALOG(gp->priv->init_dialog)->username); } gchar* remmina_protocol_widget_init_get_password(RemminaProtocolWidget* gp) { return g_strdup(REMMINA_INIT_DIALOG(gp->priv->init_dialog)->password); } gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget* gp) { return g_strdup(REMMINA_INIT_DIALOG(gp->priv->init_dialog)->domain); } gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget* gp) { RemminaFile* remminafile = gp->priv->remmina_file; return remmina_init_dialog_authx509(REMMINA_INIT_DIALOG(gp->priv->init_dialog), remmina_file_get_string(remminafile, "cacert"), remmina_file_get_string(remminafile, "cacrl"), remmina_file_get_string(remminafile, "clientcert"), remmina_file_get_string(remminafile, "clientkey")); } gchar* remmina_protocol_widget_init_get_cacert(RemminaProtocolWidget* gp) { gchar* s; s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->cacert; return (s && s[0] ? g_strdup(s) : NULL); } gchar* remmina_protocol_widget_init_get_cacrl(RemminaProtocolWidget* gp) { gchar* s; s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->cacrl; return (s && s[0] ? g_strdup(s) : NULL); } gchar* remmina_protocol_widget_init_get_clientcert(RemminaProtocolWidget* gp) { gchar* s; s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->clientcert; return (s && s[0] ? g_strdup(s) : NULL); } gchar* remmina_protocol_widget_init_get_clientkey(RemminaProtocolWidget* gp) { gchar* s; s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->clientkey; return (s && s[0] ? g_strdup(s) : NULL); } void remmina_protocol_widget_init_save_cred(RemminaProtocolWidget* gp) { RemminaFile* remminafile = gp->priv->remmina_file; gchar* s; gboolean save = FALSE; /* Save user name and certificates if any; save the password if it's requested to do so */ s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->username; if (s && s[0]) { remmina_file_set_string(remminafile, "username", s); save = TRUE; } s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->cacert; if (s && s[0]) { remmina_file_set_string(remminafile, "cacert", s); save = TRUE; } s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->cacrl; if (s && s[0]) { remmina_file_set_string(remminafile, "cacrl", s); save = TRUE; } s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->clientcert; if (s && s[0]) { remmina_file_set_string(remminafile, "clientcert", s); save = TRUE; } s = REMMINA_INIT_DIALOG(gp->priv->init_dialog)->clientkey; if (s && s[0]) { remmina_file_set_string(remminafile, "clientkey", s); save = TRUE; } if (REMMINA_INIT_DIALOG(gp->priv->init_dialog)->save_password) { remmina_file_set_string(remminafile, "password", REMMINA_INIT_DIALOG(gp->priv->init_dialog)->password); save = TRUE; } if (save) { remmina_file_save_group(remminafile, REMMINA_SETTING_GROUP_CREDENTIAL); } } void remmina_protocol_widget_init_show_listen(RemminaProtocolWidget* gp, gint port) { remmina_init_dialog_set_status(REMMINA_INIT_DIALOG(gp->priv->init_dialog), _("Listening on port %i for an incoming %s connection..."), port, remmina_file_get_string(gp->priv->remmina_file, "protocol")); } void remmina_protocol_widget_init_show_retry(RemminaProtocolWidget* gp) { remmina_init_dialog_set_status_temp(REMMINA_INIT_DIALOG(gp->priv->init_dialog), _("Authentication failed. Trying to reconnect...")); } void remmina_protocol_widget_init_show(RemminaProtocolWidget* gp) { gtk_widget_show(gp->priv->init_dialog); } void remmina_protocol_widget_init_hide(RemminaProtocolWidget* gp) { gtk_widget_hide(gp->priv->init_dialog); } static void remmina_protocol_widget_chat_on_destroy(RemminaProtocolWidget* gp) { gp->priv->chat_window = NULL; } void remmina_protocol_widget_chat_open(RemminaProtocolWidget* gp, const gchar *name, void(*on_send)(RemminaProtocolWidget* gp, const gchar *text), void(*on_destroy)(RemminaProtocolWidget* gp)) { if (gp->priv->chat_window) { gtk_window_present(GTK_WINDOW(gp->priv->chat_window)); } else { gp->priv->chat_window = remmina_chat_window_new(GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(gp))), name); g_signal_connect_swapped(G_OBJECT(gp->priv->chat_window), "send", G_CALLBACK(on_send), gp); g_signal_connect_swapped(G_OBJECT(gp->priv->chat_window), "destroy", G_CALLBACK(remmina_protocol_widget_chat_on_destroy), gp); g_signal_connect_swapped(G_OBJECT(gp->priv->chat_window), "destroy", G_CALLBACK(on_destroy), gp); gtk_widget_show(gp->priv->chat_window); } } void remmina_protocol_widget_chat_close(RemminaProtocolWidget* gp) { if (gp->priv->chat_window) { gtk_widget_destroy(gp->priv->chat_window); } } void remmina_protocol_widget_chat_receive(RemminaProtocolWidget* gp, const gchar* text) { if (gp->priv->chat_window) { remmina_chat_window_receive(REMMINA_CHAT_WINDOW(gp->priv->chat_window), _("Server"), text); gtk_window_present(GTK_WINDOW(gp->priv->chat_window)); } } GtkWidget* remmina_protocol_widget_new(void) { return GTK_WIDGET(g_object_new(REMMINA_TYPE_PROTOCOL_WIDGET, NULL)); } FreeRDP-Remmina-356c033/remmina/src/remmina_protocol_widget.h000066400000000000000000000161721171526373700241260ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPROTOCOLWIDGET_H__ #define __REMMINAPROTOCOLWIDGET_H__ #include "remmina_init_dialog.h" #include "remmina_file.h" #include "remmina_ssh.h" G_BEGIN_DECLS #define REMMINA_PROTOCOL_FEATURE_TOOL_SSH -1 #define REMMINA_PROTOCOL_FEATURE_TOOL_SFTP -2 #define REMMINA_TYPE_PROTOCOL_WIDGET (remmina_protocol_widget_get_type ()) #define REMMINA_PROTOCOL_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_PROTOCOL_WIDGET, RemminaProtocolWidget)) #define REMMINA_PROTOCOL_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_PROTOCOL_WIDGET, RemminaProtocolWidgetClass)) #define REMMINA_IS_PROTOCOL_WIDGET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_PROTOCOL_WIDGET)) #define REMMINA_IS_PROTOCOL_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_PROTOCOL_WIDGET)) #define REMMINA_PROTOCOL_WIDGET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_PROTOCOL_WIDGET, RemminaProtocolWidgetClass)) typedef struct _RemminaProtocolWidgetPriv RemminaProtocolWidgetPriv; struct _RemminaProtocolWidget { GtkEventBox event_box; RemminaProtocolWidgetPriv *priv; }; struct _RemminaProtocolWidgetClass { GtkEventBoxClass parent_class; void (*connect)(RemminaProtocolWidget *gp); void (*disconnect)(RemminaProtocolWidget *gp); void (*desktop_resize)(RemminaProtocolWidget *gp); void (*update_align)(RemminaProtocolWidget *gp); }; GType remmina_protocol_widget_get_type(void) G_GNUC_CONST; GtkWidget* remmina_protocol_widget_new(void); GtkWidget* remmina_protocol_widget_get_init_dialog(RemminaProtocolWidget *gp); gint remmina_protocol_widget_get_width(RemminaProtocolWidget *gp); void remmina_protocol_widget_set_width(RemminaProtocolWidget *gp, gint width); gint remmina_protocol_widget_get_height(RemminaProtocolWidget *gp); void remmina_protocol_widget_set_height(RemminaProtocolWidget *gp, gint height); gboolean remmina_protocol_widget_get_scale(RemminaProtocolWidget *gp); void remmina_protocol_widget_set_scale(RemminaProtocolWidget *gp, gboolean scale); gboolean remmina_protocol_widget_get_expand(RemminaProtocolWidget *gp); void remmina_protocol_widget_set_expand(RemminaProtocolWidget *gp, gboolean expand); gboolean remmina_protocol_widget_has_error(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_get_error_message(RemminaProtocolWidget *gp); void remmina_protocol_widget_set_error(RemminaProtocolWidget *gp, const gchar *fmt, ...); gboolean remmina_protocol_widget_is_closed(RemminaProtocolWidget *gp); RemminaFile* remmina_protocol_widget_get_file(RemminaProtocolWidget *gp); void remmina_protocol_widget_open_connection(RemminaProtocolWidget *gp, RemminaFile *remminafile); gboolean remmina_protocol_widget_close_connection(RemminaProtocolWidget *gp); void remmina_protocol_widget_grab_focus(RemminaProtocolWidget *gp); const RemminaProtocolFeature* remmina_protocol_widget_get_features(RemminaProtocolWidget *gp); const gchar* remmina_protocol_widget_get_domain(RemminaProtocolWidget *gp); gboolean remmina_protocol_widget_query_feature_by_type(RemminaProtocolWidget *gp, RemminaProtocolFeatureType type); gboolean remmina_protocol_widget_query_feature_by_ref(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature); void remmina_protocol_widget_call_feature_by_type(RemminaProtocolWidget *gp, RemminaProtocolFeatureType type, gint id); void remmina_protocol_widget_call_feature_by_ref(RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature); /* Provide thread-safe way to emit signals */ void remmina_protocol_widget_emit_signal(RemminaProtocolWidget *gp, const gchar *signal); void remmina_protocol_widget_register_hostkey(RemminaProtocolWidget *gp, GtkWidget *widget); typedef gboolean (*RemminaHostkeyFunc)(RemminaProtocolWidget *gp, guint keyval, gboolean release, gpointer data); void remmina_protocol_widget_set_hostkey_func(RemminaProtocolWidget *gp, RemminaHostkeyFunc func, gpointer data); gboolean remmina_protocol_widget_ssh_exec(RemminaProtocolWidget *gp, gboolean wait, const gchar *fmt, ...); /* Start a SSH tunnel if it's enabled. Returns a newly allocated string indicating: * 1. The actual destination (host:port) if SSH tunnel is disable * 2. The tunnel local destination (127.0.0.1:port) if SSH tunnel is enabled */ gchar* remmina_protocol_widget_start_direct_tunnel(RemminaProtocolWidget *gp, gint default_port, gboolean port_plus); gboolean remmina_protocol_widget_start_reverse_tunnel(RemminaProtocolWidget *gp, gint local_port); gboolean remmina_protocol_widget_start_xport_tunnel(RemminaProtocolWidget *gp, RemminaXPortTunnelInitFunc init_func); void remmina_protocol_widget_set_display(RemminaProtocolWidget *gp, gint display); gint remmina_protocol_widget_init_authpwd(RemminaProtocolWidget *gp, RemminaAuthpwdType authpwd_type); gint remmina_protocol_widget_init_authuserpwd(RemminaProtocolWidget *gp, gboolean want_domain); gint remmina_protocol_widget_init_certificate(RemminaProtocolWidget* gp, const gchar* subject, const gchar* issuer, const gchar* fingerprint); gchar* remmina_protocol_widget_init_get_username(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_password(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_domain(RemminaProtocolWidget *gp); gint remmina_protocol_widget_init_authx509(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_cacert(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_cacrl(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_clientcert(RemminaProtocolWidget *gp); gchar* remmina_protocol_widget_init_get_clientkey(RemminaProtocolWidget *gp); void remmina_protocol_widget_init_save_cred(RemminaProtocolWidget *gp); void remmina_protocol_widget_init_show_listen(RemminaProtocolWidget *gp, gint port); void remmina_protocol_widget_init_show_retry(RemminaProtocolWidget *gp); void remmina_protocol_widget_init_show(RemminaProtocolWidget *gp); void remmina_protocol_widget_init_hide(RemminaProtocolWidget *gp); void remmina_protocol_widget_chat_open(RemminaProtocolWidget *gp, const gchar *name, void(*on_send)(RemminaProtocolWidget *gp, const gchar *text), void(*on_destroy)(RemminaProtocolWidget *gp)); void remmina_protocol_widget_chat_close(RemminaProtocolWidget *gp); void remmina_protocol_widget_chat_receive(RemminaProtocolWidget *gp, const gchar *text); G_END_DECLS #endif /* __REMMINAPROTOCOLWIDGET_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_public.c000066400000000000000000000277401171526373700221760ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #include #include #include #include #include #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_SYS_UN_H #include #endif #ifdef GDK_WINDOWING_X11 #include #include #include #include #endif #include "remmina_public.h" GtkWidget* remmina_public_create_combo_entry(const gchar *text, const gchar *def, gboolean descending) { GtkWidget *combo; gboolean found; gchar *buf, *ptr1, *ptr2; gint i; combo = gtk_combo_box_text_new_with_entry(); found = FALSE; if (text && text[0] != '\0') { buf = g_strdup(text); ptr1 = buf; i = 0; while (ptr1 && *ptr1 != '\0') { ptr2 = strchr(ptr1, STRING_DELIMITOR); if (ptr2) *ptr2++ = '\0'; if (descending) { gtk_combo_box_text_prepend_text(GTK_COMBO_BOX_TEXT(combo), ptr1); if (!found && g_strcmp0(ptr1, def) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); found = TRUE; } } else { gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), ptr1); if (!found && g_strcmp0(ptr1, def) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); found = TRUE; } } ptr1 = ptr2; i++; } g_free(buf); } if (!found && def && def[0] != '\0') { gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo))), def); } return combo; } GtkWidget* remmina_public_create_combo_text_d(const gchar *text, const gchar *def, const gchar *empty_choice) { GtkWidget *combo; GtkListStore *store; GtkCellRenderer *text_renderer; store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); text_renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_end(GTK_CELL_LAYOUT(combo), text_renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), text_renderer, "text", 1); remmina_public_load_combo_text_d(combo, text, def, empty_choice); return combo; } void remmina_public_load_combo_text_d(GtkWidget *combo, const gchar *text, const gchar *def, const gchar *empty_choice) { GtkListStore *store; GtkTreeIter iter; gint i; gchar *buf, *ptr1, *ptr2; store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo))); gtk_list_store_clear(store); i = 0; if (empty_choice) { gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, "", 1, empty_choice, -1); gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); i++; } if (text == NULL || text[0] == '\0') return; buf = g_strdup(text); ptr1 = buf; while (ptr1 && *ptr1 != '\0') { ptr2 = strchr(ptr1, STRING_DELIMITOR); if (ptr2) *ptr2++ = '\0'; gtk_list_store_append(store, &iter); gtk_list_store_set(store, &iter, 0, ptr1, 1, ptr1, -1); if (i == 0 || g_strcmp0(ptr1, def) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i); } i++; ptr1 = ptr2; } g_free(buf); } GtkWidget* remmina_public_create_combo(gboolean use_icon) { GtkWidget *combo; GtkListStore *store; GtkCellRenderer *renderer; if (use_icon) { store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); } else { store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); } combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); if (use_icon) { renderer = gtk_cell_renderer_pixbuf_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, FALSE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "icon-name", 2); } renderer = gtk_cell_renderer_text_new(); gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE); gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo), renderer, "text", 1); if (use_icon) g_object_set(G_OBJECT(renderer), "xpad", 5, NULL); return combo; } GtkWidget* remmina_public_create_combo_map(const gpointer *key_value_list, const gchar *def, gboolean use_icon, const gchar *domain) { gint i; GtkWidget *combo; GtkListStore *store; GtkTreeIter iter; combo = remmina_public_create_combo(use_icon); store = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combo))); for (i = 0; key_value_list[i]; i += (use_icon ? 3 : 2)) { gtk_list_store_append(store, &iter); gtk_list_store_set( store, &iter, 0, key_value_list[i], 1, key_value_list[i + 1] && ((char*) key_value_list[i + 1])[0] ? g_dgettext(domain, key_value_list[i + 1]) : "", -1); if (use_icon) { gtk_list_store_set(store, &iter, 2, key_value_list[i + 2], -1); } if (i == 0 || g_strcmp0(key_value_list[i], def) == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(combo), i / (use_icon ? 3 : 2)); } } return combo; } GtkWidget* remmina_public_create_combo_mapint(const gpointer *key_value_list, gint def, gboolean use_icon, const gchar *domain) { gchar buf[20]; g_snprintf(buf, sizeof(buf), "%i", def); return remmina_public_create_combo_map(key_value_list, buf, use_icon, domain); } void remmina_public_create_group(GtkTable* table, const gchar *group, gint row, gint rows, gint cols) { GtkWidget *widget; gchar *str; widget = gtk_label_new(NULL); gtk_widget_show(widget); gtk_misc_set_alignment(GTK_MISC(widget), 0.0, 0.5); str = g_markup_printf_escaped("%s", group); gtk_label_set_markup(GTK_LABEL(widget), str); g_free(str); gtk_table_attach_defaults(table, widget, 0, cols, row, row + 1); widget = gtk_label_new(NULL); gtk_widget_show(widget); gtk_widget_set_size_request(widget, 15, -1); gtk_table_attach(table, widget, 0, 1, row + 1, row + rows, 0, 0, 0, 0); } gchar* remmina_public_combo_get_active_text(GtkComboBox *combo) { GtkTreeModel *model; GtkTreeIter iter; gchar *s; if (GTK_IS_COMBO_BOX_TEXT(combo)) { return gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo)); } if (!gtk_combo_box_get_active_iter(combo, &iter)) return NULL; model = gtk_combo_box_get_model(combo); gtk_tree_model_get(model, &iter, 0, &s, -1); return s; } void remmina_public_popup_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data) { GtkWidget *widget; gint tx, ty; GtkAllocation allocation; widget = GTK_WIDGET(user_data); if (gtk_widget_get_window(widget) == NULL) { *x = 0; *y = 0; *push_in = TRUE; return; } gdk_window_get_origin(gtk_widget_get_window(widget), &tx, &ty); gtk_widget_get_allocation(widget, &allocation); if (gtk_widget_get_has_window(widget)) { tx += allocation.x; ty += allocation.y; } *x = tx; *y = ty + allocation.height - 1; *push_in = TRUE; } gchar* remmina_public_combine_path(const gchar *path1, const gchar *path2) { if (!path1 || path1[0] == '\0') return g_strdup(path2); if (path1[strlen(path1) - 1] == '/') return g_strdup_printf("%s%s", path1, path2); return g_strdup_printf("%s/%s", path1, path2); } void remmina_public_threads_leave(void* data) { gdk_threads_leave(); } void remmina_public_get_server_port(const gchar *server, gint defaultport, gchar **host, gint *port) { gchar *str, *ptr, *ptr2; str = g_strdup(server); /* [server]:port format */ ptr = strchr(str, '['); if (ptr) { ptr++; ptr2 = strchr(ptr, ']'); if (ptr2) *ptr2++ = '\0'; if (*ptr2 == ':') defaultport = atoi(ptr2 + 1); if (host) *host = g_strdup(ptr); if (port) *port = defaultport; g_free(str); return; } /* server:port format, IPv6 cannot use this format */ ptr = strchr(str, ':'); if (ptr) { ptr2 = strchr(ptr + 1, ':'); if (ptr2 == NULL) { *ptr++ = '\0'; defaultport = atoi(ptr); } /* More than one ':' means this is IPv6 address. Treat it as a whole address */ } if (host) *host = str; if (port) *port = defaultport; } gboolean remmina_public_get_xauth_cookie(const gchar *display, gchar **msg) { gchar buf[200]; gchar *out = NULL; gchar *ptr; GError *error = NULL; gboolean ret; if (!display) display = gdk_get_display(); g_snprintf(buf, sizeof(buf), "xauth list %s", display); ret = g_spawn_command_line_sync(buf, &out, NULL, NULL, &error); if (ret) { if ((ptr = g_strrstr(out, "MIT-MAGIC-COOKIE-1")) == NULL) { *msg = g_strdup_printf("xauth returns %s", out); ret = FALSE; } else { ptr += 19; while (*ptr == ' ') ptr++; *msg = g_strndup(ptr, 32); } g_free(out); } else { *msg = g_strdup(error->message); } return ret; } gint remmina_public_open_xdisplay(const gchar *disp) { gchar *display; gchar *ptr; gint port; struct sockaddr_un addr; gint sock = -1; display = g_strdup(disp); ptr = g_strrstr(display, ":"); if (ptr) { *ptr++ = '\0'; /* Assume you are using a local display... might need to implement remote display in the future */ if (display[0] == '\0' || strcmp(display, "unix") == 0) { port = atoi(ptr); sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock >= 0) { memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; snprintf(addr.sun_path, sizeof(addr.sun_path), X_UNIX_SOCKET, port); if (connect(sock, (struct sockaddr *) &addr, sizeof(addr)) == -1) { close(sock); sock = -1; } } } } g_free(display); return sock; } /* This function was copied from GEdit (gedit-utils.c). */ guint remmina_public_get_current_workspace(GdkScreen *screen) { #ifdef GDK_WINDOWING_X11 GdkWindow *root_win; GdkDisplay *display; Atom type; gint format; gulong nitems; gulong bytes_after; guint *current_desktop; gint err, result; guint ret = 0; g_return_val_if_fail (GDK_IS_SCREEN (screen), 0); root_win = gdk_screen_get_root_window (screen); display = gdk_screen_get_display (screen); gdk_error_trap_push (); result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (root_win), gdk_x11_get_xatom_by_name_for_display (display, "_NET_CURRENT_DESKTOP"), 0, G_MAXLONG, False, XA_CARDINAL, &type, &format, &nitems, &bytes_after, (gpointer) ¤t_desktop); err = gdk_error_trap_pop (); if (err != Success || result != Success) return ret; if (type == XA_CARDINAL && format == 32 && nitems > 0) ret = current_desktop[0]; XFree (current_desktop); return ret; #else /* FIXME: on mac etc proably there are native APIs * to get the current workspace etc */ return 0; #endif } /* This function was copied from GEdit (gedit-utils.c). */ guint remmina_public_get_window_workspace(GtkWindow *gtkwindow) { #ifdef GDK_WINDOWING_X11 GdkWindow *window; GdkDisplay *display; Atom type; gint format; gulong nitems; gulong bytes_after; guint *workspace; gint err, result; guint ret = 0; g_return_val_if_fail (GTK_IS_WINDOW (gtkwindow), 0); g_return_val_if_fail (gtk_widget_get_realized (GTK_WIDGET (gtkwindow)), 0); window = gtk_widget_get_window (GTK_WIDGET (gtkwindow)); display = gdk_window_get_display (window); gdk_error_trap_push (); result = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_DESKTOP"), 0, G_MAXLONG, False, XA_CARDINAL, &type, &format, &nitems, &bytes_after, (gpointer) &workspace); err = gdk_error_trap_pop (); if (err != Success || result != Success) return ret; if (type == XA_CARDINAL && format == 32 && nitems > 0) ret = workspace[0]; XFree (workspace); return ret; #else /* FIXME: on mac etc proably there are native APIs * to get the current workspace etc */ return 0; #endif } FreeRDP-Remmina-356c033/remmina/src/remmina_public.h000066400000000000000000000066751171526373700222070ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAPUBLIC_H__ #define __REMMINAPUBLIC_H__ #include "config.h" /* Wrapper marcos to make the compiler happy on both signle/multi-threaded mode */ #ifdef HAVE_PTHREAD #define IDLE_ADD gdk_threads_add_idle #define TIMEOUT_ADD gdk_threads_add_timeout #define CANCEL_ASYNC pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,NULL);pthread_testcancel(); #define CANCEL_DEFER pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL); #define THREADS_ENTER gdk_threads_enter();pthread_cleanup_push(remmina_public_threads_leave,NULL); #define THREADS_LEAVE pthread_cleanup_pop(TRUE); #else #define IDLE_ADD g_idle_add #define TIMEOUT_ADD g_timeout_add #define CANCEL_ASYNC #define CANCEL_DEFER #define THREADS_ENTER #define THREADS_LEAVE #endif #define MAX_PATH_LEN 255 #define MAX_X_DISPLAY_NUMBER 99 #define X_UNIX_SOCKET "/tmp/.X11-unix/X%d" #define STRING_DELIMITOR ',' G_BEGIN_DECLS /* items is separated by STRING_DELIMTOR */ GtkWidget* remmina_public_create_combo_entry(const gchar *text, const gchar *def, gboolean descending); GtkWidget* remmina_public_create_combo_text_d(const gchar *text, const gchar *def, const gchar *empty_choice); void remmina_public_load_combo_text_d(GtkWidget *combo, const gchar *text, const gchar *def, const gchar *empty_choice); GtkWidget* remmina_public_create_combo(gboolean use_icon); GtkWidget* remmina_public_create_combo_map(const gpointer *key_value_list, const gchar *def, gboolean use_icon, const gchar *domain); GtkWidget* remmina_public_create_combo_mapint(const gpointer *key_value_list, gint def, gboolean use_icon, const gchar *domain); void remmina_public_create_group(GtkTable* table, const gchar *group, gint row, gint rows, gint cols); gchar* remmina_public_combo_get_active_text(GtkComboBox *combo); /* A function for gtk_menu_popup to get the position right below the widget specified by user_data */ void remmina_public_popup_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gpointer user_data); /* Combine two paths into one by correctly handling trailing slash. Return newly allocated string */ gchar* remmina_public_combine_path(const gchar *path1, const gchar *path2); /* Parse a server entry with server name and port */ void remmina_public_get_server_port(const gchar *server, gint defaultport, gchar **host, gint *port); /* X */ gboolean remmina_public_get_xauth_cookie(const gchar *display, gchar **msg); gint remmina_public_open_xdisplay(const gchar *disp); guint remmina_public_get_current_workspace(GdkScreen *screen); guint remmina_public_get_window_workspace(GtkWindow *gtkwindow); void remmina_public_threads_leave(void* data); G_END_DECLS #endif /* __REMMINAPUBLIC_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_scaler.c000066400000000000000000000134261171526373700221650ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_chain_button.h" #include "remmina_scaler.h" G_DEFINE_TYPE( RemminaScaler, remmina_scaler, GTK_TYPE_TABLE) #define MIN_SCALE_VALUE 0.05 struct _RemminaScalerPriv { GtkWidget *hscale_widget; GtkWidget *vscale_widget; GtkWidget *aspectscale_button; }; enum { SCALED_SIGNAL, LAST_SIGNAL }; static guint remmina_scaler_signals[LAST_SIGNAL] = { 0 }; static void remmina_scaler_class_init(RemminaScalerClass *klass) { remmina_scaler_signals[SCALED_SIGNAL] = g_signal_new("scaled", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION, G_STRUCT_OFFSET(RemminaScalerClass, scaled), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } static gchar* remmina_scaler_format_scale_value(GtkScale *scale, gdouble value, gpointer user_data) { if (value <= MIN_SCALE_VALUE) { return g_strdup(_("Fit window size")); } else { return g_strdup_printf("%.2f", value); } } static void remmina_scaler_on_chain_changed(RemminaChainButton *cb, RemminaScaler *scaler) { scaler->aspectscale = cb->chained; if (cb->chained) { gtk_range_set_value(GTK_RANGE(scaler->priv->vscale_widget), gtk_range_get_value(GTK_RANGE(scaler->priv->hscale_widget))); } g_signal_emit(G_OBJECT(scaler), remmina_scaler_signals[SCALED_SIGNAL], 0); } static void remmina_scaler_on_hscale_value_changed(GtkWidget *widget, RemminaScaler *scaler) { gdouble value; value = gtk_range_get_value(GTK_RANGE(scaler->priv->hscale_widget)); scaler->hscale = (value <= MIN_SCALE_VALUE ? 0 : (gint)(value * 100.0)); if (REMMINA_CHAIN_BUTTON(scaler->priv->aspectscale_button)->chained && gtk_range_get_value(GTK_RANGE(scaler->priv->hscale_widget)) != gtk_range_get_value(GTK_RANGE(scaler->priv->vscale_widget))) { gtk_range_set_value(GTK_RANGE(scaler->priv->vscale_widget), gtk_range_get_value(GTK_RANGE(scaler->priv->hscale_widget))); } g_signal_emit(G_OBJECT(scaler), remmina_scaler_signals[SCALED_SIGNAL], 0); } static void remmina_scaler_on_vscale_value_changed(GtkWidget *widget, RemminaScaler *scaler) { gdouble value; value = gtk_range_get_value(GTK_RANGE(scaler->priv->vscale_widget)); scaler->vscale = (value <= MIN_SCALE_VALUE ? 0 : (gint)(value * 100.0)); if (REMMINA_CHAIN_BUTTON(scaler->priv->aspectscale_button)->chained && gtk_range_get_value(GTK_RANGE(scaler->priv->hscale_widget)) != gtk_range_get_value(GTK_RANGE(scaler->priv->vscale_widget))) { gtk_range_set_value(GTK_RANGE(scaler->priv->hscale_widget), gtk_range_get_value(GTK_RANGE(scaler->priv->vscale_widget))); } g_signal_emit(G_OBJECT(scaler), remmina_scaler_signals[SCALED_SIGNAL], 0); } static void remmina_scaler_destroy(RemminaScaler *scaler, gpointer data) { g_free(scaler->priv); } static void remmina_scaler_init(RemminaScaler *scaler) { RemminaScalerPriv *priv; GtkWidget *widget; priv = g_new(RemminaScalerPriv, 1); scaler->priv = priv; scaler->hscale = 0; scaler->vscale = 0; scaler->aspectscale = FALSE; gtk_table_resize(GTK_TABLE(scaler), 2, 2); widget = gtk_hscale_new_with_range(MIN_SCALE_VALUE, 1.0, 0.01); gtk_widget_show(widget); gtk_widget_set_tooltip_text(widget, _("Horizontal scale")); gtk_table_attach_defaults(GTK_TABLE(scaler), widget, 1, 2, 0, 1); g_signal_connect(G_OBJECT(widget), "format-value", G_CALLBACK(remmina_scaler_format_scale_value), NULL); priv->hscale_widget = widget; widget = gtk_hscale_new_with_range(MIN_SCALE_VALUE, 1.0, 0.01); gtk_widget_show(widget); gtk_widget_set_tooltip_text(widget, _("Vertical scale")); gtk_table_attach_defaults(GTK_TABLE(scaler), widget, 1, 2, 1, 2); g_signal_connect(G_OBJECT(widget), "format-value", G_CALLBACK(remmina_scaler_format_scale_value), NULL); priv->vscale_widget = widget; g_signal_connect(G_OBJECT(priv->hscale_widget), "value-changed", G_CALLBACK(remmina_scaler_on_hscale_value_changed), scaler); g_signal_connect(G_OBJECT(priv->vscale_widget), "value-changed", G_CALLBACK(remmina_scaler_on_vscale_value_changed), scaler); widget = remmina_chain_button_new(); gtk_widget_show(widget); gtk_table_attach(GTK_TABLE(scaler), widget, 2, 3, 0, 2, 0, 0, 0, 0); g_signal_connect(G_OBJECT(widget), "chain-toggled", G_CALLBACK(remmina_scaler_on_chain_changed), scaler); priv->aspectscale_button = widget; g_signal_connect(G_OBJECT(scaler), "destroy", G_CALLBACK(remmina_scaler_destroy), NULL); } GtkWidget* remmina_scaler_new(void) { return GTK_WIDGET(g_object_new(REMMINA_TYPE_SCALER, NULL)); } void remmina_scaler_set(RemminaScaler *scaler, gint hscale, gint vscale, gboolean chained) { gtk_range_set_value(GTK_RANGE(scaler->priv->hscale_widget), ((gdouble) hscale) / 100.0); gtk_range_set_value(GTK_RANGE(scaler->priv->vscale_widget), ((gdouble) vscale) / 100.0); remmina_chain_button_set(REMMINA_CHAIN_BUTTON(scaler->priv->aspectscale_button), chained); } void remmina_scaler_set_draw_value(RemminaScaler *scaler, gboolean draw_value) { gtk_scale_set_draw_value(GTK_SCALE(scaler->priv->hscale_widget), draw_value); gtk_scale_set_draw_value(GTK_SCALE(scaler->priv->vscale_widget), draw_value); } FreeRDP-Remmina-356c033/remmina/src/remmina_scaler.h000066400000000000000000000041371171526373700221710ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASCALER_H__ #define __REMMINASCALER_H__ G_BEGIN_DECLS #define REMMINA_TYPE_SCALER (remmina_scaler_get_type ()) #define REMMINA_SCALER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_SCALER, RemminaScaler)) #define REMMINA_SCALER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_SCALER, RemminaScalerClass)) #define REMMINA_IS_SCALER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_SCALER)) #define REMMINA_IS_SCALER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_SCALER)) #define REMMINA_SCALER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_SCALER, RemminaScalerClass)) typedef struct _RemminaScalerPriv RemminaScalerPriv; typedef struct _RemminaScaler { GtkTable table; gint hscale; gint vscale; gboolean aspectscale; RemminaScalerPriv *priv; } RemminaScaler; typedef struct _RemminaScalerClass { GtkTableClass parent_class; void (*scaled)(RemminaScaler *scaler); } RemminaScalerClass; GType remmina_scaler_get_type(void) G_GNUC_CONST; GtkWidget* remmina_scaler_new(void); void remmina_scaler_set(RemminaScaler *scaler, gint hscale, gint vscale, gboolean chained); void remmina_scaler_set_draw_value(RemminaScaler *scaler, gboolean draw_value); G_END_DECLS #endif /* __REMMINASCALER_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_scrolled_viewport.c000066400000000000000000000104501171526373700244540ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "remmina_scrolled_viewport.h" #include "remmina_pref.h" G_DEFINE_TYPE( RemminaScrolledViewport, remmina_scrolled_viewport, GTK_TYPE_EVENT_BOX) /* Event handler when mouse move on borders */ static gboolean remmina_scrolled_viewport_motion_timeout(gpointer data) { RemminaScrolledViewport *gsv; GtkWidget *child; GdkDisplay *display; GdkScreen *screen; gint x, y, mx, my, w, h; GtkAdjustment *adj; gdouble value; if (!REMMINA_IS_SCROLLED_VIEWPORT(data)) return FALSE; if (!GTK_IS_BIN(data)) return FALSE; gsv = REMMINA_SCROLLED_VIEWPORT(data); if (!gsv->viewport_motion) return FALSE; child = gtk_bin_get_child(GTK_BIN(gsv)); if (!GTK_IS_VIEWPORT(child)) return FALSE; display = gdk_display_get_default(); if (!display) return FALSE; gdk_display_get_pointer(display, &screen, &x, &y, NULL); w = gdk_screen_get_width(screen); h = gdk_screen_get_height(screen); mx = (x == 0 ? -1 : (x >= w - 1 ? 1 : 0)); my = (y == 0 ? -1 : (y >= h - 1 ? 1 : 0)); if (mx != 0) { gint step = MAX(10, MIN(remmina_pref.auto_scroll_step, w / 5)); adj = gtk_viewport_get_hadjustment(GTK_VIEWPORT(child)); value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(mx * step); value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble) w + 2.0)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value); } if (my != 0) { gint step = MAX(10, MIN(remmina_pref.auto_scroll_step, h / 5)); adj = gtk_viewport_get_vadjustment(GTK_VIEWPORT(child)); value = gtk_adjustment_get_value(GTK_ADJUSTMENT(adj)) + (gdouble)(my * step); value = MAX(0, MIN(value, gtk_adjustment_get_upper(GTK_ADJUSTMENT(adj)) - (gdouble) h + 2.0)); gtk_adjustment_set_value(GTK_ADJUSTMENT(adj), value); } return TRUE; } static gboolean remmina_scrolled_viewport_enter(GtkWidget *widget, GdkEventCrossing *event, gpointer data) { remmina_scrolled_viewport_remove_motion(REMMINA_SCROLLED_VIEWPORT(widget)); return FALSE; } static gboolean remmina_scrolled_viewport_leave(GtkWidget *widget, GdkEventCrossing *event, gpointer data) { RemminaScrolledViewport *gsv = REMMINA_SCROLLED_VIEWPORT(widget); gsv->viewport_motion = TRUE; gsv->viewport_motion_handler = g_timeout_add(20, remmina_scrolled_viewport_motion_timeout, gsv); return FALSE; } static void remmina_scrolled_viewport_destroy(GtkWidget *widget, gpointer data) { remmina_scrolled_viewport_remove_motion(REMMINA_SCROLLED_VIEWPORT(widget)); } static void remmina_scrolled_viewport_class_init(RemminaScrolledViewportClass *klass) { } static void remmina_scrolled_viewport_init(RemminaScrolledViewport *gsv) { } void remmina_scrolled_viewport_remove_motion(RemminaScrolledViewport *gsv) { if (gsv->viewport_motion) { gsv->viewport_motion = FALSE; g_source_remove(gsv->viewport_motion_handler); gsv->viewport_motion_handler = 0; } } GtkWidget* remmina_scrolled_viewport_new(void) { RemminaScrolledViewport *gsv; gsv = REMMINA_SCROLLED_VIEWPORT(g_object_new(REMMINA_TYPE_SCROLLED_VIEWPORT, NULL)); gsv->viewport_motion = FALSE; gsv->viewport_motion_handler = 0; gtk_widget_set_size_request(GTK_WIDGET(gsv), 1, 1); gtk_widget_add_events(GTK_WIDGET(gsv), GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK); g_signal_connect(G_OBJECT(gsv), "destroy", G_CALLBACK(remmina_scrolled_viewport_destroy), NULL); g_signal_connect(G_OBJECT(gsv), "enter-notify-event", G_CALLBACK(remmina_scrolled_viewport_enter), NULL); g_signal_connect(G_OBJECT(gsv), "leave-notify-event", G_CALLBACK(remmina_scrolled_viewport_leave), NULL); return GTK_WIDGET(gsv); } FreeRDP-Remmina-356c033/remmina/src/remmina_scrolled_viewport.h000066400000000000000000000042701171526373700244640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASCROLLEDVIEWPORT_H__ #define __REMMINASCROLLEDVIEWPORT_H__ G_BEGIN_DECLS #define REMMINA_TYPE_SCROLLED_VIEWPORT \ (remmina_scrolled_viewport_get_type ()) #define REMMINA_SCROLLED_VIEWPORT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_SCROLLED_VIEWPORT, RemminaScrolledViewport)) #define REMMINA_SCROLLED_VIEWPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_SCROLLED_VIEWPORT, RemminaScrolledViewportClass)) #define REMMINA_IS_SCROLLED_VIEWPORT(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_SCROLLED_VIEWPORT)) #define REMMINA_IS_SCROLLED_VIEWPORT_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_SCROLLED_VIEWPORT)) #define REMMINA_SCROLLED_VIEWPORT_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_SCROLLED_VIEWPORT, RemminaScrolledViewportClass)) typedef struct _RemminaScrolledViewport { GtkEventBox event_box; /* Motion activates in Viewport Fullscreen mode */ gboolean viewport_motion; guint viewport_motion_handler; } RemminaScrolledViewport; typedef struct _RemminaScrolledViewportClass { GtkEventBoxClass parent_class; } RemminaScrolledViewportClass; GType remmina_scrolled_viewport_get_type(void) G_GNUC_CONST; GtkWidget* remmina_scrolled_viewport_new(void); void remmina_scrolled_viewport_remove_motion(RemminaScrolledViewport *gsv); G_END_DECLS #endif /* __REMMINASCROLLEDVIEWPORT_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_sftp_client.c000066400000000000000000000637411171526373700232330ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #define _FILE_OFFSET_BITS 64 #include "config.h" #ifdef HAVE_LIBSSH #include #include #include #include #ifdef HAVE_FCNTL_H #include #endif #include "remmina_public.h" #include "remmina_pref.h" #include "remmina_ssh.h" #include "remmina_sftp_client.h" G_DEFINE_TYPE (RemminaSFTPClient, remmina_sftp_client, REMMINA_TYPE_FTP_CLIENT) #define SET_CURSOR(cur) \ if (GDK_IS_WINDOW (gtk_widget_get_window (GTK_WIDGET (client)))) \ { \ gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET (client)), cur); \ } static void remmina_sftp_client_class_init (RemminaSFTPClientClass *klass) { } #define GET_SFTPATTR_TYPE(a,type) \ if (a->type == 0) \ { \ type = ((a->permissions & 040000) ? REMMINA_FTP_FILE_TYPE_DIR : REMMINA_FTP_FILE_TYPE_FILE); \ } \ else \ { \ type = (a->type == SSH_FILEXFER_TYPE_DIRECTORY ? REMMINA_FTP_FILE_TYPE_DIR : REMMINA_FTP_FILE_TYPE_FILE); \ } /* ------------------------ The Task Thread routines ----------------------------- */ static gboolean remmina_sftp_client_refresh (RemminaSFTPClient *client); static gint remmina_sftp_client_confirm_resume (RemminaSFTPClient *client, const gchar *path); #define THREAD_CHECK_EXIT \ (!client->taskid || client->thread_abort) static gboolean remmina_sftp_client_thread_update_task (RemminaSFTPClient *client, RemminaFTPTask *task) { if (THREAD_CHECK_EXIT) return FALSE; THREADS_ENTER remmina_ftp_client_update_task (REMMINA_FTP_CLIENT (client), task); THREADS_LEAVE return TRUE; } static void remmina_sftp_client_thread_set_error (RemminaSFTPClient *client, RemminaFTPTask *task, const gchar *error_format, ...) { va_list args; task->status = REMMINA_FTP_TASK_STATUS_ERROR; g_free(task->tooltip); if (error_format) { va_start (args, error_format); task->tooltip = g_strdup_vprintf (error_format, args); va_end (args); } else { task->tooltip = NULL; } remmina_sftp_client_thread_update_task (client, task); } static void remmina_sftp_client_thread_set_finish (RemminaSFTPClient *client, RemminaFTPTask *task) { task->status = REMMINA_FTP_TASK_STATUS_FINISH; g_free(task->tooltip); task->tooltip = NULL; remmina_sftp_client_thread_update_task (client, task); } static RemminaFTPTask* remmina_sftp_client_thread_get_task (RemminaSFTPClient *client) { RemminaFTPTask *task; if (client->thread_abort) return NULL; THREADS_ENTER task = remmina_ftp_client_get_waiting_task (REMMINA_FTP_CLIENT (client)); if (task) { client->taskid = task->taskid; task->status = REMMINA_FTP_TASK_STATUS_RUN; remmina_ftp_client_update_task (REMMINA_FTP_CLIENT (client), task); } THREADS_LEAVE return task; } static gboolean remmina_sftp_client_thread_download_file (RemminaSFTPClient *client, RemminaSFTP *sftp, RemminaFTPTask *task, const gchar *remote_path, const gchar *local_path, guint64 *donesize) { sftp_file remote_file; FILE *local_file; gchar *tmp; gchar buf[20480]; gint len; gint response; uint64_t size; if (THREAD_CHECK_EXIT) return FALSE; /* Ensure local dir exists */ g_strlcpy (buf, local_path, sizeof (buf)); tmp = g_strrstr (buf, "/"); if (tmp && tmp != buf) { *tmp = '\0'; if (g_mkdir_with_parents (buf, 0755) < 0) { remmina_sftp_client_thread_set_error (client, task, _("Error creating directory %s."), buf); return FALSE; } } local_file = g_fopen (local_path, "ab"); if (!local_file) { remmina_sftp_client_thread_set_error (client, task, _("Error creating file %s."), local_path); return FALSE; } fseeko (local_file, 0, SEEK_END); size = ftello (local_file); if (size > 0) { THREADS_ENTER response = remmina_sftp_client_confirm_resume (client, local_path); THREADS_LEAVE switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: fclose (local_file); remmina_sftp_client_thread_set_error (client, task, NULL); return FALSE; case GTK_RESPONSE_ACCEPT: fclose (local_file); local_file = g_fopen (local_path, "wb"); if (!local_file) { remmina_sftp_client_thread_set_error (client, task, _("Error creating file %s."), local_path); return FALSE; } size = 0; break; case GTK_RESPONSE_APPLY: break; } } tmp = remmina_ssh_unconvert (REMMINA_SSH (sftp), remote_path); remote_file = sftp_open (sftp->sftp_sess, tmp, O_RDONLY, 0); g_free(tmp); if (!remote_file) { fclose (local_file); remmina_sftp_client_thread_set_error (client, task, _("Error opening file %s on server. %s"), remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } if (size > 0) { if (sftp_seek64 (remote_file, size) < 0) { sftp_close (remote_file); fclose (local_file); remmina_sftp_client_thread_set_error (client, task, "Error seeking remote file %s. %s", remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } *donesize = size; } while (!THREAD_CHECK_EXIT && (len = sftp_read (remote_file, buf, sizeof (buf))) > 0) { if (THREAD_CHECK_EXIT) break; if (fwrite (buf, 1, len, local_file) < len) { sftp_close (remote_file); fclose (local_file); remmina_sftp_client_thread_set_error (client, task, _("Error writing file %s."), local_path); return FALSE; } *donesize += (guint64) len; task->donesize = (gfloat) (*donesize); if (!remmina_sftp_client_thread_update_task (client, task)) break; } sftp_close (remote_file); fclose (local_file); return TRUE; } static gboolean remmina_sftp_client_thread_recursive_dir (RemminaSFTPClient *client, RemminaSFTP *sftp, RemminaFTPTask *task, const gchar *rootdir_path, const gchar *subdir_path, GPtrArray *array) { sftp_dir sftpdir; sftp_attributes sftpattr; gchar *tmp; gchar *dir_path; gchar *file_path; gint type; gboolean ret = TRUE; if (THREAD_CHECK_EXIT) return FALSE; if (subdir_path) { dir_path = remmina_public_combine_path (rootdir_path, subdir_path); } else { dir_path = g_strdup (rootdir_path); } tmp = remmina_ssh_unconvert (REMMINA_SSH (sftp), dir_path); sftpdir = sftp_opendir (sftp->sftp_sess, tmp); g_free(tmp); if (!sftpdir) { remmina_sftp_client_thread_set_error (client, task, _("Error opening directory %s. %s"), dir_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); g_free(dir_path); return FALSE; } g_free(dir_path); while ((sftpattr = sftp_readdir (sftp->sftp_sess, sftpdir))) { if (g_strcmp0(sftpattr->name, ".") != 0 && g_strcmp0(sftpattr->name, "..") != 0) { GET_SFTPATTR_TYPE (sftpattr, type); tmp = remmina_ssh_convert (REMMINA_SSH (sftp), sftpattr->name); if (subdir_path) { file_path = remmina_public_combine_path (subdir_path, tmp); g_free(tmp); } else { file_path = tmp; } if (type == REMMINA_FTP_FILE_TYPE_DIR) { ret = remmina_sftp_client_thread_recursive_dir (client, sftp, task, rootdir_path, file_path, array); g_free(file_path); if (!ret) { sftp_attributes_free (sftpattr); break; } } else { task->size += (gfloat) sftpattr->size; g_ptr_array_add (array, file_path); if (!remmina_sftp_client_thread_update_task (client, task)) { sftp_attributes_free (sftpattr); break; } } } sftp_attributes_free (sftpattr); if (THREAD_CHECK_EXIT) break; } sftp_closedir (sftpdir); return ret; } static gboolean remmina_sftp_client_thread_recursive_localdir (RemminaSFTPClient *client, RemminaFTPTask *task, const gchar *rootdir_path, const gchar *subdir_path, GPtrArray *array) { GDir *dir; gchar *path; const gchar *name; gchar *relpath; gchar *abspath; struct stat st; gboolean ret = TRUE; path = g_build_filename (rootdir_path, subdir_path, NULL); dir = g_dir_open (path, 0, NULL); if (dir == NULL) { g_free(path); return FALSE; } while ((name = g_dir_read_name (dir)) != NULL) { if (THREAD_CHECK_EXIT) { ret = FALSE; break; } if (g_strcmp0(name, ".") == 0 || g_strcmp0(name, "..") == 0) continue; abspath = g_build_filename (path, name, NULL); if (g_stat (abspath, &st) < 0) { g_free(abspath); continue; } relpath = g_build_filename (subdir_path ? subdir_path : "", name, NULL); g_ptr_array_add (array, relpath); if (g_file_test (abspath, G_FILE_TEST_IS_DIR)) { ret = remmina_sftp_client_thread_recursive_localdir (client, task, rootdir_path, relpath, array); if (!ret) break; } else { task->size += (gfloat) st.st_size; } g_free(abspath); } g_free(path); g_dir_close (dir); return ret; } static gboolean remmina_sftp_client_thread_mkdir (RemminaSFTPClient *client, RemminaSFTP *sftp, RemminaFTPTask *task, const gchar *path) { sftp_attributes sftpattr; sftpattr = sftp_stat (sftp->sftp_sess, path); if (sftpattr != NULL) { sftp_attributes_free (sftpattr); return TRUE; } if (sftp_mkdir (sftp->sftp_sess, path, 0755) < 0) { remmina_sftp_client_thread_set_error (client, task, _("Error creating folder %s on server. %s"), path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } return TRUE; } static gboolean remmina_sftp_client_thread_upload_file (RemminaSFTPClient *client, RemminaSFTP *sftp, RemminaFTPTask *task, const gchar *remote_path, const gchar *local_path, guint64 *donesize) { sftp_file remote_file; FILE *local_file; gchar *tmp; gchar buf[20480]; gint len; sftp_attributes attr; gint response; uint64_t size; if (THREAD_CHECK_EXIT) return FALSE; tmp = remmina_ssh_unconvert (REMMINA_SSH (sftp), remote_path); remote_file = sftp_open (sftp->sftp_sess, tmp, O_WRONLY | O_CREAT, 0644); g_free(tmp); if (!remote_file) { remmina_sftp_client_thread_set_error (client, task, _("Error creating file %s on server. %s"), remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } attr = sftp_fstat (remote_file); size = attr->size; sftp_attributes_free (attr); if (size > 0) { THREADS_ENTER response = remmina_sftp_client_confirm_resume (client, remote_path); THREADS_LEAVE switch (response) { case GTK_RESPONSE_CANCEL: case GTK_RESPONSE_DELETE_EVENT: sftp_close (remote_file); remmina_sftp_client_thread_set_error (client, task, NULL); return FALSE; case GTK_RESPONSE_ACCEPT: sftp_close (remote_file); tmp = remmina_ssh_unconvert (REMMINA_SSH (sftp), remote_path); remote_file = sftp_open (sftp->sftp_sess, tmp, O_WRONLY | O_CREAT | O_TRUNC, 0644); g_free(tmp); if (!remote_file) { remmina_sftp_client_thread_set_error (client, task, _("Error creating file %s on server. %s"), remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } size = 0; break; case GTK_RESPONSE_APPLY: if (sftp_seek64 (remote_file, size) < 0) { sftp_close (remote_file); remmina_sftp_client_thread_set_error (client, task, "Error seeking remote file %s. %s", remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } break; } } local_file = g_fopen (local_path, "rb"); if (!local_file) { sftp_close (remote_file); remmina_sftp_client_thread_set_error (client, task, _("Error opening file %s."), local_path); return FALSE; } if (size > 0) { if (fseeko (local_file, size, SEEK_SET) < 0) { sftp_close (remote_file); fclose (local_file); remmina_sftp_client_thread_set_error (client, task, "Error seeking local file %s.", local_path); return FALSE; } *donesize = size; } while (!THREAD_CHECK_EXIT && (len = fread (buf, 1, sizeof (buf), local_file)) > 0) { if (THREAD_CHECK_EXIT) break; if (sftp_write (remote_file, buf, len) < len) { sftp_close (remote_file); fclose (local_file); remmina_sftp_client_thread_set_error (client, task, _("Error writing file %s on server. %s"), remote_path, ssh_get_error (REMMINA_SSH (client->sftp)->session)); return FALSE; } *donesize += (guint64) len; task->donesize = (gfloat) (*donesize); if (!remmina_sftp_client_thread_update_task (client, task)) break; } sftp_close (remote_file); fclose (local_file); return TRUE; } static gpointer remmina_sftp_client_thread_main (gpointer data) { RemminaSFTPClient *client = REMMINA_SFTP_CLIENT (data); RemminaSFTP *sftp = NULL; RemminaFTPTask *task; gchar *remote, *local; guint64 size; GPtrArray *array; gint i; gchar *remote_file, *local_file; gboolean ret; gchar *refreshdir = NULL; gchar *tmp; gboolean refresh = FALSE; task = remmina_sftp_client_thread_get_task (client); while (task) { size = 0; if (!sftp) { sftp = remmina_sftp_new_from_ssh (REMMINA_SSH (client->sftp)); if (!remmina_ssh_init_session (REMMINA_SSH (sftp)) || remmina_ssh_auth (REMMINA_SSH (sftp), NULL) <= 0 || !remmina_sftp_open (sftp)) { remmina_sftp_client_thread_set_error (client, task, (REMMINA_SSH (sftp))->error); remmina_ftp_task_free (task); break; } } remote = remmina_public_combine_path (task->remotedir, task->name); local = remmina_public_combine_path (task->localdir, task->name); switch (task->tasktype) { case REMMINA_FTP_TASK_TYPE_DOWNLOAD: switch (task->type) { case REMMINA_FTP_FILE_TYPE_FILE: ret = remmina_sftp_client_thread_download_file (client, sftp, task, remote, local, &size); break; case REMMINA_FTP_FILE_TYPE_DIR: array = g_ptr_array_new (); ret = remmina_sftp_client_thread_recursive_dir (client, sftp, task, remote, NULL, array); if (ret) { for (i = 0; i < array->len; i++) { if (THREAD_CHECK_EXIT) { ret = FALSE; break; } remote_file = remmina_public_combine_path (remote, (gchar*) g_ptr_array_index (array, i)); local_file = remmina_public_combine_path (local, (gchar*) g_ptr_array_index (array, i)); ret = remmina_sftp_client_thread_download_file (client, sftp, task, remote_file, local_file, &size); g_free(remote_file); g_free(local_file); if (!ret) break; } } g_ptr_array_foreach (array, (GFunc) g_free, NULL); g_ptr_array_free (array, TRUE); break; default: ret = 0; break; } if (ret) { remmina_sftp_client_thread_set_finish (client, task); } break; case REMMINA_FTP_TASK_TYPE_UPLOAD: switch (task->type) { case REMMINA_FTP_FILE_TYPE_FILE: ret = remmina_sftp_client_thread_upload_file (client, sftp, task, remote, local, &size); break; case REMMINA_FTP_FILE_TYPE_DIR: ret = remmina_sftp_client_thread_mkdir (client, sftp, task, remote); if (!ret) break; array = g_ptr_array_new (); ret = remmina_sftp_client_thread_recursive_localdir (client, task, local, NULL, array); if (ret) { for (i = 0; i < array->len; i++) { if (THREAD_CHECK_EXIT) { ret = FALSE; break; } remote_file = remmina_public_combine_path (remote, (gchar*) g_ptr_array_index (array, i)); local_file = g_build_filename (local, (gchar*) g_ptr_array_index (array, i), NULL); if (g_file_test (local_file, G_FILE_TEST_IS_DIR)) { ret = remmina_sftp_client_thread_mkdir (client, sftp, task, remote_file); } else { ret = remmina_sftp_client_thread_upload_file (client, sftp, task, remote_file, local_file, &size); } g_free(remote_file); g_free(local_file); if (!ret) break; } } g_ptr_array_foreach (array, (GFunc) g_free, NULL); g_ptr_array_free (array, TRUE); break; default: ret = 0; break; } if (ret) { remmina_sftp_client_thread_set_finish (client, task); tmp = remmina_ftp_client_get_dir (REMMINA_FTP_CLIENT (client)); if (g_strcmp0(tmp, task->remotedir) == 0) { refresh = TRUE; g_free(refreshdir); refreshdir = tmp; } else { g_free(tmp); } } break; } g_free(remote); g_free(local); remmina_ftp_task_free (task); client->taskid = 0; if (client->thread_abort) break; task = remmina_sftp_client_thread_get_task (client); } if (sftp) { remmina_sftp_free (sftp); } if (!client->thread_abort && refresh) { tmp = remmina_ftp_client_get_dir (REMMINA_FTP_CLIENT (client)); if (g_strcmp0(tmp, refreshdir) == 0) { IDLE_ADD ((GSourceFunc) remmina_sftp_client_refresh, client); } g_free(tmp); } g_free(refreshdir); client->thread = 0; return NULL; } /* ------------------------ The SFTP Client routines ----------------------------- */ static void remmina_sftp_client_destroy (RemminaSFTPClient *client, gpointer data) { if (client->sftp) { remmina_sftp_free (client->sftp); client->sftp = NULL; } client->thread_abort = TRUE; /* We will wait for the thread to quit itself, and hopefully the thread is handling things correctly */ while (client->thread) { gdk_threads_leave (); sleep (1); gdk_threads_enter (); } } static sftp_dir remmina_sftp_client_sftp_session_opendir (RemminaSFTPClient *client, const gchar *dir) { sftp_dir sftpdir; GtkWidget *dialog; sftpdir = sftp_opendir (client->sftp->sftp_sess, (gchar*) dir); if (!sftpdir) { dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET (client))), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed to open directory %s. %s"), dir, ssh_get_error (REMMINA_SSH (client->sftp)->session)); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); return NULL; } return sftpdir; } static gboolean remmina_sftp_client_sftp_session_closedir (RemminaSFTPClient *client, sftp_dir sftpdir) { GtkWidget *dialog; if (!sftp_dir_eof (sftpdir)) { dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET (client))), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed reading directory. %s"), ssh_get_error (REMMINA_SSH (client->sftp)->session)); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); return FALSE; } sftp_closedir (sftpdir); return TRUE; } static void remmina_sftp_client_on_opendir (RemminaSFTPClient *client, gchar *dir, gpointer data) { sftp_dir sftpdir; sftp_attributes sftpattr; GtkWidget *dialog; gchar *newdir; gchar *newdir_conv; gchar *tmp; gint type; if (client->sftp == NULL) return; if (!dir || dir[0] == '\0') { newdir = g_strdup ("."); } else if (dir[0] == '/') { newdir = g_strdup (dir); } else { tmp = remmina_ftp_client_get_dir (REMMINA_FTP_CLIENT (client)); if (tmp) { newdir = remmina_public_combine_path (tmp, dir); g_free(tmp); } else { newdir = g_strdup_printf("./%s", dir); } } tmp = remmina_ssh_unconvert (REMMINA_SSH (client->sftp), newdir); newdir_conv = sftp_canonicalize_path (client->sftp->sftp_sess, tmp); g_free(tmp); g_free(newdir); newdir = remmina_ssh_convert (REMMINA_SSH (client->sftp), newdir_conv); if (!newdir) { dialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed to open directory %s. %s"), dir, ssh_get_error (REMMINA_SSH (client->sftp)->session)); gtk_widget_show(dialog); g_signal_connect(G_OBJECT(dialog), "response", G_CALLBACK(gtk_widget_destroy), NULL); g_free(newdir_conv); return; } sftpdir = remmina_sftp_client_sftp_session_opendir (client, newdir_conv); g_free(newdir_conv); if (!sftpdir) { g_free(newdir); return; } remmina_ftp_client_clear_file_list (REMMINA_FTP_CLIENT (client)); while ((sftpattr = sftp_readdir (client->sftp->sftp_sess, sftpdir))) { if (g_strcmp0(sftpattr->name, ".") != 0 && g_strcmp0(sftpattr->name, "..") != 0) { GET_SFTPATTR_TYPE (sftpattr, type); tmp = remmina_ssh_convert (REMMINA_SSH (client->sftp), sftpattr->name); remmina_ftp_client_add_file (REMMINA_FTP_CLIENT (client), REMMINA_FTP_FILE_COLUMN_TYPE, type, REMMINA_FTP_FILE_COLUMN_NAME, tmp, REMMINA_FTP_FILE_COLUMN_SIZE, (gfloat) sftpattr->size, REMMINA_FTP_FILE_COLUMN_USER, sftpattr->owner, REMMINA_FTP_FILE_COLUMN_GROUP, sftpattr->group, REMMINA_FTP_FILE_COLUMN_PERMISSION, sftpattr->permissions, -1); g_free(tmp); } sftp_attributes_free (sftpattr); } remmina_sftp_client_sftp_session_closedir (client, sftpdir); remmina_ftp_client_set_dir (REMMINA_FTP_CLIENT (client), newdir); g_free(newdir); } static void remmina_sftp_client_on_newtask (RemminaSFTPClient *client, gpointer data) { if (client->thread) return; if (pthread_create (&client->thread, NULL, remmina_sftp_client_thread_main, client)) { client->thread = 0; } } static gboolean remmina_sftp_client_on_canceltask (RemminaSFTPClient *client, gint taskid, gpointer data) { GtkWidget *dialog; gint ret; if (client->taskid != taskid) return TRUE; dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET (client))), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, _("File transfer currently in progress.\nAre you sure to cancel it?")); ret = gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); if (ret == GTK_RESPONSE_YES) { /* Make sure we are still handling the same task before we clear the flag */ if (client->taskid == taskid) client->taskid = 0; return TRUE; } return FALSE; } static gboolean remmina_sftp_client_on_deletefile (RemminaSFTPClient *client, gint type, gchar *name, gpointer data) { GtkWidget *dialog; gint ret = 0; gchar *tmp; tmp = remmina_ssh_unconvert (REMMINA_SSH (client->sftp), name); switch (type) { case REMMINA_FTP_FILE_TYPE_DIR: ret = sftp_rmdir (client->sftp->sftp_sess, tmp); break; case REMMINA_FTP_FILE_TYPE_FILE: ret = sftp_unlink (client->sftp->sftp_sess, tmp); break; } g_free(tmp); if (ret != 0) { dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET (client))), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed to delete '%s'. %s"), name, ssh_get_error (REMMINA_SSH (client->sftp)->session)); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); return FALSE; } return TRUE; } static void remmina_sftp_client_init (RemminaSFTPClient *client) { client->sftp = NULL; client->thread = 0; client->taskid = 0; client->thread_abort = FALSE; /* Setup the internal signals */ g_signal_connect(G_OBJECT(client), "destroy", G_CALLBACK(remmina_sftp_client_destroy), NULL); g_signal_connect(G_OBJECT(client), "open-dir", G_CALLBACK(remmina_sftp_client_on_opendir), NULL); g_signal_connect(G_OBJECT(client), "new-task", G_CALLBACK(remmina_sftp_client_on_newtask), NULL); g_signal_connect(G_OBJECT(client), "cancel-task", G_CALLBACK(remmina_sftp_client_on_canceltask), NULL); g_signal_connect(G_OBJECT(client), "delete-file", G_CALLBACK(remmina_sftp_client_on_deletefile), NULL); } static gboolean remmina_sftp_client_refresh (RemminaSFTPClient *client) { SET_CURSOR (gdk_cursor_new (GDK_WATCH)); gdk_flush (); remmina_sftp_client_on_opendir (client, ".", NULL); SET_CURSOR (NULL); return FALSE; } static gint remmina_sftp_client_confirm_resume (RemminaSFTPClient *client, const gchar *path) { GtkWidget *dialog; gint response; GtkWidget *hbox; GtkWidget *vbox; GtkWidget *widget; const gchar *filename; filename = strrchr (path, '/'); filename = filename ? filename + 1 : path; dialog = gtk_dialog_new_with_buttons (_("File exists"), GTK_WINDOW(gtk_widget_get_toplevel (GTK_WIDGET (client))), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("Resume"), GTK_RESPONSE_APPLY, _("Overwrite"), GTK_RESPONSE_ACCEPT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL); gtk_container_set_border_width (GTK_CONTAINER (dialog), 4); hbox = gtk_hbox_new (FALSE, 4); gtk_widget_show(hbox); gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG(dialog))), hbox, TRUE, TRUE, 4); widget = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG); gtk_widget_show(widget); gtk_box_pack_start (GTK_BOX (hbox), widget, TRUE, TRUE, 4); vbox = gtk_vbox_new (FALSE, 4); gtk_widget_show(vbox); gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 4); widget = gtk_label_new(_("The following file already exists in the target folder:")); gtk_widget_show(widget); gtk_misc_set_alignment (GTK_MISC(widget), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 4); widget = gtk_label_new(filename); gtk_widget_show(widget); gtk_misc_set_alignment (GTK_MISC(widget), 0.0, 0.5); gtk_box_pack_start (GTK_BOX (vbox), widget, TRUE, TRUE, 4); response = gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); return response; } GtkWidget* remmina_sftp_client_new (void) { return GTK_WIDGET (g_object_new (REMMINA_TYPE_SFTP_CLIENT, NULL)); } void remmina_sftp_client_open (RemminaSFTPClient *client, RemminaSFTP *sftp) { client->sftp = sftp; g_idle_add ((GSourceFunc) remmina_sftp_client_refresh, client); } GtkWidget* remmina_sftp_client_new_init (RemminaSFTP *sftp) { GtkWidget *client; GtkWidget *dialog; client = remmina_sftp_client_new (); SET_CURSOR (gdk_cursor_new (GDK_WATCH)); gdk_flush (); if (!remmina_ssh_init_session (REMMINA_SSH (sftp)) || remmina_ssh_auth (REMMINA_SSH (sftp), NULL) <= 0 || !remmina_sftp_open (sftp)) { dialog = gtk_message_dialog_new (GTK_WINDOW(gtk_widget_get_toplevel (client)), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, (REMMINA_SSH (sftp))->error, NULL); gtk_dialog_run (GTK_DIALOG(dialog)); gtk_widget_destroy (dialog); gtk_widget_destroy (client); return NULL; } SET_CURSOR (NULL); g_idle_add ((GSourceFunc) remmina_sftp_client_refresh, client); return client; } #endif FreeRDP-Remmina-356c033/remmina/src/remmina_sftp_client.h000066400000000000000000000042741171526373700232340ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASFTPCLIENT_H__ #define __REMMINASFTPCLIENT_H__ #include "config.h" #ifdef HAVE_LIBSSH #include "remmina_file.h" #include "remmina_ftp_client.h" #include "remmina_ssh.h" G_BEGIN_DECLS #define REMMINA_TYPE_SFTP_CLIENT (remmina_sftp_client_get_type ()) #define REMMINA_SFTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_SFTP_CLIENT, RemminaSFTPClient)) #define REMMINA_SFTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_SFTP_CLIENT, RemminaSFTPClientClass)) #define REMMINA_IS_SFTP_CLIENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_SFTP_CLIENT)) #define REMMINA_IS_SFTP_CLIENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_SFTP_CLIENT)) #define REMMINA_SFTP_CLIENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_SFTP_CLIENT, RemminaSFTPClientClass)) typedef struct _RemminaSFTPClient { RemminaFTPClient client; RemminaSFTP *sftp; pthread_t thread; gint taskid; gboolean thread_abort; }RemminaSFTPClient; typedef struct _RemminaSFTPClientClass { RemminaFTPClientClass parent_class; }RemminaSFTPClientClass; GType remmina_sftp_client_get_type (void) G_GNUC_CONST; GtkWidget* remmina_sftp_client_new (void); void remmina_sftp_client_open (RemminaSFTPClient *client, RemminaSFTP *sftp); G_END_DECLS #endif /* HAVE_LIBSSH */ #endif /* __REMMINASFTPCLIENT_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_sftp_plugin.c000066400000000000000000000200061171526373700232360ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #ifdef HAVE_LIBSSH #include #include #include "remmina_public.h" #include "remmina_sftp_client.h" #include "remmina_plugin_manager.h" #include "remmina_ssh.h" #include "remmina_protocol_widget.h" #include "remmina_sftp_plugin.h" #define REMMINA_PLUGIN_SFTP_FEATURE_PREF_SHOW_HIDDEN 1 typedef struct _RemminaPluginSftpData { GtkWidget *client; pthread_t thread; RemminaSFTP *sftp; }RemminaPluginSftpData; static RemminaPluginService *remmina_plugin_service = NULL; static gpointer remmina_plugin_sftp_main_thread (gpointer data) { RemminaProtocolWidget *gp = (RemminaProtocolWidget*) data; RemminaPluginSftpData *gpdata; RemminaFile *remminafile; RemminaSSH *ssh; RemminaSFTP *sftp = NULL; gboolean cont = FALSE; gint ret; const gchar *cs; pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC gpdata = (RemminaPluginSftpData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); ssh = g_object_get_data (G_OBJECT(gp), "user-data"); if (ssh) { /* Create SFTP connection based on existing SSH session */ sftp = remmina_sftp_new_from_ssh (ssh); if (remmina_ssh_init_session (REMMINA_SSH (sftp)) && remmina_ssh_auth (REMMINA_SSH (sftp), NULL) > 0 && remmina_sftp_open (sftp)) { cont = TRUE; } } else { /* New SFTP connection */ remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); remmina_plugin_service->file_set_string (remminafile, "ssh_server", remmina_plugin_service->file_get_string (remminafile, "server")); sftp = remmina_sftp_new_from_file (remminafile); while (1) { if (!remmina_ssh_init_session (REMMINA_SSH (sftp))) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (sftp)->error); break; } ret = remmina_ssh_auth_gui (REMMINA_SSH (sftp), REMMINA_INIT_DIALOG (remmina_protocol_widget_get_init_dialog (gp)), TRUE); if (ret == 0) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (sftp)->error); } if (ret <= 0) break; if (!remmina_sftp_open (sftp)) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (sftp)->error); break; } cs = remmina_plugin_service->file_get_string (remminafile, "execpath"); if (cs && cs[0]) { remmina_ftp_client_set_dir (REMMINA_FTP_CLIENT (gpdata->client), cs); } cont = TRUE; break; } } if (!cont) { if (sftp) remmina_sftp_free (sftp); IDLE_ADD ((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, gp); return NULL; } remmina_sftp_client_open (REMMINA_SFTP_CLIENT (gpdata->client), sftp); /* RemminaSFTPClient owns the object, we just take the reference */ gpdata->sftp = sftp; remmina_plugin_service->protocol_plugin_emit_signal (gp, "connect"); gpdata->thread = 0; return NULL; } static void remmina_plugin_sftp_client_on_realize (GtkWidget *widget, RemminaProtocolWidget *gp) { RemminaFile *remminafile; remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); remmina_ftp_client_load_state (REMMINA_FTP_CLIENT (widget), remminafile); } static void remmina_plugin_sftp_init (RemminaProtocolWidget *gp) { RemminaPluginSftpData *gpdata; RemminaFile *remminafile; gpdata = g_new0 (RemminaPluginSftpData, 1); g_object_set_data_full (G_OBJECT(gp), "plugin-data", gpdata, g_free); remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); gpdata->client = remmina_sftp_client_new (); gtk_widget_show(gpdata->client); gtk_container_add(GTK_CONTAINER (gp), gpdata->client); remmina_ftp_client_set_show_hidden (REMMINA_FTP_CLIENT (gpdata->client), remmina_plugin_service->file_get_int (remminafile, "showhidden", FALSE)); remmina_plugin_service->protocol_plugin_register_hostkey (gp, gpdata->client); g_signal_connect(G_OBJECT(gpdata->client), "realize", G_CALLBACK(remmina_plugin_sftp_client_on_realize), gp); } static gboolean remmina_plugin_sftp_open_connection (RemminaProtocolWidget *gp) { RemminaPluginSftpData *gpdata; gpdata = (RemminaPluginSftpData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); remmina_plugin_service->protocol_plugin_set_expand (gp, TRUE); remmina_plugin_service->protocol_plugin_set_width (gp, 640); remmina_plugin_service->protocol_plugin_set_height (gp, 480); if (pthread_create (&gpdata->thread, NULL, remmina_plugin_sftp_main_thread, gp)) { remmina_plugin_service->protocol_plugin_set_error (gp, "Failed to initialize pthread. Falling back to non-thread mode..."); gpdata->thread = 0; return FALSE; } else { return TRUE; } return TRUE; } static gboolean remmina_plugin_sftp_close_connection (RemminaProtocolWidget *gp) { RemminaPluginSftpData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginSftpData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); if (gpdata->thread) { pthread_cancel (gpdata->thread); if (gpdata->thread) pthread_join (gpdata->thread, NULL); } remmina_ftp_client_save_state (REMMINA_FTP_CLIENT (gpdata->client), remminafile); remmina_plugin_service->protocol_plugin_emit_signal (gp, "disconnect"); return FALSE; } static gboolean remmina_plugin_sftp_query_feature (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { return TRUE; } static void remmina_plugin_sftp_call_feature (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { RemminaPluginSftpData *gpdata; RemminaFile *remminafile; gpdata = (RemminaPluginSftpData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); switch (feature->id) { case REMMINA_PROTOCOL_FEATURE_TOOL_SSH: remmina_plugin_service->open_connection ( remmina_file_dup_temp_protocol (remmina_plugin_service->protocol_plugin_get_file (gp), "SSH"), NULL, gpdata->sftp, NULL); return; case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP: remmina_plugin_service->open_connection ( remmina_file_dup_temp_protocol (remmina_plugin_service->protocol_plugin_get_file (gp), "SFTP"), NULL, gpdata->sftp, NULL); return; case REMMINA_PLUGIN_SFTP_FEATURE_PREF_SHOW_HIDDEN: remmina_ftp_client_set_show_hidden (REMMINA_FTP_CLIENT (gpdata->client), remmina_plugin_service->file_get_int (remminafile, "showhidden", FALSE)); return; } } static const RemminaProtocolFeature remmina_plugin_sftp_features[] = { { REMMINA_PROTOCOL_FEATURE_TYPE_PREF, REMMINA_PLUGIN_SFTP_FEATURE_PREF_SHOW_HIDDEN, GINT_TO_POINTER (REMMINA_PROTOCOL_FEATURE_PREF_CHECK), "showhidden", N_("Show Hidden Files")}, { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL} }; static RemminaProtocolPlugin remmina_plugin_sftp = { REMMINA_PLUGIN_TYPE_PROTOCOL, "SFTP", N_("SFTP - Secure File Transfer"), GETTEXT_PACKAGE, VERSION, "remmina-sftp", "remmina-sftp", NULL, NULL, REMMINA_PROTOCOL_SSH_SETTING_SFTP, remmina_plugin_sftp_features, remmina_plugin_sftp_init, remmina_plugin_sftp_open_connection, remmina_plugin_sftp_close_connection, remmina_plugin_sftp_query_feature, remmina_plugin_sftp_call_feature }; void remmina_sftp_plugin_register (void) { remmina_plugin_service = &remmina_plugin_manager_service; remmina_plugin_service->register_plugin ((RemminaPlugin *) &remmina_plugin_sftp); } #else void remmina_sftp_plugin_register(void) { } #endif FreeRDP-Remmina-356c033/remmina/src/remmina_sftp_plugin.h000066400000000000000000000017211171526373700232460ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASFTPPLUGIN_H__ #define __REMMINASFTPPLUGIN_H__ G_BEGIN_DECLS void remmina_sftp_plugin_register (void); G_END_DECLS #endif /* __REMMINASFTPPLUGIN_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_ssh.c000066400000000000000000001050101171526373700215000ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #ifdef HAVE_LIBSSH /* Define this before stdlib.h to have posix_openpt */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include #include #include #ifdef HAVE_NETDB_H #include #endif #ifdef HAVE_ARPA_INET_H #include #endif #ifdef HAVE_NETINET_IN_H #include #endif #ifdef HAVE_SYS_SOCKET_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif #ifdef HAVE_TERMIOS_H #include #endif #include "remmina_public.h" #include "remmina_log.h" #include "remmina_ssh.h" /*************************** SSH Base *********************************/ #define LOCK_SSH(ssh) pthread_mutex_lock (&REMMINA_SSH (ssh)->ssh_mutex); #define UNLOCK_SSH(ssh) pthread_mutex_unlock (&REMMINA_SSH (ssh)->ssh_mutex); static const gchar *common_identities[] = { ".ssh/id_rsa", ".ssh/id_dsa", ".ssh/identity", NULL }; gchar* remmina_ssh_identity_path (const gchar *id) { if (id == NULL) return NULL; if (id[0] == '/') return g_strdup (id); return g_strdup_printf("%s/%s", g_get_home_dir (), id); } gchar* remmina_ssh_find_identity (void) { gchar *path; gint i; for (i = 0; common_identities[i]; i++) { path = remmina_ssh_identity_path (common_identities[i]); if (g_file_test (path, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_EXISTS)) { return path; } g_free(path); } return NULL; } void remmina_ssh_set_error (RemminaSSH *ssh, const gchar *fmt) { const gchar *err; err = ssh_get_error (ssh->session); ssh->error = g_strdup_printf(fmt, err); } void remmina_ssh_set_application_error (RemminaSSH *ssh, const gchar *fmt, ...) { va_list args; va_start (args, fmt); ssh->error = g_strdup_vprintf (fmt, args); va_end (args); } static gint remmina_ssh_auth_password (RemminaSSH *ssh) { gint ret; gint authlist; gint n; gint i; if (ssh->authenticated) return 1; if (ssh->password == NULL) return -1; authlist = ssh_userauth_list (ssh->session, NULL); if (authlist & SSH_AUTH_METHOD_INTERACTIVE) { while ((ret = ssh_userauth_kbdint (ssh->session, NULL, NULL)) == SSH_AUTH_INFO) { n = ssh_userauth_kbdint_getnprompts (ssh->session); for (i = 0; i < n; i++) { ssh_userauth_kbdint_setanswer(ssh->session, i, ssh->password); } } } else { ret = ssh_userauth_password (ssh->session, NULL, ssh->password); } if (ret != SSH_AUTH_SUCCESS) { remmina_ssh_set_error (ssh, _("SSH password authentication failed: %s")); return 0; } ssh->authenticated = TRUE; return 1; } static gint remmina_ssh_auth_pubkey (RemminaSSH *ssh) { gint ret; ssh_string pubkey; ssh_private_key privkey; gint keytype; if (ssh->authenticated) return 1; if (ssh->pubkeyfile == NULL || ssh->privkeyfile == NULL) { ssh->error = g_strdup_printf(_("SSH public key authentication failed: %s"), _("SSH Key file not yet set.")); return 0; } pubkey = publickey_from_file (ssh->session, ssh->pubkeyfile, &keytype); if (pubkey == NULL) { remmina_ssh_set_error (ssh, _("SSH public key authentication failed: %s")); return 0; } privkey = privatekey_from_file (ssh->session, ssh->privkeyfile, keytype, _ (ssh->password ? ssh->password : "")); if (privkey == NULL) { string_free(pubkey); if (ssh->password == NULL || ssh->password[0] == '\0') return -1; remmina_ssh_set_error (ssh, _("SSH public key authentication failed: %s")); return 0; } ret = ssh_userauth_pubkey (ssh->session, NULL, pubkey, privkey); string_free(pubkey); privatekey_free (privkey); if (ret != SSH_AUTH_SUCCESS) { remmina_ssh_set_error (ssh, _("SSH public key authentication failed: %s")); return 0; } ssh->authenticated = TRUE; return 1; } static gint remmina_ssh_auth_auto_pubkey (RemminaSSH* ssh) { gint ret; ret = ssh_userauth_autopubkey (ssh->session, ""); if (ret != SSH_AUTH_SUCCESS) { remmina_ssh_set_error (ssh, _("SSH automatic public key authentication failed: %s")); return 0; } ssh->authenticated = TRUE; return 1; } gint remmina_ssh_auth (RemminaSSH *ssh, const gchar *password) { /* Check known host again to ensure it's still the original server when user forks a new session from existing one */ if (ssh_is_server_known (ssh->session) != SSH_SERVER_KNOWN_OK) { remmina_ssh_set_application_error (ssh, "SSH public key has changed!"); return 0; } if (password) { g_free(ssh->password); ssh->password = g_strdup (password); } switch (ssh->auth) { case SSH_AUTH_PASSWORD: return remmina_ssh_auth_password (ssh); case SSH_AUTH_PUBLICKEY: return remmina_ssh_auth_pubkey (ssh); case SSH_AUTH_AUTO_PUBLICKEY: return remmina_ssh_auth_auto_pubkey (ssh); default: return 0; } } gint remmina_ssh_auth_gui (RemminaSSH *ssh, RemminaInitDialog *dialog, gboolean threaded) { gchar *tips; gchar *keyname; gint ret; gint len; guchar *pubkey; /* Check if the server's public key is known */ ret = ssh_is_server_known (ssh->session); switch (ret) { case SSH_SERVER_KNOWN_OK: break; case SSH_SERVER_NOT_KNOWN: case SSH_SERVER_FILE_NOT_FOUND: case SSH_SERVER_KNOWN_CHANGED: case SSH_SERVER_FOUND_OTHER: len = ssh_get_pubkey_hash (ssh->session, &pubkey); if (len < 0) { remmina_ssh_set_error (ssh, "SSH pubkey hash failed: %s"); return 0; } keyname = ssh_get_hexa (pubkey, len); if (threaded) gdk_threads_enter(); if (ret == SSH_SERVER_NOT_KNOWN || ret == SSH_SERVER_FILE_NOT_FOUND) { ret = remmina_init_dialog_serverkey_unknown (dialog, keyname); } else { ret = remmina_init_dialog_serverkey_changed (dialog, keyname); } if (threaded) { gdk_flush();gdk_threads_leave();} free (keyname); ssh_clean_pubkey_hash (&pubkey); if (ret != GTK_RESPONSE_OK) return -1; ssh_write_knownhost (ssh->session); break; case SSH_SERVER_ERROR: default: remmina_ssh_set_error (ssh, "SSH known host checking failed: %s"); return 0; } /* Try empty password or existing password first */ ret = remmina_ssh_auth (ssh, NULL); if (ret > 0) return 1; /* Requested for a non-empty password */ if (ret < 0) { if (!dialog) return -1; switch (ssh->auth) { case SSH_AUTH_PASSWORD: tips = _("Authenticating %s's password to SSH server %s..."); keyname = _("SSH password"); break; case SSH_AUTH_PUBLICKEY: tips = _("Authenticating %s's identity to SSH server %s..."); keyname = _("SSH private key passphrase"); break; default: return FALSE; } if (ssh->auth != SSH_AUTH_AUTO_PUBLICKEY) { if (threaded) gdk_threads_enter(); remmina_init_dialog_set_status (dialog, tips, ssh->user, ssh->server); ret = remmina_init_dialog_authpwd (dialog, keyname, FALSE); if (threaded) { gdk_flush();gdk_threads_leave();} if (ret != GTK_RESPONSE_OK) return -1; } ret = remmina_ssh_auth (ssh, dialog->password); } if (ret <= 0) { return 0; } return 1; } void remmina_ssh_log_callback(ssh_session session, int priority, const char *message, void *userdata) { remmina_log_printf ("[SSH] %s\n", message); } gboolean remmina_ssh_init_session (RemminaSSH *ssh) { gint verbosity; ssh->callback = g_new0 (struct ssh_callbacks_struct, 1); ssh->callback->userdata = ssh; /* Init & startup the SSH session */ ssh->session = ssh_new (); ssh_options_set (ssh->session, SSH_OPTIONS_HOST, ssh->server); ssh_options_set (ssh->session, SSH_OPTIONS_PORT, &ssh->port); ssh_options_set (ssh->session, SSH_OPTIONS_USER, ssh->user); if (remmina_log_running ()) { verbosity = SSH_LOG_RARE; ssh_options_set (ssh->session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity); ssh->callback->log_function = remmina_ssh_log_callback; } ssh_callbacks_init (ssh->callback); ssh_set_callbacks(ssh->session, ssh->callback); if (ssh_connect (ssh->session)) { remmina_ssh_set_error (ssh, _("Failed to startup SSH session: %s")); return FALSE; } /* Try the "none" authentication */ if (ssh_userauth_none (ssh->session, NULL) == SSH_AUTH_SUCCESS) { ssh->authenticated = TRUE; } return TRUE; } gboolean remmina_ssh_init_from_file (RemminaSSH *ssh, RemminaFile *remminafile) { const gchar *ssh_server; const gchar *ssh_username; const gchar *ssh_privatekey; const gchar *server; gchar *s; ssh->session = NULL; ssh->callback = NULL; ssh->authenticated = FALSE; ssh->error = NULL; pthread_mutex_init (&ssh->ssh_mutex, NULL); /* Parse the address and port */ ssh_server = remmina_file_get_string (remminafile, "ssh_server"); ssh_username = remmina_file_get_string (remminafile, "ssh_username"); ssh_privatekey = remmina_file_get_string (remminafile, "ssh_privatekey"); server = remmina_file_get_string (remminafile, "server"); if (ssh_server) { remmina_public_get_server_port (ssh_server, 22, &ssh->server, &ssh->port); if (ssh->server[0] == '\0') { g_free(ssh->server); remmina_public_get_server_port (server, 0, &ssh->server, NULL); } } else if (server == NULL) { ssh->server = g_strdup ("localhost"); ssh->port = 22; } else { remmina_public_get_server_port (server, 0, &ssh->server, NULL); ssh->port = 22; } ssh->user = g_strdup (ssh_username ? ssh_username : g_get_user_name ()); ssh->password = NULL; ssh->auth = remmina_file_get_int (remminafile, "ssh_auth", 0); ssh->charset = g_strdup (remmina_file_get_string (remminafile, "ssh_charset")); /* Public/Private keys */ s = (ssh_privatekey ? g_strdup (ssh_privatekey) : remmina_ssh_find_identity ()); if (s) { ssh->privkeyfile = remmina_ssh_identity_path (s); ssh->pubkeyfile = g_strdup_printf("%s.pub", ssh->privkeyfile); g_free(s); } else { ssh->privkeyfile = NULL; ssh->pubkeyfile = NULL; } return TRUE; } static gboolean remmina_ssh_init_from_ssh (RemminaSSH *ssh, const RemminaSSH *ssh_src) { ssh->session = NULL; ssh->authenticated = FALSE; ssh->error = NULL; pthread_mutex_init (&ssh->ssh_mutex, NULL); ssh->server = g_strdup (ssh_src->server); ssh->port = ssh_src->port; ssh->user = g_strdup (ssh_src->user); ssh->auth = ssh_src->auth; ssh->password = g_strdup (ssh_src->password); ssh->pubkeyfile = g_strdup (ssh_src->pubkeyfile); ssh->privkeyfile = g_strdup (ssh_src->privkeyfile); ssh->charset = g_strdup (ssh_src->charset); return TRUE; } gchar* remmina_ssh_convert (RemminaSSH *ssh, const gchar *from) { gchar *to = NULL; if (ssh->charset && from) { to = g_convert (from, -1, "UTF-8", ssh->charset, NULL, NULL, NULL); } if (!to) to = g_strdup (from); return to; } gchar* remmina_ssh_unconvert (RemminaSSH *ssh, const gchar *from) { gchar *to = NULL; if (ssh->charset && from) { to = g_convert (from, -1, ssh->charset, "UTF-8", NULL, NULL, NULL); } if (!to) to = g_strdup (from); return to; } void remmina_ssh_free (RemminaSSH *ssh) { if (ssh->session) { ssh_free (ssh->session); ssh->session = NULL; } g_free(ssh->callback); g_free(ssh->server); g_free(ssh->user); g_free(ssh->password); g_free(ssh->pubkeyfile); g_free(ssh->privkeyfile); g_free(ssh->charset); g_free(ssh->error); pthread_mutex_destroy (&ssh->ssh_mutex); g_free(ssh); } /*************************** SSH Tunnel *********************************/ struct _RemminaSSHTunnelBuffer { gchar *data; gchar *ptr; ssize_t len; }; static RemminaSSHTunnelBuffer* remmina_ssh_tunnel_buffer_new (ssize_t len) { RemminaSSHTunnelBuffer *buffer; buffer = g_new (RemminaSSHTunnelBuffer, 1); buffer->data = (gchar*) g_malloc (len); buffer->ptr = buffer->data; buffer->len = len; return buffer; } static void remmina_ssh_tunnel_buffer_free (RemminaSSHTunnelBuffer *buffer) { if (buffer) { g_free(buffer->data); g_free(buffer); } } RemminaSSHTunnel* remmina_ssh_tunnel_new_from_file (RemminaFile *remminafile) { RemminaSSHTunnel *tunnel; tunnel = g_new (RemminaSSHTunnel, 1); remmina_ssh_init_from_file (REMMINA_SSH (tunnel), remminafile); tunnel->tunnel_type = -1; tunnel->channels = NULL; tunnel->sockets = NULL; tunnel->socketbuffers = NULL; tunnel->num_channels = 0; tunnel->max_channels = 0; tunnel->x11_channel = NULL; tunnel->thread = 0; tunnel->running = FALSE; tunnel->server_sock = -1; tunnel->dest = NULL; tunnel->port = 0; tunnel->buffer = NULL; tunnel->buffer_len = 0; tunnel->channels_out = NULL; tunnel->remotedisplay = 0; tunnel->localdisplay = NULL; tunnel->init_func = NULL; tunnel->connect_func = NULL; tunnel->disconnect_func = NULL; tunnel->callback_data = NULL; return tunnel; } static void remmina_ssh_tunnel_close_all_channels (RemminaSSHTunnel *tunnel) { int i; for (i = 0; i < tunnel->num_channels; i++) { close (tunnel->sockets[i]); remmina_ssh_tunnel_buffer_free (tunnel->socketbuffers[i]); channel_close (tunnel->channels[i]); channel_free (tunnel->channels[i]); } g_free(tunnel->channels); tunnel->channels = NULL; g_free(tunnel->sockets); tunnel->sockets = NULL; g_free(tunnel->socketbuffers); tunnel->socketbuffers = NULL; tunnel->num_channels = 0; tunnel->max_channels = 0; if (tunnel->x11_channel) { channel_close (tunnel->x11_channel); channel_free (tunnel->x11_channel); tunnel->x11_channel = NULL; } } static void remmina_ssh_tunnel_remove_channel (RemminaSSHTunnel *tunnel, gint n) { channel_close (tunnel->channels[n]); channel_free (tunnel->channels[n]); close (tunnel->sockets[n]); remmina_ssh_tunnel_buffer_free (tunnel->socketbuffers[n]); tunnel->num_channels--; tunnel->channels[n] = tunnel->channels[tunnel->num_channels]; tunnel->channels[tunnel->num_channels] = NULL; tunnel->sockets[n] = tunnel->sockets[tunnel->num_channels]; tunnel->socketbuffers[n] = tunnel->socketbuffers[tunnel->num_channels]; } /* Register the new channel/socket pair */ static void remmina_ssh_tunnel_add_channel (RemminaSSHTunnel *tunnel, ssh_channel channel, gint sock) { gint flags; gint i; i = tunnel->num_channels++; if (tunnel->num_channels > tunnel->max_channels) { /* Allocate an extra NULL pointer in channels for ssh_select */ tunnel->channels = (ssh_channel*) g_realloc (tunnel->channels, sizeof (ssh_channel) * (tunnel->num_channels + 1)); tunnel->sockets = (gint*) g_realloc (tunnel->sockets, sizeof (gint) * tunnel->num_channels); tunnel->socketbuffers = (RemminaSSHTunnelBuffer**) g_realloc (tunnel->socketbuffers, sizeof (RemminaSSHTunnelBuffer*) * tunnel->num_channels); tunnel->max_channels = tunnel->num_channels; tunnel->channels_out = (ssh_channel*) g_realloc (tunnel->channels_out, sizeof (ssh_channel) * (tunnel->num_channels + 1)); } tunnel->channels[i] = channel; tunnel->channels[i + 1] = NULL; tunnel->sockets[i] = sock; tunnel->socketbuffers[i] = NULL; flags = fcntl (sock, F_GETFL, 0); fcntl (sock, F_SETFL, flags | O_NONBLOCK); } static gpointer remmina_ssh_tunnel_main_thread_proc (gpointer data) { RemminaSSHTunnel *tunnel = (RemminaSSHTunnel*) data; gchar *ptr; ssize_t len = 0, lenw = 0; fd_set set; struct timeval timeout; GTimeVal t1, t2; glong diff; ssh_channel channel = NULL; gboolean first = TRUE; gboolean disconnected; gint sock; gint maxfd; gint i; gint ret; struct sockaddr_in sin; g_get_current_time (&t1); t2 = t1; switch (tunnel->tunnel_type) { case REMMINA_SSH_TUNNEL_OPEN: /* Accept a local connection */ sock = accept (tunnel->server_sock, NULL, NULL); if (sock < 0) { REMMINA_SSH (tunnel)->error = g_strdup ("Failed to accept local socket"); tunnel->thread = 0; return NULL; } if ((channel = channel_new (tunnel->ssh.session)) == NULL) { close (sock); remmina_ssh_set_error (REMMINA_SSH (tunnel), "Failed to createt channel : %s"); tunnel->thread = 0; return NULL; } /* Request the SSH server to connect to the destination */ if (channel_open_forward (channel, tunnel->dest, tunnel->port, "127.0.0.1", 0) != SSH_OK) { close (sock); channel_close (channel); channel_free (channel); remmina_ssh_set_error (REMMINA_SSH (tunnel), _("Failed to connect to the SSH tunnel destination: %s")); tunnel->thread = 0; return NULL; } remmina_ssh_tunnel_add_channel (tunnel, channel, sock); break; case REMMINA_SSH_TUNNEL_X11: if ((tunnel->x11_channel = channel_new (tunnel->ssh.session)) == NULL) { remmina_ssh_set_error (REMMINA_SSH (tunnel), "Failed to create channel : %s"); tunnel->thread = 0; return NULL; } if (!remmina_public_get_xauth_cookie (tunnel->localdisplay, &ptr)) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "%s", ptr); g_free(ptr); tunnel->thread = 0; return NULL; } if (channel_open_session (tunnel->x11_channel) || channel_request_x11 (tunnel->x11_channel, TRUE, NULL, ptr, gdk_screen_get_number (gdk_screen_get_default ()))) { g_free(ptr); remmina_ssh_set_error (REMMINA_SSH (tunnel), "Failed to open channel : %s"); tunnel->thread = 0; return NULL; } g_free(ptr); if (channel_request_exec (tunnel->x11_channel, tunnel->dest)) { ptr = g_strdup_printf(_("Failed to execute %s on SSH server : %%s"), tunnel->dest); remmina_ssh_set_error (REMMINA_SSH (tunnel), ptr); g_free(ptr); tunnel->thread = 0; return NULL; } if (tunnel->init_func && ! (*tunnel->init_func) (tunnel, tunnel->callback_data)) { if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } break; case REMMINA_SSH_TUNNEL_XPORT: /* Detect the next available port starting from 6010 on the server */ for (i = 10; i <= MAX_X_DISPLAY_NUMBER; i++) { if (channel_forward_listen (REMMINA_SSH (tunnel)->session, (tunnel->bindlocalhost ? "localhost" : NULL), 6000 + i, NULL)) { continue; } else { tunnel->remotedisplay = i; break; } } if (tunnel->remotedisplay < 1) { remmina_ssh_set_error (REMMINA_SSH (tunnel), _("Failed to request port forwarding : %s")); if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } if (tunnel->init_func && ! (*tunnel->init_func) (tunnel, tunnel->callback_data)) { if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } break; case REMMINA_SSH_TUNNEL_REVERSE: if (channel_forward_listen (REMMINA_SSH (tunnel)->session, NULL, tunnel->port, NULL)) { remmina_ssh_set_error (REMMINA_SSH (tunnel), _("Failed to request port forwarding : %s")); if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } if (tunnel->init_func && ! (*tunnel->init_func) (tunnel, tunnel->callback_data)) { if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } break; } tunnel->buffer_len = 10240; tunnel->buffer = g_malloc (tunnel->buffer_len); /* Start the tunnel data transmittion */ while (tunnel->running) { if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_XPORT || tunnel->tunnel_type == REMMINA_SSH_TUNNEL_X11 || tunnel->tunnel_type == REMMINA_SSH_TUNNEL_REVERSE) { if (first) { first = FALSE; /* Wait for a period of time for the first incoming connection */ if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_X11) { channel = channel_accept_x11 (tunnel->x11_channel, 15000); } else { channel = channel_forward_accept (REMMINA_SSH (tunnel)->session, 15000); } if (!channel) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), _("No response from the server.")); if (tunnel->disconnect_func) { (*tunnel->disconnect_func) (tunnel, tunnel->callback_data); } tunnel->thread = 0; return NULL; } if (tunnel->connect_func) { (*tunnel->connect_func) (tunnel, tunnel->callback_data); } if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_REVERSE) { /* For reverse tunnel, we only need one connection. */ channel_forward_cancel (REMMINA_SSH (tunnel)->session, NULL, tunnel->port); } } else if (tunnel->tunnel_type != REMMINA_SSH_TUNNEL_REVERSE) { /* Poll once per some period of time if no incoming connections. * Don't try to poll continuously as it will significantly slow down the loop */ g_get_current_time (&t1); diff = (t1.tv_sec - t2.tv_sec) * 10 + (t1.tv_usec - t2.tv_usec) / 100000; if (diff > 1) { if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_X11) { channel = channel_accept_x11 (tunnel->x11_channel, 0); } else { channel = channel_forward_accept (REMMINA_SSH (tunnel)->session, 0); } if (channel == NULL) { t2 = t1; } } } if (channel) { if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_REVERSE) { sin.sin_family = AF_INET; sin.sin_port = htons (tunnel->localport); sin.sin_addr.s_addr = inet_addr ("127.0.0.1"); sock = socket (AF_INET, SOCK_STREAM, 0); if (connect (sock, (struct sockaddr *) &sin, sizeof (sin)) < 0) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "Cannot connect to local port %i.", tunnel->localport); close (sock); sock = -1; } } else { sock = remmina_public_open_xdisplay (tunnel->localdisplay); } if (sock >= 0) { remmina_ssh_tunnel_add_channel (tunnel, channel, sock); } else { /* Failed to create unix socket. Will this happen? */ channel_close (channel); channel_free (channel); } channel = NULL; } } if (tunnel->num_channels <= 0) { /* No more connections. We should quit */ break; } timeout.tv_sec = 0; timeout.tv_usec = 200000; FD_ZERO (&set); maxfd = 0; for (i = 0; i < tunnel->num_channels; i++) { if (tunnel->sockets[i] > maxfd) { maxfd = tunnel->sockets[i]; } FD_SET (tunnel->sockets[i], &set); } ret = ssh_select (tunnel->channels, tunnel->channels_out, maxfd + 1, &set, &timeout); if (!tunnel->running) break; if (ret == SSH_EINTR) continue; if (ret == -1) break; i = 0; while (tunnel->running && i < tunnel->num_channels) { disconnected = FALSE; if (FD_ISSET (tunnel->sockets[i], &set)) { while (!disconnected && (len = read (tunnel->sockets[i], tunnel->buffer, tunnel->buffer_len)) > 0) { for (ptr = tunnel->buffer, lenw = 0; len > 0; len -= lenw, ptr += lenw) { lenw = channel_write (tunnel->channels[i], (char*) ptr, len); if (lenw <= 0) { disconnected = TRUE; break; } } } if (len == 0) disconnected = TRUE; } if (disconnected) { remmina_ssh_tunnel_remove_channel (tunnel, i); continue; } i++; } if (!tunnel->running) break; i = 0; while (tunnel->running && i < tunnel->num_channels) { disconnected = FALSE; if (!tunnel->socketbuffers[i]) { len = channel_poll (tunnel->channels[i], 0); if (len == SSH_ERROR || len == SSH_EOF) { disconnected = TRUE; } else if (len > 0) { tunnel->socketbuffers[i] = remmina_ssh_tunnel_buffer_new (len); len = channel_read_nonblocking (tunnel->channels[i], tunnel->socketbuffers[i]->data, len, 0); if (len <= 0) { disconnected = TRUE; } else { tunnel->socketbuffers[i]->len = len; } } } if (!disconnected && tunnel->socketbuffers[i]) { for (lenw = 0; tunnel->socketbuffers[i]->len > 0; tunnel->socketbuffers[i]->len -= lenw, tunnel->socketbuffers[i]->ptr += lenw) { lenw = write (tunnel->sockets[i], tunnel->socketbuffers[i]->ptr, tunnel->socketbuffers[i]->len); if (lenw == -1 && errno == EAGAIN && tunnel->running) { /* Sometimes we cannot write to a socket (always EAGAIN), probably because it's internal * buffer is full. We need read the pending bytes from the socket first. so here we simply * break, leave the buffer there, and continue with other data */ break; } if (lenw <= 0) { disconnected = TRUE; break; } } if (tunnel->socketbuffers[i]->len <= 0) { remmina_ssh_tunnel_buffer_free (tunnel->socketbuffers[i]); tunnel->socketbuffers[i] = NULL; } } if (disconnected) { remmina_ssh_tunnel_remove_channel (tunnel, i); continue; } i++; } } remmina_ssh_tunnel_close_all_channels (tunnel); return NULL; } static gpointer remmina_ssh_tunnel_main_thread (gpointer data) { RemminaSSHTunnel *tunnel = (RemminaSSHTunnel*) data; pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); while (TRUE) { remmina_ssh_tunnel_main_thread_proc (data); if (tunnel->server_sock < 0 || tunnel->thread == 0 || !tunnel->running) break; } tunnel->thread = 0; return NULL; } void remmina_ssh_tunnel_cancel_accept (RemminaSSHTunnel *tunnel) { if (tunnel->server_sock >= 0) { close (tunnel->server_sock); tunnel->server_sock = -1; } } gboolean remmina_ssh_tunnel_open (RemminaSSHTunnel* tunnel, const gchar *host, gint port, gint local_port) { gint sock; gint sockopt = 1; struct sockaddr_in sin; tunnel->tunnel_type = REMMINA_SSH_TUNNEL_OPEN; tunnel->dest = g_strdup (host); tunnel->port = port; if (tunnel->port == 0) { REMMINA_SSH (tunnel)->error = g_strdup ("Destination port has not been assigned"); return FALSE; } /* Create the server socket that listens on the local port */ sock = socket (AF_INET, SOCK_STREAM, 0); if (sock < 0) { REMMINA_SSH (tunnel)->error = g_strdup ("Failed to create socket."); return FALSE; } setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof (sockopt)); sin.sin_family = AF_INET; sin.sin_port = htons (local_port); sin.sin_addr.s_addr = inet_addr ("127.0.0.1"); if (bind (sock, (struct sockaddr *) &sin, sizeof(sin))) { REMMINA_SSH (tunnel)->error = g_strdup ("Failed to bind on local port."); close (sock); return FALSE; } if (listen (sock, 1)) { REMMINA_SSH (tunnel)->error = g_strdup ("Failed to listen on local port."); close (sock); return FALSE; } tunnel->server_sock = sock; tunnel->running = TRUE; if (pthread_create (&tunnel->thread, NULL, remmina_ssh_tunnel_main_thread, tunnel)) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "Failed to initialize pthread."); tunnel->thread = 0; return FALSE; } return TRUE; } gboolean remmina_ssh_tunnel_x11 (RemminaSSHTunnel *tunnel, const gchar *cmd) { tunnel->tunnel_type = REMMINA_SSH_TUNNEL_X11; tunnel->dest = g_strdup (cmd); tunnel->running = TRUE; if (pthread_create (&tunnel->thread, NULL, remmina_ssh_tunnel_main_thread, tunnel)) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "Failed to initialize pthread."); tunnel->thread = 0; return FALSE; } return TRUE; } gboolean remmina_ssh_tunnel_xport (RemminaSSHTunnel *tunnel, gboolean bindlocalhost) { tunnel->tunnel_type = REMMINA_SSH_TUNNEL_XPORT; tunnel->bindlocalhost = bindlocalhost; tunnel->running = TRUE; if (pthread_create (&tunnel->thread, NULL, remmina_ssh_tunnel_main_thread, tunnel)) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "Failed to initialize pthread."); tunnel->thread = 0; return FALSE; } return TRUE; } gboolean remmina_ssh_tunnel_reverse (RemminaSSHTunnel *tunnel, gint port, gint local_port) { tunnel->tunnel_type = REMMINA_SSH_TUNNEL_REVERSE; tunnel->port = port; tunnel->localport = local_port; tunnel->running = TRUE; if (pthread_create (&tunnel->thread, NULL, remmina_ssh_tunnel_main_thread, tunnel)) { remmina_ssh_set_application_error (REMMINA_SSH (tunnel), "Failed to initialize pthread."); tunnel->thread = 0; return FALSE; } return TRUE; } gboolean remmina_ssh_tunnel_terminated (RemminaSSHTunnel* tunnel) { return (tunnel->thread == 0); } void remmina_ssh_tunnel_free (RemminaSSHTunnel* tunnel) { pthread_t thread; thread = tunnel->thread; if (thread != 0) { tunnel->running = FALSE; pthread_cancel (thread); pthread_join (thread, NULL); tunnel->thread = 0; } if (tunnel->tunnel_type == REMMINA_SSH_TUNNEL_XPORT && tunnel->remotedisplay > 0) { channel_forward_cancel (REMMINA_SSH (tunnel)->session, NULL, 6000 + tunnel->remotedisplay); } if (tunnel->server_sock >= 0) { close (tunnel->server_sock); tunnel->server_sock = -1; } remmina_ssh_tunnel_close_all_channels (tunnel); g_free(tunnel->buffer); g_free(tunnel->channels_out); g_free(tunnel->dest); g_free(tunnel->localdisplay); remmina_ssh_free (REMMINA_SSH (tunnel)); } /*************************** SFTP *********************************/ RemminaSFTP* remmina_sftp_new_from_file (RemminaFile *remminafile) { RemminaSFTP *sftp; sftp = g_new (RemminaSFTP, 1); remmina_ssh_init_from_file (REMMINA_SSH (sftp), remminafile); sftp->sftp_sess = NULL; return sftp; } RemminaSFTP* remmina_sftp_new_from_ssh (RemminaSSH *ssh) { RemminaSFTP *sftp; sftp = g_new (RemminaSFTP, 1); remmina_ssh_init_from_ssh (REMMINA_SSH (sftp), ssh); sftp->sftp_sess = NULL; return sftp; } gboolean remmina_sftp_open (RemminaSFTP *sftp) { sftp->sftp_sess = sftp_new (sftp->ssh.session); if (!sftp->sftp_sess) { remmina_ssh_set_error (REMMINA_SSH (sftp), _("Failed to create sftp session: %s")); return FALSE; } if (sftp_init (sftp->sftp_sess)) { remmina_ssh_set_error (REMMINA_SSH (sftp), _("Failed to initialize sftp session: %s")); return FALSE; } return TRUE; } void remmina_sftp_free (RemminaSFTP *sftp) { if (sftp->sftp_sess) { sftp_free (sftp->sftp_sess); sftp->sftp_sess = NULL; } remmina_ssh_free (REMMINA_SSH (sftp)); } /*************************** SSH Shell *********************************/ RemminaSSHShell* remmina_ssh_shell_new_from_file (RemminaFile *remminafile) { RemminaSSHShell *shell; shell = g_new0 (RemminaSSHShell, 1); remmina_ssh_init_from_file (REMMINA_SSH (shell), remminafile); shell->master = -1; shell->slave = -1; shell->exec = g_strdup (remmina_file_get_string (remminafile, "exec")); return shell; } RemminaSSHShell* remmina_ssh_shell_new_from_ssh (RemminaSSH *ssh) { RemminaSSHShell *shell; shell = g_new0 (RemminaSSHShell, 1); remmina_ssh_init_from_ssh (REMMINA_SSH (shell), ssh); shell->master = -1; shell->slave = -1; return shell; } static gpointer remmina_ssh_shell_thread (gpointer data) { RemminaSSHShell *shell = (RemminaSSHShell*) data; fd_set fds; struct timeval timeout; ssh_channel channel = NULL; ssh_channel ch[2], chout[2]; gchar *buf = NULL; gint buf_len; gint len; gint i, ret; LOCK_SSH (shell) if ((channel = channel_new (REMMINA_SSH (shell)->session)) == NULL || channel_open_session (channel)) { UNLOCK_SSH (shell) remmina_ssh_set_error (REMMINA_SSH (shell), "Failed to open channel : %s"); if (channel) channel_free (channel); shell->thread = 0; return NULL; } channel_request_pty (channel); if (shell->exec && shell->exec[0]) { ret = channel_request_exec (channel, shell->exec); } else { ret = channel_request_shell (channel); } if (ret) { UNLOCK_SSH (shell) remmina_ssh_set_error (REMMINA_SSH (shell), "Failed to request shell : %s"); channel_close (channel); channel_free (channel); shell->thread = 0; return NULL; } shell->channel = channel; UNLOCK_SSH (shell) buf_len = 1000; buf = g_malloc (buf_len + 1); ch[0] = channel; ch[1] = NULL; while (!shell->closed) { timeout.tv_sec = 1; timeout.tv_usec = 0; FD_ZERO (&fds); FD_SET (shell->master, &fds); ret = ssh_select (ch, chout, shell->master + 1, &fds, &timeout); if (ret == SSH_EINTR) continue; if (ret == -1) break; if (FD_ISSET (shell->master, &fds)) { len = read (shell->master, buf, buf_len); if (len <= 0) break; LOCK_SSH (shell) channel_write (channel, buf, len); UNLOCK_SSH (shell) } for (i = 0; i < 2; i++) { LOCK_SSH (shell) len = channel_poll (channel, i); UNLOCK_SSH (shell) if (len == SSH_ERROR || len == SSH_EOF) { shell->closed = TRUE; break; } if (len <= 0) continue; if (len > buf_len) { buf_len = len; buf = (gchar*) g_realloc (buf, buf_len + 1); } LOCK_SSH (shell) len = channel_read_nonblocking (channel, buf, len, i); UNLOCK_SSH (shell) if (len <= 0) { shell->closed = TRUE; break; } while (len > 0) { ret = write (shell->master, buf, len); if (ret <= 0) break; len -= ret; } } } LOCK_SSH (shell) shell->channel = NULL; channel_close (channel); channel_free (channel); UNLOCK_SSH (shell) g_free(buf); shell->thread = 0; if (shell->exit_callback) shell->exit_callback (shell->user_data); return NULL; } gboolean remmina_ssh_shell_open (RemminaSSHShell *shell, RemminaSSHExitFunc exit_callback, gpointer data) { gchar *slavedevice; struct termios stermios; shell->master = posix_openpt (O_RDWR | O_NOCTTY); if (shell->master == -1 || grantpt (shell->master) == -1 || unlockpt (shell->master) == -1 || (slavedevice = ptsname (shell->master)) == NULL || (shell->slave = open (slavedevice, O_RDWR | O_NOCTTY)) < 0) { REMMINA_SSH (shell)->error = g_strdup ("Failed to create pty device."); return FALSE; } /* These settings works fine with OpenSSH... */ tcgetattr (shell->slave, &stermios); stermios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON); stermios.c_iflag &= ~(ICRNL); tcsetattr (shell->slave, TCSANOW, &stermios); shell->exit_callback = exit_callback; shell->user_data = data; /* Once the process started, we should always TRUE and assume the pthread will be created always */ pthread_create (&shell->thread, NULL, remmina_ssh_shell_thread, shell); return TRUE; } void remmina_ssh_shell_set_size (RemminaSSHShell *shell, gint columns, gint rows) { LOCK_SSH (shell) if (shell->channel) { channel_change_pty_size (shell->channel, columns, rows); } UNLOCK_SSH (shell) } void remmina_ssh_shell_free (RemminaSSHShell *shell) { pthread_t thread = shell->thread; shell->exit_callback = NULL; if (thread) { shell->closed = TRUE; pthread_join (thread, NULL); } close (shell->master); if (shell->exec) { g_free(shell->exec); shell->exec = NULL; } /* It's not necessary to close shell->slave since the other end (vte) will close it */; remmina_ssh_free (REMMINA_SSH (shell)); } #endif /* HAVE_LIBSSH */ FreeRDP-Remmina-356c033/remmina/src/remmina_ssh.h000066400000000000000000000156441171526373700215220ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASSH_H__ #define __REMMINASSH_H__ #include "config.h" #ifdef HAVE_LIBSSH #include #include #include #include #include "remmina_file.h" #include "remmina_init_dialog.h" G_BEGIN_DECLS /* ----------------- SSH Base --------------- */ #define REMMINA_SSH(a) ((RemminaSSH*)a) typedef struct _RemminaSSH { ssh_session session; ssh_callbacks callback; gboolean authenticated; gchar *server; gint port; gchar *user; gint auth; gchar *password; gchar *pubkeyfile; gchar *privkeyfile; gchar *charset; gchar *error; pthread_mutex_t ssh_mutex; }RemminaSSH; gchar* remmina_ssh_identity_path (const gchar *id); /* Auto-detect commonly used private key identities */ gchar* remmina_ssh_find_identity (void); /* Initialize the ssh object */ gboolean remmina_ssh_init_from_file (RemminaSSH *ssh, RemminaFile *remminafile); /* Initialize the SSH session */ gboolean remmina_ssh_init_session (RemminaSSH *ssh); /* Authenticate SSH session */ /* -1: Require password; 0: Failed; 1: Succeeded */ gint remmina_ssh_auth (RemminaSSH *ssh, const gchar *password); /* -1: Cancelled; 0: Failed; 1: Succeeded */ gint remmina_ssh_auth_gui (RemminaSSH *ssh, RemminaInitDialog *dialog, gboolean threaded); /* Error handling */ #define remmina_ssh_has_error(ssh) (((RemminaSSH*)ssh)->error!=NULL) void remmina_ssh_set_error (RemminaSSH *ssh, const gchar *fmt); void remmina_ssh_set_application_error (RemminaSSH *ssh, const gchar *fmt, ...); /* Converts a string to/from UTF-8, or simply duplicate it if no conversion */ gchar* remmina_ssh_convert (RemminaSSH *ssh, const gchar *from); gchar* remmina_ssh_unconvert (RemminaSSH *ssh, const gchar *from); void remmina_ssh_free (RemminaSSH *ssh); /* ------------------- SSH Tunnel ---------------------- */ typedef struct _RemminaSSHTunnel RemminaSSHTunnel; typedef struct _RemminaSSHTunnelBuffer RemminaSSHTunnelBuffer; typedef gboolean (*RemminaSSHTunnelCallback) (RemminaSSHTunnel*, gpointer); enum { REMMINA_SSH_TUNNEL_OPEN, REMMINA_SSH_TUNNEL_X11, REMMINA_SSH_TUNNEL_XPORT, REMMINA_SSH_TUNNEL_REVERSE }; struct _RemminaSSHTunnel { RemminaSSH ssh; gint tunnel_type; ssh_channel *channels; gint *sockets; RemminaSSHTunnelBuffer **socketbuffers; gint num_channels; gint max_channels; ssh_channel x11_channel; pthread_t thread; gboolean running; gchar *buffer; gint buffer_len; ssh_channel *channels_out; gint server_sock; gchar *dest; gint port; gint localport; gint remotedisplay; gboolean bindlocalhost; gchar *localdisplay; RemminaSSHTunnelCallback init_func; RemminaSSHTunnelCallback connect_func; RemminaSSHTunnelCallback disconnect_func; gpointer callback_data; }; /* Create a new SSH Tunnel session and connects to the SSH server */ RemminaSSHTunnel* remmina_ssh_tunnel_new_from_file (RemminaFile *remminafile); /* Open the tunnel. A new thread will be started and listen on a local port. * dest: The host:port of the remote destination * local_port: The listening local port for the tunnel */ gboolean remmina_ssh_tunnel_open (RemminaSSHTunnel *tunnel, const gchar *host, gint port, gint local_port); /* Cancel accepting any incoming tunnel request. * Typically called after the connection has already been establish. */ void remmina_ssh_tunnel_cancel_accept (RemminaSSHTunnel *tunnel); /* Accept the X11 tunnel. A new thread will be started and connect to local display. * cmd: The remote X11 application to be executed */ gboolean remmina_ssh_tunnel_x11 (RemminaSSHTunnel *tunnel, const gchar *cmd); /* start X Port Forwarding */ gboolean remmina_ssh_tunnel_xport (RemminaSSHTunnel *tunnel, gboolean bindlocalhost); /* start reverse tunnel. A new thread will be started and waiting for incoming connection. * port: the port listening on the remote server side. * local_port: the port listening on the local side. When connection on the server side comes * in, it will connect to the local port and create the tunnel. The caller should * start listening on the local port before calling it or in connect_func callback. */ gboolean remmina_ssh_tunnel_reverse (RemminaSSHTunnel *tunnel, gint port, gint local_port); /* Tells if the tunnel is terminated after start */ gboolean remmina_ssh_tunnel_terminated (RemminaSSHTunnel *tunnel); /* Free the tunnel */ void remmina_ssh_tunnel_free (RemminaSSHTunnel *tunnel); /*----------------------- SFTP ------------------------*/ typedef struct _RemminaSFTP { RemminaSSH ssh; sftp_session sftp_sess; }RemminaSFTP; /* Create a new SFTP session object from RemminaFile */ RemminaSFTP* remmina_sftp_new_from_file (RemminaFile *remminafile); /* Create a new SFTP session object from existing SSH session */ RemminaSFTP* remmina_sftp_new_from_ssh (RemminaSSH *ssh); /* open the SFTP session, assuming the session already authenticated */ gboolean remmina_sftp_open (RemminaSFTP *sftp); /* Free the SFTP session */ void remmina_sftp_free (RemminaSFTP *sftp); /*----------------------- SSH Shell ------------------------*/ typedef void (*RemminaSSHExitFunc) (gpointer data); typedef struct _RemminaSSHShell { RemminaSSH ssh; gint master; gint slave; gchar *exec; pthread_t thread; ssh_channel channel; gboolean closed; RemminaSSHExitFunc exit_callback; gpointer user_data; }RemminaSSHShell; /* Create a new SSH Shell session object from RemminaFile */ RemminaSSHShell* remmina_ssh_shell_new_from_file (RemminaFile *remminafile); /* Create a new SSH Shell session object from existing SSH session */ RemminaSSHShell* remmina_ssh_shell_new_from_ssh (RemminaSSH *ssh); /* open the SSH Shell, assuming the session already authenticated */ gboolean remmina_ssh_shell_open (RemminaSSHShell *shell, RemminaSSHExitFunc exit_callback, gpointer data); /* Change the SSH Shell terminal size */ void remmina_ssh_shell_set_size (RemminaSSHShell *shell, gint columns, gint rows); /* Free the SFTP session */ void remmina_ssh_shell_free (RemminaSSHShell *shell); G_END_DECLS #else #define RemminaSSH void #define RemminaSSHTunnel void #define RemminaSFTP void #define RemminaSSHShell void typedef void (*RemminaSSHTunnelCallback)(void); #endif /* HAVE_LIBSSH */ #endif /* __REMMINASSH_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_ssh_plugin.c000066400000000000000000000233051171526373700230640ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include "config.h" #if defined (HAVE_LIBSSH) && defined (HAVE_LIBVTE) #include #include #include #include "remmina_public.h" #include "remmina_plugin_manager.h" #include "remmina_ssh.h" #include "remmina_protocol_widget.h" #include "remmina_pref.h" #include "remmina_ssh_plugin.h" #define REMMINA_PLUGIN_SSH_FEATURE_TOOL_COPY 1 #define REMMINA_PLUGIN_SSH_FEATURE_TOOL_PASTE 2 /***** The SSH plugin implementation *****/ typedef struct _RemminaPluginSshData { RemminaSSHShell *shell; GtkWidget *vte; pthread_t thread; }RemminaPluginSshData; static RemminaPluginService *remmina_plugin_service = NULL; static gpointer remmina_plugin_ssh_main_thread (gpointer data) { RemminaProtocolWidget *gp = (RemminaProtocolWidget*) data; RemminaPluginSshData *gpdata; RemminaFile *remminafile; RemminaSSH *ssh; RemminaSSHShell *shell = NULL; gboolean cont = FALSE; gint ret; gchar *charset; pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL); CANCEL_ASYNC gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); ssh = g_object_get_data (G_OBJECT(gp), "user-data"); if (ssh) { /* Create SSH Shell connection based on existing SSH session */ shell = remmina_ssh_shell_new_from_ssh (ssh); if (remmina_ssh_init_session (REMMINA_SSH (shell)) && remmina_ssh_auth (REMMINA_SSH (shell), NULL) > 0 && remmina_ssh_shell_open (shell, (RemminaSSHExitFunc) remmina_plugin_service->protocol_plugin_close_connection, gp)) { cont = TRUE; } } else { /* New SSH Shell connection */ remminafile = remmina_plugin_service->protocol_plugin_get_file (gp); remmina_plugin_service->file_set_string (remminafile, "ssh_server", remmina_plugin_service->file_get_string (remminafile, "server")); shell = remmina_ssh_shell_new_from_file (remminafile); while (1) { if (!remmina_ssh_init_session (REMMINA_SSH (shell))) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (shell)->error); break; } ret = remmina_ssh_auth_gui (REMMINA_SSH (shell), REMMINA_INIT_DIALOG (remmina_protocol_widget_get_init_dialog (gp)), TRUE); if (ret == 0) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (shell)->error); } if (ret <= 0) break; if (!remmina_ssh_shell_open (shell, (RemminaSSHExitFunc) remmina_plugin_service->protocol_plugin_close_connection, gp)) { remmina_plugin_service->protocol_plugin_set_error (gp, "%s", REMMINA_SSH (shell)->error); break; } cont = TRUE; break; } } if (!cont) { if (shell) remmina_ssh_shell_free (shell); IDLE_ADD ((GSourceFunc) remmina_plugin_service->protocol_plugin_close_connection, gp); return NULL; } gpdata->shell = shell; charset = REMMINA_SSH (shell)->charset; THREADS_ENTER if (charset && charset[0] != '\0') { vte_terminal_set_encoding (VTE_TERMINAL (gpdata->vte), charset); } vte_terminal_set_pty (VTE_TERMINAL (gpdata->vte), shell->slave); THREADS_LEAVE remmina_plugin_service->protocol_plugin_emit_signal (gp, "connect"); gpdata->thread = 0; return NULL; } static gboolean remmina_plugin_ssh_on_focus_in (GtkWidget *widget, GdkEventFocus *event, RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); gtk_widget_grab_focus (gpdata->vte); return TRUE; } static gboolean remmina_plugin_ssh_on_size_allocate (GtkWidget *widget, GtkAllocation *alloc, RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; gint cols, rows; if (!gtk_widget_get_mapped (widget)) return FALSE; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); cols = vte_terminal_get_column_count (VTE_TERMINAL (widget)); rows = vte_terminal_get_row_count (VTE_TERMINAL (widget)); remmina_ssh_shell_set_size (gpdata->shell, cols, rows); return FALSE; } static void remmina_plugin_ssh_set_vte_pref (RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); if (remmina_pref.vte_font && remmina_pref.vte_font[0]) { vte_terminal_set_font_from_string (VTE_TERMINAL (gpdata->vte), remmina_pref.vte_font); } vte_terminal_set_allow_bold (VTE_TERMINAL (gpdata->vte), remmina_pref.vte_allow_bold_text); if (remmina_pref.vte_lines > 0) { vte_terminal_set_scrollback_lines (VTE_TERMINAL (gpdata->vte), remmina_pref.vte_lines); } } static void remmina_plugin_ssh_init (RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; GtkWidget *hbox; GtkWidget *vscrollbar; GtkWidget *vte; gpdata = g_new0 (RemminaPluginSshData, 1); g_object_set_data_full (G_OBJECT(gp), "plugin-data", gpdata, g_free); hbox = gtk_hbox_new (FALSE, 0); gtk_widget_show(hbox); gtk_container_add(GTK_CONTAINER (gp), hbox); g_signal_connect(G_OBJECT(hbox), "focus-in-event", G_CALLBACK(remmina_plugin_ssh_on_focus_in), gp); vte = vte_terminal_new (); gtk_widget_show(vte); vte_terminal_set_size (VTE_TERMINAL (vte), 80, 25); vte_terminal_set_scroll_on_keystroke (VTE_TERMINAL (vte), TRUE); gtk_box_pack_start (GTK_BOX (hbox), vte, TRUE, TRUE, 0); gpdata->vte = vte; remmina_plugin_ssh_set_vte_pref (gp); g_signal_connect(G_OBJECT(vte), "size-allocate", G_CALLBACK(remmina_plugin_ssh_on_size_allocate), gp); remmina_plugin_service->protocol_plugin_register_hostkey (gp, vte); vscrollbar = gtk_vscrollbar_new (vte_terminal_get_adjustment (VTE_TERMINAL (vte))); gtk_widget_show(vscrollbar); gtk_box_pack_start (GTK_BOX (hbox), vscrollbar, FALSE, TRUE, 0); } static gboolean remmina_plugin_ssh_open_connection (RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); remmina_plugin_service->protocol_plugin_set_expand (gp, TRUE); remmina_plugin_service->protocol_plugin_set_width (gp, 640); remmina_plugin_service->protocol_plugin_set_height (gp, 480); if (pthread_create (&gpdata->thread, NULL, remmina_plugin_ssh_main_thread, gp)) { remmina_plugin_service->protocol_plugin_set_error (gp, "Failed to initialize pthread. Falling back to non-thread mode..."); gpdata->thread = 0; return FALSE; } else { return TRUE; } return TRUE; } static gboolean remmina_plugin_ssh_close_connection (RemminaProtocolWidget *gp) { RemminaPluginSshData *gpdata; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); if (gpdata->thread) { pthread_cancel (gpdata->thread); if (gpdata->thread) pthread_join (gpdata->thread, NULL); } if (gpdata->shell) { remmina_ssh_shell_free (gpdata->shell); gpdata->shell = NULL; } remmina_plugin_service->protocol_plugin_emit_signal (gp, "disconnect"); return FALSE; } static gboolean remmina_plugin_ssh_query_feature (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { return TRUE; } static void remmina_plugin_ssh_call_feature (RemminaProtocolWidget *gp, const RemminaProtocolFeature *feature) { RemminaPluginSshData *gpdata; gpdata = (RemminaPluginSshData*) g_object_get_data (G_OBJECT(gp), "plugin-data"); switch (feature->id) { case REMMINA_PROTOCOL_FEATURE_TOOL_SSH: remmina_plugin_service->open_connection ( remmina_file_dup_temp_protocol (remmina_plugin_service->protocol_plugin_get_file (gp), "SSH"), NULL, gpdata->shell, NULL); return; case REMMINA_PROTOCOL_FEATURE_TOOL_SFTP: remmina_plugin_service->open_connection ( remmina_file_dup_temp_protocol (remmina_plugin_service->protocol_plugin_get_file (gp), "SFTP"), NULL, gpdata->shell, NULL); return; case REMMINA_PLUGIN_SSH_FEATURE_TOOL_COPY: vte_terminal_copy_clipboard (VTE_TERMINAL (gpdata->vte)); return; case REMMINA_PLUGIN_SSH_FEATURE_TOOL_PASTE: vte_terminal_paste_clipboard (VTE_TERMINAL (gpdata->vte)); return; } } static RemminaProtocolFeature remmina_plugin_ssh_features[] = { { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_SSH_FEATURE_TOOL_COPY, N_("Copy"), GTK_STOCK_COPY, NULL}, { REMMINA_PROTOCOL_FEATURE_TYPE_TOOL, REMMINA_PLUGIN_SSH_FEATURE_TOOL_PASTE, N_("Paste"), GTK_STOCK_PASTE, NULL}, { REMMINA_PROTOCOL_FEATURE_TYPE_END, 0, NULL, NULL, NULL} }; static RemminaProtocolPlugin remmina_plugin_ssh = { REMMINA_PLUGIN_TYPE_PROTOCOL, "SSH", N_("SSH - Secure Shell"), GETTEXT_PACKAGE, VERSION, "utilities-terminal", "utilities-terminal", NULL, NULL, REMMINA_PROTOCOL_SSH_SETTING_SSH, remmina_plugin_ssh_features, remmina_plugin_ssh_init, remmina_plugin_ssh_open_connection, remmina_plugin_ssh_close_connection, remmina_plugin_ssh_query_feature, remmina_plugin_ssh_call_feature }; void remmina_ssh_plugin_register (void) { remmina_plugin_ssh_features[0].opt3 = GUINT_TO_POINTER (remmina_pref.vte_shortcutkey_copy); remmina_plugin_ssh_features[1].opt3 = GUINT_TO_POINTER (remmina_pref.vte_shortcutkey_paste); remmina_plugin_service = &remmina_plugin_manager_service; remmina_plugin_service->register_plugin ((RemminaPlugin *) &remmina_plugin_ssh); } #else void remmina_ssh_plugin_register(void) { } #endif FreeRDP-Remmina-356c033/remmina/src/remmina_ssh_plugin.h000066400000000000000000000017201171526373700230660ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2010-2011 Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASSHPLUGIN_H__ #define __REMMINASSHPLUGIN_H__ G_BEGIN_DECLS void remmina_ssh_plugin_register(void); G_END_DECLS #endif /* __REMMINASSHPLUGIN_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_string_array.c000066400000000000000000000065061171526373700234210ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_string_array.h" RemminaStringArray* remmina_string_array_new(void) { return g_ptr_array_new(); } RemminaStringArray* remmina_string_array_new_from_string(const gchar *strs) { RemminaStringArray *array; gchar *buf, *ptr1, *ptr2; array = remmina_string_array_new(); if (!strs || strs[0] == '\0') return array; buf = g_strdup(strs); ptr1 = buf; while (ptr1) { ptr2 = strchr(ptr1, ','); if (ptr2) *ptr2++ = '\0'; remmina_string_array_add(array, ptr1); ptr1 = ptr2; } g_free(buf); return array; } RemminaStringArray* remmina_string_array_new_from_allocated_string(gchar *strs) { RemminaStringArray *array; array = remmina_string_array_new_from_string(strs); g_free(strs); return array; } void remmina_string_array_add(RemminaStringArray* array, const gchar *str) { g_ptr_array_add(array, g_strdup(str)); } gint remmina_string_array_find(RemminaStringArray* array, const gchar *str) { gint i; for (i = 0; i < array->len; i++) { if (g_strcmp0(remmina_string_array_index(array, i), str) == 0) return i; } return -1; } void remmina_string_array_remove_index(RemminaStringArray* array, gint i) { g_ptr_array_remove_index(array, i); } void remmina_string_array_remove(RemminaStringArray* array, const gchar *str) { gint i; i = remmina_string_array_find(array, str); if (i >= 0) { remmina_string_array_remove_index(array, i); } } void remmina_string_array_intersect(RemminaStringArray* array, const gchar *dest_strs) { RemminaStringArray *dest_array; gint i, j; dest_array = remmina_string_array_new_from_string(dest_strs); i = 0; while (i < array->len) { j = remmina_string_array_find(dest_array, remmina_string_array_index(array, i)); if (j < 0) { remmina_string_array_remove_index(array, i); continue; } i++; } remmina_string_array_free(dest_array); } static gint remmina_string_array_compare_func(const gchar **a, const gchar **b) { return g_strcmp0(*a, *b); } void remmina_string_array_sort(RemminaStringArray *array) { g_ptr_array_sort(array, (GCompareFunc) remmina_string_array_compare_func); } gchar* remmina_string_array_to_string(RemminaStringArray* array) { GString *gstr; gint i; gstr = g_string_new(""); for (i = 0; i < array->len; i++) { if (i > 0) g_string_append_c(gstr, ','); g_string_append(gstr, remmina_string_array_index(array, i)); } return g_string_free(gstr, FALSE); } void remmina_string_array_free(RemminaStringArray *array) { g_ptr_array_foreach(array, (GFunc) g_free, NULL); g_ptr_array_free(array, TRUE); } FreeRDP-Remmina-356c033/remmina/src/remmina_string_array.h000066400000000000000000000034711171526373700234240ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASTRINGARRAY_H__ #define __REMMINASTRINGARRAY_H__ G_BEGIN_DECLS typedef GPtrArray RemminaStringArray; RemminaStringArray* remmina_string_array_new(void); #define remmina_string_array_index(array,i) (gchar*)g_ptr_array_index(array,i) RemminaStringArray* remmina_string_array_new_from_string(const gchar *strs); RemminaStringArray* remmina_string_array_new_from_allocated_string(gchar *strs); void remmina_string_array_add(RemminaStringArray *array, const gchar *str); gint remmina_string_array_find(RemminaStringArray *array, const gchar *str); void remmina_string_array_remove_index(RemminaStringArray *array, gint i); void remmina_string_array_remove(RemminaStringArray *array, const gchar *str); void remmina_string_array_intersect(RemminaStringArray *array, const gchar *dest_strs); void remmina_string_array_sort(RemminaStringArray *array); gchar* remmina_string_array_to_string(RemminaStringArray *array); void remmina_string_array_free(RemminaStringArray *array); G_END_DECLS #endif /* __REMMINASTRINGARRAY_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_string_list.c000066400000000000000000000246111171526373700232530ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include #include "remmina_public.h" #include "remmina_string_list.h" G_DEFINE_TYPE( RemminaStringList, remmina_string_list, GTK_TYPE_TABLE) #define ERROR_COLOR "red" enum { COLUMN_TEXT, COLUMN_COLOR, NUM_COLUMNS }; static void remmina_string_list_status_error(RemminaStringList *gsl, const gchar *error) { GdkColor color; gdk_color_parse(ERROR_COLOR, &color); gtk_widget_modify_fg(gsl->status_label, GTK_STATE_NORMAL, &color); gtk_label_set_text(GTK_LABEL(gsl->status_label), error); } static void remmina_string_list_status_hints(RemminaStringList *gsl) { gtk_widget_modify_fg(gsl->status_label, GTK_STATE_NORMAL, NULL); gtk_label_set_text(GTK_LABEL(gsl->status_label), gsl->hints); } static void remmina_string_list_add(GtkWidget *widget, RemminaStringList *gsl) { GtkTreeSelection *selection; GtkTreeIter iter; GtkTreePath *path; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gsl->list)); gtk_list_store_append(gsl->store, &iter); gtk_list_store_set(gsl->store, &iter, COLUMN_COLOR, ERROR_COLOR, -1); gtk_tree_selection_select_iter(selection, &iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(gsl->store), &iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(gsl->list), path, gtk_tree_view_get_column(GTK_TREE_VIEW(gsl->list), COLUMN_TEXT), TRUE); gtk_tree_path_free(path); } static void remmina_string_list_remove(GtkWidget *widget, RemminaStringList *gsl) { GtkTreeSelection *selection; GtkTreeIter iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gsl->list)); if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { gtk_list_store_remove(gsl->store, &iter); } remmina_string_list_status_hints(gsl); } static void remmina_string_list_move(RemminaStringList *gsl, GtkTreeIter *from, GtkTreeIter *to) { GtkTreePath *path; gtk_list_store_swap(gsl->store, from, to); path = gtk_tree_model_get_path(GTK_TREE_MODEL(gsl->store), from); gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(gsl->list), path, NULL, 0, 0, 0); gtk_tree_path_free(path); } static void remmina_string_list_down(GtkWidget *widget, RemminaStringList *gsl) { GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter target_iter; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gsl->list)); if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { gtk_tree_selection_get_selected(selection, NULL, &target_iter); if (gtk_tree_model_iter_next(GTK_TREE_MODEL(gsl->store), &target_iter)) { remmina_string_list_move(gsl, &iter, &target_iter); } } } static void remmina_string_list_up(GtkWidget *widget, RemminaStringList *gsl) { GtkTreeSelection *selection; GtkTreeIter iter; GtkTreeIter target_iter; GtkTreePath *path; selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(gsl->list)); if (gtk_tree_selection_get_selected(selection, NULL, &iter)) { gtk_tree_selection_get_selected(selection, NULL, &target_iter); path = gtk_tree_model_get_path(GTK_TREE_MODEL(gsl->store), &target_iter); if (gtk_tree_path_prev(path)) { gtk_tree_model_get_iter(GTK_TREE_MODEL(gsl->store), &target_iter, path); gtk_tree_path_free(path); remmina_string_list_move(gsl, &iter, &target_iter); } } } static void remmina_string_list_cell_edited(GtkCellRendererText *cell, const gchar *path_string, const gchar *new_text, RemminaStringList *gsl) { gchar *text, *ptr, *error; GtkTreePath *path = gtk_tree_path_new_from_string(path_string); GtkTreeIter iter; gboolean has_error = FALSE; gtk_tree_model_get_iter(GTK_TREE_MODEL(gsl->store), &iter, path); text = g_strdup(new_text); /* Eliminate delimitors... */ for (ptr = text; *ptr; ptr++) { if (*ptr == STRING_DELIMITOR) *ptr = ' '; } if (gsl->validation_func) { if (!((*gsl->validation_func)(text, &error))) { remmina_string_list_status_error(gsl, error); g_free(error); has_error = TRUE; } else { remmina_string_list_status_hints(gsl); } } gtk_list_store_set(gsl->store, &iter, COLUMN_TEXT, text, COLUMN_COLOR, (has_error ? ERROR_COLOR : NULL), -1); gtk_tree_path_free (path); } static void remmina_string_list_class_init(RemminaStringListClass *klass) { } static void remmina_string_list_init(RemminaStringList *gsl) { GtkWidget *widget; GtkWidget *image; GtkWidget *scrolled_window; GtkWidget *vbox; GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkWidget *frame; gtk_table_resize(GTK_TABLE(gsl), 3, 2); /* Create the frame and add a new scrolled window, followed by the group list */ frame = gtk_frame_new(NULL); gtk_widget_show(frame); gtk_table_attach_defaults(GTK_TABLE(gsl), frame, 0, 1, 0, 1); scrolled_window = gtk_scrolled_window_new(NULL, NULL); gtk_widget_show(scrolled_window); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_container_add(GTK_CONTAINER(frame), scrolled_window); gsl->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); gsl->list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(gsl->store)); gtk_widget_show(gsl->list); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(gsl->list), FALSE); gtk_container_add(GTK_CONTAINER(scrolled_window), gsl->list); renderer = gtk_cell_renderer_text_new(); g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL); g_signal_connect(renderer, "edited", G_CALLBACK(remmina_string_list_cell_edited), gsl); column = gtk_tree_view_column_new_with_attributes(NULL, renderer, "text", COLUMN_TEXT, "foreground", COLUMN_COLOR, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(gsl->list), column); /* buttons packed into a vbox */ vbox = gtk_vbox_new(FALSE, 0); gtk_widget_show(vbox); gtk_table_attach(GTK_TABLE(gsl), vbox, 1, 2, 0, 3, 0, GTK_EXPAND | GTK_FILL, 0, 0); image = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU); gtk_widget_show(image); widget = gtk_button_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(widget), image); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_string_list_add), gsl); image = gtk_image_new_from_stock(GTK_STOCK_REMOVE, GTK_ICON_SIZE_MENU); gtk_widget_show(image); widget = gtk_button_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(widget), image); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_string_list_remove), gsl); image = gtk_image_new_from_stock(GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU); gtk_widget_show(image); widget = gtk_button_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(widget), image); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_string_list_up), gsl); gsl->up_button = widget; image = gtk_image_new_from_stock(GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU); gtk_widget_show(image); widget = gtk_button_new(); gtk_widget_show(widget); gtk_container_add(GTK_CONTAINER(widget), image); gtk_box_pack_start(GTK_BOX(vbox), widget, FALSE, FALSE, 0); g_signal_connect(G_OBJECT(widget), "clicked", G_CALLBACK(remmina_string_list_down), gsl); gsl->down_button = widget; /* The last status label */ gsl->status_label = gtk_label_new(NULL); gtk_widget_show(gsl->status_label); gtk_misc_set_alignment(GTK_MISC(gsl->status_label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(gsl), gsl->status_label, 0, 2, 2, 3, GTK_EXPAND | GTK_FILL, 0, 0, 0); gsl->hints = NULL; gsl->validation_func = NULL; } GtkWidget* remmina_string_list_new(void) { return GTK_WIDGET(g_object_new(REMMINA_TYPE_STRING_LIST, NULL)); } void remmina_string_list_set_auto_sort(RemminaStringList *gsl, gboolean auto_sort) { if (auto_sort) { gtk_widget_hide(gsl->up_button); gtk_widget_hide(gsl->down_button); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gsl->store), COLUMN_TEXT, GTK_SORT_ASCENDING); } else { gtk_widget_show(gsl->up_button); gtk_widget_show(gsl->down_button); gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gsl->store), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING); } } void remmina_string_list_set_hints(RemminaStringList *gsl, const gchar *hints) { gsl->hints = hints; remmina_string_list_status_hints(gsl); } void remmina_string_list_set_text(RemminaStringList *gsl, const gchar *text) { GtkTreeIter iter; gchar *buf, *ptr1, *ptr2; gtk_list_store_clear(gsl->store); buf = g_strdup(text); ptr1 = buf; while (ptr1 && *ptr1 != '\0') { ptr2 = strchr(ptr1, STRING_DELIMITOR); if (ptr2) *ptr2++ = '\0'; gtk_list_store_append(gsl->store, &iter); gtk_list_store_set(gsl->store, &iter, COLUMN_TEXT, ptr1, COLUMN_COLOR, NULL, -1); ptr1 = ptr2; } g_free(buf); } gchar* remmina_string_list_get_text(RemminaStringList *gsl) { GString *str; GtkTreeIter iter; gboolean first, ret; GValue value = { 0 }; const gchar *s; str = g_string_new(NULL); first = TRUE; ret = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(gsl->store), &iter); while (ret) { gtk_tree_model_get_value(GTK_TREE_MODEL(gsl->store), &iter, COLUMN_COLOR, &value); if (g_value_get_string(&value) == NULL) { g_value_unset(&value); gtk_tree_model_get_value(GTK_TREE_MODEL(gsl->store), &iter, COLUMN_TEXT, &value); s = g_value_get_string(&value); if (s && s[0] != '\0') { if (!first) { g_string_append_c(str, STRING_DELIMITOR); } else { first = FALSE; } g_string_append(str, s); } } g_value_unset(&value); ret = gtk_tree_model_iter_next(GTK_TREE_MODEL(gsl->store), &iter); } return g_string_free(str, FALSE); } void remmina_string_list_set_validation_func(RemminaStringList *gsl, RemminaStringListValidationFunc func) { gsl->validation_func = func; } FreeRDP-Remmina-356c033/remmina/src/remmina_string_list.h000066400000000000000000000051231171526373700232550ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINASTRINGLIST_H__ #define __REMMINASTRINGLIST_H__ G_BEGIN_DECLS #define REMMINA_TYPE_STRING_LIST (remmina_string_list_get_type ()) #define REMMINA_STRING_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), REMMINA_TYPE_STRING_LIST, RemminaStringList)) #define REMMINA_STRING_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), REMMINA_TYPE_STRING_LIST, RemminaStringListClass)) #define REMMINA_IS_STRING_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), REMMINA_TYPE_STRING_LIST)) #define REMMINA_IS_STRING_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), REMMINA_TYPE_STRING_LIST)) #define REMMINA_STRING_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), REMMINA_TYPE_STRING_LIST, RemminaStringListClass)) typedef gboolean (*RemminaStringListValidationFunc)(const gchar *new_str, gchar **error); typedef struct _RemminaStringList { GtkTable table; GtkListStore *store; GtkWidget *list; GtkWidget *status_label; const gchar *hints; GtkWidget *up_button; GtkWidget *down_button; RemminaStringListValidationFunc validation_func; } RemminaStringList; typedef struct _RemminaStringListClass { GtkTableClass parent_class; } RemminaStringListClass; GType remmina_string_list_get_type(void) G_GNUC_CONST; GtkWidget* remmina_string_list_new(void); void remmina_string_list_set_auto_sort(RemminaStringList *gsl, gboolean auto_sort); void remmina_string_list_set_hints(RemminaStringList *gsl, const gchar *hints); void remmina_string_list_set_text(RemminaStringList *gsl, const gchar *text); void remmina_string_list_set_validation_func(RemminaStringList *gsl, RemminaStringListValidationFunc func); /* The returned text is newly allocated */ gchar* remmina_string_list_get_text(RemminaStringList *gsl); G_END_DECLS #endif /* __REMMINASTRINGLIST_H__ */ FreeRDP-Remmina-356c033/remmina/src/remmina_widget_pool.c000066400000000000000000000104261171526373700232250ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #include #include "remmina_public.h" #include "remmina_widget_pool.h" static GPtrArray *remmina_widget_pool = NULL; static guint remmina_widget_pool_try_quit_handler = 0; static gboolean remmina_widget_pool_on_hold = FALSE; static gboolean remmina_widget_pool_try_quit(gpointer data) { if (remmina_widget_pool->len == 0 && !remmina_widget_pool_on_hold) { gtk_main_quit(); } remmina_widget_pool_try_quit_handler = 0; return FALSE; } void remmina_widget_pool_init(void) { remmina_widget_pool = g_ptr_array_new(); remmina_widget_pool_try_quit_handler = g_timeout_add(15000, remmina_widget_pool_try_quit, NULL); } static void remmina_widget_pool_on_widget_destroy(GtkWidget *widget, gpointer data) { g_ptr_array_remove(remmina_widget_pool, widget); if (remmina_widget_pool->len == 0 && remmina_widget_pool_try_quit_handler == 0) { /* Wait for a while to make sure no more windows will open before we quit the application */ remmina_widget_pool_try_quit_handler = g_timeout_add(10000, remmina_widget_pool_try_quit, NULL); } } void remmina_widget_pool_register(GtkWidget *widget) { g_ptr_array_add(remmina_widget_pool, widget); g_signal_connect(G_OBJECT(widget), "destroy", G_CALLBACK(remmina_widget_pool_on_widget_destroy), NULL); if (remmina_widget_pool_try_quit_handler) { g_source_remove(remmina_widget_pool_try_quit_handler); remmina_widget_pool_try_quit_handler = 0; } } GtkWidget* remmina_widget_pool_find(GType type, const gchar *tag) { GtkWidget *widget; gint i; GdkScreen *screen; gint screen_number; guint workspace; screen = gdk_screen_get_default(); screen_number = gdk_screen_get_number(screen); workspace = remmina_public_get_current_workspace(screen); if (remmina_widget_pool == NULL) return NULL; for (i = 0; i < remmina_widget_pool->len; i++) { widget = GTK_WIDGET(g_ptr_array_index(remmina_widget_pool, i)); if (!G_TYPE_CHECK_INSTANCE_TYPE(widget, type)) continue; if (screen_number != gdk_screen_get_number(gtk_window_get_screen(GTK_WINDOW(widget)))) continue; if (workspace != remmina_public_get_window_workspace(GTK_WINDOW(widget))) continue; if (tag && g_strcmp0((const gchar*) g_object_get_data(G_OBJECT(widget), "tag"), tag) != 0) continue; return widget; } return NULL; } GtkWidget* remmina_widget_pool_find_by_window(GType type, GdkWindow *window) { GtkWidget *widget; gint i; GdkWindow *parent; if (window == NULL || remmina_widget_pool == NULL) return NULL; for (i = 0; i < remmina_widget_pool->len; i++) { widget = GTK_WIDGET(g_ptr_array_index(remmina_widget_pool, i)); if (!G_TYPE_CHECK_INSTANCE_TYPE(widget, type)) continue; /* gdk_window_get_toplevel won't work here, if the window is an embedded client. So we iterate the window tree */ for (parent = window; parent && parent != GDK_WINDOW_ROOT; parent = gdk_window_get_parent(parent)) { if (gtk_widget_get_window(widget) == parent) return widget; } } return NULL; } void remmina_widget_pool_hold(gboolean hold) { remmina_widget_pool_on_hold = hold; if (!hold && remmina_widget_pool_try_quit_handler == 0) { remmina_widget_pool_try_quit_handler = g_timeout_add(10000, remmina_widget_pool_try_quit, NULL); } } gint remmina_widget_pool_foreach(RemminaWidgetPoolForEachFunc callback, gpointer data) { GtkWidget *widget; gint i; gint n = 0; if (remmina_widget_pool == NULL) return 0; for (i = 0; i < remmina_widget_pool->len; i++) { widget = GTK_WIDGET(g_ptr_array_index(remmina_widget_pool, i)); if (callback(widget, data)) n++; } return n; } FreeRDP-Remmina-356c033/remmina/src/remmina_widget_pool.h000066400000000000000000000025621171526373700232340ustar00rootroot00000000000000/* * Remmina - The GTK+ Remote Desktop Client * Copyright (C) 2009 - Vic Lee * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __REMMINAWIDGETPOOL_H__ #define __REMMINAWIDGETPOOL_H__ G_BEGIN_DECLS typedef gboolean (*RemminaWidgetPoolForEachFunc)(GtkWidget *widget, gpointer data); void remmina_widget_pool_init(void); void remmina_widget_pool_register(GtkWidget *widget); GtkWidget* remmina_widget_pool_find(GType type, const gchar *tag); GtkWidget* remmina_widget_pool_find_by_window(GType type, GdkWindow *window); void remmina_widget_pool_hold(gboolean hold); gint remmina_widget_pool_foreach(RemminaWidgetPoolForEachFunc callback, gpointer data); G_END_DECLS #endif /* __REMMINAWIDGETPOOL_H__ */