mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-05-09 13:42:09 -05:00

Switching to server-side rendering of X fonts under Cairo turned out to make text rendering much slower, at least on my laptop. This appears to be because PuTTY was asking the X server to render text into a 1-bit-per-pixel (bpp) pixmap before having Cairo composite into the terminal surface. On modern X servers 1bpp pixmaps are slow, being largely un-accelerated. Happily, it is possible to get Cairo to use an 8bpp pixmap instead, and this is rather faster. It's a bit inconvenient, though, because first we have to confirm that that the X Rendering Extensions is present and find the correct picture format. That requires linking in libXrender, which means a bit of CMake faff. For now, I've make libXrender mandatory (for X11 builds), but it and the corresponding Cairo functions could be made optional fairly simply. This hasn't actually made text rendering as much faster as I'd like on my laptop. While creating 1bpp pixmaps is nearly free, creating 8bpp pixmaps takes significant time because they actually involve the GPU. So I think now I need to rework my persistent-pixmap patch to work on top of this one.
261 lines
7.7 KiB
CMake
261 lines
7.7 KiB
CMake
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
|
|
|
add_sources_from_current_dir(utils
|
|
utils/arm_arch_queries.c
|
|
utils/block_signal.c
|
|
utils/cloexec.c
|
|
utils/cmdline_arg.c
|
|
utils/dputs.c
|
|
utils/filename.c
|
|
utils/fontspec.c
|
|
utils/getticks.c
|
|
utils/get_username.c
|
|
utils/keysym_to_unicode.c
|
|
utils/make_dir_and_check_ours.c
|
|
utils/make_dir_path.c
|
|
utils/make_spr_sw_abort_errno.c
|
|
utils/nonblock.c
|
|
utils/open_for_write_would_lose_data.c
|
|
utils/pgp_fingerprints.c
|
|
utils/pollwrap.c
|
|
utils/signal.c
|
|
utils/x11_ignore_error.c
|
|
# We want the ISO C implementation of ltime(), because we don't have
|
|
# a local better alternative
|
|
../utils/ltime.c)
|
|
# Compiled icon pixmap files
|
|
add_library(puttyxpms STATIC
|
|
putty-xpm.c
|
|
putty-config-xpm.c)
|
|
add_library(ptermxpms STATIC
|
|
pterm-xpm.c
|
|
pterm-config-xpm.c)
|
|
add_sources_from_current_dir(eventloop
|
|
cliloop.c uxsel.c)
|
|
add_sources_from_current_dir(console
|
|
console.c)
|
|
add_sources_from_current_dir(settings
|
|
storage.c)
|
|
add_sources_from_current_dir(network
|
|
network.c fd-socket.c agent-socket.c peerinfo.c local-proxy.c x11.c)
|
|
add_sources_from_current_dir(sshcommon
|
|
noise.c)
|
|
add_sources_from_current_dir(sshclient
|
|
gss.c agent-client.c sharing.c)
|
|
add_sources_from_current_dir(sshserver
|
|
sftpserver.c procnet.c)
|
|
add_sources_from_current_dir(sftpclient
|
|
sftp.c)
|
|
add_sources_from_current_dir(otherbackends
|
|
serial.c)
|
|
add_sources_from_current_dir(agent
|
|
agent-client.c)
|
|
|
|
add_executable(fuzzterm
|
|
${CMAKE_SOURCE_DIR}/test/fuzzterm.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-print.c
|
|
unicode.c
|
|
no-gtk.c
|
|
$<TARGET_OBJECTS:logging>)
|
|
be_list(fuzzterm FuZZterm)
|
|
add_dependencies(fuzzterm generated_licence_h)
|
|
target_link_libraries(fuzzterm
|
|
guiterminal eventloop charset settings utils)
|
|
|
|
add_executable(osxlaunch
|
|
osxlaunch.c)
|
|
|
|
add_sources_from_current_dir(plink unicode.c no-gtk.c)
|
|
add_sources_from_current_dir(pscp unicode.c no-gtk.c)
|
|
add_sources_from_current_dir(psftp unicode.c no-gtk.c)
|
|
add_sources_from_current_dir(psocks no-gtk.c)
|
|
|
|
add_executable(psusan
|
|
psusan.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/ssh/scpserver.c
|
|
unicode.c
|
|
no-gtk.c
|
|
pty.c)
|
|
be_list(psusan psusan)
|
|
target_link_libraries(psusan
|
|
eventloop sshserver keygen settings network crypto utils)
|
|
installed_program(psusan)
|
|
|
|
add_library(puttygen-common OBJECT
|
|
${CMAKE_SOURCE_DIR}/stubs/no-timing.c
|
|
keygen-noise.c
|
|
no-gtk.c
|
|
noise.c
|
|
storage.c
|
|
${CMAKE_SOURCE_DIR}/sshpubk.c
|
|
${CMAKE_SOURCE_DIR}/sshrand.c)
|
|
|
|
add_executable(puttygen
|
|
${CMAKE_SOURCE_DIR}/cmdgen.c
|
|
$<TARGET_OBJECTS:puttygen-common>)
|
|
target_link_libraries(puttygen keygen console crypto utils)
|
|
installed_program(puttygen)
|
|
|
|
add_executable(cgtest
|
|
${CMAKE_SOURCE_DIR}/cgtest.c
|
|
$<TARGET_OBJECTS:puttygen-common>)
|
|
target_link_libraries(cgtest keygen console crypto utils)
|
|
|
|
if(HAVE_ALIGNED_ALLOC)
|
|
add_library(overaligned_alloc OBJECT
|
|
${CMAKE_SOURCE_DIR}/utils/memory.c)
|
|
target_compile_definitions(overaligned_alloc PRIVATE ALLOCATION_ALIGNMENT=128)
|
|
add_executable(testsc
|
|
${CMAKE_SOURCE_DIR}/test/testsc.c
|
|
$<TARGET_OBJECTS:overaligned_alloc>)
|
|
target_link_libraries(testsc keygen crypto utils)
|
|
endif()
|
|
|
|
add_executable(testzlib
|
|
${CMAKE_SOURCE_DIR}/test/testzlib.c
|
|
${CMAKE_SOURCE_DIR}/ssh/zlib.c)
|
|
target_link_libraries(testzlib utils)
|
|
|
|
add_executable(uppity
|
|
uppity.c
|
|
${CMAKE_SOURCE_DIR}/ssh/scpserver.c
|
|
no-gtk.c
|
|
pty.c
|
|
unicode.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c)
|
|
be_list(uppity Uppity)
|
|
target_link_libraries(uppity
|
|
eventloop sshserver keygen settings network crypto utils)
|
|
|
|
if(GTK_FOUND)
|
|
add_sources_from_current_dir(utils
|
|
utils/align_label_left.c
|
|
utils/buildinfo_gtk_version.c
|
|
utils/get_label_text_dimensions.c
|
|
utils/get_x11_display.c
|
|
utils/our_dialog.c
|
|
utils/string_width.c
|
|
columns.c)
|
|
add_sources_from_current_dir(guiterminal
|
|
window.c unifont.c dialog.c config-gtk.c gtk-common.c config-unix.c unicode.c printing.c)
|
|
add_dependencies(guiterminal generated_licence_h) # dialog.c uses licence.h
|
|
|
|
add_executable(pterm
|
|
pterm.c
|
|
main-gtk-simple.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-ca-config.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-console.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-dit.c
|
|
${CMAKE_SOURCE_DIR}/proxy/nosshproxy.c
|
|
pty.c)
|
|
be_list(pterm pterm)
|
|
target_link_libraries(pterm
|
|
guiterminal eventloop settings utils ptermxpms
|
|
${GTK_LIBRARIES} ${X11_LIBRARIES} ${X11_Xrender_LIB})
|
|
installed_program(pterm)
|
|
|
|
if(GTK_VERSION GREATER_EQUAL 3)
|
|
add_executable(ptermapp
|
|
pterm.c
|
|
main-gtk-application.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-cmdline.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-ca-config.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-console.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-dit.c
|
|
${CMAKE_SOURCE_DIR}/proxy/nosshproxy.c
|
|
pty.c)
|
|
be_list(ptermapp pterm)
|
|
target_link_libraries(ptermapp
|
|
guiterminal eventloop settings utils ptermxpms
|
|
${GTK_LIBRARIES} ${X11_LIBRARIES} ${X11_Xrender_LIB})
|
|
endif()
|
|
|
|
add_executable(putty
|
|
putty.c
|
|
main-gtk-simple.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-console.c)
|
|
be_list(putty PuTTY SSH SERIAL OTHERBACKENDS)
|
|
target_link_libraries(putty
|
|
guiterminal eventloop sshclient otherbackends settings
|
|
network crypto utils puttyxpms
|
|
${GTK_LIBRARIES} ${X11_LIBRARIES} ${X11_Xrender_LIB})
|
|
set_target_properties(putty
|
|
PROPERTIES LINK_INTERFACE_MULTIPLICITY 2)
|
|
installed_program(putty)
|
|
|
|
if(GTK_VERSION GREATER_EQUAL 3)
|
|
add_executable(puttyapp
|
|
putty.c
|
|
main-gtk-application.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-cmdline.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-console.c)
|
|
be_list(puttyapp PuTTY SSH SERIAL OTHERBACKENDS)
|
|
target_link_libraries(puttyapp
|
|
guiterminal eventloop sshclient otherbackends settings
|
|
network crypto utils puttyxpms
|
|
${GTK_LIBRARIES} ${X11_LIBRARIES} ${X11_Xrender_LIB})
|
|
endif()
|
|
|
|
add_executable(puttytel
|
|
putty.c
|
|
main-gtk-simple.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-ca-config.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-console.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-rand.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-dit.c
|
|
${CMAKE_SOURCE_DIR}/proxy/nocproxy.c
|
|
${CMAKE_SOURCE_DIR}/proxy/nosshproxy.c)
|
|
be_list(puttytel PuTTYtel SERIAL OTHERBACKENDS)
|
|
target_link_libraries(puttytel
|
|
guiterminal eventloop otherbackends settings network utils
|
|
puttyxpms
|
|
${GTK_LIBRARIES} ${X11_LIBRARIES} ${X11_Xrender_LIB})
|
|
|
|
add_executable(test_lineedit
|
|
${CMAKE_SOURCE_DIR}/test/test_lineedit.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-logging.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-printing.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-storage.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-timing.c)
|
|
target_link_libraries(test_lineedit
|
|
guiterminal settings eventloop utils ${platform_libraries})
|
|
|
|
add_executable(test_terminal
|
|
${CMAKE_SOURCE_DIR}/test/test_terminal.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-storage.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-timing.c)
|
|
target_link_libraries(test_terminal
|
|
guiterminal settings eventloop utils ${platform_libraries})
|
|
endif()
|
|
|
|
# Pageant is built whether we have GTK or not; in its absence we
|
|
# degrade to a version that doesn't provide the GTK askpass.
|
|
if(GTK_FOUND)
|
|
set(pageant_conditional_sources askpass.c)
|
|
set(pageant_libs ${GTK_LIBRARIES})
|
|
else()
|
|
set(pageant_conditional_sources noaskpass.c no-gtk.c)
|
|
set(pageant_libs)
|
|
endif()
|
|
add_executable(pageant
|
|
pageant.c
|
|
${CMAKE_SOURCE_DIR}/stubs/no-gss.c
|
|
x11.c
|
|
noise.c
|
|
${CMAKE_SOURCE_DIR}/ssh/x11fwd.c
|
|
${CMAKE_SOURCE_DIR}/proxy/nosshproxy.c
|
|
${pageant_conditional_sources})
|
|
be_list(pageant Pageant)
|
|
target_link_libraries(pageant
|
|
eventloop console agent settings network crypto utils
|
|
${pageant_libs})
|
|
installed_program(pageant)
|
|
|
|
add_sources_from_current_dir(test_conf unicode.c stubs/no-uxsel.c)
|