commit a779100e89f76b46207774de124576ca9f5530df from: Oliver Lowe date: Thu Sep 4 08:05:42 2025 UTC dump autotools, search; build with zig dumping search because it requires lex and yacc, which i'm too much of a noob to deal with right now commit - e4802dc8e436eb2cd46f072685db270a35d8e0c1 commit + a779100e89f76b46207774de124576ca9f5530df blob - 08e81c7ec7cd417867a39d64a9e34a0ba8f0ea3f blob + 91a54e50843f940e900dd835f2d56fd7b9f08552 --- .gitignore +++ .gitignore @@ -5,8 +5,6 @@ *.loT *.o *.swp -Makefile -Makefile.in /ChangeLog /*.tar.gz /*.tar.bz2 @@ -117,5 +115,5 @@ Makefile.in /TAGS /version .zig-cache +zig-out src/fence/zig-out/ -*~ blob - eb55d180458d4be11143984ace1d3ef4c5db4047 (mode 644) blob + /dev/null --- Makefile.am +++ /dev/null @@ -1,98 +0,0 @@ -# Copyright 1999-2014 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - -if BUILD_TESTS -include $(top_srcdir)/tests.mk -endif - -ACLOCAL_AMFLAGS = -I m4 -AUTOMAKE_OPTIONS = dist-bzip2 dist-xz - -SUBDIRS = src config doc manual - -EXTRA_DIST = \ - ChangeLog \ - ChangeLog.gtk1 \ - ChangeLog.pre2.0.0 \ - ChangeLog.2.0.0-3.0.0 \ - ChangeLog.3.0.0-3.9.0 \ - RELEASE_NOTES \ - claws-mail-128x128.png \ - claws-mail-64x64.png \ - claws-mail.pc.in \ - claws-mail.desktop \ - claws-mail.png \ - autogen.sh \ - claws-features.h.in \ - get-git-version \ - m4 \ - version - -# hicolor icon theme, base class of all icon themes -pixmapdir=$(datadir)/icons/hicolor/48x48/apps -pixmap_DATA=claws-mail.png - -pixmap64dir=$(datadir)/icons/hicolor/64x64/apps -pixmap64_DATA=claws-mail-64x64.png - -pixmap128dir=$(datadir)/icons/hicolor/128x128/apps -pixmap128_DATA=claws-mail-128x128.png - -# when changing the name or location of the .desktop file, -# also update src/common/Makefile.am -gnomapdir = $(datadir)/applications -gnomap_DATA=claws-mail.desktop - -rename-icons: - @cd $(DESTDIR)$(datadir)/icons/hicolor/64x64/apps && \ - mv claws-mail-64x64.png claws-mail.png - @cd $(DESTDIR)$(datadir)/icons/hicolor/128x128/apps && \ - mv claws-mail-128x128.png claws-mail.png - -remove-icons: - rm -f $(DESTDIR)$(datadir)/icons/hicolor/64x64/apps/claws-mail.png - rm -f $(DESTDIR)$(datadir)/icons/hicolor/128x128/apps/claws-mail.png - -if UPDATE_GTK_ICON_CACHE -gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor - -install-data-hook: rename-icons update-icon-cache -uninstall-hook: remove-icons update-icon-cache - -update-icon-cache: - @-if test -z "$(DESTDIR)"; then \ - echo "Updating Gtk icon cache."; \ - $(gtk_update_icon_cache); \ - else \ - echo "*** Icon cache not updated. Remember to run:"; \ - echo "***"; \ - echo "*** $(gtk_update_icon_cache)"; \ - echo "***"; \ - fi -else - -install-data-hook: rename-icons -uninstall-hook: remove-icons - -endif - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = claws-mail.pc - -clawsincludedir = $(pkgincludedir) -clawsinclude_HEADERS = \ - claws-features.h - -relnotesdir = $(docdir) -relnotes_DATA = RELEASE_NOTES - -dist-local: ChangeLog - -maintainer-clean-local: - @rm -f ChangeLog - @rm -f version - -ChangeLog: version - @./tools/gitlog2changelog.py 3.9.0 > ChangeLog blob - 19fce27a37a85aa341c0eacd6f73135333a691d9 (mode 755) blob + /dev/null --- autogen.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/sh -# Copyright 1999-2014 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - -bisonver=`bison --version` - -if [ "$bisonver" = "" ]; then - echo Bison is needed to compile Claws Mail git - exit 1 -fi - -if [ "$LEX" != "" ]; then - flexver=`$LEX --version|awk '{print $2}'` -else - flexver=`flex --version|awk '{print $2}'` -fi - -if [ "$flexver" = "" ]; then - echo Flex 2.5.31 or greater is needed to compile Claws Mail git - exit 1 -else - flex_major=`echo $flexver|sed "s/\..*//"` - flex_minor=`echo $flexver|sed "s/$flex_major\.\(.*\)\..*/\1/"` - flex_micro=`echo $flexver|sed "s/$flex_major\.$flex_minor\.\(.*\)/\1/"` - - flex_numversion=$(expr \ - $flex_major \* 10000 + \ - $flex_minor \* 100 + \ - $flex_micro) - - if [ $flex_numversion -lt 20531 ]; then - echo Flex 2.5.31 or greater is needed to compile Claws Mail git - exit 1 - fi -fi - -case `uname` in - Darwin*) - if [ "`glibtoolize --version`" = "" ]; then - echo MacOS requires glibtool from either Macport or brew - exit 1 - fi - LIBTOOL="glibtoolize --force --copy" - ;; - *) - LIBTOOL="libtoolize --force --copy" - ;; -esac - -${LIBTOOL} \ - && autopoint -f \ - && aclocal -I m4 \ - && autoconf \ - && autoheader \ - && automake --add-missing --foreign --copy -if test -z "$NOCONFIGURE"; then -exec ./configure --enable-maintainer-mode "$@" -fi blob - c38443d54f684bdeadda85b4e10a8247a36230a2 (mode 644) blob + /dev/null --- claws-features.h.in +++ /dev/null @@ -1 +0,0 @@ -#undef USE_GNUTLS blob - d4b3f0a129b8cfde47c6c5ab033a3a9f2e5b39a0 (mode 644) blob + /dev/null --- config/Makefile.am +++ /dev/null @@ -1,2 +0,0 @@ - -.PHONY: test blob - 3f1bef34a0f0d57a0561e71fc215e64905d9950c (mode 644) blob + /dev/null --- config/config.rpath +++ /dev/null @@ -1,571 +0,0 @@ -#! /bin/sh -# Output a system dependent set of variables, describing how to set the -# run time search path of shared libraries in an executable. -# -# Copyright 1996-2005 Free Software Foundation, Inc. -# Taken from GNU libtool, 2001 -# Originally by Gordon Matzigkeit , 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# The first argument passed to this file is the canonical host specification, -# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM -# or -# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM -# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld -# should be set by the caller. -# -# The set of defined variables is at the end of this script. - -# Known limitations: -# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer -# than 256 bytes, otherwise the compiler driver will dump core. The only -# known workaround is to choose shorter directory names for the build -# directory and/or the installation directory. - -# All known linkers require a `.a' archive for static linking (except M$VC, -# which needs '.lib'). -libext=a -shrext=.so - -host="$1" -host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` -host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` -host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` - -cc_basename=`echo "$CC" | sed -e 's%^.*/%%'` - -# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. - -wl= -if test "$GCC" = yes; then - wl='-Wl,' -else - case "$host_os" in - aix*) - wl='-Wl,' - ;; - darwin*) - case "$cc_basename" in - xlc*) - wl='-Wl,' - ;; - esac - ;; - mingw* | pw32* | os2*) - ;; - hpux9* | hpux10* | hpux11*) - wl='-Wl,' - ;; - irix5* | irix6* | nonstopux*) - wl='-Wl,' - ;; - newsos6) - ;; - linux*) - case $cc_basename in - icc* | ecc*) - wl='-Wl,' - ;; - pgcc | pgf77 | pgf90) - wl='-Wl,' - ;; - ccc*) - wl='-Wl,' - ;; - como) - wl='-lopt=' - ;; - esac - ;; - osf3* | osf4* | osf5*) - wl='-Wl,' - ;; - sco3.2v5*) - ;; - solaris*) - wl='-Wl,' - ;; - sunos4*) - wl='-Qoption ld ' - ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - wl='-Wl,' - ;; - sysv4*MP*) - ;; - unicos*) - wl='-Wl,' - ;; - uts4*) - ;; - esac -fi - -# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. - -hardcode_libdir_flag_spec= -hardcode_libdir_separator= -hardcode_direct=no -hardcode_minus_L=no - -case "$host_os" in - cygwin* | mingw* | pw32*) - # FIXME: the MSVC++ port hasn't been tested in a loooong time - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - if test "$GCC" != yes; then - with_gnu_ld=no - fi - ;; - openbsd*) - with_gnu_ld=no - ;; -esac - -ld_shlibs=yes -if test "$with_gnu_ld" = yes; then - case "$host_os" in - aix3* | aix4* | aix5*) - # On AIX/PPC, the GNU linker is very broken - if test "$host_cpu" != ia64; then - ld_shlibs=no - fi - ;; - amigaos*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # Samuel A. Falvo II reports - # that the semantics of dynamic libraries on AmigaOS, at least up - # to version 4, is to share data among multiple programs linked - # with the same dynamic library. Since this doesn't match the - # behavior of shared libraries on other platforms, we cannot use - # them. - ld_shlibs=no - ;; - beos*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - cygwin* | mingw* | pw32*) - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec='-L$libdir' - if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - netbsd*) - ;; - solaris* | sysv5*) - if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then - ld_shlibs=no - elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - sunos4*) - hardcode_direct=yes - ;; - linux*) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - *) - if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then - : - else - ld_shlibs=no - fi - ;; - esac - if test "$ld_shlibs" = yes; then - # Unlike libtool, we use -rpath here, not --rpath, since the documented - # option of GNU ld is called -rpath, not --rpath. - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - fi -else - case "$host_os" in - aix3*) - # Note: this linker hardcodes the directories in LIBPATH if there - # are no directories specified by -L. - hardcode_minus_L=yes - if test "$GCC" = yes; then - # Neither direct hardcoding nor static linking is supported with a - # broken collect2. - hardcode_direct=unsupported - fi - ;; - aix4* | aix5*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - else - aix_use_runtimelinking=no - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[23]|aix4.[23].*|aix5*) - for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi - done - esac - fi - hardcode_direct=yes - hardcode_libdir_separator=':' - if test "$GCC" = yes; then - case $host_os in aix4.[012]|aix4.[012].*) - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && \ - strings "$collect2name" | grep resolve_lib_name >/dev/null - then - # We have reworked collect2 - hardcode_direct=yes - else - # We have old collect2 - hardcode_direct=unsupported - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= - fi - esac - fi - # Begin _LT_AC_SYS_LIBPATH_AIX. - echo 'int main () { return 0; }' > conftest.c - ${CC} ${LDFLAGS} conftest.c -o conftest - aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` - if test -z "$aix_libpath"; then - aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } -}'` - fi - if test -z "$aix_libpath"; then - aix_libpath="/usr/lib:/lib" - fi - rm -f conftest.c conftest - # End _LT_AC_SYS_LIBPATH_AIX. - if test "$aix_use_runtimelinking" = yes; then - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - else - if test "$host_cpu" = ia64; then - hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' - else - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - fi - fi - ;; - amigaos*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - # see comment about different semantics on the GNU ld section - ld_shlibs=no - ;; - bsdi[45]*) - ;; - cygwin* | mingw* | pw32*) - # When not using gcc, we currently assume that we are using - # Microsoft Visual C++. - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - hardcode_libdir_flag_spec=' ' - libext=lib - ;; - darwin* | rhapsody*) - hardcode_direct=no - if test "$GCC" = yes ; then - : - else - case "$cc_basename" in - xlc*) - ;; - *) - ld_shlibs=no - ;; - esac - fi - ;; - dgux*) - hardcode_libdir_flag_spec='-L$libdir' - ;; - freebsd1*) - ld_shlibs=no - ;; - freebsd2.2*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - freebsd2*) - hardcode_direct=yes - hardcode_minus_L=yes - ;; - freebsd* | kfreebsd*-gnu | dragonfly*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - hpux9*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - hpux10* | hpux11*) - if test "$with_gnu_ld" = no; then - case "$host_cpu" in - hppa*64*) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=no - ;; - ia64*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=no - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - *) - hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' - hardcode_libdir_separator=: - hardcode_direct=yes - # hardcode_minus_L: Not really in the search PATH, - # but as the default location of the library. - hardcode_minus_L=yes - ;; - esac - fi - ;; - irix5* | irix6* | nonstopux*) - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - netbsd*) - hardcode_libdir_flag_spec='-R$libdir' - hardcode_direct=yes - ;; - newsos6) - hardcode_direct=yes - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - openbsd*) - hardcode_direct=yes - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - else - case "$host_os" in - openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) - hardcode_libdir_flag_spec='-R$libdir' - ;; - *) - hardcode_libdir_flag_spec='${wl}-rpath,$libdir' - ;; - esac - fi - ;; - os2*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - osf3*) - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - hardcode_libdir_separator=: - ;; - osf4* | osf5*) - if test "$GCC" = yes; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - else - # Both cc and cxx compiler support -rpath directly - hardcode_libdir_flag_spec='-rpath $libdir' - fi - hardcode_libdir_separator=: - ;; - sco3.2v5*) - ;; - solaris*) - hardcode_libdir_flag_spec='-R$libdir' - ;; - sunos4*) - hardcode_libdir_flag_spec='-L$libdir' - hardcode_direct=yes - hardcode_minus_L=yes - ;; - sysv4) - case $host_vendor in - sni) - hardcode_direct=yes # is this really true??? - ;; - siemens) - hardcode_direct=no - ;; - motorola) - hardcode_direct=no #Motorola manual says yes, but my tests say they lie - ;; - esac - ;; - sysv4.3*) - ;; - sysv4*MP*) - if test -d /usr/nec; then - ld_shlibs=yes - fi - ;; - sysv4.2uw2*) - hardcode_direct=yes - hardcode_minus_L=no - ;; - sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) - ;; - sysv5*) - hardcode_libdir_flag_spec= - ;; - uts4*) - hardcode_libdir_flag_spec='-L$libdir' - ;; - *) - ld_shlibs=no - ;; - esac -fi - -# Check dynamic linker characteristics -# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. -libname_spec='lib$name' -case "$host_os" in - aix3*) - ;; - aix4* | aix5*) - ;; - amigaos*) - ;; - beos*) - ;; - bsdi[45]*) - ;; - cygwin* | mingw* | pw32*) - shrext=.dll - ;; - darwin* | rhapsody*) - shrext=.dylib - ;; - dgux*) - ;; - freebsd1*) - ;; - kfreebsd*-gnu) - ;; - freebsd*) - ;; - gnu*) - ;; - hpux9* | hpux10* | hpux11*) - case "$host_cpu" in - ia64*) - shrext=.so - ;; - hppa*64*) - shrext=.sl - ;; - *) - shrext=.sl - ;; - esac - ;; - irix5* | irix6* | nonstopux*) - case "$host_os" in - irix5* | nonstopux*) - libsuff= shlibsuff= - ;; - *) - case $LD in - *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; - *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; - *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; - *) libsuff= shlibsuff= ;; - esac - ;; - esac - ;; - linux*oldld* | linux*aout* | linux*coff*) - ;; - linux*) - ;; - knetbsd*-gnu) - ;; - netbsd*) - ;; - newsos6) - ;; - nto-qnx*) - ;; - openbsd*) - ;; - os2*) - libname_spec='$name' - shrext=.dll - ;; - osf3* | osf4* | osf5*) - ;; - sco3.2v5*) - ;; - solaris*) - ;; - sunos4*) - ;; - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - ;; - sysv4*MP*) - ;; - uts4*) - ;; -esac - -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' -escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` -shlibext=`echo "$shrext" | sed -e 's,^\.,,'` -escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` - -LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < -# Created: 1993-05-16 -# Public domain. -# -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -errstatus=0 -dirmode="" - -usage="\ -Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... - -Create each directory DIR (with mode MODE, if specified), including all -leading file name components. - -Report bugs to ." - -# process command line arguments -while test $# -gt 0 ; do - case $1 in - -h | --help | --h*) # -h for help - echo "$usage" - exit 0 - ;; - -m) # -m PERM arg - shift - test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } - dirmode=$1 - shift - ;; - --version) - echo "$0 $scriptversion" - exit 0 - ;; - --) # stop option processing - shift - break - ;; - -*) # unknown option - echo "$usage" 1>&2 - exit 1 - ;; - *) # first non-opt arg - break - ;; - esac -done - -for file -do - if test -d "$file"; then - shift - else - break - fi -done - -case $# in - 0) exit 0 ;; -esac - -# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and -# mkdir -p a/c at the same time, both will detect that a is missing, -# one will create a, then the other will try to create a and die with -# a "File exists" error. This is a problem when calling mkinstalldirs -# from a parallel make. We use --version in the probe to restrict -# ourselves to GNU mkdir, which is thread-safe. -case $dirmode in - '') - if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - echo "mkdir -p -- $*" - exec mkdir -p -- "$@" - else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - test -d ./-p && rmdir ./-p - test -d ./--version && rmdir ./--version - fi - ;; - *) - if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && - test ! -d ./--version; then - echo "mkdir -m $dirmode -p -- $*" - exec mkdir -m "$dirmode" -p -- "$@" - else - # Clean up after NextStep and OpenStep mkdir. - for d in ./-m ./-p ./--version "./$dirmode"; - do - test -d $d && rmdir $d - done - fi - ;; -esac - -for file -do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d - do - pathcomp="$pathcomp$d" - case $pathcomp in - -*) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" - - mkdir "$pathcomp" || lasterr=$? - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - else - if test ! -z "$dirmode"; then - echo "chmod $dirmode $pathcomp" - lasterr="" - chmod "$dirmode" "$pathcomp" || lasterr=$? - - if test ! -z "$lasterr"; then - errstatus=$lasterr - fi - fi - fi - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: blob - 0218a01f616eb7265619df4f87151d56be9ebaf1 (mode 755) blob + /dev/null --- config/test-driver +++ /dev/null @@ -1,148 +0,0 @@ -#! /bin/sh -# test-driver - basic testsuite driver script. - -scriptversion=2016-01-11.22; # UTC - -# Copyright (C) 2011-2017 Free Software Foundation, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -# Make unconditional expansion of undefined variables an error. This -# helps a lot in preventing typo-related bugs. -set -u - -usage_error () -{ - echo "$0: $*" >&2 - print_usage >&2 - exit 2 -} - -print_usage () -{ - cat <$log_file 2>&1 -estatus=$? - -if test $enable_hard_errors = no && test $estatus -eq 99; then - tweaked_estatus=1 -else - tweaked_estatus=$estatus -fi - -case $tweaked_estatus:$expect_failure in - 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; - 0:*) col=$grn res=PASS recheck=no gcopy=no;; - 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; - 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; - *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; - *:*) col=$red res=FAIL recheck=yes gcopy=yes;; -esac - -# Report the test outcome and exit status in the logs, so that one can -# know whether the test passed or failed simply by looking at the '.log' -# file, without the need of also peaking into the corresponding '.trs' -# file (automake bug#11814). -echo "$res $test_name (exit status: $estatus)" >>$log_file - -# Report outcome to console. -echo "${col}${res}${std}: $test_name" - -# Register the test result, and other relevant metadata. -echo ":test-result: $res" > $trs_file -echo ":global-test-result: $res" >> $trs_file -echo ":recheck: $recheck" >> $trs_file -echo ":copy-in-global-log: $gcopy" >> $trs_file - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: blob - 484c86000d211401aad8ae88c46ba1335df79257 (mode 644) blob + /dev/null --- configure.ac +++ /dev/null @@ -1,298 +0,0 @@ -AC_PREREQ([2.69]) - -m4_define([claws_VERSION], - m4_esyscmd([./get-git-version])) - -AC_INIT([claws-mail], - m4_defn([claws_VERSION])) -AC_CONFIG_SRCDIR([src/main.c]) -AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_AUX_DIR([config]) -AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE([no-define]) - -PACKAGE=claws-mail - -dnl version number -INTERFACE_AGE=0 -BINARY_AGE=0 -EXTRA_RELEASE= -EXTRA_GTK3_VERSION= - -GIT_VERSION=m4_defn([claws_VERSION]) - -if test \( -z "$GIT_VERSION" \); then - AC_MSG_ERROR([*** could not determine program version]) -fi - -MAJOR_VERSION=${GIT_VERSION%%.*} -MINOR_VERSION=${GIT_VERSION#*.} -MINOR_VERSION=${MINOR_VERSION%%.*} -MICRO_VERSION=${GIT_VERSION##*.} -MICRO_VERSION=${MICRO_VERSION%%-*} -EXTRA_VERSION=${GIT_VERSION#*-} -EXTRA_VERSION=${EXTRA_VERSION%%-*} - -if test \( "x$EXTRA_VERSION" != "x" -a `echo -n $EXTRA_VERSION | wc -c` -lt 5 \); then - VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}git${EXTRA_VERSION} -else - VERSION=${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION} - EXTRA_VERSION=0 -fi - -if test \( "x$EXTRA_RELEASE" != "x" \); then - VERSION=${VERSION}${EXTRA_RELEASE}${EXTRA_GTK3_VERSION} -fi - -AC_SUBST(PACKAGE) -AC_SUBST(VERSION) -AC_SUBST(MAJOR_VERSION) -AC_SUBST(MINOR_VERSION) -AC_SUBST(MICRO_VERSION) -AC_SUBST(EXTRA_VERSION) -AC_SUBST(GIT_VERSION) - -AC_CHECK_PROG(HAVE_GTK_ICON_CACHE, gtk-update-icon-cache, yes, no) -AM_CONDITIONAL(UPDATE_GTK_ICON_CACHE, test x"$HAVE_GTK_ICON_CACHE" = xyes) - -dnl Require pkg-config -m4_ifndef([PKG_PROG_PKG_CONFIG], - [m4_fatal([Could not locate the pkg-config autoconf macros. These -are usually located in /usr/share/aclocal/pkg.m4. If your macros -are in a different location, try setting the environment variable -ACLOCAL_FLAGS before running ./autogen.sh or autoreconf again. E.g.: -export ACLOCAL_FLAGS="-I/other/macro/dir"]) -]) -PKG_PROG_PKG_CONFIG - -dnl libtool versioning -LT_RELEASE=$MAJOR_VERSION.$MINOR_VERSION -LT_CURRENT=`expr $MICRO_VERSION - $INTERFACE_AGE` -LT_REVISION=$INTERFACE_AGE -LT_AGE=`expr $BINARY_AGE - $INTERFACE_AGE` -AC_SUBST(LT_RELEASE) -AC_SUBST(LT_CURRENT) -AC_SUBST(LT_REVISION) -AC_SUBST(LT_AGE) - -dnl Specify a header configuration file -AC_CONFIG_HEADERS(config.h) -AC_CONFIG_HEADERS(claws-features.h) - -AM_MAINTAINER_MODE - -AC_PROG_CC -AC_SEARCH_LIBS([strerror],[cposix]) -AC_PROG_INSTALL -AC_PROG_LN_S -AC_PROG_MAKE_SET -AC_PROG_CPP -AC_PROG_LEX(noyywrap) -AC_PROG_YACC -AC_LIB_PREFIX - -LT_INIT -LT_PROG_RC -LT_LANG([Windows Resource]) -LT_INIT -AC_PROG_AWK - -AC_SYS_LARGEFILE - -LDFLAGS="$LDFLAGS -Wl,--export-dynamic" - -AM_CFLAGS="-Wall" -if test $USE_MAINTAINER_MODE = yes; then - AM_CFLAGS="$AM_CFLAGS -g" -fi - -AC_SUBST(AM_CFLAGS) - -AM_ICONV - -dnl floor and ceil are in -lm -LIBS="$LIBS -lm" - -GETTEXT_PACKAGE=claws-mail -AC_SUBST(GETTEXT_PACKAGE) -AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE", [Define text domain.]) - -AM_GNU_GETTEXT_VERSION([0.18]) -AM_GNU_GETTEXT([external]) - -AC_ARG_ENABLE(gnutls, - [ --disable-gnutls Do not build GnuTLS support for TLS], - [enable_gnutls=$enableval], [enable_gnutls=yes]) - -AC_ARG_ENABLE(oauth2, - [ --disable-oauth2 Do not build OAuth2 support], - [enable_oauth2=$enableval], [enable_oauth2=yes]) - -AC_ARG_ENABLE(tests, - [ --enable-tests Build unit tests], - [enable_tests=$enableval], [enable_tests=no]) - -dnl Set PACKAGE_DATA_DIR in config.h. -if test "x${datarootdir}" = 'x${prefix}/share'; then - if test "x${prefix}" = "xNONE"; then - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${ac_default_prefix}/share/${PACKAGE}",[PACKAGE_DATA_DIR]) - else - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${prefix}/share/${PACKAGE}",[PACKAGE_DATA_DIR]) - fi -else - AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${datarootdir}/${PACKAGE}",[PACKAGE_DATA_DIR]) -fi - -AC_CHECK_LIB(xpg4, setlocale) - -dnl Check for __VA_OPT__ macro -AC_CACHE_CHECK([for __VA_OPT__], - [ac_cv_va_opt], - [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[#define va_opt_printf(format, ...) fprintf(stderr, format __VA_OPT__(,) __VA_ARGS__) - va_opt_printf("success\n");]])],[ac_cv_va_opt=yes],[ac_cv_va_opt=no])] -) -if test "$ac_cv_va_opt" = yes; then - AC_DEFINE([HAVE_VA_OPT], [1], [Define if __VA_OPT__ macro works]) -fi - -AC_FUNC_ALLOCA - -dnl check for glib -PKG_CHECK_MODULES(GLIB, [glib-2.0 >= 2.50 gmodule-2.0 >= 2.50 gobject-2.0 >= 2.50 gthread-2.0 >= 2.50]) - -GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0` -AC_SUBST(GLIB_GENMARSHAL) - -AC_SUBST(GLIB_CFLAGS) -AC_SUBST(GLIB_LIBS) - -PKG_CHECK_MODULES(GDK_PIXBUF, [gdk-pixbuf-2.0 >= 2.26]) - -dnl GNUTLS -AC_MSG_CHECKING([whether to use GnuTLS]) -AC_MSG_RESULT($enable_gnutls) -if test "x$enable_gnutls" != "xno"; then - PKG_CHECK_MODULES(GNUTLS, gnutls >= 2.2, - [ - AC_DEFINE(USE_GNUTLS, 1, gnutls) - echo "Building with GnuTLS" - ], - [ - echo "Building without GnuTLS" - AC_MSG_RESULT([*** GnuTLS support is recommended ]) - AC_MSG_RESULT([*** You can use --disable-gnutls if you don't need it.]) - AC_MSG_ERROR([GnuTLS not found]) - ]) - AC_SUBST(GNUTLS_LIBS) - AC_SUBST(GNUTLS_CFLAGS) -fi - -dnl RC dir (will be default at a certain point in time) -AC_ARG_WITH(config-dir, [ --with-config-dir=RCDIR Local configuration dir (default: .claws-mail)], - ac_cv_with_config_dir="$withval", ac_cv_with_config_dir="") - -if test x"$ac_cv_with_config_dir" = x""; then - ac_cv_with_config_dir=".claws-mail" -fi -AC_DEFINE_UNQUOTED(CFG_RC_DIR, "$ac_cv_with_config_dir", Configuration directory) - -if ! `$PKG_CONFIG --atleast-version=3.0 gnutls`; then - AC_MSG_ERROR([GnuTLS version at least 3.0 is required for password encryption.]) -fi - -AC_MSG_CHECKING([whether GnuTLS support is present for OAuth2]) -if test x"$enable_gnutls" = xyes; then - AC_MSG_RESULT([yes]) - AC_MSG_CHECKING([whether to build OAuth2 support]) - if test x"$enable_oauth2" = xyes; then - AC_MSG_RESULT([yes]) - AC_DEFINE(USE_OAUTH2, 1, [Define if OAuth2 is to be activated.]) - else - AC_MSG_RESULT([no]) - enable_oauth2=no - fi -else - AC_MSG_RESULT([no]) - enable_oauth2=no -fi - -PKG_CHECK_MODULES(GTK, gtk+-3.0 >= 3.20 cairo) - -AC_ARG_ENABLE(deprecated, - [ --disable-deprecated Disable deprecated GTK functions], - gtkdeprecated=$enableval) -AC_MSG_CHECKING([whether to use deprecated GTK functions]) -if test x"$gtkdeprecated" != xno; then - AC_MSG_RESULT(yes) -else - GTK_CFLAGS="$GTK_CFLAGS -DG_DISABLE_DEPRECATED -DGTK_DISABLE_DEPRECATED" - AC_MSG_RESULT(no) -fi - -dnl Make sure the code does not regress to using deprecated GTK stuff... -GTK_CFLAGS="$GTK_CFLAGS -DGTK_DISABLE_SINGLE_INCLUDES -DGSEAL_ENABLE" - -AC_SUBST(GTK_CFLAGS) -AC_SUBST(GTK_LIBS) - -PKG_CHECK_MODULES([LIBETPAN], [libetpan >= 1.9.4]) -LIBETPAN_LIBS=`pkg-config --libs libetpan` -AC_SUBST(LIBETPAN_LIBS) -LIBS="$LIBS $LIBETPAN_LIBS" -LIBETPAN_CFLAGS=`pkg-config --cflags libetpan` -AC_SUBST(LIBETPAN_CFLAGS) -CPPFLAGS="$CPPFLAGS $LIBETPAN_CFLAGS" - -AC_MSG_CHECKING([whether to build unit tests]) -if test x$enable_tests = xyes; then - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi -AM_CONDITIONAL(BUILD_TESTS, test "x$enable_tests" = "xyes") - -PKG_CHECK_MODULES(EXPAT, expat, HAVE_EXPAT=yes, HAVE_EXPAT=no) - -if test x"$HAVE_EXPAT" = xno; then - AC_CHECK_HEADER(expat.h, [expat_header=yes], [expat_header=no]) - AC_CHECK_LIB(expat, XML_ParserCreate, [expat_lib=yes], [expat_lib=no]) - if test x"$expat_header" = xyes -a x"$expat_lib"=xyes; then - HAVE_EXPAT=yes - EXPAT_CFLAGS="" - EXPAT_LIBS="-lexpat" - fi -fi - -AC_SUBST(EXPAT_CFLAGS) -AC_SUBST(EXPAT_LIBS) - -PKG_CHECK_MODULES(CAIRO, cairo >= 1.12.0, HAVE_CAIRO=yes, HAVE_CAIRO=no) -AC_SUBST(CAIRO_CFLAGS) -AC_SUBST(CAIRO_LIBS) - -AC_CONFIG_FILES([ -Makefile -src/common/version.h -src/Makefile -src/common/Makefile -src/common/tests/Makefile -src/gtk/Makefile -src/etpan/Makefile -src/tests/Makefile -claws-mail.pc -]) -AC_OUTPUT - -echo "$PACKAGE $VERSION" -echo "" -echo "gnuTLS : $enable_gnutls" -echo "OAuth2 : $enable_oauth2" -echo "iconv : $am_cv_func_iconv" -echo "Unit tests : $enable_tests" - -echo "" -echo "The binary will be installed in $prefix/bin" -echo "" -echo "Configuration directory: $ac_cv_with_config_dir" -echo "" -echo "Configure finished, type 'make' to build." blob - e45fb09a6d5c941f97ecf9acc660715f2b8504e5 (mode 755) blob + /dev/null --- get-git-version +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh -if test -d .git; then - git=`command -v git` - if test -x "$git"; then - version=`git describe --abbrev=6 --dirty --always` - echo "echo $version" > ./version - else - echo "Error: *** git not found. See http://git-scm.com/" - exit 1 - fi -elif test -s ./version; then - version=`sh -c ". ./version"` -else - echo "Error: *** invalid tree. Neither '.git' nor 'version' were found" - exit 1 -fi -echo -n $version blob - 3352a8321bf9f38cce2678b28c8d928b7566a4b8 (mode 644) blob + /dev/null --- src/Makefile.am +++ /dev/null @@ -1,479 +0,0 @@ -# Copyright 1999-2021 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - - -SUBDIRS = common gtk etpan fence . - -bin_PROGRAMS = claws-mail - -abook_source = \ - addrbook.c \ - addrclip.c \ - addressbook.c \ - addressbook_foldersel.c \ - addrindex.c \ - addrquery.c \ - addrselect.c \ - addrduplicates.c \ - addrmerge.c \ - editaddress.c \ - editbook.c \ - editgroup.c - -abook_headers = \ - adbookbase.h \ - addrbook.h \ - addrclip.h \ - addressbook.h \ - addressbook_foldersel.h \ - addrindex.h \ - addrquery.h \ - addrselect.h \ - addrduplicates.h \ - addrmerge.h \ - editaddress.h \ - editbook.h \ - editgroup.h - -claws_mail_SOURCES = \ - account.c \ - action.c \ - addrcache.c \ - addr_compl.c \ - addressadd.c \ - addrgather.c \ - addrharvest.c \ - addritem.c \ - advsearch.c \ - alertpanel.c \ - avatars.c \ - compose.c \ - customheader.c \ - displayheader.c \ - entity.c \ - export.c \ - folder.c \ - folder_item_prefs.c \ - foldersel.c \ - folderutils.c \ - folderview.c \ - html.c \ - imap.c \ - imap_gtk.c \ - import.c \ - inc.c \ - localfolder.c \ - main.c \ - mainwindow.c \ - manual.c \ - matcher.c \ - matcher_parser_lex.l \ - matcher_parser_parse.y \ - mbox.c \ - message_search.c \ - messageview.c \ - mh.c \ - mh_gtk.c \ - mimeview.c \ - msgcache.c \ - noticeview.c \ - oauth2.c \ - password.c \ - passwordstore.c \ - pop.c \ - prefs_account.c \ - prefs_actions.c \ - prefs_common.c \ - prefs_compose_writing.c \ - prefs_customheader.c \ - prefs_display_header.c \ - prefs_ext_prog.c \ - prefs_folder_item.c \ - prefs_gtk.c \ - prefs_matcher.c \ - prefs_message.c \ - prefs_other.c \ - prefs_quote.c \ - prefs_receive.c \ - prefs_send.c \ - prefs_summaries.c \ - prefs_summary_column.c \ - prefs_summary_open.c \ - prefs_folder_column.c \ - prefs_template.c \ - prefs_themes.c \ - prefs_toolbar.c \ - prefs_wrapping.c \ - privacy.c \ - procheader.c \ - procmime.c \ - procmsg.c \ - quote_fmt.c \ - quote_fmt_lex.l \ - quote_fmt_parse.y \ - send_message.c \ - setup.c \ - sourcewindow.c \ - statusbar.c \ - stock_pixmap.c \ - summary_search.c \ - summaryview.c \ - textview.c \ - toolbar.c \ - undo.c \ - $(abook_source) - -claws_mailincludedir = $(pkgincludedir) -claws_mailinclude_HEADERS = \ - account.h \ - action.h \ - addrcache.h \ - addr_compl.h \ - addrdefs.h \ - addressadd.h \ - addritem.h \ - addressitem.h \ - addrgather.h \ - addrharvest.h \ - advsearch.h \ - alertpanel.h \ - avatars.h \ - compose.h \ - customheader.h \ - displayheader.h \ - entity.h \ - export.h \ - folder.h \ - folder_item_prefs.h \ - foldersel.h \ - folderutils.h \ - folderview.h \ - html.h \ - imap.h \ - imap_gtk.h \ - import.h \ - inc.h \ - localfolder.h \ - main.h \ - mainwindow.h \ - manual.h \ - matcher.h \ - matchertypes.h \ - matcher_parser.h \ - matcher_parser_lex.h \ - matcher_parser_parse.h \ - mbox.h \ - message_search.h \ - messageview.h \ - mh.h \ - mh_gtk.h \ - mimeview.h \ - msgcache.h \ - noticeview.h \ - oauth2.h \ - password.h \ - passwordstore.h \ - pop.h \ - prefs_account.h \ - prefs_actions.h \ - prefs_common.h \ - prefs_compose_writing.h \ - prefs_customheader.h \ - prefs_display_header.h \ - prefs_ext_prog.h \ - prefs_folder_item.h \ - prefs_gtk.h \ - prefs_matcher.h \ - prefs_message.h \ - prefs_other.h \ - prefs_quote.h \ - prefs_receive.h \ - prefs_send.h \ - prefs_summaries.h \ - prefs_summary_column.h \ - prefs_summary_open.h \ - prefs_folder_column.h \ - prefs_template.h \ - prefs_themes.h \ - prefs_toolbar.h \ - prefs_wrapping.h \ - privacy.h \ - procheader.h \ - procmime.h \ - procmsg.h \ - proctypes.h \ - quote_fmt.h \ - quote_fmt_lex.h \ - quote_fmt_parse.h \ - remotefolder.h \ - send_message.h \ - setup.h \ - sourcewindow.h \ - statusbar.h \ - stock_pixmap.h \ - summary_search.h \ - summaryview.h \ - textview.h \ - toolbar.h \ - undo.h \ - viewtypes.h \ - $(abook_headers) - -BUILT_SOURCES = \ - matcher_parser_parse.h \ - quote_fmt_parse.h - -CLEANFILES = \ - $(BUILT_SOURCES) - -EXTRA_DIST = \ - pixmaps/addr_one.xpm \ - pixmaps/addr_two.xpm \ - pixmaps/address_book.xpm \ - pixmaps/address_search.xpm \ - pixmaps/address.xpm \ - pixmaps/anonymous.xpm \ - pixmaps/book.xpm \ - pixmaps/cancel.xpm \ - pixmaps/category.xpm \ - pixmaps/checkbox_off.xpm \ - pixmaps/checkbox_on.xpm \ - pixmaps/check_spelling.xpm \ - pixmaps/clipkey.xpm \ - pixmaps/claws_mail_icon.xpm \ - pixmaps/claws_mail_icon_64.xpm \ - pixmaps/claws_mail_compose_logo.xpm \ - pixmaps/claws_mail_logo.xpm \ - pixmaps/claws_mail_logo_small.xpm \ - pixmaps/clip.xpm \ - pixmaps/clip_gpg_signed.xpm \ - pixmaps/close.xpm \ - pixmaps/complete.xpm \ - pixmaps/continue.xpm \ - pixmaps/copied.xpm \ - pixmaps/delete_btn.xpm \ - pixmaps/delete_dup_btn.xpm \ - pixmaps/deleted.xpm \ - pixmaps/dir_close.xpm \ - pixmaps/dir_close_hrm.xpm \ - pixmaps/dir_close_hrm_mark.xpm \ - pixmaps/dir_close_mark.xpm \ - pixmaps/dir_open.xpm \ - pixmaps/dir_open_hrm.xpm \ - pixmaps/dir_open_hrm_mark.xpm \ - pixmaps/dir_open_mark.xpm \ - pixmaps/dir_noselect_close.xpm \ - pixmaps/dir_noselect_close_mark.xpm \ - pixmaps/dir_noselect_open.xpm \ - pixmaps/dir_subs_close_mark.xpm \ - pixmaps/dir_subs_close.xpm \ - pixmaps/dir_subs_open.xpm \ - pixmaps/doc_index.xpm \ - pixmaps/doc_index_close.xpm \ - pixmaps/doc_info.xpm \ - pixmaps/down_arrow.xpm \ - pixmaps/drafts_close.xpm \ - pixmaps/drafts_close_mark.xpm \ - pixmaps/drafts_open.xpm \ - pixmaps/drafts_open_mark.xpm \ - pixmaps/edit_extern.xpm \ - pixmaps/empty.xpm \ - pixmaps/error.xpm \ - pixmaps/exec.xpm \ - pixmaps/first_arrow.xpm \ - pixmaps/forwarded.xpm \ - pixmaps/gpg_signed.xpm \ - pixmaps/go_folders.xpm \ - pixmaps/group.xpm \ - pixmaps/ham_btn.xpm \ - pixmaps/ignorethread.xpm \ - pixmaps/inbox_open.xpm \ - pixmaps/inbox_open_hrm.xpm \ - pixmaps/inbox_open_hrm_mark.xpm \ - pixmaps/inbox_open_mark.xpm \ - pixmaps/inbox_close.xpm \ - pixmaps/inbox_close_hrm.xpm \ - pixmaps/inbox_close_hrm_mark.xpm \ - pixmaps/inbox_close_mark.xpm \ - pixmaps/interface.xpm \ - pixmaps/insert_file.xpm \ - pixmaps/key.xpm \ - pixmaps/key_gpg_signed.xpm \ - pixmaps/last_arrow.xpm \ - pixmaps/left_arrow.xpm \ - pixmaps/linewrap.xpm \ - pixmaps/linewrapcurrent.xpm \ - pixmaps/locked.xpm \ - pixmaps/mail_attach.xpm \ - pixmaps/mail_compose.xpm \ - pixmaps/mail_forward.xpm \ - pixmaps/mail_privacy_encrypted.xpm \ - pixmaps/mail_privacy_signed.xpm \ - pixmaps/mail_receive_all.xpm \ - pixmaps/mail_receive.xpm \ - pixmaps/mail_reply_to_all.xpm \ - pixmaps/mail_reply_to_author.xpm \ - pixmaps/mail_reply_to_list.xpm \ - pixmaps/mail_reply.xpm \ - pixmaps/mail_send_queue.xpm \ - pixmaps/mail_send.xpm \ - pixmaps/mail_sign.xpm \ - pixmaps/mail_draft.xpm \ - pixmaps/mark.xpm \ - pixmaps/mark_allread.xpm \ - pixmaps/mark_allunread.xpm \ - pixmaps/mark_ignorethread.xpm \ - pixmaps/mark_locked.xpm \ - pixmaps/mark_mark.xpm \ - pixmaps/mark_read.xpm \ - pixmaps/mark_unlocked.xpm \ - pixmaps/mark_unmark.xpm \ - pixmaps/mark_unread.xpm \ - pixmaps/mark_watchthread.xpm \ - pixmaps/mime_application.xpm \ - pixmaps/mime_audio.xpm \ - pixmaps/mime_image.xpm \ - pixmaps/mime_message.xpm \ - pixmaps/mime_pdf.xpm \ - pixmaps/mime_ps.xpm \ - pixmaps/mime_calendar.xpm \ - pixmaps/mime_pgpsig.xpm \ - pixmaps/mime_text_html.xpm \ - pixmaps/mime_text_patch.xpm \ - pixmaps/mime_text_plain.xpm \ - pixmaps/mime_unknown.xpm \ - pixmaps/moved.xpm \ - pixmaps/news_compose.xpm \ - pixmaps/new.xpm \ - pixmaps/notice_error.xpm \ - pixmaps/notice_note.xpm \ - pixmaps/notice_warn.xpm \ - pixmaps/offline.xpm \ - pixmaps/online.xpm \ - pixmaps/open_mail.xpm \ - pixmaps/outbox_close.xpm \ - pixmaps/outbox_close_hrm.xpm \ - pixmaps/outbox_open.xpm \ - pixmaps/outbox_open_hrm.xpm \ - pixmaps/outbox_close_mark.xpm \ - pixmaps/outbox_close_hrm_mark.xpm \ - pixmaps/outbox_open_mark.xpm \ - pixmaps/outbox_open_hrm_mark.xpm \ - pixmaps/paste.xpm \ - pixmaps/preferences.xpm \ - pixmaps/printer.xpm \ - pixmaps/printer_btn.xpm \ - pixmaps/privacy_expired.xpm \ - pixmaps/privacy_failed.xpm \ - pixmaps/privacy_passed.xpm \ - pixmaps/privacy_signed.xpm \ - pixmaps/privacy_unknown.xpm \ - pixmaps/privacy_warn.xpm \ - pixmaps/privacy_emblem_encrypted.xpm \ - pixmaps/privacy_emblem_failed.xpm \ - pixmaps/privacy_emblem_passed.xpm \ - pixmaps/privacy_emblem_signed.xpm \ - pixmaps/privacy_emblem_warn.xpm \ - pixmaps/properties.xpm \ - pixmaps/queue_close.xpm \ - pixmaps/queue_close_hrm.xpm \ - pixmaps/queue_close_hrm_mark.xpm \ - pixmaps/queue_close_mark.xpm \ - pixmaps/queue_open.xpm \ - pixmaps/queue_open_hrm.xpm \ - pixmaps/queue_open_hrm_mark.xpm \ - pixmaps/queue_open_mark.xpm \ - pixmaps/quicksearch.xpm \ - pixmaps/replied.xpm \ - pixmaps/replied_and_forwarded.xpm \ - pixmaps/right_arrow.xpm \ - pixmaps/rotate_left.xpm \ - pixmaps/rotate_right.xpm \ - pixmaps/selection.xpm \ - pixmaps/spam.xpm \ - pixmaps/spam_btn.xpm \ - pixmaps/trash_btn.xpm \ - pixmaps/trash_close.xpm \ - pixmaps/trash_close_hrm.xpm \ - pixmaps/trash_close_hrm_mark.xpm \ - pixmaps/trash_close_mark.xpm \ - pixmaps/trash_open.xpm \ - pixmaps/trash_open_hrm.xpm \ - pixmaps/trash_open_hrm_mark.xpm \ - pixmaps/trash_open_mark.xpm \ - pixmaps/tray_newmail_offline.xpm \ - pixmaps/tray_newmail.xpm \ - pixmaps/tray_newmarkedmail_offline.xpm \ - pixmaps/tray_newmarkedmail.xpm \ - pixmaps/tray_nomail_offline.xpm \ - pixmaps/tray_nomail.xpm \ - pixmaps/tray_unreadmail_offline.xpm \ - pixmaps/tray_unreadmail.xpm \ - pixmaps/tray_unreadmarkedmail_offline.xpm \ - pixmaps/tray_unreadmarkedmail.xpm \ - pixmaps/unread.xpm \ - pixmaps/read.xpm \ - pixmaps/up_arrow.xpm \ - pixmaps/watchthread.xpm \ - pixmaps/zoom_fit.xpm \ - pixmaps/zoom_in.xpm \ - pixmaps/zoom_out.xpm \ - pixmaps/zoom_width.xpm - -IFLAGS = \ - -I$(srcdir)/common \ - -Icommon \ - -I$(srcdir)/gtk \ - -I$(srcdir)/etpan - -claws_mail_LDFLAGS = \ - $(claws_mail_platform_ldflags) \ - -Lfence/zig-out/lib \ - -Wl,-z,nobtcfi - -# The linker flag -Wl... disables "Mandatory enforcement of indirect -# branch targets" which I think(?) trips up my shit code. -# https://www.openbsd.org/innovations.html - -etpan_library = etpan/libclawsetpan.la - -claws_mail_DEPENDENCIES = $(claws_mail_deps) \ - $(etpan_library) \ - gtk/libclawsgtk.la - -claws_mail_LDADD = \ - $(etpan_library) \ - gtk/libclawsgtk.la \ - $(INTLLIBS) \ - $(GTK_LIBS) \ - $(GNUTLS_LIBS) \ - -lpthread \ - $(LIBICONV) \ - $(LIBETPAN_LIBS) \ - $(SVG_LIBS) \ - -lfence - -pixmapdir=$(datadir)/icons/hicolor/48x48/apps - -AM_CPPFLAGS = \ - -DG_LOG_DOMAIN=\"Claws-Mail\" \ - -DLOCALEDIR=\""$(localedir)"\" \ - -DPIXMAP_DIR=\""$(pixmapdir)"\" \ - -DMANUALDIR=\""$(manualdir)"\" \ - -DTARGET_ALIAS=\""$(target_triplet)"\" \ - -DSYSCONFDIR=\""$(sysconfdir)"\" \ - -DDATAROOTDIR=\""$(datarootdir)"\" \ - $(IFLAGS) \ - $(GTK_CFLAGS) \ - $(GNUTLS_CFLAGS) \ - $(LIBETPAN_CPPFLAGS) \ - $(VALGRIND_CFLAGS) \ - -Ifence/zig-out/include - -#no-unused-function because of bison stuff -matcher_parser_lex.$(OBJEXT) : AM_CFLAGS += -Wno-unused-function -quote_fmt_lex.$(OBJEXT) : AM_CFLAGS += -Wno-unused-function - -AM_YFLAGS = -d blob - 86d11ab6bf219f775b3a27a684777483fa0534cd blob + d16a310231a094a9a584ef5b0d73626775baa44f --- src/account.c +++ src/account.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include @@ -54,9 +49,7 @@ #include "hooks.h" #include "passwordstore.h" #include "file-utils.h" -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif enum { ACCOUNT_IS_DEFAULT, @@ -1413,7 +1406,6 @@ static void account_list_store_insert_account_item(Gtk ac_prefs->recv_at_getall; gchar *protocol, *server; -#ifdef USE_GNUTLS protocol = ac_prefs->protocol == A_POP3 ? (ac_prefs->ssl_pop == SSL_TUNNEL ? "POP (TLS)" : @@ -1426,12 +1418,6 @@ static void account_list_store_insert_account_item(Gtk "IMAP (STARTTLS)" : "IMAP") : ac_prefs->protocol == A_LOCAL ? "Local" : ac_prefs->protocol == A_NONE ? "SMTP" : "-"; -#else - protocol = ac_prefs->protocol == A_POP3 ? "POP" : - ac_prefs->protocol == A_IMAP4 ? "IMAP" : - ac_prefs->protocol == A_LOCAL ? "Local" : - ac_prefs->protocol == A_NONE ? "SMTP" : "-"; -#endif server= ac_prefs->protocol == A_LOCAL ? "-" : ac_prefs->protocol == A_NONE ? ac_prefs->smtp_server : blob - 015b345509d3814a093608a2e0c0e4eafe3fac4f blob + 175376d40dc051650c9ebeeb481f2c6e92ba9431 --- src/action.c +++ src/action.c @@ -53,7 +53,6 @@ #include "procmsg.h" #include "msgcache.h" #include "textview.h" -#include "matcher_parser.h" /* CLAWS */ #include "procheader.h" typedef struct _Children Children; @@ -693,20 +692,6 @@ static gboolean execute_filtering_actions(gchar *actio if (NULL == (send = strrchr(sbegin, '}'))) return FALSE; action_string = g_strndup(sbegin, send - sbegin); - - action_list = matcher_parser_get_action_list(action_string); - if (action_list == NULL) { - gchar *tmp = g_strdup(action_string); - - g_strstrip(tmp); - if (*tmp == '\0') - alertpanel_error(_("There is no filtering action set")); - else - alertpanel_error(_("Invalid filtering action(s):\n%s"), tmp); - g_free(action_string); - g_free(tmp); - return FALSE; - } g_free(action_string); if (summaryview) { blob - 7f534df3e0a3c4836dfd3be771b5bf25fbaed564 blob + f8cd7627e5217a38445480f4b18eca557b7b2837 --- src/action.h +++ src/action.h @@ -47,7 +47,7 @@ typedef enum ActionType action_get_type (const gchar *action_str); -void actions_execute (gpointer data, +void actions_execute (gpointer data, guint action_nb, GtkWidget *widget, gint source); blob - 25f7b21aa1daac30ea03523ad148eed1cb18c982 blob + 56ce8f379ee5b57587278309d2188a757d47b85e --- src/addr_compl.c +++ src/addr_compl.c @@ -17,10 +17,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif #include "defs.h" #include blob - a056db6fa0283bfb88d85028a4880fc6596de068 blob + e1b0b7cbd1aadb1d6e64e591f0912073c34d4219 --- src/addr_compl.h +++ src/addr_compl.h @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * + * * Copyright (C) 2000-2012 by Alfons Hoogervorst & The Claws Mail Team. * * This program is free software; you can redistribute it and/or modify blob - eada4b48051ae04d7bf146192e21dff1f3e7ea94 blob + 95d9481a691324c9384339f493cf8da8f010d6c8 --- src/addrcache.c +++ src/addrcache.c @@ -21,8 +21,6 @@ * Functions to maintain address cache. */ -#include "config.h" - #include #include #include blob - c6be90b275453fe7dcd26cc1b36369f21bad13cc blob + 97193484230691929c8c7c9d57c378e74235f739 --- src/addrcache.h +++ src/addrcache.h @@ -118,7 +118,7 @@ ItemPerson *addrcache_remove_person ( AddressCache *ca ItemEMail *addrcache_remove_email ( AddressCache *cache, ItemEMail *email ); ItemEMail *addrcache_person_remove_email( AddressCache *cache, - ItemPerson *person, + ItemPerson *person, ItemEMail *email ); GList *addrcache_get_group_for_person ( AddressCache *cache, ItemPerson *person ); blob - 8912ab7975d2db28b9225e74209027b2c8d7e63c blob + 40ac4af68e9148bf603b5020098ffb168d17e4c3 --- src/addrclip.c +++ src/addrclip.c @@ -44,8 +44,6 @@ * */ -#include "config.h" - #include #include #include blob - c2d9f0a25df63058dc885a66d533163b80a8edbe blob + 87abaa45c22e560dab7212003883a21427b73806 --- src/addressbook.h +++ src/addressbook.h @@ -40,7 +40,7 @@ gboolean addressbook_add_contact ( const gchar *name, const gchar *address, const gchar *remarks, GdkPixbuf *picture ); - + gchar *addressbook_folder_selection( const gchar *folderpath); gboolean addressbook_peek_folder_exists( gchar *folderpath, AddressDataSource **book, blob - 6a2b8aaa727a066c0aa94c99ef204324192162a4 blob + bb2e3fb2564fa3f8a2f9b351927f9f687c7874c0 --- src/addritem.c +++ src/addritem.c @@ -20,8 +20,6 @@ * General primitive address item objects. */ -#include "config.h" - #include #include #include blob - 7a30f42865926c098256d878128c70fc56c413a9 blob + 6f0c6968f9947d55ac6176d1b611103552411419 --- src/addrquery.c +++ src/addrquery.c @@ -21,8 +21,6 @@ * Functions to define an address query (a request). */ -#include "config.h" - #include #include #include blob - ad4549b0d7e25182dbbdd090b63f69669916b20f blob + ae8634ac19a7f8bff0e5e579ae7919c0a4592cb0 --- src/addrselect.c +++ src/addrselect.c @@ -21,8 +21,6 @@ * Address list item selection objects. */ -#include "config.h" - #include #include blob - 2d563e43cf1381863dab4e9745dd21a9debbac58 (mode 644) blob + /dev/null --- src/advsearch.c +++ /dev/null @@ -1,566 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2012-2023 the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -# include "claws-features.h" -#endif - -#include "advsearch.h" - -#include -#include - -#include "matcher.h" -#include "matcher_parser.h" -#include "utils.h" -#include "prefs_common.h" - -struct _AdvancedSearch { - struct { - AdvancedSearchType type; - gchar *matchstring; - } request; - - MatcherList *predicate; - gboolean is_fast; - gboolean search_aborted; - - struct { - gboolean (*cb)(gpointer data, guint at, guint matched, guint total); - gpointer data; - } on_progress_cb; - struct { - void (*cb)(gpointer data); - gpointer data; - } on_error_cb; -}; - -void advsearch_set_on_progress_cb(AdvancedSearch *search, gboolean (*cb)(gpointer, guint, guint, guint), gpointer data) -{ - search->on_progress_cb.cb = cb; - search->on_progress_cb.data = data; -} - -void advsearch_set_on_error_cb(AdvancedSearch* search, void (*cb)(gpointer data), gpointer data) -{ - search->on_error_cb.cb = cb; - search->on_error_cb.data = data; -} - -static void prepare_matcher(AdvancedSearch *search); -static gboolean search_impl(MsgInfoList **messages, AdvancedSearch* search, - FolderItem* folderItem, gboolean recursive); - -// -------------------------- - -AdvancedSearch* advsearch_new() -{ - AdvancedSearch *result; - - result = g_new0(AdvancedSearch, 1); - - return result; -} - -void advsearch_free(AdvancedSearch *search) -{ - if (search->predicate != NULL) - matcherlist_free(search->predicate); - - g_free(search->request.matchstring); - g_free(search); -} - -void advsearch_set(AdvancedSearch *search, AdvancedSearchType type, const gchar *matchstring) -{ - cm_return_if_fail(search != NULL); - - search->request.type = type; - - g_free(search->request.matchstring); - search->request.matchstring = g_strdup(matchstring); - - prepare_matcher(search); -} - -gboolean advsearch_is_fast(AdvancedSearch *search) -{ - cm_return_val_if_fail(search != NULL, FALSE); - - return search->is_fast; -} - -gboolean advsearch_has_proper_predicate(AdvancedSearch *search) -{ - cm_return_val_if_fail(search != NULL, FALSE); - - return search->predicate != NULL; -} - -gboolean advsearch_search_msgs_in_folders(AdvancedSearch* search, MsgInfoList **messages, - FolderItem* folderItem, gboolean recursive) -{ - if (search == NULL || search->predicate == NULL) - return FALSE; - - search->search_aborted = FALSE; - return search_impl(messages, search, folderItem, recursive); -} - -void advsearch_abort(AdvancedSearch *search) -{ - search->search_aborted = TRUE; -} - - -static void advsearch_extract_param(GString *matcherstr, gchar **cmd_start_, gchar **cmd_end_, gboolean quotes, gboolean qualifier, gboolean casesens, gboolean regex) -{ - gchar *cmd_start, *cmd_end; - gchar term_char, save_char; - - cmd_start = *cmd_start_; - cmd_end = *cmd_end_; - - /* extract a parameter, allow quotes */ - while (*cmd_end && isspace((guchar)*cmd_end)) - cmd_end++; - - cmd_start = cmd_end; - if (*cmd_start == '"') { - term_char = '"'; - cmd_end++; - } - else - term_char = ' '; - - /* extract actual parameter */ - while ((*cmd_end) && (*cmd_end != term_char)) - cmd_end++; - - if (*cmd_end == '"') - cmd_end++; - - save_char = *cmd_end; - *cmd_end = '\0'; - - if (qualifier) { - if (casesens) - g_string_append(matcherstr, regex ? "regexp " : "match "); - else - g_string_append(matcherstr, regex ? "regexpcase " : "matchcase "); - } - - /* do we need to add quotes ? */ - if (quotes && term_char != '"') - g_string_append(matcherstr, "\""); - - /* copy actual parameter */ - g_string_append(matcherstr, cmd_start); - - /* do we need to add quotes ? */ - if (quotes && term_char != '"') - g_string_append(matcherstr, "\""); - - /* restore original character */ - *cmd_end = save_char; - - *cmd_end_ = cmd_end; - *cmd_start_ = cmd_start; - return; -} - -gchar *advsearch_expand_search_string(const gchar *search_string) -{ - int i = 0; - gchar *cmd_start, *cmd_end; - gchar save_char; - GString *matcherstr; - gchar *returnstr = NULL; - gchar *copy_str; - gboolean casesens, dontmatch, regex; - /* list of allowed pattern abbreviations */ - struct { - gchar *abbreviated; /* abbreviation */ - gchar *command; /* actual matcher command */ - gint numparams; /* number of params for cmd */ - gboolean qualifier; /* do we append stringmatch operations */ - gboolean quotes; /* do we need quotes */ - } - cmds[] = { - { "a", "all", 0, FALSE, FALSE }, - { "ag", "age_greater", 1, FALSE, FALSE }, - { "al", "age_lower", 1, FALSE, FALSE }, - { "agh","age_greater_hours", 1, FALSE, FALSE }, - { "alh","age_lower_hours", 1, FALSE, FALSE }, - { "b", "body_part", 1, TRUE, TRUE }, - { "B", "message", 1, TRUE, TRUE }, - { "c", "cc", 1, TRUE, TRUE }, - { "C", "to_or_cc", 1, TRUE, TRUE }, - { "D", "deleted", 0, FALSE, FALSE }, - { "da", "date_after", 1, FALSE, TRUE }, - { "db", "date_before", 1, FALSE, TRUE }, - { "e", "header \"Sender\"", 1, TRUE, TRUE }, - { "E", "execute", 1, FALSE, TRUE }, - { "f", "from", 1, TRUE, TRUE }, - { "F", "forwarded", 0, FALSE, FALSE }, - { "h", "headers_part", 1, TRUE, TRUE }, - { "H", "headers_cont", 1, TRUE, TRUE }, - { "ha", "has_attachments", 0, FALSE, FALSE }, - { "i", "messageid", 1, TRUE, TRUE }, - { "I", "inreplyto", 1, TRUE, TRUE }, - { "L", "locked", 0, FALSE, FALSE }, - { "N", "new", 0, FALSE, FALSE }, - { "O", "~new", 0, FALSE, FALSE }, - { "r", "replied", 0, FALSE, FALSE }, - { "R", "~unread", 0, FALSE, FALSE }, - { "s", "subject", 1, TRUE, TRUE }, - { "se", "score_equal", 1, FALSE, FALSE }, - { "sg", "score_greater", 1, FALSE, FALSE }, - { "sl", "score_lower", 1, FALSE, FALSE }, - { "Se", "size_equal", 1, FALSE, FALSE }, - { "Sg", "size_greater", 1, FALSE, FALSE }, - { "Ss", "size_smaller", 1, FALSE, FALSE }, - { "t", "to", 1, TRUE, TRUE }, - { "tg", "tag", 1, TRUE, TRUE }, - { "T", "marked", 0, FALSE, FALSE }, - { "U", "unread", 0, FALSE, FALSE }, - { "x", "references", 1, TRUE, TRUE }, - { "X", "test", 1, FALSE, FALSE }, - { "v", "header", 2, TRUE, TRUE }, - { "&", "&", 0, FALSE, FALSE }, - { "|", "|", 0, FALSE, FALSE }, - { "p", "partial", 0, FALSE, FALSE }, - { NULL, NULL, 0, FALSE, FALSE } - }; - - if (search_string == NULL) - return NULL; - - copy_str = g_strdup(search_string); - - matcherstr = g_string_sized_new(16); - cmd_start = copy_str; - while (cmd_start && *cmd_start) { - /* skip all white spaces */ - while (*cmd_start && isspace((guchar)*cmd_start)) - cmd_start++; - cmd_end = cmd_start; - - /* extract a command */ - while (*cmd_end && !isspace((guchar)*cmd_end)) - cmd_end++; - - /* save character */ - save_char = *cmd_end; - *cmd_end = '\0'; - - dontmatch = FALSE; - casesens = FALSE; - regex = FALSE; - - /* ~ and ! mean logical NOT */ - if (*cmd_start == '~' || *cmd_start == '!') - { - dontmatch = TRUE; - cmd_start++; - } - /* % means case sensitive match */ - if (*cmd_start == '%') - { - casesens = TRUE; - cmd_start++; - } - /* # means regex match */ - if (*cmd_start == '#') { - regex = TRUE; - cmd_start++; - } - - /* find matching abbreviation */ - for (i = 0; cmds[i].command; i++) { - if (!strcmp(cmd_start, cmds[i].abbreviated)) { - /* restore character */ - *cmd_end = save_char; - - /* copy command */ - if (matcherstr->len > 0) { - g_string_append(matcherstr, " "); - } - if (dontmatch) - g_string_append(matcherstr, "~"); - g_string_append(matcherstr, cmds[i].command); - g_string_append(matcherstr, " "); - - /* stop if no params required */ - if (cmds[i].numparams == 0) - break; - - /* extract a first parameter before the final matched one */ - if (cmds[i].numparams == 2) - { - advsearch_extract_param(matcherstr, &cmd_start, &cmd_end, cmds[i].quotes, FALSE, casesens, regex); - g_string_append(matcherstr, " "); - } - advsearch_extract_param(matcherstr, &cmd_start, &cmd_end, cmds[i].quotes, cmds[i].qualifier, casesens, regex); - break; - } - } - - if (*cmd_end) - cmd_end++; - cmd_start = cmd_end; - } - - g_free(copy_str); - - /* return search string if no match is found to allow - all available filtering expressions in advanced search */ - if (matcherstr->len > 0) { - returnstr = g_string_free(matcherstr, FALSE); - } else { - returnstr = g_strdup(search_string); - g_string_free(matcherstr, TRUE); - } - return returnstr; -} - -static void prepare_matcher_extended(AdvancedSearch *search) -{ - gchar *newstr = advsearch_expand_search_string(search->request.matchstring); - - if (newstr && newstr[0] != '\0') { - search->predicate = matcher_parser_get_cond(newstr, &search->is_fast); - g_free(newstr); - } -} - -#define debug_matcher_list(prefix, list) \ -do { \ - gchar *str = list ? matcherlist_to_string(list) : g_strdup("(NULL)"); \ - \ - debug_print("%s: %s\n", prefix, str); \ - \ - g_free(str); \ -} while(0) - -static void prepare_matcher_tag(AdvancedSearch *search) -{ - gchar **words = search->request.matchstring - ? g_strsplit(search->request.matchstring, " ", -1) - : NULL; - gint i = 0; - - if (search->predicate == NULL) { - search->predicate = g_new0(MatcherList, 1); - search->predicate->bool_and = FALSE; - search->is_fast = TRUE; - } - - while (words && words[i] && *words[i]) { - MatcherProp *matcher; - - g_strstrip(words[i]); - - matcher = matcherprop_new(MATCHCRITERIA_TAG, NULL, - MATCHTYPE_MATCHCASE, words[i], 0); - - search->predicate->matchers = g_slist_prepend(search->predicate->matchers, matcher); - - i++; - } - g_strfreev(words); -} - -static void prepare_matcher_header(AdvancedSearch *search, gint match_header) -{ - MatcherProp *matcher; - - if (search->predicate == NULL) { - search->predicate = g_new0(MatcherList, 1); - search->predicate->bool_and = FALSE; - search->is_fast = TRUE; - } - - matcher = matcherprop_new(match_header, NULL, MATCHTYPE_MATCHCASE, - search->request.matchstring, 0); - - search->predicate->matchers = g_slist_prepend(search->predicate->matchers, matcher); -} - -static void prepare_matcher_mixed(AdvancedSearch *search) -{ - prepare_matcher_tag(search); - debug_matcher_list("tag matcher list", search->predicate); - - /* we want an OR search */ - if (search->predicate) - search->predicate->bool_and = FALSE; - - prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); - debug_matcher_list("tag + subject matcher list", search->predicate); - prepare_matcher_header(search, MATCHCRITERIA_FROM); - debug_matcher_list("tag + subject + from matcher list", search->predicate); - prepare_matcher_header(search, MATCHCRITERIA_TO); - debug_matcher_list("tag + subject + from + to matcher list", search->predicate); - prepare_matcher_header(search, MATCHCRITERIA_CC); - debug_matcher_list("tag + subject + from + to + cc matcher list", search->predicate); -} - -static void prepare_matcher(AdvancedSearch *search) -{ - const gchar *search_string; - - cm_return_if_fail(search != NULL); - - if (search->predicate) { - matcherlist_free(search->predicate); - search->predicate = NULL; - } - - search_string = search->request.matchstring; - - if (search_string == NULL || search_string[0] == '\0') - return; - - switch (search->request.type) { - case ADVANCED_SEARCH_SUBJECT: - prepare_matcher_header(search, MATCHCRITERIA_SUBJECT); - debug_matcher_list("subject search", search->predicate); - break; - - case ADVANCED_SEARCH_FROM: - prepare_matcher_header(search, MATCHCRITERIA_FROM); - debug_matcher_list("from search", search->predicate); - break; - - case ADVANCED_SEARCH_TO: - prepare_matcher_header(search, MATCHCRITERIA_TO); - debug_matcher_list("to search", search->predicate); - break; - - case ADVANCED_SEARCH_TAG: - prepare_matcher_tag(search); - debug_matcher_list("tag search", search->predicate); - break; - - case ADVANCED_SEARCH_MIXED: - prepare_matcher_mixed(search); - debug_matcher_list("mixed search", search->predicate); - break; - - case ADVANCED_SEARCH_EXTENDED: - prepare_matcher_extended(search); - debug_matcher_list("extended search", search->predicate); - break; - - default: - debug_print("unknown search type (%d)\n", search->request.type); - break; - } -} - -static gboolean search_progress_notify_cb(gpointer data, gboolean on_server, guint at, - guint matched, guint total) -{ - AdvancedSearch *search = (AdvancedSearch*) data; - - if (search->search_aborted) - return FALSE; - - if (on_server || search->on_progress_cb.cb == NULL) - return TRUE; - - return search->on_progress_cb.cb(search->on_progress_cb.data, at, matched, total); -} - -static gboolean search_filter_folder(MsgNumberList **msgnums, AdvancedSearch *search, - FolderItem *folderItem, gboolean onServer) -{ - gint matched; - gboolean tried_server = onServer; - - matched = folder_item_search_msgs(folderItem->folder, - folderItem, - msgnums, - &onServer, - search->predicate, - search_progress_notify_cb, - search); - - if (matched < 0) { - if (search->on_error_cb.cb != NULL) - search->on_error_cb.cb(search->on_error_cb.data); - return FALSE; - } - - if (folderItem->folder->klass->supports_server_search && tried_server && !onServer) { - return search_filter_folder(msgnums, search, folderItem, onServer); - } else { - return TRUE; - } -} - -static gboolean search_impl(MsgInfoList **messages, AdvancedSearch* search, - FolderItem* folderItem, gboolean recursive) -{ - if (recursive) { - if (!search_impl(messages, search, folderItem, FALSE)) { - return FALSE; - } - if (folderItem->node->children != NULL && !search->search_aborted) { - GNode *node; - for (node = folderItem->node->children; node != NULL; node = node->next) { - FolderItem *cur = FOLDER_ITEM(node->data); - debug_print("in: %s\n", cur->path); - if (!search_impl(messages, search, cur, TRUE)) { - return FALSE; - } - } - } - } else if (!folderItem->no_select) { - MsgNumberList *msgnums = NULL; - MsgNumberList *cur; - MsgInfoList *msgs = NULL; - gboolean can_search_on_server = folderItem->folder->klass->supports_server_search; - if (!search_filter_folder(&msgnums, search, folderItem, - can_search_on_server)) { - g_slist_free(msgnums); - return FALSE; - } - - for (cur = msgnums; cur != NULL; cur = cur->next) { - MsgInfo *msg = folder_item_get_msginfo(folderItem, GPOINTER_TO_UINT(cur->data)); - - msgs = g_slist_prepend(msgs, msg); - } - - while (msgs != NULL) { - MsgInfoList *front = msgs; - - msgs = msgs->next; - - front->next = *messages; - *messages = front; - } - - g_slist_free(msgnums); - } - - return TRUE; -} blob - 2f66a88d448db93c6d891c5b0ca44f3cbcb7d7eb (mode 644) blob + /dev/null --- src/advsearch.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2012 the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef ADVSEARCH_H -#define ADVSEARCH_H 1 - -#include "proctypes.h" -#include "folder.h" - -// temporary -#include "matcher.h" - -typedef enum -{ - ADVANCED_SEARCH_SUBJECT, - ADVANCED_SEARCH_FROM, - ADVANCED_SEARCH_TO, - ADVANCED_SEARCH_EXTENDED, - ADVANCED_SEARCH_MIXED, - ADVANCED_SEARCH_TAG, -} AdvancedSearchType; - - -typedef struct _AdvancedSearch AdvancedSearch; - -void advsearch_set_on_progress_cb(AdvancedSearch* search, - gboolean (*cb)(gpointer data, guint at, guint matched, guint total), gpointer data); -void advsearch_set_on_error_cb(AdvancedSearch* search, void (*cb)(gpointer data), gpointer data); - -AdvancedSearch *advsearch_new(); -void advsearch_free(AdvancedSearch *search); - -void advsearch_set(AdvancedSearch *search, AdvancedSearchType type, const gchar *matchstring); -gboolean advsearch_is_fast(AdvancedSearch *search); -gboolean advsearch_has_proper_predicate(AdvancedSearch *search); - -gboolean advsearch_search_msgs_in_folders(AdvancedSearch* search, MsgInfoList **messages, - FolderItem* folderItem, gboolean recursive); - -void advsearch_abort(AdvancedSearch *search); - -gchar *advsearch_expand_search_string(const gchar *search_string); - -#endif blob - /dev/null blob + 1eef23314842d0aa522f7fdcd0f9d640eba69644 (mode 644) --- /dev/null +++ src/build.zig @@ -0,0 +1,184 @@ +const std = @import("std"); + +var alloc = std.heap.DebugAllocator(.{}){}; + +fn cFiles(name: []const u8) ![][]const u8 { + var dir = try std.fs.cwd().openDir(name, .{.iterate = true}); + defer dir.close(); + const dba = alloc.allocator(); + var files = std.ArrayList([]const u8).init(dba); + var iter = dir.iterate(); + while (try iter.next()) |dent| { + if (std.mem.endsWith(u8, dent.name, ".c")) { + try files.append(try std.fs.path.join(dba, &.{name, dent.name})); + } + } + return files.toOwnedSlice(); +} + +// Although this function looks imperative, note that its job is to +// declaratively construct a build graph that will be executed by an external +// runner. +pub fn build(b: *std.Build) void { + // Standard target options allows the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. + const target = b.standardTargetOptions(.{}); + + // Standard optimization options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not + // set a preferred release mode, allowing the user to decide how to optimize. + const optimize = b.standardOptimizeOption(.{}); + + const fence_mod = b.createModule(.{ + .root_source_file = b.path("fence/src/root.zig"), + .target = target, + }); + const fence = b.addLibrary(.{ + .name = "fence", + .root_module = fence_mod, + }); + // https://github.com/ziglang/zig/issues/6817 + fence.bundle_compiler_rt = true; + const header_file = b.addInstallHeaderFile(b.path("fence/src/fence.h"), "fence.h"); + b.getInstallStep().dependOn(&header_file.step); + + const extlibs = [_][]const u8{ + "cairo", "glib-2.0", "gtk-3", "gdk-3", "gdk_pixbuf-2.0", "pango-1.0", + "iconv", + "gnutls", "gmp", "unistring", + }; + + const common_mod = b.createModule(.{ + .target = target, + .link_libc = true, + }); + common_mod.linkLibrary(fence); + for (extlibs) |l| { + common_mod.linkSystemLibrary(l, .{}); + } + const common = b.addLibrary(.{ + .name = "clawscommon", + .root_module = common_mod, + }); + common.addCSourceFiles(.{ + .files = cFiles("common") catch unreachable, + .flags = &.{"-g"}, + }); + common.addIncludePath(b.path("zig-out/include")); + + const gtk_mod = b.createModule(.{ + .target = target, + .link_libc = true, + }); + for (extlibs) |l| { + gtk_mod.linkSystemLibrary(l, .{}); + } + gtk_mod.linkSystemLibrary("atk-1.0", .{}); + const gtk = b.addLibrary(.{ + .name = "clawsgtk", + .root_module = gtk_mod, + }); + gtk.addCSourceFiles(.{ + .files = cFiles("gtk") catch unreachable, + .flags = &.{"-g"}, + }); + gtk.addIncludePath(b.path(".")); + gtk.addIncludePath(b.path("common")); + + const etpan_mod = b.createModule(.{ + .target = target, + .link_libc = true, + }); + for (extlibs) |l| { + etpan_mod.linkSystemLibrary(l, .{}); + } + etpan_mod.linkLibrary(common); + etpan_mod.linkSystemLibrary("etpan", .{}); + etpan_mod.linkSystemLibrary("atk", .{}); + const etpan = b.addLibrary(.{ + .name = "clawsetpan", + .root_module = etpan_mod, + }); + etpan.addCSourceFiles(.{ + .files = cFiles("etpan") catch unreachable, + .flags = &.{"-g"}, + }); + etpan.addIncludePath(b.path(".")); + etpan.addIncludePath(b.path("common")); + + // We will also create a module for our other entry point, 'main.zig'. + const exe_mod = b.createModule(.{ + .target = target, + .optimize = optimize, + .link_libc = true, + }); + exe_mod.linkLibrary(fence); + exe_mod.linkLibrary(common); + exe_mod.linkLibrary(gtk); + exe_mod.linkLibrary(etpan); + for (extlibs) |l| { + exe_mod.linkSystemLibrary(l, .{}); + } + + // This creates another `std.Build.Step.Compile`, but this one builds an executable + // rather than a static library. + const exe = b.addExecutable(.{ + .name = "talons", + .root_module = exe_mod, + }); + exe.addCSourceFiles(.{ + .files = cFiles(".") catch unreachable, + .flags = &.{ + "-Wall", + "-DGTK_DISABLE_DEPRECATION_WARNINGS", + "-DGDK_DISABLE_DEPRECATION_WARNINGS", + "-g", + // "-std=c11", + }, + }); + exe.addIncludePath(b.path("..")); + exe.addIncludePath(b.path(".")); + exe.addIncludePath(b.path("etpan")); + exe.addIncludePath(b.path("gtk")); + exe.addIncludePath(b.path("common")); + exe.addIncludePath(b.path("zig-out/include")); + exe.addSystemIncludePath(b.path("../../../../../usr/local/include/atk-1.0")); + + // exe.step.dependOn(&fence.step); + + // This declares intent for the executable to be installed into the + // standard location when the user invokes the "install" step (the default + // step when running `zig build`). + b.installArtifact(exe); + + // This *creates* a Run step in the build graph, to be executed when another + // step is evaluated that depends on it. The next line below will establish + // such a dependency. + const run_cmd = b.addRunArtifact(exe); + + // By making the run step depend on the install step, it will be run from the + // installation directory rather than directly from within the cache directory. + // This is not necessary, however, if the application depends on other installed + // files, this ensures they will be present and in the expected location. + run_cmd.step.dependOn(b.getInstallStep()); + + // This creates a build step. It will be visible in the `zig build --help` menu, + // and can be selected like this: `zig build run` + // This will evaluate the `run` step rather than the default, which is "install". + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + const exe_unit_tests = b.addTest(.{ + .root_module = exe_mod, + }); + + const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests); + + // Similar to creating the run step earlier, this exposes a `test` step to + // the `zig build --help` menu, providing a way for the user to request + // running the unit tests. + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&run_exe_unit_tests.step); +} blob - /dev/null blob + b6c74d01101c214d2769b34f25ee5c3ffda49a98 (mode 644) --- /dev/null +++ src/build.zig.zon @@ -0,0 +1,86 @@ +.{ + // This is the default name used by packages depending on this one. For + // example, when a user runs `zig fetch --save `, this field is used + // as the key in the `dependencies` table. Although the user can choose a + // different name, most users will stick with this provided value. + // + // It is redundant to include "zig" in this name because it is already + // within the Zig package namespace. + .name = .src, + + // This is a [Semantic Version](https://semver.org/). + // In a future version of Zig it will be used for package deduplication. + .version = "0.0.0", + + // Together with name, this represents a globally unique package + // identifier. This field is generated by the Zig toolchain when the + // package is first created, and then *never changes*. This allows + // unambiguous detection of one package being an updated version of + // another. + // + // When forking a Zig project, this id should be regenerated (delete the + // field and run `zig build`) if the upstream project is still maintained. + // Otherwise, the fork is *hostile*, attempting to take control over the + // original project's identity. Thus it is recommended to leave the comment + // on the following line intact, so that it shows up in code reviews that + // modify the field. + .fingerprint = 0x6044248d3aa22f72, // Changing this has security and trust implications. + + // Tracks the earliest Zig version that the package considers to be a + // supported use case. + .minimum_zig_version = "0.14.0+5ad91a646", + + // This field is optional. + // Each dependency must either provide a `url` and `hash`, or a `path`. + // `zig build --fetch` can be used to fetch all dependencies of a package, recursively. + // Once all dependencies are fetched, `zig build` no longer requires + // internet connectivity. + .dependencies = .{ + // See `zig fetch --save ` for a command-line interface for adding dependencies. + //.example = .{ + // // When updating this field to a new URL, be sure to delete the corresponding + // // `hash`, otherwise you are communicating that you expect to find the old hash at + // // the new URL. If the contents of a URL change this will result in a hash mismatch + // // which will prevent zig from using it. + // .url = "https://example.com/foo.tar.gz", + // + // // This is computed from the file contents of the directory of files that is + // // obtained after fetching `url` and applying the inclusion rules given by + // // `paths`. + // // + // // This field is the source of truth; packages do not come from a `url`; they + // // come from a `hash`. `url` is just one of many possible mirrors for how to + // // obtain a package matching this `hash`. + // // + // // Uses the [multihash](https://multiformats.io/multihash/) format. + // .hash = "...", + // + // // When this is provided, the package is found in a directory relative to the + // // build root. In this case the package's hash is irrelevant and therefore not + // // computed. This field and `url` are mutually exclusive. + // .path = "foo", + // + // // When this is set to `true`, a package is declared to be lazily + // // fetched. This makes the dependency only get fetched if it is + // // actually used. + // .lazy = false, + //}, + }, + + // Specifies the set of files and directories that are included in this package. + // Only files and directories listed here are included in the `hash` that + // is computed for this package. Only files listed here will remain on disk + // when using the zig package manager. As a rule of thumb, one should list + // files required for compilation plus any license(s). + // Paths are relative to the build root. Use the empty string (`""`) to refer to + // the build root itself. + // A directory listed here means that all files within, recursively, are included. + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + // For example... + //"LICENSE", + //"README.md", + }, +} blob - 50c6984173753743147a1588db8b926f53fcaa89 (mode 644) blob + /dev/null --- src/common/Makefile.am +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright 1999-2024 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - -if BUILD_TESTS -include $(top_srcdir)/tests.mk -SUBDIRS = . tests -endif - -DESKTOPFILEPATH=$(datadir)/applications/claws-mail.desktop - -noinst_LTLIBRARIES = libclawscommon.la - -arch_files = -arch_header = - -libclawscommon_la_SOURCES = $(arch_sources) \ - codeconv.c \ - file-utils.c \ - hooks.c \ - log.c \ - mgutils.c \ - prefs.c \ - progressindicator.c \ - quoted-printable.c \ - session.c \ - smtp.c \ - socket.c \ - ssl.c \ - ssl_certificate.c \ - string_match.c \ - stringtable.c \ - claws.c \ - template.c \ - utils.c \ - uuencode.c \ - xml.c \ - xmlprops.c \ - pkcs5_pbkdf2.c \ - unmime.c - -clawscommonincludedir = $(pkgincludedir)/common -clawscommoninclude_HEADERS = $(arch_headers) \ - codeconv.h \ - file-utils.h \ - defs.h \ - hooks.h \ - log.h \ - mgutils.h \ - prefs.h \ - progressindicator.h \ - quoted-printable.h \ - session.h \ - smtp.h \ - socket.h \ - ssl_certificate.h \ - ssl.h \ - string_match.h \ - stringtable.h \ - claws.h \ - tags.h \ - template.h \ - utils.h \ - uuencode.h \ - version.h \ - xml.h \ - xmlprops.h \ - pkcs5_pbkdf2.h \ - unmime.h - -AM_CPPFLAGS = \ - $(GLIB_CFLAGS) \ - $(VALGRIND_CFLAGS) \ - -DLOCALEDIR=\""$(localedir)"\" \ - -DDATAROOTDIR=\""$(datarootdir)"\" \ - -DDESKTOPFILEPATH=\"$(DESKTOPFILEPATH)\" \ - -DGTK_DISABLE_DEPRECATED \ - -I../fence/zig-out/include - -libclawscommon_la_LIBADD = \ - $(GLIB_LIBS) \ - $(CRYPT_LIBS) \ - -lpthread - -EXTRA_DIST = \ - version.h.in blob - 662e7ce21fd5d7162bf052d341008e2b8716aa5e blob + 827ecda4a021748f7a7801757b72a2e79397ce70 --- src/common/claws.c +++ src/common/claws.c @@ -14,14 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include #include @@ -90,15 +85,14 @@ gboolean claws_init(int *argc, char ***argv) if (claws_initialized) return TRUE; -#ifdef USE_GNUTLS ssl_init(); -#endif + startup_dir = g_get_current_dir(); parse_parameter(argc, argv); debug_print("Starting Claws Mail version %s\n", VERSION); - + setlocale(LC_ALL, ""); #ifdef ENABLE_NLS bindtextdomain(PACKAGE, get_locale_dir () ); @@ -130,10 +124,7 @@ gboolean claws_init(int *argc, char ***argv) void claws_done(void) { - -#ifdef USE_GNUTLS ssl_done(); -#endif } const gchar *claws_get_startup_dir(void) blob - 489c52ca575409fe4f553b0df9a626463bc43bc1 blob + 03b449423334f3e9f1036a43b1c35d323b4c6c74 --- src/common/codeconv.c +++ src/common/codeconv.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include blob - b26aba294e09007db4649e9805c0c95023fa3445 blob + 8cb893eaf9445dc05be81c929724fcf1d404d6fb --- src/common/defs.h +++ src/common/defs.h @@ -29,7 +29,7 @@ #define DRAFT_DIR "draft" #define TRASH_DIR "trash" #define TAGS_DIR "tagsdb" -#define RC_DIR CFG_RC_DIR +#define RC_DIR ".claws-mail" #define OLD_GTK2_RC_DIR ".sylpheed-claws" #define OLDER_GTK2_RC_DIR ".sylpheed-gtk2" #define OLD_GTK1_RC_DIR ".sylpheed" blob - bf3252014eb600d0ac21b6a7a590089fec41e20a blob + ec93821554b472b10cf6ac6579de6fd7ae9afdaa --- src/common/file-utils.c +++ src/common/file-utils.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include blob - 33172c9c6d02b17b3034ebad4742ba1f4a4f8f94 blob + ddca061c9a85c654df8c77c2f34d3304512d2d85 --- src/common/hooks.c +++ src/common/hooks.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include "utils.h" @@ -34,15 +29,15 @@ static GHookList *hooks_get_hooklist(const gchar *hook if (hooklist_table == NULL) hooklist_table = g_hash_table_new(g_str_hash, g_str_equal); - + hooklist = (GHookList *) g_hash_table_lookup(hooklist_table, hooklist_name); if (hooklist != NULL) return hooklist; - + hooklist = g_new0(GHookList, 1); g_hook_list_init(hooklist, sizeof(GHook)); g_hash_table_insert(hooklist_table, g_strdup(hooklist_name), hooklist); - + return hooklist; } @@ -55,7 +50,7 @@ gulong hooks_register_hook(const gchar *hooklist_name, cm_return_val_if_fail(hooklist_name != NULL, HOOK_NONE); cm_return_val_if_fail(hook_func != NULL, HOOK_NONE); - + hooklist = hooks_get_hooklist(hooklist_name); cm_return_val_if_fail(hooklist != NULL, HOOK_NONE); @@ -115,7 +110,7 @@ gboolean hooks_invoke(const gchar *hooklist_name, { GHookList *hooklist; struct MarshalData marshal_data; - + cm_return_val_if_fail(hooklist_name != NULL, FALSE); hooklist = hooks_get_hooklist(hooklist_name); blob - 0fcede8bcb1a2c32996a23797be3aefcce380f7a blob + e0195c3867a0d4c55b4a6f474bd5ab108a7113f3 --- src/common/log.c +++ src/common/log.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include blob - ffab44f1ba64a872af24bf4a2391304c02999c01 blob + d0e54254e5b70ed66449b9122d2f2d78570525ff --- src/common/mgutils.c +++ src/common/mgutils.c @@ -20,8 +20,6 @@ * Definitions for generic functions. */ -#include "config.h" - #include #include #include blob - 4a6fa714db7b7be31b5498589643fc1c15154023 blob + 6f83fe50f3bc287a203e5d46d31b0e16d36bb323 --- src/common/pkcs5_pbkdf2.c +++ src/common/pkcs5_pbkdf2.c @@ -17,8 +17,6 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -#include "config.h" - #include #include blob - f2fb971389289cb8b6307846cb759fee7e1ebb13 blob + a9693e2fd6d59568343ab983d0102efcc3ae2788 --- src/common/prefs.c +++ src/common/prefs.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include "defs.h" blob - 066b2b6800844a04d301ae89a7bcf9c34df0f2d5 blob + aa4750f14829fe975ae0d3daa18055adee39bec0 --- src/common/progressindicator.c +++ src/common/progressindicator.c @@ -14,11 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "config.h" - #include #include "hooks.h" blob - ea223613b8cfaf678f16aa7aa1decfba7c5f5907 blob + 016bcdcc22a4a6cf08952aaa852eac588dd064b0 --- src/common/quoted-printable.c +++ src/common/quoted-printable.c @@ -14,11 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "config.h" - #include #include blob - 27c8ef31d65613d80e372d9be34afe36ca51195b blob + fc978ef17282eeb94bc19090a4da579f2894885f --- src/common/session.c +++ src/common/session.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include @@ -67,10 +62,8 @@ void session_init(Session *session, const void *prefs_ session->sock = NULL; session->server = NULL; session->port = 0; -#ifdef USE_GNUTLS session->ssl_type = SSL_NONE; session->use_tls_sni = TRUE; -#endif session->nonblocking = TRUE; session->state = SESSION_READY; session->last_access_time = time(NULL); @@ -171,7 +164,6 @@ static gint session_connect_cb(SockInfo *sock, gpointe sock->is_smtp = session->is_smtp; sock->ssl_cert_auto_accept = TRUE; -#ifdef USE_GNUTLS sock->gnutls_priority = session->gnutls_priority; sock->use_tls_sni = session->use_tls_sni; @@ -186,7 +178,6 @@ static gint session_connect_cb(SockInfo *sock, gpointe return -1; } } -#endif /* we could have gotten a timeout while waiting for user input in * an SSL certificate dialog */ @@ -242,9 +233,7 @@ void session_destroy(Session *session) g_byte_array_free(session->read_data_buf, TRUE); g_free(session->read_data_terminator); g_free(session->write_buf); -#ifdef USE_GNUTLS g_free(session->gnutls_priority); -#endif g_date_time_unref(session->tv_prev); debug_print("session (%p): destroyed\n", session); @@ -378,7 +367,6 @@ static gint session_close(Session *session) return 0; } -#ifdef USE_GNUTLS gint session_start_tls(Session *session) { gboolean nb_mode; @@ -411,7 +399,6 @@ gint session_start_tls(Session *session) return 0; } -#endif gint session_send_msg(Session *session, const gchar *msg) { blob - f3b028415b965a828068ca32d497e096991516f4 blob + 2d8ccb012c2dfb2ab48f43d9ecff1616083eaa41 --- src/common/session.h +++ src/common/session.h @@ -147,11 +147,9 @@ struct _Session gboolean ssl_cert_auto_accept; gint ping_tag; -#ifdef USE_GNUTLS SSLType ssl_type; gchar *gnutls_priority; gboolean use_tls_sni; -#endif }; void session_init (Session *session, @@ -188,9 +186,7 @@ void session_set_send_data_notify (Session *session, SendDataNotify notify_func, gpointer data); -#ifdef USE_GNUTLS gint session_start_tls (Session *session); -#endif gint session_send_msg (Session *session, const gchar *msg); blob - 2464599b5e27158a987b89a3dab27f9dbbfce972 blob + 093452c1ee6d3abb012ec0a07a64a5fabc170e62 --- src/common/smtp.c +++ src/common/smtp.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #ifdef ENABLE_NLS #include @@ -39,12 +34,8 @@ static void smtp_session_destroy(Session *session); static gint smtp_auth(SMTPSession *session); -#ifdef USE_GNUTLS static gint smtp_starttls(SMTPSession *session); -#endif -#ifdef USE_OAUTH2 static gint smtp_auth_oauth2(SMTPSession *session); -#endif static gint smtp_auth_login(SMTPSession *session); static gint smtp_auth_plain(SMTPSession *session); @@ -80,10 +71,7 @@ Session *smtp_session_new(void *prefs_account) SESSION(session)->destroy = smtp_session_destroy; session->state = SMTP_READY; - -#ifdef USE_GNUTLS session->tls_init_done = FALSE; -#endif session->hostname = NULL; session->user = NULL; @@ -168,13 +156,13 @@ static gint smtp_auth(SMTPSession *session) && (session->avail_auth_type & SMTPAUTH_PLAIN) != 0) smtp_auth_plain(session); -#ifdef USE_OAUTH2 + else if ((session->forced_auth_type == SMTPAUTH_OAUTH2 || session->forced_auth_type == 0) && (session->avail_auth_type & SMTPAUTH_OAUTH2) != 0) smtp_auth_oauth2(session); -#endif + else if (session->forced_auth_type == 0) { log_warning(LOG_PROTOCOL, _("No SMTP AUTH method available\n")); return SM_AUTHFAIL; @@ -271,10 +259,8 @@ static gint smtp_ehlo_recv(SMTPSession *session, const session->avail_auth_type |= SMTPAUTH_PLAIN; if (strcasestr(p, "LOGIN")) session->avail_auth_type |= SMTPAUTH_LOGIN; -#ifdef USE_GNUTLS if (strcasestr(p, "XOAUTH2")) session->avail_auth_type |= SMTPAUTH_OAUTH2; -#endif } if (g_ascii_strncasecmp(p, "SIZE", 4) == 0) { p += 5; @@ -296,7 +282,6 @@ static gint smtp_ehlo_recv(SMTPSession *session, const return SM_ERROR; } -#ifdef USE_GNUTLS static gint smtp_starttls(SMTPSession *session) { session->state = SMTP_STARTTLS; @@ -307,7 +292,6 @@ static gint smtp_starttls(SMTPSession *session) return SM_OK; } -#endif static gint smtp_auth_plain(SMTPSession *session) { @@ -337,7 +321,6 @@ static gint smtp_auth_plain(SMTPSession *session) return SM_OK; } -#ifdef USE_OAUTH2 static gint smtp_auth_oauth2(SMTPSession *session) { gchar buf[MESSAGEBUFSIZE], *b64buf, *out; @@ -366,7 +349,6 @@ static gint smtp_auth_oauth2(SMTPSession *session) return SM_OK; } -#endif static gint smtp_auth_login(SMTPSession *session) { @@ -486,9 +468,7 @@ static gint smtp_session_recv_msg(Session *session, co case SMTP_AUTH_PLAIN: case SMTP_AUTH_LOGIN_USER: case SMTP_AUTH_LOGIN_PASS: -#ifdef USE_GNUTLS case SMTP_AUTH_OAUTH2: -#endif default: log_print(LOG_PROTOCOL, "SMTP< %s\n", msg); break; @@ -539,12 +519,8 @@ static gint smtp_session_recv_msg(Session *session, co case SMTP_READY: if (strstr(msg, "ESMTP")) smtp_session->is_esmtp = TRUE; -#ifdef USE_GNUTLS if (smtp_session->user || session->ssl_type != SSL_NONE || smtp_session->is_esmtp) -#else - if (smtp_session->user || smtp_session->is_esmtp) -#endif ret = smtp_ehlo(smtp_session); else ret = smtp_helo(smtp_session); @@ -567,29 +543,24 @@ static gint smtp_session_recv_msg(Session *session, co smtp_session->error_val = SM_ERROR; return -1; } -#ifdef USE_GNUTLS if (session->ssl_type == SSL_STARTTLS && smtp_session->tls_init_done == FALSE) { ret = smtp_starttls(smtp_session); break; } -#endif if (smtp_session->user) { if (smtp_auth(smtp_session) != SM_OK) { -#ifdef USE_GNUTLS if (session->ssl_type == SSL_NONE && smtp_session->tls_init_done == FALSE && (smtp_session->avail_auth_type & SMTPAUTH_TLS_AVAILABLE)) ret = smtp_starttls(smtp_session); else -#endif ret = smtp_from(smtp_session); } } else ret = smtp_from(smtp_session); break; case SMTP_STARTTLS: -#ifdef USE_GNUTLS if (session_start_tls(session) < 0) { log_warning(LOG_PROTOCOL, _("couldn't start STARTTLS session\n")); smtp_session->state = SMTP_ERROR; @@ -598,7 +569,6 @@ static gint smtp_session_recv_msg(Session *session, co } smtp_session->tls_init_done = TRUE; ret = smtp_ehlo(smtp_session); -#endif break; case SMTP_AUTH: ret = smtp_auth_recv(smtp_session, msg); @@ -608,9 +578,7 @@ static gint smtp_session_recv_msg(Session *session, co break; case SMTP_AUTH_PLAIN: case SMTP_AUTH_LOGIN_PASS: -#ifdef USE_GNUTLS case SMTP_AUTH_OAUTH2: -#endif case SMTP_FROM: if (smtp_session->cur_to) ret = smtp_rcpt(smtp_session); blob - d5671a4f5ff0042ec91f7adc07c43df44b6356fb blob + 6641ee5d762786c9b53eeea2a4a5551299040bda --- src/common/smtp.h +++ src/common/smtp.h @@ -115,10 +115,7 @@ struct _SMTPSession ESMTPFlag esmtp_flags; void *dialog; - -#ifdef USE_GNUTLS gboolean tls_init_done; -#endif }; Session *smtp_session_new (void *prefs_account); blob - 31a87cec8d660bd69a57da34c5c3da5a9515fbf3 blob + d7a5649003d5be319e090b51977f8d13c150ccd8 --- src/common/socket.c +++ src/common/socket.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include @@ -48,9 +43,7 @@ #include "socket.h" #include "utils.h" #include "log.h" -#ifdef USE_GNUTLS -# include "ssl.h" -#endif +#include "ssl.h" #if USE_GIO #error USE_GIO is currently not supported @@ -109,7 +102,6 @@ static guint io_timeout = 60; static GList *sock_connect_data_list = NULL; -#ifdef USE_GNUTLS static gboolean ssl_sock_prepare (GSource *source, gint *timeout); static gboolean ssl_sock_check (GSource *source); @@ -124,7 +116,6 @@ GSourceFuncs ssl_watch_funcs = { NULL, NULL }; -#endif static gint sock_connect_with_timeout (gint sock, const struct sockaddr *serv_addr, @@ -371,7 +362,6 @@ gboolean sock_is_nonblocking_mode(SockInfo *sock) } -#ifdef USE_GNUTLS static gboolean ssl_sock_prepare(GSource *source, gint *timeout) { *timeout = 1; @@ -415,7 +405,6 @@ static gboolean ssl_sock_dispatch(GSource *source, GSo return sock->callback(sock, sock->condition, sock->data); } -#endif static gboolean sock_watch_cb(GIOChannel *source, GIOCondition condition, gpointer data) @@ -438,9 +427,7 @@ guint sock_add_watch(SockInfo *sock, GIOCondition cond sock->condition = condition; sock->data = data; -#ifdef USE_GNUTLS - if (sock->ssl) - { + if (sock->ssl) { GSource *source = g_source_new(&ssl_watch_funcs, sizeof(SockSource)); ((SockSource *) source)->sock = sock; @@ -450,7 +437,6 @@ guint sock_add_watch(SockInfo *sock, GIOCondition cond g_source_unref (source); /* Refcount back down to 1 */ return sock->g_source; } -#endif return g_io_add_watch(sock->sock_ch, condition, sock_watch_cb, sock); } @@ -1090,7 +1076,6 @@ static gint fd_read(gint fd, gchar *buf, gint len) return read(fd, buf, len); } -#if USE_GNUTLS static gint ssl_read(gnutls_session_t ssl, gchar *buf, gint len) { gint r; @@ -1131,7 +1116,6 @@ static gint ssl_read(gnutls_session_t ssl, gchar *buf, } } -#endif gint sock_read(SockInfo *sock, gchar *buf, gint len) { @@ -1139,11 +1123,9 @@ gint sock_read(SockInfo *sock, gchar *buf, gint len) cm_return_val_if_fail(sock != NULL, -1); -#ifdef USE_GNUTLS if (sock->ssl) ret = ssl_read(sock->ssl, buf, len); else -#endif ret = fd_read(sock->sock, buf, len); if (ret < 0) @@ -1158,7 +1140,6 @@ gint fd_write(gint fd, const gchar *buf, gint len) return write(fd, buf, len); } -#if USE_GNUTLS static gint ssl_write(gnutls_session_t ssl, const gchar *buf, gint len) { gint ret; @@ -1180,19 +1161,15 @@ static gint ssl_write(gnutls_session_t ssl, const gcha } } -#endif - gint sock_write(SockInfo *sock, const gchar *buf, gint len) { gint ret; cm_return_val_if_fail(sock != NULL, -1); -#ifdef USE_GNUTLS if (sock->ssl) ret = ssl_write(sock->ssl, buf, len); else -#endif ret = fd_write(sock->sock, buf, len); if (ret < 0) @@ -1222,7 +1199,6 @@ gint fd_write_all(gint fd, const gchar *buf, gint len) return wrlen; } -#ifdef USE_GNUTLS static gint ssl_write_all(gnutls_session_t ssl, const gchar *buf, gint len) { gint n, wrlen = 0; @@ -1238,7 +1214,6 @@ static gint ssl_write_all(gnutls_session_t ssl, const return wrlen; } -#endif gint sock_write_all(SockInfo *sock, const gchar *buf, gint len) { @@ -1246,11 +1221,9 @@ gint sock_write_all(SockInfo *sock, const gchar *buf, cm_return_val_if_fail(sock != NULL, -1); -#ifdef USE_GNUTLS if (sock->ssl) ret = ssl_write_all(sock->ssl, buf, len); else -#endif ret = fd_write_all(sock->sock, buf, len); if (ret < 0) @@ -1278,13 +1251,11 @@ gint sock_close(SockInfo *sock, gboolean close_fd) if (sock->sock_ch) g_io_channel_unref(sock->sock_ch); -#ifdef USE_GNUTLS if (sock->ssl) ssl_done_socket(sock); if (sock->g_source != 0 && g_main_context_find_source_by_id(NULL, sock->g_source) != NULL) g_source_remove(sock->g_source); sock->g_source = 0; -#endif if (close_fd) ret = close(sock->sock); blob - 4e1f576a53b0a29693f9050ee66f1f2dd1eef388 blob + 6cb3bf2e55e24fad696f842573cb338bfa3fb971 --- src/common/socket.h +++ src/common/socket.h @@ -28,9 +28,7 @@ typedef struct _SockInfo SockInfo; -#ifdef USE_GNUTLS -# include "ssl.h" -#endif +#include "ssl.h" typedef enum { @@ -51,18 +49,11 @@ typedef gboolean (*SockFunc) (SockInfo *sock, struct _SockInfo { gint sock; -#if USE_GNUTLS gnutls_session_t ssl; gnutls_certificate_credentials_t xcred; -#if GNUTLS_VERSION_NUMBER < 0x030000 - gnutls_x509_crt_t client_crt; - gnutls_x509_privkey_t client_key; -#else gnutls_pcert_st client_crt; gnutls_privkey_t client_key; -#endif /* GNUTLS_VERSION_NUMBER < 0x030000 */ gchar *gnutls_priority; -#endif guint g_source; GIOChannel *sock_ch; blob - c5e71f2c6ee5ed42daf87523605c65f2a3b19973 blob + 1e3e0e0bc3de23820ff52048228a7c77f7a3487d --- src/common/ssl.c +++ src/common/ssl.c @@ -17,12 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS #include "defs.h" #include @@ -37,11 +31,6 @@ #include "ssl_certificate.h" #include "hooks.h" -#if GNUTLS_VERSION_NUMBER <= 0x020b00 -#include -GCRY_THREAD_OPTION_PTHREAD_IMPL; -#endif - #include #include @@ -51,77 +40,9 @@ typedef struct _thread_data { gboolean done; } thread_data; -#if GNUTLS_VERSION_NUMBER < 0x030400 -#define DEFAULT_GNUTLS_PRIORITY "NORMAL:-VERS-SSL3.0" -#else #define DEFAULT_GNUTLS_PRIORITY "NORMAL" -#endif -#if GNUTLS_VERSION_NUMBER < 0x030000 -/* GnuTLS 3.0 introduced new API for certificate callback, - * gnutls_certificate_set_retrieve_function2() */ - -#if GNUTLS_VERSION_NUMBER <= 0x020c00 -static int gnutls_client_cert_cb(gnutls_session_t session, - const gnutls_datum_t *req_ca_rdn, int nreqs, - const gnutls_pk_algorithm_t *sign_algos, - int sign_algos_length, gnutls_retr_st *st) -#else static int gnutls_cert_cb(gnutls_session_t session, - const gnutls_datum_t *req_ca_rdn, int nreqs, - const gnutls_pk_algorithm_t *sign_algos, - int sign_algos_length, gnutls_retr2_st *st) -#endif /* GNUTLS_VERSION_NUMBER <= 0x020c00 */ -{ - SSLClientCertHookData hookdata; - SockInfo *sockinfo = (SockInfo *)gnutls_session_get_ptr(session); - gnutls_certificate_type_t type = gnutls_certificate_type_get(session); - gnutls_x509_crt_t crt; - gnutls_x509_privkey_t key; - - st->ncerts = 0; - - hookdata.account = sockinfo->account; - hookdata.cert_path = NULL; - hookdata.password = NULL; - hookdata.is_smtp = sockinfo->is_smtp; - hooks_invoke(SSLCERT_GET_CLIENT_CERT_HOOKLIST, &hookdata); - - if (hookdata.cert_path == NULL) { - g_free(hookdata.password); - return 0; - } - - sockinfo->client_crt = ssl_certificate_get_x509_from_pem_file(hookdata.cert_path); - sockinfo->client_key = ssl_certificate_get_pkey_from_pem_file(hookdata.cert_path); - if (!(sockinfo->client_crt && sockinfo->client_key)) { - /* try pkcs12 format */ - ssl_certificate_get_x509_and_pkey_from_p12_file(hookdata.cert_path, hookdata.password, - &crt, &key); - sockinfo->client_crt = crt; - sockinfo->client_key = key; - } - - if (type == GNUTLS_CRT_X509 && sockinfo->client_crt && sockinfo->client_key) { - st->ncerts = 1; -#if GNUTLS_VERSION_NUMBER <= 0x020c00 - st->type = type; -#else - st->key_type = type; -#endif - st->cert.x509 = &(sockinfo->client_crt); - st->key.x509 = sockinfo->client_key; - st->deinit_all = 0; - g_free(hookdata.password); - return 0; - } - g_free(hookdata.password); - return 0; -} - -#else /* GNUTLS_VERSION_NUMBER < 0x030000 */ - -static int gnutls_cert_cb(gnutls_session_t session, const gnutls_datum_t *req_ca_rdn, int nreqs, const gnutls_pk_algorithm_t *pk_algos, @@ -183,7 +104,6 @@ static int gnutls_cert_cb(gnutls_session_t session, return 0; } -#endif /* GNUTLS_VERSION_NUMBER < 0x030000 */ const gchar *claws_ssl_get_cert_file(void) { @@ -238,9 +158,6 @@ const gchar *claws_ssl_get_cert_dir(void) void ssl_init(void) { -#if GNUTLS_VERSION_NUMBER <= 0x020b00 - gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); -#endif mailstream_gnutls_init_not_required(); gnutls_global_init(); } @@ -415,24 +332,9 @@ gboolean ssl_init_socket(SockInfo *sockinfo) gnutls_session_set_ptr(session, sockinfo); -#if GNUTLS_VERSION_NUMBER < 0x030000 -# if GNUTLS_VERSION_NUMBER <= 0x020c00 - gnutls_certificate_client_set_retrieve_function(xcred, gnutls_client_cert_cb); -# else - gnutls_certificate_set_retrieve_function(xcred, gnutls_cert_cb); -# endif -#else debug_print("setting certificate callback function\n"); gnutls_certificate_set_retrieve_function2(xcred, gnutls_cert_cb); -#endif -#if GNUTLS_VERSION_NUMBER < 0x030107 - /* Starting from GnuTLS 3.1.7, minimal size of the DH prime is - * set by the priority string. By default ("NORMAL"), it is 1008 - * as of GnuTLS 3.3.0. */ - gnutls_dh_set_prime_bits(session, 1008); -#endif - if ((r = SSL_connect_nb(session)) < 0) { g_warning("TLS connection failed (%s)", gnutls_strerror(r)); gnutls_certificate_free_credentials(xcred); @@ -474,21 +376,10 @@ void ssl_done_socket(SockInfo *sockinfo) if (sockinfo->xcred) gnutls_certificate_free_credentials(sockinfo->xcred); gnutls_deinit(sockinfo->ssl); -#if GNUTLS_VERSION_NUMBER < 0x030000 - if (sockinfo->client_crt) - gnutls_x509_crt_deinit(sockinfo->client_crt); - if (sockinfo->client_key) - gnutls_x509_privkey_deinit(sockinfo->client_key); - sockinfo->client_key = NULL; - sockinfo->client_crt = NULL; -#else gnutls_pcert_deinit(&sockinfo->client_crt); gnutls_privkey_deinit(sockinfo->client_key); -#endif sockinfo->client_key = NULL; sockinfo->xcred = NULL; sockinfo->ssl = NULL; } } - -#endif /* USE_GNUTLS */ blob - 82df6794f0bfb78298da0c1317011e8d9aba0d3a blob + 2dbb02dc06d0aeef34d27f9dd75f7e898038c477 --- src/common/ssl.h +++ src/common/ssl.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef __SSL_H__ @@ -30,14 +30,11 @@ typedef enum { SSL_STARTTLS } SSLType; -#ifdef USE_GNUTLS #include #include #include -#if GNUTLS_VERSION_NUMBER >= 0x030000 #include -#endif #include "socket.h" @@ -56,6 +53,5 @@ struct _SSLClientCertHookData }; const gchar *claws_ssl_get_cert_file(void); -#endif /* USE_GNUTLS */ #endif /* __SSL_H__ */ blob - c23af85359f6638e74a46f82013f7da562aa1ebf blob + 7bd2a781f41d37cd1f4392271426f4cf8295dc08 --- src/common/ssl_certificate.c +++ src/common/ssl_certificate.c @@ -16,12 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS #include #include #include @@ -99,7 +93,6 @@ char * readable_fingerprint(unsigned char *src, int le return ret; } -#if USE_GNUTLS static gnutls_x509_crt_t x509_crt_copy(gnutls_x509_crt_t src) { int ret; @@ -140,7 +133,6 @@ static gnutls_x509_crt_t x509_crt_copy(gnutls_x509_crt free(tmp.data); return dest; } -#endif static SSLCertificate *ssl_certificate_new(gnutls_x509_crt_t x509_cert, const gchar *host, gushort port) { @@ -1079,5 +1071,3 @@ gchar *ssl_certificate_get_subject_cn(SSLCertificate * return g_strdup(subject_cn); } - -#endif /* USE_GNUTLS */ blob - f853a3fc569969b080f70e169d9af0c6caeb78b7 blob + 6f33cd5ef02c75afdf9982368ff11274a31fb5f2 --- src/common/ssl_certificate.h +++ src/common/ssl_certificate.h @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy + * Copyright (C) 1999-2012 Colin Leroy * and the Claws Mail team * * This program is free software; you can redistribute it and/or modify @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef __SSL_CERTIFICATE_H__ @@ -25,7 +25,6 @@ #include "claws-features.h" #endif -#ifdef USE_GNUTLS #include #include @@ -66,11 +65,10 @@ char *ssl_certificate_check_signer (SSLCertificate *ce gnutls_x509_crt_t ssl_certificate_get_x509_from_pem_file(const gchar *file); gnutls_x509_privkey_t ssl_certificate_get_pkey_from_pem_file(const gchar *file); -void ssl_certificate_get_x509_and_pkey_from_p12_file(const gchar *file, +void ssl_certificate_get_x509_and_pkey_from_p12_file(const gchar *file, const gchar *password, gnutls_x509_crt_t *crt, gnutls_x509_privkey_t *key); size_t gnutls_i2d_X509(gnutls_x509_crt_t x509_cert, unsigned char **output); size_t gnutls_i2d_PrivateKey(gnutls_x509_privkey_t pkey, unsigned char **output); gboolean ssl_certificate_check_subject_cn(SSLCertificate *cert); gchar *ssl_certificate_get_subject_cn(SSLCertificate *cert); -#endif /* USE_GNUTLS */ #endif /* SSL_CERTIFICATE_H */ blob - c99b4a651531c42c229a5c25b05252764129f531 blob + e5f227d4828a03f55722d353a9971b628c436383 --- src/common/string_match.c +++ src/common/string_match.c @@ -15,14 +15,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #ifdef ENABLE_NLS #include @@ -56,7 +51,7 @@ gchar *string_remove_match(gchar *buf, gint buflen, gc buf[i++] = txt[j++]; else { k = j; - while (txt[j] && j != k + match.rm_so) + while (txt[j] && j != k + match.rm_so) buf[i++] = txt[j++]; if (txt[j]) j = k + match.rm_eo; @@ -69,7 +64,7 @@ gchar *string_remove_match(gchar *buf, gint buflen, gc buflen - 1); buf[buflen - 1] = 0x00; } - return buf; + return buf; } return txt; } blob - 5a4a3251b8370edfcab37771e6aee636f0eb5188 blob + f974b90aef415621004d8c1d21d204d30edabb31 --- src/common/stringtable.c +++ src/common/stringtable.c @@ -14,18 +14,16 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "config.h" - #include #include #include "stringtable.h" #include "utils.h" -/* alfons - hashed string table (I wasn't content with GStringChunk; +/* alfons - hashed string table (I wasn't content with GStringChunk; * can't recall why :-) */ #if 0 @@ -109,7 +107,7 @@ void string_table_free_string(StringTable *table, cons string_entry_free(entry); } else { XXX_DEBUG ("ref-- for %s (%d)\n", entry->string, - entry->ref_count); + entry->ref_count); } } } blob - cbd45b60aa72abd3fe90bb301bc5795b94e3a2da blob + 561ec7ad23f9c59cdba8c65fb9173c2c0c4b7928 --- src/common/template.c +++ src/common/template.c @@ -1,5 +1,5 @@ /* - * Claws Mail templates subsystem + * Claws Mail templates subsystem * Copyright (C) 2001 Alexander Barinov * Copyright (C) 2001-2021 The Claws Mail team * @@ -15,10 +15,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "config.h" #include "defs.h" #include @@ -52,7 +51,7 @@ static Template *template_load(gchar *filename) tmpl->subject = NULL; tmpl->from = NULL; tmpl->to = NULL; - tmpl->cc = NULL; + tmpl->cc = NULL; tmpl->bcc = NULL; tmpl->replyto = NULL; tmpl->value = NULL; @@ -69,9 +68,9 @@ static Template *template_load(gchar *filename) else if (!g_ascii_strncasecmp(buf, "Cc:", 3)) tmpl->cc = g_strdup(g_strstrip(buf + 3)); else if (!g_ascii_strncasecmp(buf, "Bcc:", 4)) - tmpl->bcc = g_strdup(g_strstrip(buf + 4)); + tmpl->bcc = g_strdup(g_strstrip(buf + 4)); else if (!g_ascii_strncasecmp(buf, "Reply-To:", 9)) - tmpl->replyto = g_strdup(g_strstrip(buf + 9)); + tmpl->replyto = g_strdup(g_strstrip(buf + 9)); else if (!g_ascii_strncasecmp(buf, "Subject:", 8)) tmpl->subject = g_strdup(g_strstrip(buf + 8)); } @@ -105,8 +104,8 @@ void template_free(Template *tmpl) g_free(tmpl->from); g_free(tmpl->to); g_free(tmpl->cc); - g_free(tmpl->bcc); - g_free(tmpl->replyto); + g_free(tmpl->bcc); + g_free(tmpl->replyto); g_free(tmpl->value); g_free(tmpl); } @@ -150,7 +149,7 @@ static gint tmpl_compare(gconstpointer tmpl1, gconstpo else if (filenum1 > filenum2) ret = 1; - + return ret; } @@ -295,7 +294,7 @@ static void template_write_config(GSList *tmpl_list) g_free(new); g_free(filename); } - + /* remove other templates */ while (TRUE) { gchar *filename = g_strconcat(path, G_DIR_SEPARATOR_S, blob - f03f47164f229df96ee6499d494aef0eb5b30dc6 (mode 644) blob + /dev/null --- src/common/tests/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -include $(top_srcdir)/tests.mk - -common_ldadd = \ - $(GLIB_LIBS) - -AM_CPPFLAGS = \ - $(GLIB_CFLAGS) \ - -DLOCALEDIR=\""$(localedir)"\" \ - -I$(top_srcdir)/src \ - -I.. - -TEST_PROGS += xml_test -xml_test_SOURCES = xml_test.c -xml_test_LDADD = $(common_ldadd) ../xml.o ../stringtable.o ../utils.o ../codeconv.o ../quoted-printable.o ../unmime.o ../file-utils.o - -TEST_PROGS += codeconv_test -codeconv_test_SOURCES = codeconv_test.c -codeconv_test_LDADD = $(common_ldadd) ../codeconv.o ../utils.o ../quoted-printable.o ../unmime.o ../file-utils.o - -TEST_PROGS += pkcs5_pbkdf2_test -pkcs5_pbkdf2_test_SOURCES = pkcs5_pbkdf2_test.c -pkcs5_pbkdf2_test_LDADD = $(common_ldadd) ../pkcs5_pbkdf2.o - -TEST_PROGS += unmime_test -unmime_test_SOURCES = unmime_test.c -unmime_test_LDADD = $(common_ldadd) ../unmime.o ../quoted-printable.o ../utils.o ../file-utils.o ../codeconv.o - -TEST_PROGS += utils_get_serverportfp_from_filename_test -utils_get_serverportfp_from_filename_test_SOURCES = utils_get_serverportfp_from_filename_test.c -utils_get_serverportfp_from_filename_test_LDADD = $(common_ldadd) ../utils.o ../file-utils.o ../codeconv.o ../quoted-printable.o ../unmime.o - -TEST_PROGS += utils_get_uri_part_test -utils_get_uri_part_test_SOURCES = utils_get_uri_part_test.c -utils_get_uri_part_test_LDADD = $(common_ldadd) ../utils.o ../file-utils.o ../codeconv.o ../quoted-printable.o ../unmime.o - -noinst_PROGRAMS = $(TEST_PROGS) - -.PHONY: test blob - 1dc6ffba37870368e479dea0c47cc7769dc54d3b blob + 4e9e1492c2446b26319b35d3cbf9acbcd29e8be1 --- src/common/unmime.c +++ src/common/unmime.c @@ -14,14 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include @@ -62,7 +57,7 @@ gchar *unmime_header(const gchar *encoded_str, gboolea g_string_append(outbuf, p); break; } - + quote_p = p; while ((quote_p = strchr(quote_p, '"')) != NULL) { if (quote_p && quote_p < eword_begin_p) { @@ -156,7 +151,7 @@ gchar *unmime_header(const gchar *encoded_str, gboolea p = eword_end_p + 2; } - + out_len = outbuf->len; out_str = g_string_free(outbuf, FALSE); blob - 3ecde2bdcc573b2193bab4b4874233b5f5379fe7 blob + 71f8ee79878e6bf2a0fd58fed4ac67ac08edee9c --- src/common/utils.c +++ src/common/utils.c @@ -28,11 +28,6 @@ * ?h=glib-2-30&id=9eb65dd3ed5e1a9638595cbe10699c7606376511 */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include @@ -1375,7 +1370,8 @@ const gchar *get_locale_dir(void) { static gchar *loc_dir; if (!loc_dir) - loc_dir = LOCALEDIR; + loc_dir = "/dev/null"; + // loc_dir = LOCALEDIR; return loc_dir; } blob - 52da6b73f643007877f56353fb8e52bb35ad9c21 blob + 12472e9b4e51bb68d782c7cb31bb31403b9cbe87 --- src/common/uuencode.c +++ src/common/uuencode.c @@ -16,8 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" - #include #define UUDECODE(c) (c=='`' ? 0 : c - ' ') blob - d649c4ee484598bbb1d032a386a0b47cd92c64ce blob + 5212692802e915ab7c545240fd22e8ffe2d8c084 --- src/common/xml.c +++ src/common/xml.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - 75a1e50aaddaa611c2b759e4e9310de89e56bbff blob + 18771428ffd4a769a492b41e72020fdccd777f6a --- src/common/xmlprops.c +++ src/common/xmlprops.c @@ -30,11 +30,6 @@ * *********************************************************************** */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - ac045ca5e3a790284df1d44f516da523325967e8 blob + a6e4db599f826dd67ad9744c6e2dec9bb32b97c9 --- src/compose.c +++ src/compose.c @@ -80,7 +80,6 @@ #include "folder.h" #include "folder_item_prefs.h" #include "addr_compl.h" -#include "quote_fmt.h" #include "undo.h" #include "foldersel.h" #include "toolbar.h" @@ -223,13 +222,6 @@ static gint compose_parse_manual_headers (Compose *com static gchar *compose_parse_references (const gchar *ref, const gchar *msgid); -static gchar *compose_quote_fmt (Compose *compose, - MsgInfo *msginfo, - const gchar *fmt, - const gchar *body, - gboolean rewrap, - gboolean need_unescape, - const gchar *err_msg); static void compose_reply_set_entry (Compose *compose, MsgInfo *msginfo, @@ -806,8 +798,6 @@ Compose *compose_generic_new(PrefsAccount *account, co GtkTextView *textview; GtkTextBuffer *textbuf; GtkTextIter iter; - const gchar *subject_format = NULL; - const gchar *body_format = NULL; gchar *mailto_from = NULL; PrefsAccount *mailto_account = NULL; MsgInfo* dummyinfo = NULL; @@ -876,74 +866,6 @@ Compose *compose_generic_new(PrefsAccount *account, co compose_add_field_list( compose, listAddress ); - if (prefs_common.compose_with_format) { - subject_format = prefs_common.compose_subject_format; - body_format = prefs_common.compose_body_format; - } - - if (subject_format || body_format) { - - if ( subject_format - && *subject_format != '\0' ) - { - gchar *subject = NULL; - gchar *tmp = NULL; - gchar *buf = NULL; - - if (!dummyinfo) - dummyinfo = compose_msginfo_new_from_compose(compose); - - /* decode \-escape sequences in the internal representation of the quote format */ - tmp = g_malloc(strlen(subject_format)+1); - pref_get_unescaped_pref(tmp, subject_format); - - subject = gtk_editable_get_chars(GTK_EDITABLE(compose->subject_entry), 0, -1); - quote_fmt_init(dummyinfo, NULL, subject, FALSE, compose->account, FALSE); - - quote_fmt_scan_string(tmp); - quote_fmt_parse(); - - buf = quote_fmt_get_buffer(); - if (buf == NULL) - alertpanel_error(_("New message subject format error.")); - else - gtk_entry_set_text(GTK_ENTRY(compose->subject_entry), buf); - compose_attach_from_list(compose, quote_fmt_get_attachments_list(), FALSE); - quote_fmt_reset_vartable(); - quote_fmtlex_destroy(); - - g_free(subject); - g_free(tmp); - mfield = SUBJECT_FIELD_PRESENT; - } - - if ( body_format - && *body_format != '\0' ) - { - GtkTextView *text; - GtkTextBuffer *buffer; - GtkTextIter start, end; - gchar *tmp = NULL; - - if (!dummyinfo) - dummyinfo = compose_msginfo_new_from_compose(compose); - - text = GTK_TEXT_VIEW(compose->text); - buffer = gtk_text_view_get_buffer(text); - gtk_text_buffer_get_start_iter(buffer, &start); - gtk_text_buffer_get_iter_at_offset(buffer, &end, -1); - tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); - - compose_quote_fmt(compose, dummyinfo, body_format, tmp, FALSE, TRUE, - _("The body of the \"New message\" template has an error at line %d.")); - compose_attach_from_list(compose, quote_fmt_get_attachments_list(), FALSE); - quote_fmt_reset_vartable(); - - g_free(tmp); - mfield = BODY_FIELD_PRESENT; - } - - } procmsg_msginfo_free( &dummyinfo ); if (attach_files) { @@ -1006,11 +928,7 @@ Compose *compose_generic_new(PrefsAccount *account, co * is therefore created before placing the cursor */ case BODY_FIELD_PRESENT: - cursor_pos = quote_fmt_get_cursor_pos(); - if (cursor_pos == -1) - gtk_widget_grab_focus(compose->header_last->entry); - else - gtk_widget_grab_focus(compose->text); + gtk_widget_grab_focus(compose->text); break; } @@ -1362,26 +1280,6 @@ static Compose *compose_generic_reply(MsgInfo *msginfo undo_block(compose->undostruct); - if (quote_mode == COMPOSE_QUOTE_FORCED || - (quote_mode == COMPOSE_QUOTE_CHECK && prefs_common.reply_with_quote)) { - /* use the reply format of folder (if enabled), or the account's one - (if enabled) or fallback to the global reply format, which is always - enabled (even if empty). */ - quote = TRUE; - body_fmt = ""; - if (prefs_common.quotefmt && *prefs_common.quotefmt) { - body_fmt = prefs_common.quotefmt; - } - } - - if (quote) { - compose_quote_fmt(compose, compose->replyinfo, - body_fmt, body, FALSE, TRUE, - _("The body of the \"Reply\" template has an error at line %d.")); - compose_attach_from_list(compose, quote_fmt_get_attachments_list(), FALSE); - quote_fmt_reset_vartable(); - } - if (MSG_IS_ENCRYPTED(compose->replyinfo->flags)) { compose_force_encryption(compose, account, FALSE, s_system); } @@ -1507,26 +1405,6 @@ Compose *compose_forward(PrefsAccount *account, MsgInf "message/rfc822", NULL); g_free(msgfile); - } else { - MsgInfo *full_msginfo; - - full_msginfo = procmsg_msginfo_get_full_info(msginfo); - if (!full_msginfo) - full_msginfo = procmsg_msginfo_copy(msginfo); - - gchar *body_fmt = ""; - if (prefs_common.fw_quotefmt && *prefs_common.fw_quotefmt) { - body_fmt = prefs_common.fw_quotefmt; - } - - compose_quote_fmt(compose, full_msginfo, - body_fmt, body, FALSE, TRUE, - _("The body of the \"Forward\" template has an error at line %d.")); - compose_attach_from_list(compose, quote_fmt_get_attachments_list(), FALSE); - quote_fmt_reset_vartable(); - compose_attach_parts(compose, msginfo); - - procmsg_msginfo_free(&full_msginfo); } SIGNAL_BLOCK(textbuf); @@ -1542,11 +1420,7 @@ Compose *compose_forward(PrefsAccount *account, MsgInf (account->default_encrypt || account->default_sign)) COMPOSE_PRIVACY_WARNING(); - cursor_pos = quote_fmt_get_cursor_pos(); - if (cursor_pos == -1) - gtk_widget_grab_focus(compose->header_last->entry); - else - gtk_widget_grab_focus(compose->text); + gtk_widget_grab_focus(compose->text); if (!no_extedit && prefs_common.auto_exteditor) compose_exec_ext_editor(compose); @@ -2171,9 +2045,6 @@ Compose *compose_redirect(PrefsAccount *account, MsgIn msginfo->subject); gtk_editable_set_editable(GTK_EDITABLE(compose->subject_entry), FALSE); - compose_quote_fmt(compose, msginfo, "%M", NULL, FALSE, FALSE, - _("The body of the \"Redirect\" template has an error at line %d.")); - quote_fmt_reset_vartable(); gtk_text_view_set_editable(GTK_TEXT_VIEW(compose->text), FALSE); compose_colorize_signature(compose); @@ -2671,118 +2542,6 @@ static gchar *compose_parse_references(const gchar *re return g_string_free(new_ref, FALSE); } -static gchar *compose_quote_fmt(Compose *compose, MsgInfo *msginfo, - const gchar *fmt, const gchar *body, - gboolean rewrap, - gboolean need_unescape, - const gchar *err_msg) -{ - MsgInfo* dummyinfo = NULL; - gchar *quote_str = NULL; - gchar *buf; - gboolean prev_autowrap; - const gchar *trimmed_body = body; - gint cursor_pos = -1; - GtkTextView *text = GTK_TEXT_VIEW(compose->text); - GtkTextBuffer *buffer = gtk_text_view_get_buffer(text); - GtkTextIter iter; - GtkTextMark *mark; - - SIGNAL_BLOCK(buffer); - - if (!msginfo) { - dummyinfo = compose_msginfo_new_from_compose(compose); - msginfo = dummyinfo; - } - - const char *qmark = "> "; - quote_fmt_init(msginfo, NULL, NULL, FALSE, compose->account, FALSE); - quote_fmt_scan_string(qmark); - quote_fmt_parse(); - - buf = quote_fmt_get_buffer(); - if (buf == NULL) - alertpanel_error(_("The \"Quotation mark\" of the template is invalid.")); - else - Xstrdup_a(quote_str, buf, goto error) - - if (fmt && *fmt != '\0') { - if (trimmed_body) - while (*trimmed_body == '\n') - trimmed_body++; - quote_fmt_init(msginfo, quote_str, trimmed_body, FALSE, compose->account, FALSE); - if (need_unescape) { - gchar *tmp = NULL; - - /* decode \-escape sequences in the internal representation of the quote format */ - tmp = g_malloc(strlen(fmt)+1); - pref_get_unescaped_pref(tmp, fmt); - quote_fmt_scan_string(tmp); - quote_fmt_parse(); - g_free(tmp); - } else { - quote_fmt_scan_string(fmt); - quote_fmt_parse(); - } - - buf = quote_fmt_get_buffer(); - - if (buf == NULL) { - gint line = quote_fmt_get_line(); - alertpanel_error(err_msg, line); - - goto error; - } - - } else - buf = ""; - - prev_autowrap = compose->autowrap; - compose->autowrap = FALSE; - - mark = gtk_text_buffer_get_insert(buffer); - gtk_text_buffer_get_iter_at_mark(buffer, &iter, mark); - if (g_utf8_validate(buf, -1, NULL)) { - gtk_text_buffer_insert(buffer, &iter, buf, -1); - } else { - gchar *tmpout = NULL; - tmpout = conv_codeset_strdup - (buf, conv_get_locale_charset_str_no_utf8(), - CS_INTERNAL); - if (!tmpout || !g_utf8_validate(tmpout, -1, NULL)) { - g_free(tmpout); - tmpout = g_malloc(strlen(buf)*2+1); - conv_localetodisp(tmpout, strlen(buf)*2+1, buf); - } - gtk_text_buffer_insert(buffer, &iter, tmpout, -1); - g_free(tmpout); - } - - cursor_pos = quote_fmt_get_cursor_pos(); - if (cursor_pos == -1) - cursor_pos = gtk_text_iter_get_offset(&iter); - compose->set_cursor_pos = cursor_pos; - - gtk_text_buffer_get_start_iter(buffer, &iter); - gtk_text_buffer_get_iter_at_offset(buffer, &iter, cursor_pos); - gtk_text_buffer_place_cursor(buffer, &iter); - - compose->autowrap = prev_autowrap; - if (compose->autowrap && rewrap) - compose_wrap_all(compose); - - goto ok; - -error: - buf = NULL; -ok: - SIGNAL_UNBLOCK(buffer); - - procmsg_msginfo_free( &dummyinfo ); - - return buf; -} - /* if ml_post is of type addr@host and from is of type * addr-anything@host, return TRUE */ @@ -6163,10 +5922,7 @@ static gchar *compose_get_header(Compose *compose) /* Program version and system info */ if (compose->account->gen_xmailer && g_slist_length(compose->to_list) && !IS_IN_CUSTOM_HEADER("X-Mailer")) { - g_string_append_printf(header, "X-Mailer: %s (GTK %d.%d.%d; %s)\n", - prog_version, - gtk_major_version, gtk_minor_version, gtk_micro_version, - TARGET_ALIAS); + g_string_append_printf(header, "X-Mailer: Talons (https://git.olowe.co/talons)\n"); } /* custom headers */ @@ -8485,7 +8241,7 @@ static void compose_undo_state_changed(UndoMain *undos switch (undo_state) { case UNDO_STATE_TRUE: if (!undostruct->undo_state) { - undostruct->undo_state = TRUE; + undostruct->undo_state = 1; cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit/Undo", TRUE); } break; @@ -8508,7 +8264,7 @@ static void compose_undo_state_changed(UndoMain *undos switch (redo_state) { case UNDO_STATE_TRUE: if (!undostruct->redo_state) { - undostruct->redo_state = TRUE; + undostruct->redo_state = 1; cm_menu_set_sensitive_full(compose->ui_manager, "Menu/Edit/Redo", TRUE); } break; @@ -9112,7 +8868,6 @@ static void compose_insert_file_cb(GtkAction *action, { Compose *compose = (Compose *)data; GList *file_list; - gint files_inserted = 0; file_list = filesel_select_multiple_files_open(_("Select file"), NULL); @@ -9133,8 +8888,7 @@ static void compose_insert_file_cb(GtkAction *action, alertpanel_error(_("File '%s' contained invalid characters\n" "for the current encoding, insertion may be incorrect."), shortfile); - } else if (res == COMPOSE_INSERT_SUCCESS) - files_inserted++; + } g_free(shortfile); g_free(filedup); @@ -9338,7 +9092,6 @@ static void paste_text(Compose *compose, GtkWidget *en static void attach_uri_list(Compose *compose, GtkSelectionData *data) { GList *list, *tmp; - int att = 0; gchar *warn_files = NULL; list = uri_list_extract_filenames( @@ -9350,7 +9103,6 @@ static void attach_uri_list(Compose *compose, GtkSelec utf8_filename); g_free(warn_files); warn_files = tmp_f; - att++; compose_attach_append (compose, (const gchar *)tmp->data, utf8_filename, NULL, NULL); @@ -9527,7 +9279,6 @@ static void compose_copy_cb(GtkAction *action, gpointe static void compose_paste_cb(GtkAction *action, gpointer data) { Compose *compose = (Compose *)data; - GtkTextBuffer *buffer; if (compose->focused_editable && gtk_widget_has_focus(compose->focused_editable)) entry_paste_clipboard(compose, compose->focused_editable, GDK_SELECTION_CLIPBOARD, NULL); } @@ -10289,36 +10040,7 @@ static void text_inserted(GtkTextBuffer *buffer, GtkTe G_CALLBACK(text_inserted), compose); if (paste_as_quotation) { - gchar *new_text; - guint pos = 0; - GtkTextIter start_iter; - - if (len < 0) - len = strlen(text); - - new_text = g_strndup(text, len); - - mark = gtk_text_buffer_create_mark(buffer, NULL, iter, FALSE); - gtk_text_buffer_place_cursor(buffer, iter); - - pos = gtk_text_iter_get_offset(iter); - - compose_quote_fmt(compose, NULL, "%Q", new_text, TRUE, FALSE, - _("Quote format error at line %d.")); - quote_fmt_reset_vartable(); - g_free(new_text); - g_object_set_data(G_OBJECT(compose->text), "paste_as_quotation", - GINT_TO_POINTER(paste_as_quotation - 1)); - - gtk_text_buffer_get_iter_at_mark(buffer, iter, mark); - gtk_text_buffer_place_cursor(buffer, iter); - gtk_text_buffer_delete_mark(buffer, mark); - - gtk_text_buffer_get_iter_at_offset(buffer, &start_iter, pos); - mark = gtk_text_buffer_create_mark(buffer, NULL, &start_iter, FALSE); - compose_beautify_paragraph(compose, &start_iter, FALSE); - gtk_text_buffer_get_iter_at_mark(buffer, &start_iter, mark); - gtk_text_buffer_delete_mark(buffer, mark); + // TODO delete } else { if (strcmp(text, "\n") || compose->automatic_break || gtk_text_iter_starts_line(iter)) { blob - a84813eccf0f1673aa51f272a7341050f6bcfa02 (mode 644) blob + /dev/null --- src/etpan/Makefile.am +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright 1999-2014 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - -noinst_LTLIBRARIES = libclawsetpan.la - -libclawsetpan_la_SOURCES = \ - etpan-thread-manager.c \ - imap-thread.c \ - etpan-ssl.c - -clawsetpanincludedir = $(pkgincludedir)/etpan -clawsetpaninclude_HEADERS = \ - etpan-thread-manager-types.h \ - etpan-thread-manager.h \ - etpan-errors.h \ - imap-thread.h \ - etpan-ssl.h - -AM_CPPFLAGS = \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/src/common \ - -I$(top_srcdir)/src/gtk \ - $(GTK_CFLAGS) \ - $(LIBETPAN_CFLAGS) - -libclawsetpan_la_LIBADD = \ - ../common/libclawscommon.la \ - $(GTK_LIBS) \ - $(LIBETPAN_LIBS) - -.PHONY: test blob - 9176b0c91e41b8325bdf597f2cb9b761340ac7d9 blob + 62097167889a97e92d832aaac84b11c5ec72faf3 --- src/etpan/etpan-ssl.c +++ src/etpan/etpan-ssl.c @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy + * Copyright (C) 1999-2012 Colin Leroy * and the Claws Mail team * * This program is free software; you can redistribute it and/or modify @@ -15,15 +15,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#ifdef USE_GNUTLS #include #include #include @@ -162,7 +156,7 @@ void etpan_connect_ssl_context_cb(struct mailstream_ss pkey_len = (size_t)gnutls_i2d_PrivateKey(pkey, &pkey_der); if (x509_len > 0 && pkey_len > 0) { if (mailstream_ssl_set_client_certificate_data(ssl_context, x509_der, x509_len) < 0 || - mailstream_ssl_set_client_private_key_data(ssl_context, pkey_der, pkey_len) < 0) + mailstream_ssl_set_client_private_key_data(ssl_context, pkey_der, pkey_len) < 0) log_error(LOG_PROTOCOL, _("Impossible to set the client certificate.\n")); g_free(x509_der); g_free(pkey_der); @@ -188,5 +182,3 @@ void etpan_connect_ssl_context_cb(struct mailstream_ss #endif /* LIBETPAN_API_CURRENT >= 23 */ } - -#endif /* USE_GNUTLS */ blob - 4a862d8638aaa12002a7496b1c717f73f3fff7f0 blob + 4a285f7376bfd2c338cbcdebafd18c26054af9c3 --- src/etpan/etpan-ssl.h +++ src/etpan/etpan-ssl.h @@ -1,6 +1,6 @@ /* * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy + * Copyright (C) 1999-2012 Colin Leroy * and the Claws Mail team * * This program is free software; you can redistribute it and/or modify @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef __ETPAN_SSL_H__ @@ -25,13 +25,9 @@ #include "claws-features.h" #endif -#ifdef USE_GNUTLS - #include gboolean etpan_certificate_check(mailstream *imap_stream, const char *host, gint port, gboolean accept_if_valid); void etpan_connect_ssl_context_cb(struct mailstream_ssl_context * ssl_context, void * data); -#endif /* USE_GNUTLS */ - #endif /* __ETPAN_SSL_H__ */ blob - 708a95a34dfff636a38c3b910f0e1c02f5a566b1 blob + 408ad42541ecded852504e2a9054e253a1c3dab3 --- src/etpan/etpan-thread-manager.c +++ src/etpan/etpan-thread-manager.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "etpan-thread-manager.h" #include blob - e5590f47c4ae734cb1a6f9e8461c5fffd42e1335 blob + a6f33bc49d03910d5620491f6df35516239cace8 --- src/etpan/imap-thread.c +++ src/etpan/imap-thread.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include "imap-thread.h" @@ -541,7 +536,7 @@ int imap_threaded_connect(Folder * folder, const char return result.error; } -#ifdef USE_GNUTLS + static void connect_ssl_run(struct etpan_thread_op * op) { int r; @@ -602,7 +597,7 @@ int imap_threaded_connect_ssl(Folder * folder, const c return result.error; } -#endif + struct capa_param { mailimap * imap; }; @@ -888,10 +883,8 @@ static void login_run(struct etpan_thread_op * op) param->type, NULL, NULL, NULL, NULL, param->login, param->password, NULL); -#ifdef USE_OAUTH2 else if (!strcmp(param->type, "XOAUTH2")) r = mailimap_oauth2_authenticate(param->imap, param->login, param->password); -#endif else r = mailimap_authenticate(param->imap, param->type, NULL, NULL, NULL, @@ -1084,7 +1077,6 @@ int imap_threaded_noop(Folder * folder, unsigned int * return result.error; } -#ifdef USE_GNUTLS struct starttls_result { int error; }; @@ -1158,7 +1150,6 @@ int imap_threaded_starttls(Folder * folder, const gcha } return result.error; } -#endif struct create_param { mailimap * imap; blob - f987326d639cdc02943f93229f20670c0c832090 (mode 644) blob + /dev/null --- src/fence/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: zig-out/lib/libfence.a - -zig-out/lib/libfence.a: build.zig src/root.zig src/fence.h - zig build - -clean: - rm -rf zig-out blob - c237df8a8a113c3a73b32d7f3b5ebd3b849ca4b3 blob + 5a03fae815e48f756e80ae455a55663d16fec102 --- src/folder.c +++ src/folder.c @@ -963,8 +963,6 @@ void folder_scan_tree(Folder *folder, gboolean rebuild folder_persist_prefs_free(pptable); - prefs_matcher_read_config(); - folder_write_list(); } @@ -3172,8 +3170,6 @@ static FolderItem *folder_item_move_recursive(FolderIt procmsg_msg_list_free(mlist); } - prefs_matcher_write_config(); - /* recurse */ srcnode = src->folder->node; srcnode = g_node_find(srcnode, G_PRE_ORDER, G_TRAVERSE_ALL, src); @@ -4529,30 +4525,6 @@ gboolean folder_get_sort_type (Folder *folder, return TRUE; } -gint folder_item_search_msgs (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data) -{ - gint result = -1; - - folder_item_update_freeze(); - - if (folder->klass->search_msgs) - result = folder->klass->search_msgs(folder, container, - msgs, on_server, predicate, progress_cb, progress_data); - if (result < 0) - result = folder_item_search_msgs_local(folder, container, - msgs, on_server, predicate, progress_cb, progress_data); - - folder_item_update_thaw(); - - return result; -} - MsgNumberList *folder_item_get_number_list(FolderItem *item) { GSList *nums = NULL; @@ -4564,61 +4536,6 @@ MsgNumberList *folder_item_get_number_list(FolderItem return nums; } -gint folder_item_search_msgs_local (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data) -{ - GSList *result = NULL; - GSList *cur = NULL; - gint matched_count = 0; - guint processed_count = 0; - gint msgcount; - GSList *nums = NULL; - - if (*msgs == NULL) { - nums = folder_item_get_number_list(container); - } else { - nums = *msgs; - } - - msgcount = g_slist_length(nums); - - if (msgcount < 0) - return -1; - - for (cur = nums; cur != NULL; cur = cur->next) { - guint msgnum = GPOINTER_TO_UINT(cur->data); - MsgInfo *msg = folder_item_get_msginfo(container, msgnum); - - if (msg == NULL) { - g_slist_free(result); - return -1; - } - - if (matcherlist_match(predicate, msg)) { - result = g_slist_prepend(result, GUINT_TO_POINTER(msg->msgnum)); - matched_count++; - } - processed_count++; - - procmsg_msginfo_free(&msg); - - if (progress_cb != NULL - && !progress_cb(progress_data, FALSE, processed_count, - matched_count, msgcount)) - break; - } - - g_slist_free(nums); - *msgs = g_slist_reverse(result); - - return matched_count; -} - /* Tests if a local (on disk) folder name is acceptable. */ gboolean folder_local_name_ok(const gchar *name) { blob - 930b1f6cb8af4bfafe1104de98547c6701347510 blob + 9648e6aa02201275fa3963600b64234fac95cf50 --- src/folder.h +++ src/folder.h @@ -194,12 +194,6 @@ struct _FolderClass * user. Can be upper and lowercase unlike the idstr. */ gchar *uistr; - /** - * A boolean to indicate whether or not the FolderClass supports search on the - * server. If \c TRUE, setting \c on_server in \c search_msgs offloads search to - * the server. - */ - gboolean supports_server_search; /** * Klass-specific prefs pages @@ -533,59 +527,7 @@ struct _FolderClass FolderItem *dest, MsgInfoList *msglist, GHashTable *relation); - /** - * Search the given FolderItem for messages matching \c predicate. - * The search may be offloaded to the server if the \c folder - * supports server side search, as indicated by \c supports_server_search. - * - * \param folder The \c Folder of the container FolderItem - * \param container The \c FolderItem containing the messages to be searched - * \param msgs The \c MsgNumberList results will be saved to. - * If *msgs != NULL, the search will be restricted to - * messages whose numbers are contained therein. - * If \c on_server is considered \c FALSE, messages are guaranteed to - * be processed in the order they are listed in \c msgs. - * On error, \c msgs will not be changed. - * \param on_server Whether or not the search should be offloaded to the server. - * If \c on_server is not \c NULL and points to a \c TRUE value, - * search will be done on the server. If \c predicate contains - * one or more atoms the server does not support, the value - * pointed to by \c on_server will be set to \c FALSE upon return. - * In this case, \c msgs must still contain a valid superset of - * messages actually matched by \c predicate, or this method must - * return an error. - * \c on_server may only point to a \c TRUE value if - * \c supports_server_search is also \c TRUE. - * \c NULL and pointer to \c FALSE are considered equivalent and - * will start a client-only search. - * \param predicate The \c MatcherList to use in the search - * \param progress_cb Called for every message searched. - * When search is offloaded to the server, this function - * may or may not be called, depending on the implementation. - * The second argument of this function will be the number of - * messages already processed. - * Return \c FALSE from this function to end the search. - * May be \c NULL, no calls will be made in this case. - * \param progress_data First argument value for \c progress_cb - * \return Number of messages that matched \c predicate on success, a negative - * number otherwise. - * - * \note - * When search is stopped by returning \c FALSE from \c progress_cb, \c msgs will - * contain all messages found until the point of cancellation. The number of - * messages found will be returned as indicated above. - */ - gint (*search_msgs) (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data); - - - /** * Remove a message from a \c FolderItem. * * \param folder The \c Folder of the message @@ -941,13 +883,7 @@ gint folder_item_copy_msg (FolderItem *dest, MsgInfo *msginfo); gint folder_item_copy_msgs (FolderItem *dest, GSList *msglist); -gint folder_item_search_msgs (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data); + gint folder_item_remove_msg (FolderItem *item, gint num); gint folder_item_remove_msgs (FolderItem *item, @@ -987,16 +923,6 @@ void folder_item_synchronise (FolderItem *item); void folder_item_discard_cache (FolderItem *item); void folder_item_commit_tags(FolderItem *item, MsgInfo *msginfo, GSList *tags_set, GSList *tags_unset); - - -gint folder_item_search_msgs_local (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data); - gchar *folder_get_list_path (void); gboolean folder_local_name_ok(const gchar *name); blob - 3c552ac900de8a6849c6325141d72e3a9f033870 blob + 3d6a77763cd6c1369c216d8f196bd0524ba832c5 --- src/folder_item_prefs.c +++ src/folder_item_prefs.c @@ -225,8 +225,6 @@ void folder_item_prefs_copy_prefs(FolderItem * src, Fo tmp_prefs.render_html = src->prefs->render_html; tmp_prefs.skip_on_goto_unread_or_new = src->prefs->skip_on_goto_unread_or_new; - prefs_matcher_read_config(); - tmp_prefs.processing = tmp_prop_list; tmp_prefs.enable_default_from = src->prefs->enable_default_from; @@ -253,7 +251,6 @@ void folder_item_prefs_copy_prefs(FolderItem * src, Fo *dest->prefs = tmp_prefs; folder_item_prefs_save_config(dest); - prefs_matcher_write_config(); dest->collapsed = src->collapsed; dest->thread_collapsed = src->thread_collapsed; blob - 588a5f134853252a0c5ac97da10b81f55d54628d blob + 2c4224d63379ef82188497658fee90ecc6e88feb --- src/foldersel.c +++ src/foldersel.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include blob - d15f62336d67bfc15c132b150edf423e80be335d blob + 3d04e1885c1d8758464be6462a0e039ee08103da --- src/folderutils.c +++ src/folderutils.c @@ -17,8 +17,6 @@ * */ -#include "config.h" - #include #include "utils.h" blob - 46ac7693cd6b9c0f53511f61e9d74f96d17543ec blob + 5b807c82b3cb5c7e37fa5144cbdcabe11a348d0b --- src/folderview.c +++ src/folderview.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include @@ -31,7 +30,6 @@ #include "mainwindow.h" #include "folderview.h" #include "summaryview.h" -#include "summary_search.h" #include "inputdialog.h" #include "manage_window.h" #include "alertpanel.h" @@ -51,7 +49,6 @@ #include "hooks.h" #include "folderutils.h" #include "prefs_folder_column.h" -#include "quicksearch.h" #include "manual.h" #include "log.h" #include "gtkcmctree.h" @@ -181,8 +178,6 @@ static void folderview_empty_trash_cb (GtkAction *act static void folderview_send_queue_cb (GtkAction *action, gpointer data); -static void folderview_search_cb (GtkAction *action, - gpointer data); static void folderview_startup_folder_cb(GtkAction *action, gpointer data); @@ -243,7 +238,6 @@ static GtkActionEntry folderview_common_popup_entries[ {"FolderViewPopup/MarkAllReadRec", NULL, N_("Mark all read recursi_vely"), NULL, NULL, G_CALLBACK(mark_all_read_recursive_cb) }, {"FolderViewPopup/MarkAllUnreadRec", NULL, N_("Mark all unread recursi_vely"), NULL, NULL, G_CALLBACK(mark_all_unread_recursive_cb) }, {"FolderViewPopup/---", NULL, "---", NULL, NULL , NULL}, - {"FolderViewPopup/SearchFolder", NULL, N_("_Search folder..."), NULL, NULL, G_CALLBACK(folderview_search_cb) }, {"FolderViewPopup/OpenFolder", NULL, N_("Open on start-up"), NULL, NULL, G_CALLBACK(folderview_startup_folder_cb) }, {"FolderViewPopup/Properties", NULL, N_("_Properties..."), NULL, NULL, G_CALLBACK(folderview_property_cb) }, {"FolderViewPopup/EmptyTrash", NULL, N_("Empty _trash..."), NULL, NULL, G_CALLBACK(folderview_empty_trash_cb) }, @@ -1733,8 +1727,7 @@ static gboolean folderview_update_item_claws(gpointer if ((update_info->update_flags & F_ITEM_UPDATE_CONTENT) && update_info->item == folderview->summaryview->folder_item && update_info->item != NULL) - if (!quicksearch_has_sat_predicate(folderview->summaryview->quicksearch)) - summary_show(folderview->summaryview, update_info->item, FALSE); + summary_show(folderview->summaryview, update_info->item, FALSE); } return FALSE; @@ -1883,7 +1876,6 @@ static void folderview_set_sens_and_popup_menu(FolderV MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllReadRec", "FolderViewPopup/MarkAllReadRec", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "MarkAllUnreadRec", "FolderViewPopup/MarkAllUnreadRec", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Separator1", "FolderViewPopup/---", GTK_UI_MANAGER_SEPARATOR) - MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "SearchFolder", "FolderViewPopup/SearchFolder", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "OpenFolder", "FolderViewPopup/OpenFolder", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(ui_manager, "/Popup/FolderViewPopup", "Properties", "FolderViewPopup/Properties", GTK_UI_MANAGER_MENUITEM) @@ -1915,8 +1907,6 @@ static void folderview_set_sens_and_popup_menu(FolderV (item->unread_msgs != (item->total_msgs - item->ignored_msgs))); SET_SENS("FolderViewPopup/MarkAllReadRec", folderview_have_unread_children(folderview,item)); SET_SENS("FolderViewPopup/MarkAllUnreadRec", folderview_have_read_children(folderview,item)); - SET_SENS("FolderViewPopup/SearchFolder", item->total_msgs > 0 && - folderview->selected == folderview->opened); SET_SENS("FolderViewPopup/Properties", TRUE); if (item->node->parent != NULL) { @@ -2040,9 +2030,6 @@ static gboolean folderview_key_pressed(GtkWidget *widg if (!event) return FALSE; - if (quicksearch_has_focus(folderview->summaryview->quicksearch)) - return FALSE; - switch (event->keyval) { case GDK_KEY_Right: if (folderview->selected) { @@ -2475,12 +2462,6 @@ static void folderview_send_queue_cb(GtkAction *action } } -static void folderview_search_cb(GtkAction *action, gpointer data) -{ - FolderView *folderview = (FolderView *)data; - summary_search(folderview->summaryview); -} - static void folderview_startup_folder_cb(GtkAction *action, gpointer data) { FolderView *folderview = (FolderView *)data; blob - 78c9b0120d245e697b134201337489bcb84dea0b (mode 644) blob + /dev/null --- src/gtk/Makefile.am +++ /dev/null @@ -1,80 +0,0 @@ -# Copyright 1999-2014 the Claws Mail team. -# This file is part of Claws Mail package, and distributed under the -# terms of the General Public License version 3 (or later). -# See COPYING file for license details. - -DOCDIR = $(docdir) - -noinst_LTLIBRARIES = libclawsgtk.la - -EXTRA_DIST = \ - claws-marshal.list - -libclawsgtk_la_SOURCES = \ - about.c \ - combobox.c \ - description_window.c \ - filesel.c \ - foldersort.c \ - gtkcmctree.c \ - gtkcmclist.c \ - gtksctree.c \ - gtkunit.c \ - gtkutils.c \ - gtkvscrollbutton.c \ - icon_legend.c \ - inputdialog.c \ - logwindow.c \ - manage_window.c \ - menu.c \ - prefswindow.c \ - progressdialog.c \ - quicksearch.c \ - claws-marshal.c - -clawsgtkincludedir = $(pkgincludedir)/gtk -clawsgtkinclude_HEADERS = \ - about.h \ - authors.h \ - combobox.h \ - description_window.h \ - filesel.h \ - foldersort.h \ - gtkutils.h \ - gtkunit.h \ - gtkvscrollbutton.h \ - headers.h \ - icon_legend.h \ - inputdialog.h \ - logwindow.h \ - manage_window.h \ - menu.h \ - prefswindow.h \ - progressdialog.h \ - quicksearch.h \ - claws-marshal.h \ - gtkcmctree.h \ - gtkcmclist.h \ - gtksctree.h - -AM_CPPFLAGS = \ - -I$(srcdir)/../common \ - -I../common \ - -I$(srcdir)/.. \ - -I$(builddir)/.. \ - $(GTK_CFLAGS) \ - -DDOCDIR=\"$(DOCDIR)\" - -libclawsgtk_la_LIBADD = \ - ../common/libclawscommon.la \ - $(GTK_LIBS) - -BUILT_SOURCES=claws-marshal.c claws-marshal.h - -claws-marshal.h: claws-marshal.list - $(GLIB_GENMARSHAL) $< --header --prefix=claws_marshal > $@ - -claws-marshal.c: claws-marshal.list - $(GLIB_GENMARSHAL) $< --body --prefix=claws_marshal > $@ - -.PHONY: test blob - c6f56769d383857f8c82f7e8229b6e580465aea9 blob + 3457dc938b74465c949d8037adca44abcdfe0e77 --- src/gtk/about.c +++ src/gtk/about.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include @@ -376,21 +371,13 @@ static GtkWidget *about_create_child_page_features(voi stock_pixbuf_gdk(STOCK_PIXMAP_CHECKBOX_ON, &active_pixbuf); stock_pixbuf_gdk(STOCK_PIXMAP_CHECKBOX_OFF, &inactive_pixbuf); -#if USE_GNUTLS gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); -#else - gtk_text_buffer_insert_pixbuf(buffer, &iter, inactive_pixbuf); -#endif gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" GnuTLS "), -1, "bold", NULL); gtk_text_buffer_insert(buffer, &iter, (gchar *)C_("GnuTLS", "adds support for encrypted connections to servers\n"), -1); -#if HAVE_ICONV gtk_text_buffer_insert_pixbuf(buffer, &iter, active_pixbuf); -#else - gtk_text_buffer_insert_pixbuf(buffer, &iter, inactive_pixbuf); -#endif gtk_text_buffer_insert_with_tags_by_name(buffer, &iter, (" iconv "), -1, "bold", NULL); gtk_text_buffer_insert(buffer, &iter, @@ -492,7 +479,8 @@ static gboolean release_notes_available(void) gboolean ret = FALSE; gchar *path = NULL; - path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); + // path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); + path = "/dev/null"; ret = (is_file_exist(path)); g_free(path); @@ -525,7 +513,8 @@ static GtkWidget *about_create_child_page_release_note buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text)); gtk_text_buffer_get_iter_at_offset(buffer, &iter, 0); - path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); + // path = g_strconcat(DOCDIR, G_DIR_SEPARATOR_S, RELEASE_NOTES_FILE, NULL); + path = "/dev/null"; if ((fp = g_fopen(path, "rb")) == NULL) { if (ENOENT != errno) FILE_OP_ERROR(path, "g_fopen"); g_free(path); blob - 4f97260291868e8e5121782e1020b81acb03996d blob + 7764c94b04c1f5ed5dcce7a3310b1cc554a97a70 --- src/gtk/combobox.c +++ src/gtk/combobox.c @@ -14,14 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include @@ -41,10 +36,10 @@ GtkWidget *combobox_text_new(const gboolean with_entry GtkWidget *combo; va_list args; gchar *string; - + if(text == NULL) return NULL; - + if (with_entry) combo = gtk_combo_box_text_new_with_entry(); else @@ -56,9 +51,9 @@ GtkWidget *combobox_text_new(const gboolean with_entry while ((string = va_arg(args, gchar*)) != NULL) gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), string); va_end(args); - + gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0); - + return combo; } @@ -184,7 +179,7 @@ void combobox_set_popdown_strings(GtkComboBoxText *com gboolean combobox_set_value_from_arrow_key(GtkComboBox *combobox, guint keyval) -/* used from key_press events upon gtk_combo_box_entry with one text column +/* used from key_press events upon gtk_combo_box_entry with one text column (gtk_combo_box_text_new() and with GtkComboBoxEntry's for instance), make sure that up and down arrow keys behave the same as old with old gtk_combo widgets: @@ -260,7 +255,7 @@ void combobox_set_sensitive(GtkComboBox *combobox, con GtkTreeModel *model; GtkTreeIter iter, child; guint i; - + if((model = gtk_combo_box_get_model(combobox)) == NULL) return; @@ -270,12 +265,12 @@ void combobox_set_sensitive(GtkComboBox *combobox, con if(gtk_tree_model_iter_next(model, &iter) == FALSE) return; } - + store_set_sensitive(model, &iter, sensitive); if(gtk_tree_model_iter_children(model, &child, &iter) == FALSE) return; - + do { store_set_sensitive(model, &child, sensitive); } while (gtk_tree_model_iter_next(model, &child) == TRUE); blob - dc1881ea003a7cad8cddf44570bdff2bb854fb22 blob + 79edfabd3b1c4d89979a186e068c329c34f246ea --- src/gtk/description_window.c +++ src/gtk/description_window.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - 41b9f89f795791be33ee31dbbeecb148c746c9d3 blob + 8ae4c16c3f7cf9d1401a82f3d3ed845a6a42d30f --- src/gtk/filesel.c +++ src/gtk/filesel.c @@ -14,14 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#include "claws-features.h" -#endif - #include #include #include @@ -52,10 +47,10 @@ update_preview_cb (GtkFileChooser *file_chooser, gpoin return; } type = procmime_get_mime_type(filename); - - if (type && !strncmp(type, "image/", 6)) + + if (type && !strncmp(type, "image/", 6)) pixbuf = gdk_pixbuf_new_from_file_at_size (filename, 128, 128, NULL); - + g_free(type); g_free (filename); @@ -67,7 +62,7 @@ update_preview_cb (GtkFileChooser *file_chooser, gpoin gtk_file_chooser_set_preview_widget_active (file_chooser, have_preview); } - + static GList *filesel_create(const gchar *title, const gchar *path, gboolean multiple_files, gboolean open, gboolean folder_mode, @@ -76,15 +71,15 @@ static GList *filesel_create(const gchar *title, const GSList *slist = NULL, *slist_orig = NULL; GList *list = NULL; - gint action = (open == TRUE) ? + gint action = (open == TRUE) ? (folder_mode == TRUE ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: GTK_FILE_CHOOSER_ACTION_OPEN): (folder_mode == TRUE ? GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER: GTK_FILE_CHOOSER_ACTION_SAVE); - + gchar * action_btn = (open == TRUE) ? _("_Open"):_("_Save"); GtkFileChooserNative *chooser = gtk_file_chooser_native_new - (title, NULL, action, + (title, NULL, action, action_btn, _("_Cancel")); gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(chooser), FALSE); @@ -125,7 +120,7 @@ static GList *filesel_create(const gchar *title, const *(strrchr(realpath, G_DIR_SEPARATOR)+1) = '\0'; } else { filename = (char *) path; - g_free(realpath); + g_free(realpath); realpath = g_strdup(get_home_dir()); } if (g_utf8_validate(realpath, -1, NULL)) @@ -152,19 +147,19 @@ static GList *filesel_create(const gchar *title, const g_free(tmp); } - if (gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) + if (gtk_native_dialog_run(GTK_NATIVE_DIALOG(chooser)) == GTK_RESPONSE_ACCEPT) slist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER (chooser)); - + g_object_unref(chooser); slist_orig = slist; - + if (slist) { gchar *tmp = g_strdup(slist->data); if (!path && prefs_common.attach_load_dir) g_free(prefs_common.attach_load_dir); - + if (strrchr(tmp, G_DIR_SEPARATOR)) *(strrchr(tmp, G_DIR_SEPARATOR)+1) = '\0'; @@ -178,10 +173,10 @@ static GList *filesel_create(const gchar *title, const list = g_list_append(list, slist->data); slist = slist->next; } - + if (slist_orig) g_slist_free(slist_orig); - + return list; } @@ -204,7 +199,7 @@ GList *filesel_select_multiple_files_open_with_filter( /** * This function lets the user select one file. - * This opens an Open type dialog if "file" is NULL, + * This opens an Open type dialog if "file" is NULL, * Save dialog if "file" contains a path. * @param title the title of the dialog * @param path the optional path to save to blob - 2074ad677be17dff3590cfc9fd8069bc1a10a5d6 blob + 42c245ea8ddd2490274d2fef0c4b68d8c2661e0f --- src/gtk/foldersort.c +++ src/gtk/foldersort.c @@ -17,9 +17,6 @@ * */ -#include "config.h" -#include "defs.h" - #include #include #include blob - 6aff7c088429708ce9b5960b3e1e62505d6bb196 blob + c77f4fb773f9152c1bca57745b6b874af1f55a01 --- src/gtk/gtkcmclist.c +++ src/gtk/gtkcmclist.c @@ -1,6 +1,6 @@ /* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, - * Copyright (C) 1997-1998 Jay Painter + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, + * Copyright (C) 1997-1998 Jay Painter * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,11 +22,9 @@ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include - #include #include @@ -64,7 +62,7 @@ (((row) + 1) * CELL_SPACING) + \ (clist)->voffset) -/* returns the row index from a y pixel location in the +/* returns the row index from a y pixel location in the * context of the clist's voffset */ #define ROW_FROM_YPIXEL(clist, y) (((y) - (clist)->voffset) / \ ((clist)->row_height + CELL_SPACING)) @@ -76,7 +74,7 @@ static void gtk_cmclist_scrollable_init (GtkScrollableInterface *iface); -/* returns the column index from a x pixel location in the +/* returns the column index from a x pixel location in the * context of the clist's hoffset */ static inline gint COLUMN_FROM_XPIXEL (GtkCMCList * clist, @@ -113,7 +111,7 @@ COLUMN_FROM_XPIXEL (GtkCMCList * clist, /* returns the total width of the list */ static inline gint -LIST_WIDTH (GtkCMCList * clist) +LIST_WIDTH (GtkCMCList * clist) { gint last_column; @@ -213,7 +211,7 @@ static gint gtk_cmclist_button_press (GtkWidget GdkEventButton *event); static gint gtk_cmclist_button_release (GtkWidget *widget, GdkEventButton *event); -static gint gtk_cmclist_motion (GtkWidget *widget, +static gint gtk_cmclist_motion (GtkWidget *widget, GdkEventMotion *event); static void gtk_cmclist_get_preferred_height (GtkWidget *widget, gint *minimal_height, @@ -399,7 +397,7 @@ static void draw_row (GtkCMCList *clist, static void draw_rows (GtkCMCList *clist, GdkRectangle *area); static void clist_refresh (GtkCMCList *clist); - + /* Size Allocation / Requisition */ static void size_allocate_title_buttons (GtkCMCList *clist); static void size_allocate_columns (GtkCMCList *clist, @@ -449,7 +447,7 @@ static gboolean title_focus_move (GtkCMCList *clist, static void real_row_move (GtkCMCList *clist, gint source_row, gint dest_row); -static gint column_title_passive_func (GtkWidget *widget, +static gint column_title_passive_func (GtkWidget *widget, GdkEvent *event, gpointer data); static void drag_dest_cell (GtkCMCList *clist, @@ -485,8 +483,8 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) widget_class->destroy = gtk_cmclist_destroy; object_class->set_property = gtk_cmclist_set_arg; object_class->get_property = gtk_cmclist_get_arg; - + widget_class->realize = gtk_cmclist_realize; widget_class->unrealize = gtk_cmclist_unrealize; widget_class->map = gtk_cmclist_map; @@ -510,7 +508,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) widget_class->drag_data_get = gtk_cmclist_drag_data_get; widget_class->drag_data_received = gtk_cmclist_drag_data_received; widget_class->focus = gtk_cmclist_focus; - + /* container_class->add = NULL; use the default GtkContainerClass warning */ /* container_class->remove=NULL; use the default GtkContainerClass warning */ @@ -796,7 +794,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) "scroll_vertical", 2, G_TYPE_ENUM, GTK_SCROLL_JUMP, G_TYPE_FLOAT, 1.0); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, GDK_SHIFT_MASK, "extend_selection", 3, G_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, @@ -850,7 +848,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) G_TYPE_ENUM, GTK_SCROLL_JUMP, G_TYPE_FLOAT, 1.0, G_TYPE_BOOLEAN, TRUE); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, 0, "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, @@ -859,7 +857,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_STEP_BACKWARD, G_TYPE_FLOAT, 0.0); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, 0, "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_STEP_FORWARD, @@ -877,7 +875,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_JUMP, G_TYPE_FLOAT, 0.0); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_End, 0, "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_JUMP, @@ -887,7 +885,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) "scroll_horizontal", 2, G_TYPE_ENUM, GTK_SCROLL_JUMP, G_TYPE_FLOAT, 1.0); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "undo_selection", 0); gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, @@ -895,7 +893,7 @@ gtk_cmclist_class_init (GtkCMCListClass *klass) gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0, "toggle_focus_row", 0); gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0, - "toggle_focus_row", 0); + "toggle_focus_row", 0); gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK, "toggle_add_mode", 0); gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK, @@ -1115,18 +1113,18 @@ gtk_cmclist_constructor (GType type, n_construct_properties, construct_properties); GtkCMCList *clist = GTK_CMCLIST (object); - + /* allocate memory for columns */ clist->column = columns_new (clist); - - /* there needs to be at least one column button + + /* there needs to be at least one column button * because there is alot of code that will break if it * isn't there */ column_button_create (clist, 0); clist->draw_now = 1; - + return object; } @@ -1147,7 +1145,7 @@ gtk_cmclist_new (gint columns) { return gtk_cmclist_new_with_titles (columns, NULL); } - + GtkWidget* gtk_cmclist_new_with_titles (gint columns, gchar *titles[]) @@ -1180,10 +1178,10 @@ gtk_cmclist_set_hadjustment (GtkCMCList *clist, cm_return_if_fail (GTK_IS_CMCLIST (clist)); if (adjustment) cm_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - + if (clist->hadjustment == adjustment) return; - + old_adjustment = clist->hadjustment; if (clist->hadjustment) @@ -1228,7 +1226,7 @@ gtk_cmclist_set_vadjustment (GtkCMCList *clist, if (clist->vadjustment == adjustment) return; - + old_adjustment = clist->vadjustment; if (clist->vadjustment) @@ -1361,7 +1359,7 @@ gtk_cmclist_column_titles_show (GtkCMCList *clist) } } -void +void gtk_cmclist_column_titles_hide (GtkCMCList *clist) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); @@ -1669,7 +1667,7 @@ gtk_cmclist_set_column_visibility (GtkCMCList *clist, else gtk_widget_hide (clist->column[column].button); } - + gtk_widget_queue_resize (GTK_WIDGET(clist)); } @@ -1832,7 +1830,7 @@ gtk_cmclist_set_column_max_width (GtkCMCList *clist, clist->column[column].max_width = clist->column[column].min_width; else clist->column[column].max_width = max_width; - + if (clist->column[column].area.width > clist->column[column].max_width) gtk_cmclist_set_column_width (clist, column,clist->column[column].max_width); } @@ -1910,7 +1908,7 @@ real_resize_column (GtkCMCList *clist, if (column < 0 || column >= clist->columns) return; - + if (width < MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width)) width = MAX (COLUMN_MIN_WIDTH, clist->column[column].min_width); if (clist->column[column].max_width >= 0 && @@ -2000,7 +1998,7 @@ size_allocate_title_buttons (GtkCMCList *clist) { gdk_window_show (clist->column[last_button].window); gdk_window_move_resize (clist->column[last_button].window, - button_allocation.x - (DRAG_WIDTH / 2), + button_allocation.x - (DRAG_WIDTH / 2), 0, DRAG_WIDTH, clist->column_title_area.height); } @@ -2021,7 +2019,7 @@ size_allocate_title_buttons (GtkCMCList *clist) gdk_window_show (clist->column[last_button].window); gdk_window_move_resize (clist->column[last_button].window, - button_allocation.x - (DRAG_WIDTH / 2), + button_allocation.x - (DRAG_WIDTH / 2), 0, DRAG_WIDTH, clist->column_title_area.height); } else @@ -2082,7 +2080,7 @@ size_allocate_columns (GtkCMCList *clist, } static gint -list_requisition_width (GtkCMCList *clist) +list_requisition_width (GtkCMCList *clist) { GtkRequisition requisition; gint width = CELL_SPACING; @@ -2144,7 +2142,7 @@ new_column_width (GtkCMCList *clist, width = clist->column[column].max_width; cx = dx + clist->column[column].max_width; *x = cx + xthickness; - } + } if (cx < 0 || cx > clist->clist_window_width) *x = -1; @@ -2199,12 +2197,12 @@ column_button_clicked (GtkWidget *widget, } static gint -column_title_passive_func (GtkWidget *widget, +column_title_passive_func (GtkWidget *widget, GdkEvent *event, gpointer data) { cm_return_val_if_fail (event != NULL, FALSE); - + switch (event->type) { case GDK_MOTION_NOTIFY: @@ -2232,7 +2230,7 @@ column_title_passive_func (GtkWidget *widget, * gtk_cmclist_get_pixtext * gtk_cmclist_set_shift */ -GtkCMCellType +GtkCMCellType gtk_cmclist_get_cell_type (GtkCMCList *clist, gint row, gint column) @@ -2322,9 +2320,9 @@ gtk_cmclist_set_pixbuf (GtkCMCList *clist, return; clist_row = ROW_ELEMENT (clist, row)->data; - + g_object_ref (pixbuf); - + GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents (clist, clist_row, column, GTK_CMCELL_PIXBUF, NULL, 0, pixbuf); @@ -2382,7 +2380,7 @@ gtk_cmclist_set_pixtext (GtkCMCList *clist, return; clist_row = ROW_ELEMENT (clist, row)->data; - + g_object_ref (pixbuf); GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents (clist, clist_row, column, GTK_CMCELL_PIXTEXT, text, spacing, pixbuf); @@ -2476,7 +2474,7 @@ set_cell_contents (GtkCMCList *clist, GtkRequisition requisition; gchar *old_text = NULL; GdkPixbuf *old_pixbuf = NULL; - + cm_return_if_fail (GTK_IS_CMCLIST (clist)); cm_return_if_fail (clist_row != NULL); @@ -2557,7 +2555,7 @@ _gtk_cmclist_create_cell_layout (GtkCMCList *cli GtkStyle *style; GtkCMCell *cell; gchar *text; - + get_cell_style (clist, clist_row, GTK_STATE_NORMAL, column, &style); @@ -2572,15 +2570,15 @@ _gtk_cmclist_create_cell_layout (GtkCMCList *cli if (!text) return NULL; - + layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist), ((cell->type == GTK_CMCELL_PIXTEXT) ? GTK_CMCELL_PIXTEXT (*cell)->text : GTK_CMCELL_TEXT (*cell)->text)); pango_layout_set_font_description (layout, style->font_desc); - + return layout; - + default: return NULL; } @@ -2604,10 +2602,10 @@ cell_size_request (GtkCMCList *clist, if (layout) { pango_layout_get_pixel_extents (layout, NULL, &logical_rect); - + requisition->width = logical_rect.width; requisition->height = logical_rect.height; - + g_object_unref (G_OBJECT (layout)); } else @@ -2625,7 +2623,7 @@ cell_size_request (GtkCMCList *clist, width = gdk_pixbuf_get_width(GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf); height = gdk_pixbuf_get_height(GTK_CMCELL_PIXTEXT (clist_row->cell[column])->pixbuf); requisition->width += width; - requisition->height = MAX (requisition->height, height); + requisition->height = MAX (requisition->height, height); break; case GTK_CMCELL_PIXBUF: width = gdk_pixbuf_get_width(GTK_CMCELL_PIXBUF (clist_row->cell[column])->pixbuf); @@ -2633,7 +2631,7 @@ cell_size_request (GtkCMCList *clist, requisition->width += width; requisition->height = MAX (requisition->height, height); break; - + default: break; } @@ -2694,7 +2692,7 @@ void gtk_cmclist_clear (GtkCMCList *clist) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + GTK_CMCLIST_GET_CLASS (clist)->clear (clist); } @@ -2738,10 +2736,10 @@ real_insert_row (GtkCMCList *clist, if (GTK_CMCLIST_AUTO_SORT(clist)) /* override insertion pos */ { GList *work; - + row = 0; work = clist->row_list; - + if (clist->sort_type == GTK_SORT_ASCENDING) { while (row < clist->rows && @@ -2763,7 +2761,7 @@ real_insert_row (GtkCMCList *clist, } } } - + /* reset the row end pointer if we're inserting at the end of the list */ if (row == clist->rows) clist->row_list_end = (g_list_append (clist->row_list_end, @@ -2975,7 +2973,7 @@ real_row_move (GtkCMCList *clist, last >= GPOINTER_TO_INT (list->data)) list->data = GINT_TO_POINTER (GPOINTER_TO_INT (list->data) + d); } - + if (clist->focus_row == source_row) clist->focus_row = dest_row; else if (clist->focus_row > first) @@ -3025,7 +3023,7 @@ gtk_cmclist_moveto (GtkCMCList *clist, if (x < 0) gtk_adjustment_set_value (clist->hadjustment, 0.0); else if (x > LIST_WIDTH (clist) - clist->clist_window_width) - gtk_adjustment_set_value + gtk_adjustment_set_value (clist->hadjustment, LIST_WIDTH (clist) - clist->clist_window_width); else gtk_adjustment_set_value (clist->hadjustment, x); @@ -3107,7 +3105,7 @@ gtk_cmclist_set_row_data_full (GtkCMCList *cli if (clist_row->destroy) clist_row->destroy (clist_row->data); - + clist_row->data = data; clist_row->destroy = destroy; } @@ -3143,9 +3141,9 @@ gtk_cmclist_find_row_from_data (GtkCMCList *clist, return -1; } -void +void gtk_cmclist_swap_rows (GtkCMCList *clist, - gint row1, + gint row1, gint row2) { gint first, last; @@ -3163,7 +3161,7 @@ gtk_cmclist_swap_rows (GtkCMCList *clist, gtk_cmclist_row_move (clist, last, first); gtk_cmclist_row_move (clist, first + 1, last); - + gtk_cmclist_thaw (clist); } @@ -3348,7 +3346,7 @@ gtk_cmclist_set_cell_style (GtkCMCList *clist, if (clist_row->cell[column].style) { g_object_ref (clist_row->cell[column].style); - + if (gtk_widget_get_realized (GTK_WIDGET(clist))) clist_row->cell[column].style = gtk_style_attach (clist_row->cell[column].style, @@ -3427,7 +3425,7 @@ gtk_cmclist_set_row_style (GtkCMCList *clist, if (clist_row->style) { g_object_ref (clist_row->style); - + if (gtk_widget_get_realized (GTK_WIDGET(clist))) clist_row->style = gtk_style_attach (clist_row->style, clist->clist_window); @@ -3502,7 +3500,7 @@ gtk_cmclist_set_selectable (GtkCMCList *clist, } g_signal_emit (G_OBJECT (clist), clist_signals[UNSELECT_ROW], 0, row, -1, NULL); - } + } } gboolean @@ -3646,12 +3644,12 @@ fake_toggle_row (GtkCMCList *clist, if (!work || !GTK_CMCLIST_ROW (work)->selectable) return; - + if (GTK_CMCLIST_ROW (work)->state == GTK_STATE_NORMAL) clist->anchor_state = GTK_CMCLIST_ROW (work)->state = GTK_STATE_SELECTED; else clist->anchor_state = GTK_CMCLIST_ROW (work)->state = GTK_STATE_NORMAL; - + if (CLIST_UNFROZEN (clist) && gtk_cmclist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) GTK_CMCLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, @@ -3689,7 +3687,7 @@ toggle_focus_row (GtkCMCList *clist) clist->anchor = clist->focus_row; clist->drag_pos = clist->focus_row; clist->undo_anchor = clist->focus_row; - + if (GTK_CMCLIST_ADD_MODE(clist)) fake_toggle_row (clist, clist->focus_row); else @@ -3707,7 +3705,7 @@ toggle_add_mode (GtkCMCList *clist) { cm_return_if_fail (clist != 0); cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + if (clist_has_grab (clist) || clist->selection_mode != GTK_SELECTION_MULTIPLE) return; @@ -3763,7 +3761,7 @@ real_select_row (GtkCMCList *clist, if (row_selected) return; - + default: break; } @@ -3781,9 +3779,9 @@ real_select_row (GtkCMCList *clist, clist->selection_end = clist->selection; } else - clist->selection_end = + clist->selection_end = g_list_append (clist->selection_end, GINT_TO_POINTER (row))->next; - + if (CLIST_UNFROZEN (clist) && (gtk_cmclist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)) GTK_CMCLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); @@ -3808,13 +3806,13 @@ real_unselect_row (GtkCMCList *clist, { clist_row->state = GTK_STATE_NORMAL; - if (clist->selection_end && + if (clist->selection_end && clist->selection_end->data == GINT_TO_POINTER (row)) clist->selection_end = clist->selection_end->prev; clist->selection = g_list_remove (clist->selection, GINT_TO_POINTER (row)); - + if (CLIST_UNFROZEN (clist) && (gtk_cmclist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE)) GTK_CMCLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, clist_row); @@ -3840,7 +3838,7 @@ real_select_all (GtkCMCList *clist) g_list_free (clist->undo_unselection); clist->undo_selection = NULL; clist->undo_unselection = NULL; - + if (clist->rows && ((GtkCMCListRow *) (clist->row_list->data))->state != GTK_STATE_SELECTED) @@ -3863,7 +3861,7 @@ real_unselect_all (GtkCMCList *clist) { GList *list; gint i; - + cm_return_if_fail (GTK_IS_CMCLIST (clist)); if (clist_has_grab (clist)) @@ -3918,12 +3916,12 @@ fake_unselect_all (GtkCMCList *clist, GTK_CMCLIST_ROW (work)->selectable) { GTK_CMCLIST_ROW (work)->state = GTK_STATE_SELECTED; - + if (CLIST_UNFROZEN (clist) && gtk_cmclist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) GTK_CMCLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, GTK_CMCLIST_ROW (work)); - } + } } clist->undo_selection = clist->selection; @@ -3982,9 +3980,9 @@ real_undo_selection (GtkCMCList *clist) } else clist->focus_row = clist->undo_anchor; - + clist->undo_anchor = -1; - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -4004,7 +4002,7 @@ set_anchor (GtkCMCList *clist, gint undo_anchor) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor >= 0) return; @@ -4072,7 +4070,7 @@ resync_selection (GtkCMCList *clist, } } } - } + } if (clist->anchor < clist->drag_pos) { @@ -4130,7 +4128,7 @@ resync_selection (GtkCMCList *clist, } } } - + clist->undo_unselection = g_list_reverse (clist->undo_unselection); for (list = clist->undo_unselection; list; list = list->next) g_signal_emit (G_OBJECT (clist), clist_signals[SELECT_ROW], 0, @@ -4363,7 +4361,7 @@ sync_selection (GtkCMCList *clist, d = 1; else d = -1; - + if (clist->focus_row >= row) { if (d > 0 || clist->focus_row > row) @@ -4505,7 +4503,7 @@ gtk_cmclist_realize (GtkWidget *widget) gtk_widget_set_realized (widget, TRUE); gtk_widget_get_allocation (widget, &allocation); - + attributes.window_type = GDK_WINDOW_CHILD; attributes.x = allocation.x; attributes.y = allocation.y; @@ -4535,7 +4533,7 @@ gtk_cmclist_realize (GtkWidget *widget) attributes.y = clist->column_title_area.y; attributes.width = clist->column_title_area.width; attributes.height = clist->column_title_area.height; - + clist->title_window = gdk_window_new (window, &attributes, attributes_mask); gtk_widget_register_window (widget, clist->title_window); @@ -4565,7 +4563,7 @@ gtk_cmclist_realize (GtkWidget *widget) GDK_KEY_RELEASE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK; - + clist->clist_window = gdk_window_new (window, &attributes, attributes_mask); gtk_widget_register_window (widget, clist->clist_window); @@ -4709,7 +4707,7 @@ gtk_cmclist_map (GtkWidget *widget) !gtk_widget_get_mapped (clist->column[i].button)) gtk_widget_map (clist->column[i].button); } - + for (i = 0; i < clist->columns; i++) if (clist->column[i].window && clist->column[i].button) { @@ -5027,7 +5025,7 @@ gtk_cmclist_button_press (GtkWidget *widget, row, column, event); break; } - + if (event->state & GDK_CONTROL_MASK) { if (event->state & GDK_SHIFT_MASK) @@ -5197,7 +5195,7 @@ gtk_cmclist_button_release (GtkWidget *widget, return TRUE; } - + return FALSE; } @@ -5228,7 +5226,7 @@ gtk_cmclist_motion (GtkWidget *widget, gtk_widget_get_pointer (widget, &x, NULL); else x = event->x; - + new_width = new_column_width (clist, clist->drag_pos, &x); if (x != clist->x_drag) { @@ -5288,7 +5286,7 @@ gtk_cmclist_motion (GtkWidget *widget, y >= (ROW_TOP_YPIXEL (clist, clist->click_cell.row) + clist->row_height) || x < COLUMN_LEFT_XPIXEL (clist, clist->click_cell.column) || - x >= (COLUMN_LEFT_XPIXEL(clist, clist->click_cell.column) + + x >= (COLUMN_LEFT_XPIXEL(clist, clist->click_cell.column) + clist->column[clist->click_cell.column].area.width))) { GtkTargetList *target_list; @@ -5373,7 +5371,7 @@ gtk_cmclist_motion (GtkWidget *widget, break; } } - + if (ROW_TOP_YPIXEL(clist, row) < 0) move_vertical (clist, row, 0); else if (ROW_TOP_YPIXEL(clist, row) + clist->row_height > @@ -5431,7 +5429,7 @@ gtk_cmclist_size_request (GtkWidget *widget, if (clist->column[i].button) { GtkRequisition child_requisition; - + gtk_widget_get_preferred_size(clist->column[i].button, &child_requisition, NULL); clist->column_title_area.height = @@ -5488,22 +5486,22 @@ gtk_cmclist_size_allocate (GtkWidget *widget, border_width * 2); clist->internal_allocation.height = MAX (1, (gint)allocation->height - border_width * 2); - + /* allocate clist window assuming no scrollbars */ clist_allocation.x = (clist->internal_allocation.x + style->xthickness); clist_allocation.y = (clist->internal_allocation.y + style->ythickness + clist->column_title_area.height); - clist_allocation.width = MAX (1, (gint)clist->internal_allocation.width - + clist_allocation.width = MAX (1, (gint)clist->internal_allocation.width - (2 * (gint)style->xthickness)); clist_allocation.height = MAX (1, (gint)clist->internal_allocation.height - (2 * (gint)style->ythickness) - (gint)clist->column_title_area.height); - + clist->clist_window_width = clist_allocation.width; clist->clist_window_height = clist_allocation.height; - + if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (clist->clist_window, @@ -5512,12 +5510,12 @@ gtk_cmclist_size_allocate (GtkWidget *widget, clist_allocation.width, clist_allocation.height); } - + /* position the window which holds the column title buttons */ clist->column_title_area.x = style->xthickness; clist->column_title_area.y = style->ythickness; clist->column_title_area.width = clist_allocation.width; - + if (gtk_widget_get_realized (widget)) { gdk_window_move_resize (clist->title_window, @@ -5526,7 +5524,7 @@ gtk_cmclist_size_allocate (GtkWidget *widget, clist->column_title_area.width, clist->column_title_area.height); } - + /* column button allocation */ size_allocate_columns (clist, FALSE); size_allocate_title_buttons (clist); @@ -5553,7 +5551,7 @@ gtk_cmclist_forall (GtkContainer *container, return; clist = GTK_CMCLIST (container); - + /* callback for the column buttons */ for (i = 0; i < clist->columns; i++) if (clist->column[i].button) @@ -5639,7 +5637,7 @@ draw_cell_pixbuf (GdkWindow *window, static void cairo_dash_from_add_mode(GtkCMCList *clist, cairo_t *cr) { const double dashes[] = { 4.0, 4.0 }; - if (GTK_CMCLIST_ADD_MODE(clist)) + if (GTK_CMCLIST_ADD_MODE(clist)) cairo_set_dash(cr, dashes, 2, 0); else cairo_set_dash(cr, NULL, 0, 0); @@ -5695,7 +5693,7 @@ draw_row (GtkCMCList *clist, cell_rectangle.height = CELL_SPACING; /* rectangle used to clip drawing operations, its y and height - * positions only need to be set once, so we set them once here. + * positions only need to be set once, so we set them once here. * the x and width are set withing the drawing loop below once per * column */ clip_rectangle.y = row_rectangle.y; @@ -5746,9 +5744,9 @@ draw_row (GtkCMCList *clist, gdk_cairo_rectangle(cr, &cell_rectangle); gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]); cairo_fill(cr); - } + } } - + for (last_column = clist->columns - 1; last_column >= 0 && !clist->column[last_column].visible; last_column--) ; @@ -5777,7 +5775,7 @@ draw_row (GtkCMCList *clist, clip_rectangle.x -= COLUMN_INSET + CELL_SPACING; clip_rectangle.width += (2 * COLUMN_INSET + CELL_SPACING + (i == last_column) * CELL_SPACING); - + if (area && !gdk_rectangle_intersect (area, &clip_rectangle, &intersect_rectangle)) continue; @@ -5792,7 +5790,7 @@ draw_row (GtkCMCList *clist, /* calculate real width for column justification */ - + layout = _gtk_cmclist_create_cell_layout (clist, clist_row, i); if (layout) { @@ -5966,7 +5964,7 @@ draw_rows (GtkCMCList *clist, } } -static void +static void draw_xor_line (GtkCMCList *clist) { cairo_t *cr; @@ -5985,9 +5983,9 @@ static void clist_refresh (GtkCMCList *clist) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + if (CLIST_UNFROZEN (clist)) - { + { adjust_adjustments (clist, FALSE); draw_rows (clist, NULL); } @@ -6008,7 +6006,7 @@ get_selection_info (GtkCMCList *clist, cm_return_val_if_fail (GTK_IS_CMCLIST (clist), 0); - /* bounds checking, return false if the user clicked + /* bounds checking, return false if the user clicked * on a blank area */ trow = ROW_FROM_YPIXEL (clist, y); if (trow >= clist->rows) @@ -6028,10 +6026,10 @@ get_selection_info (GtkCMCList *clist, } gint -gtk_cmclist_get_selection_info (GtkCMCList *clist, - gint x, - gint y, - gint *row, +gtk_cmclist_get_selection_info (GtkCMCList *clist, + gint x, + gint y, + gint *row, gint *column) { cm_return_val_if_fail (GTK_IS_CMCLIST (clist), 0); @@ -6043,7 +6041,7 @@ gtk_cmclist_get_selection_info (GtkCMCList *clist, * vadjustment_changed * hadjustment_changed * vadjustment_value_changed - * hadjustment_value_changed + * hadjustment_value_changed * check_exposures */ static void @@ -6138,7 +6136,7 @@ vadjustment_value_changed (GtkAdjustment *adjustment, { gdk_window_scroll (clist->clist_window, 0, dy); } - + return; } @@ -6162,14 +6160,14 @@ adjust_allocation_recurse (GtkWidget *widget, ScrollData *scroll_data = data; gtk_widget_get_allocation (widget, &allocation); - + if (!gtk_widget_get_realized (widget)) { if (gtk_widget_get_visible (widget)) { GdkRectangle tmp_rectangle = allocation; tmp_rectangle.x += scroll_data->dx; - + gtk_widget_size_allocate (widget, &tmp_rectangle); } } @@ -6198,9 +6196,9 @@ adjust_allocation (GtkWidget *widget, scroll_data.window = ALLOCATION_WINDOW (widget); else scroll_data.window = NULL; - + scroll_data.dx = dx; - + adjust_allocation_recurse (widget, &scroll_data); } @@ -6246,10 +6244,10 @@ hadjustment_value_changed (GtkAdjustment *adjustment, if (gtk_widget_is_drawable (GTK_WIDGET(clist))) { GtkWidget *focus_child = gtk_container_get_focus_child (container); - + gdk_window_scroll (clist->clist_window, dx, 0); - if (gtk_widget_get_can_focus(GTK_WIDGET(clist)) && + if (gtk_widget_get_can_focus(GTK_WIDGET(clist)) && gtk_widget_has_focus(GTK_WIDGET(clist)) && !focus_child && GTK_CMCLIST_ADD_MODE(clist)) { @@ -6259,19 +6257,19 @@ hadjustment_value_changed (GtkAdjustment *adjustment, cairo_stroke(cr); } - if (gtk_widget_get_can_focus(GTK_WIDGET(clist)) && + if (gtk_widget_get_can_focus(GTK_WIDGET(clist)) && gtk_widget_has_focus(GTK_WIDGET(clist)) && !focus_child) { if (GTK_CMCLIST_ADD_MODE(clist)) { gint focus_row; - + focus_row = clist->focus_row; clist->focus_row = -1; draw_rows (clist, NULL); clist->focus_row = focus_row; - + cairo_rectangle(cr, 0, y, clist->clist_window_width + 1, clist->row_height); cairo_stroke(cr); @@ -6282,7 +6280,7 @@ hadjustment_value_changed (GtkAdjustment *adjustment, cairo_destroy(cr); } -/* PRIVATE +/* PRIVATE * Memory Allocation/Distruction Routines for GtkCMCList stuctures * * functions: @@ -6340,7 +6338,7 @@ columns_delete (GtkCMCList *clist) for (i = 0; i < clist->columns; i++) g_free (clist->column[i].title); - + g_free (clist->column); } @@ -6418,7 +6416,7 @@ gtk_cmclist_focus_content_area (GtkCMCList *clist) if (clist->focus_row < 0) { clist->focus_row = 0; - + if ((clist->selection_mode == GTK_SELECTION_BROWSE || clist->selection_mode == GTK_SELECTION_MULTIPLE) && !clist->selection) @@ -6441,13 +6439,13 @@ gtk_cmclist_focus (GtkWidget *widget, return FALSE; focus_child = gtk_container_get_focus_child (GTK_CONTAINER (widget)); - + is_current_focus = gtk_widget_is_focus (GTK_WIDGET (clist)); - + if (focus_child && gtk_widget_child_focus (focus_child, direction)) return TRUE; - + switch (direction) { case GTK_DIR_LEFT: @@ -6470,7 +6468,7 @@ gtk_cmclist_focus (GtkWidget *widget, if (title_focus_in (clist, direction)) return TRUE; } - + if (!is_current_focus && clist->rows) { gtk_cmclist_focus_content_area (clist); @@ -6484,7 +6482,7 @@ gtk_cmclist_focus (GtkWidget *widget, if (title_focus_in (clist, direction)) return TRUE; } - + if (!is_current_focus && !focus_child && clist->rows) { gtk_cmclist_focus_content_area (clist); @@ -6508,7 +6506,7 @@ gtk_cmclist_set_focus_child (GtkContainer *container, for (i = 0; i < clist->columns; i++) if (clist->column[i].button == child) clist->focus_header_column = i; - + if (GTK_CONTAINER_CLASS (gtk_cmclist_parent_class)->set_focus_child) (*GTK_CONTAINER_CLASS (gtk_cmclist_parent_class)->set_focus_child) (container, child); } @@ -6609,7 +6607,7 @@ gtk_cmclist_focus_out (GtkWidget *widget, GtkCMCList *clist = GTK_CMCLIST (widget); gtk_cmclist_undraw_focus (widget); - + GTK_CMCLIST_GET_CLASS (widget)->resync_selection (clist, (GdkEvent *) event); return FALSE; @@ -6619,7 +6617,7 @@ static gboolean focus_column (GtkCMCList *clist, gint column, gint dir) { GtkWidget *child = clist->column[column].button; - + if (gtk_widget_child_focus (child, dir)) { return TRUE; @@ -6649,10 +6647,10 @@ title_focus_in (GtkCMCList *clist, gint dir) if (clist->focus_header_column != -1) { i = clist->focus_header_column; - + left = COLUMN_LEFT_XPIXEL (clist, i); right = left + clist->column[i].area.width; - + if (left >= 0 && right <= clist->clist_window_width) { if (focus_column (clist, i, dir)) @@ -6665,7 +6663,7 @@ title_focus_in (GtkCMCList *clist, gint dir) { left = COLUMN_LEFT_XPIXEL (clist, i); right = left + clist->column[i].area.width; - + if (left >= 0 && right <= clist->clist_window_width) { if (focus_column (clist, i, dir)) @@ -6686,7 +6684,7 @@ title_focus_in (GtkCMCList *clist, gint dir) return TRUE; } } - + return FALSE; } @@ -6720,13 +6718,13 @@ title_focus_move (GtkCMCList *clist, d = -1; break; } - + for (i = 0; i < clist->columns; i++) if (clist->column[i].button == focus_child) break; - + g_assert (i != -1); /* Have a starting column */ - + j = i + d; while (!return_val && j >= 0 && j < clist->columns) { @@ -6773,7 +6771,7 @@ title_focus_move (GtkCMCList *clist, clist->clist_window_width) { gint last_column; - + for (last_column = clist->columns - 1; last_column >= 0 && !clist->column[last_column].visible; last_column--); @@ -6836,7 +6834,7 @@ move_focus_row (GtkCMCList *clist, gtk_cmclist_undraw_focus (widget); clist->focus_row = MAX (0, clist->focus_row - (2 * clist->clist_window_height - - clist->row_height - CELL_SPACING) / + clist->row_height - CELL_SPACING) / (2 * (clist->row_height + CELL_SPACING))); gtk_cmclist_draw_focus (widget); break; @@ -6845,9 +6843,9 @@ move_focus_row (GtkCMCList *clist, if (clist->focus_row >= clist->rows - 1) return; gtk_cmclist_undraw_focus (widget); - clist->focus_row = MIN (clist->rows - 1, clist->focus_row + + clist->focus_row = MIN (clist->rows - 1, clist->focus_row + (2 * clist->clist_window_height - - clist->row_height - CELL_SPACING) / + clist->row_height - CELL_SPACING) / (2 * (clist->row_height + CELL_SPACING))); gtk_cmclist_draw_focus (widget); break; @@ -7025,7 +7023,7 @@ scroll_vertical (GtkCMCList *clist, default: break; } - /* fallback is intentional */ + /* fallback is intentional */ default: if (old_focus_row != clist->focus_row && !(clist->selection_mode == GTK_SELECTION_MULTIPLE && @@ -7119,11 +7117,11 @@ static void remove_grab (GtkCMCList *clist) { GtkWidget *widget = GTK_WIDGET (clist); - + if (gtk_widget_has_grab (widget)) { GdkDisplay *display = gtk_widget_get_display (widget); - + gtk_grab_remove (widget); if (gtkut_pointer_is_grabbed (widget)) gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME); @@ -7166,12 +7164,12 @@ gtk_cmclist_set_compare_func (GtkCMCList *c clist->compare = (cmp_func) ? cmp_func : default_compare; } -void +void gtk_cmclist_set_auto_sort (GtkCMCList *clist, gboolean auto_sort) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + if (GTK_CMCLIST_AUTO_SORT(clist) && !auto_sort) GTK_CMCLIST_UNSET_FLAG (clist, CMCLIST_AUTO_SORT); else if (!GTK_CMCLIST_AUTO_SORT(clist) && auto_sort) @@ -7181,12 +7179,12 @@ gtk_cmclist_set_auto_sort (GtkCMCList *clist, } } -void +void gtk_cmclist_set_sort_type (GtkCMCList *clist, GtkSortType sort_type) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + clist->sort_type = sort_type; } @@ -7230,7 +7228,7 @@ default_compare (GtkCMCList *clist, default: break; } - + switch (row2->cell[clist->sort_column].type) { case GTK_CMCELL_TEXT: @@ -7277,7 +7275,7 @@ real_sort_list (GtkCMCList *clist) clist->undo_selection = NULL; clist->undo_unselection = NULL; } - + clist->row_list = gtk_cmclist_mergesort (clist, clist->row_list, clist->rows); work = clist->selection; @@ -7289,7 +7287,7 @@ real_sort_list (GtkCMCList *clist) work->data = GINT_TO_POINTER (i); work = work->next; } - + if (i == clist->rows - 1) clist->row_list_end = list; } @@ -7432,7 +7430,7 @@ drag_dest_cell (GtkCMCList *clist, } if (dest_info->cell.row < -1) dest_info->cell.row = -1; - + x -= border_width + style->xthickness; dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x); @@ -7443,7 +7441,7 @@ drag_dest_cell (GtkCMCList *clist, gint h = 0; y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row); - + if (GTK_CMCLIST_DRAW_DRAG_RECT(clist)) { dest_info->insert_pos = GTK_CMCLIST_DRAG_INTO; @@ -7544,7 +7542,7 @@ gtk_cmclist_drag_leave (GtkWidget *widget, clist = GTK_CMCLIST (widget); dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest"); - + if (dest_info) { if (dest_info->cell.row >= 0 && @@ -7616,7 +7614,7 @@ gtk_cmclist_drag_motion (GtkWidget *widget, } return TRUE; } - + if (new_info.cell.row != dest_info->cell.row || (new_info.cell.row == dest_info->cell.row && dest_info->insert_pos != new_info.insert_pos)) @@ -7625,7 +7623,7 @@ gtk_cmclist_drag_motion (GtkWidget *widget, dest_info->insert_pos = new_info.insert_pos; dest_info->cell.row = new_info.cell.row; dest_info->cell.column = new_info.cell.column; - + clist->drag_highlight_row = dest_info->cell.row; clist->drag_highlight_pos = dest_info->insert_pos; @@ -7709,7 +7707,7 @@ gtk_cmclist_drag_data_received (GtkWidget *widg } } -static void +static void gtk_cmclist_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, @@ -7743,7 +7741,7 @@ gtk_cmclist_drag_data_get (GtkWidget *widget, } void -gtk_cmclist_set_reorderable (GtkCMCList *clist, +gtk_cmclist_set_reorderable (GtkCMCList *clist, gboolean reorderable) { GtkWidget *widget; @@ -7787,10 +7785,10 @@ gtk_cmclist_set_button_actions (GtkCMCList *clist, guint8 button_actions) { cm_return_if_fail (GTK_IS_CMCLIST (clist)); - + if (button < MAX_BUTTON) { - if (gtkut_pointer_is_grabbed (GTK_WIDGET(clist)) || + if (gtkut_pointer_is_grabbed (GTK_WIDGET(clist)) || gtk_widget_has_grab (GTK_WIDGET(clist))) { remove_grab (clist); blob - 78e3ddab6316de6010317d7695717f61303f4ca4 blob + 90fa1cfcc5129d889893201df64bf8fd6aaeb89f --- src/gtk/gtkcmctree.c +++ src/gtk/gtkcmctree.c @@ -1,6 +1,6 @@ /* GTK - The GIMP Toolkit - * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, - * Copyright (C) 1997-1998 Jay Painter + * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald, + * Copyright (C) 1997-1998 Jay Painter * * GtkCMCTree widget for GTK+ * Copyright (C) 1998 Lars Hamann and Stefan Jeske @@ -25,10 +25,9 @@ * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include #include #include @@ -176,7 +175,7 @@ static void ctree_attach_styles (GtkCMCTree GtkCMCTreeNode *node, gpointer data); static void ctree_detach_styles (GtkCMCTree *ctree, - GtkCMCTreeNode *node, + GtkCMCTreeNode *node, gpointer data); static void set_cell_contents (GtkCMCList *clist, GtkCMCListRow *clist_row, @@ -196,32 +195,32 @@ static void set_node_info (GtkCMCTree static GtkCMCTreeRow *row_new (GtkCMCTree *ctree); static void row_delete (GtkCMCTree *ctree, GtkCMCTreeRow *ctree_row); -static void tree_delete (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_delete (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); -static void tree_delete_row (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_delete_row (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); static void real_clear (GtkCMCList *clist); -static void tree_update_level (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_update_level (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); -static void tree_select (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_select (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); -static void tree_unselect (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_unselect (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); static void real_select_all (GtkCMCList *clist); static void real_unselect_all (GtkCMCList *clist); -static void tree_expand (GtkCMCTree *ctree, +static void tree_expand (GtkCMCTree *ctree, GtkCMCTreeNode *node, gpointer data); -static void tree_collapse (GtkCMCTree *ctree, +static void tree_collapse (GtkCMCTree *ctree, GtkCMCTreeNode *node, gpointer data); -static void tree_collapse_to_depth (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void tree_collapse_to_depth (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gint depth); static void tree_toggle_expansion (GtkCMCTree *ctree, GtkCMCTreeNode *node, @@ -248,7 +247,7 @@ static void real_tree_collapse (GtkCMCTree GtkCMCTreeNode *node); static void real_tree_move (GtkCMCTree *ctree, GtkCMCTreeNode *node, - GtkCMCTreeNode *new_parent, + GtkCMCTreeNode *new_parent, GtkCMCTreeNode *new_sibling); static void real_row_move (GtkCMCList *clist, gint source_row, @@ -258,15 +257,15 @@ static void gtk_cmctree_link (GtkCMCTree GtkCMCTreeNode *parent, GtkCMCTreeNode *sibling, gboolean update_focus_row); -static void gtk_cmctree_unlink (GtkCMCTree *ctree, +static void gtk_cmctree_unlink (GtkCMCTree *ctree, GtkCMCTreeNode *node, gboolean update_focus_row); static GtkCMCTreeNode * gtk_cmctree_last_visible (GtkCMCTree *ctree, GtkCMCTreeNode *node); -static gboolean ctree_is_hot_spot (GtkCMCTree *ctree, +static gboolean ctree_is_hot_spot (GtkCMCTree *ctree, GtkCMCTreeNode *node, - gint row, - gint x, + gint row, + gint x, gint y); static void tree_sort (GtkCMCTree *ctree, GtkCMCTreeNode *node, @@ -279,8 +278,8 @@ static GList * selection_find (GtkCMCList static void resync_selection (GtkCMCList *clist, GdkEvent *event); static void real_undo_selection (GtkCMCList *clist); -static void select_row_recursive (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +static void select_row_recursive (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data); static gint real_insert_row (GtkCMCList *clist, gint row, @@ -521,7 +520,7 @@ static gboolean filter_fg (PangoAttribute *attribute, if (klass->type == PANGO_ATTR_FOREGROUND) return TRUE; - return FALSE; + return FALSE; } static PangoLayout * @@ -548,7 +547,7 @@ create_cell_layout (GtkCMCList *clist, if (!text) return NULL; - + if (!GTK_SCTREE(clist)->use_markup[column]) { layout = gtk_widget_create_pango_layout (GTK_WIDGET (clist), ((cell->type == GTK_CMCELL_PIXTEXT) ? @@ -569,9 +568,9 @@ create_cell_layout (GtkCMCList *clist, pango_attr_list_unref(rem); } } - + return layout; - + default: return NULL; } @@ -589,7 +588,7 @@ draw_row (GtkCMCList *clist, GtkCMCTree *ctree; GdkRectangle *crect; GdkRectangle row_rectangle; - GdkRectangle cell_rectangle; + GdkRectangle cell_rectangle; GdkRectangle clip_rectangle; GdkRectangle intersect_rectangle; gint last_column; @@ -659,7 +658,7 @@ draw_row (GtkCMCList *clist, cell_rectangle.height = CELL_SPACING; /* rectangle used to clip drawing operations, its y and height - * positions only need to be set once, so we set them once here. + * positions only need to be set once, so we set them once here. * the x and width are set withing the drawing loop below once per * column */ clip_rectangle.y = row_rectangle.y; @@ -674,7 +673,7 @@ draw_row (GtkCMCList *clist, state = clist_row->state; cr = gdk_cairo_create(clist->clist_window); - + if (clist_row->fg_set && state != GTK_STATE_SELECTED) fgcolor = &clist_row->foreground; else @@ -714,7 +713,7 @@ draw_row (GtkCMCList *clist, gdk_cairo_set_source_color(cr, &style->base[GTK_STATE_NORMAL]); cairo_fill(cr); } - } + } for (last_column = clist->columns - 1; last_column >= 0 && !clist->column[last_column].visible; last_column--) @@ -898,7 +897,7 @@ draw_row (GtkCMCList *clist, old_offset = offset; offset = draw_cell_pixbuf (clist->clist_window, &clip_rectangle, cr, GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf, - offset, + offset, clip_rectangle.y + clist_row->cell[i].vertical + (clip_rectangle.height - height) / 2, pixbuf_width, height); @@ -906,7 +905,7 @@ draw_row (GtkCMCList *clist, if (layout) { gint row_center_offset = (clist->row_height - logical_rect.height) / 2; - + if (clist->column[i].justification == GTK_JUSTIFY_RIGHT) { offset = (old_offset - string_width); @@ -918,7 +917,7 @@ draw_row (GtkCMCList *clist, if (GTK_CMCELL_PIXTEXT (clist_row->cell[i])->pixbuf) offset += GTK_CMCELL_PIXTEXT (clist_row->cell[i])->spacing; } - + cairo_move_to(cr, offset, row_rectangle.y + row_center_offset + clist_row->cell[i].vertical); gdk_cairo_set_source_color(cr, fgcolor); pango_cairo_show_layout(cr, layout); @@ -1141,7 +1140,7 @@ gtk_cmctree_class_init (GtkCMCTreeClass *klass) GDK_KEY_KP_Add, GDK_CONTROL_MASK, "change_focus_row_expansion", 1, G_TYPE_ENUM, GTK_CMCTREE_EXPANSION_EXPAND_RECURSIVE); - + gtk_binding_entry_add_signal (binding_set, GDK_KEY_minus, 0, "change_focus_row_expansion", 1, @@ -1185,7 +1184,7 @@ gtk_cmctree_class_init (GtkCMCTreeClass *klass) GDK_KEY_asterisk, GDK_CONTROL_MASK, "change_focus_row_expansion", 1, G_TYPE_ENUM, - GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE); + GTK_CMCTREE_EXPANSION_TOGGLE_RECURSIVE); } static void @@ -1434,7 +1433,7 @@ gtk_cmctree_button_press (GtkWidget *widget, return FALSE; work = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, row)); - + if (button_actions & GTK_CMBUTTON_EXPANDS && (GTK_CMCTREE_ROW (work)->children && !GTK_CMCTREE_ROW (work)->is_leaf && (event->type == GDK_2BUTTON_PRESS || @@ -1448,7 +1447,7 @@ gtk_cmctree_button_press (GtkWidget *widget, return TRUE; } } - + return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event); } @@ -1457,7 +1456,7 @@ gtk_cmctree_last_visible (GtkCMCTree *ctree, GtkCMCTreeNode *node) { GtkCMCTreeNode *work; - + if (!node) return NULL; @@ -1485,7 +1484,7 @@ gtk_cmctree_link (GtkCMCTree *ctree, GList *work; gboolean visible = FALSE; gint rows = 0; - + if (sibling) cm_return_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent); cm_return_if_fail (node != NULL); @@ -1497,7 +1496,7 @@ gtk_cmctree_link (GtkCMCTree *ctree, if (update_focus_row && clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -1540,7 +1539,7 @@ gtk_cmctree_link (GtkCMCTree *ctree, list = (GList *)GTK_CMCTREE_NODE_PREV (sibling); list->next = (GList *)node; } - + list = (GList *)node; list->prev = (GList *)GTK_CMCTREE_NODE_PREV (sibling); list_end->next = (GList *)sibling; @@ -1557,11 +1556,11 @@ gtk_cmctree_link (GtkCMCTree *ctree, while (GTK_CMCTREE_ROW (work)->sibling) work = (GList *)(GTK_CMCTREE_ROW (work)->sibling); GTK_CMCTREE_ROW (work)->sibling = node; - + /* find last visible child of sibling */ work = (GList *) gtk_cmctree_last_visible (ctree, GTK_CMCTREE_NODE (work)); - + list_end->next = work->next; if (work->next) work->next->prev = list_end; @@ -1600,7 +1599,7 @@ gtk_cmctree_link (GtkCMCTree *ctree, } } - gtk_cmctree_pre_recursive (ctree, node, tree_update_level, NULL); + gtk_cmctree_pre_recursive (ctree, node, tree_update_level, NULL); if (clist->row_list_end == NULL || clist->row_list_end->next == (GList *)node) @@ -1609,9 +1608,9 @@ gtk_cmctree_link (GtkCMCTree *ctree, if (visible && update_focus_row) { gint pos; - + pos = g_list_position (clist->row_list, (GList *)node); - + if (pos <= clist->focus_row) { clist->focus_row += rows; @@ -1621,7 +1620,7 @@ gtk_cmctree_link (GtkCMCTree *ctree, } static void -gtk_cmctree_unlink (GtkCMCTree *ctree, +gtk_cmctree_unlink (GtkCMCTree *ctree, GtkCMCTreeNode *node, gboolean update_focus_row) { @@ -1637,11 +1636,11 @@ gtk_cmctree_unlink (GtkCMCTree *ctree, cm_return_if_fail (node != NULL); clist = GTK_CMCLIST (ctree); - + if (update_focus_row && clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -1675,7 +1674,7 @@ gtk_cmctree_unlink (GtkCMCTree *ctree, if (update_focus_row) { gint pos; - + pos = g_list_position (clist->row_list, (GList *)node); if (pos + rows < clist->focus_row) clist->focus_row -= (rows + 1); @@ -1685,7 +1684,7 @@ gtk_cmctree_unlink (GtkCMCTree *ctree, clist->focus_row = MAX (pos - 1, 0); else clist->focus_row = pos; - + clist->focus_row = MIN (clist->focus_row, clist->rows - 1); } clist->undo_anchor = clist->focus_row; @@ -1766,7 +1765,7 @@ real_row_move (GtkCMCList *clist, if (source_row < dest_row) { - GtkCMCTreeNode *work; + GtkCMCTreeNode *work; dest_row++; work = GTK_CMCTREE_ROW (node)->children; @@ -1795,7 +1794,7 @@ real_row_move (GtkCMCList *clist, static void real_tree_move (GtkCMCTree *ctree, GtkCMCTreeNode *node, - GtkCMCTreeNode *new_parent, + GtkCMCTreeNode *new_parent, GtkCMCTreeNode *new_sibling) { GtkCMCList *clist; @@ -1804,7 +1803,7 @@ real_tree_move (GtkCMCTree *ctree, cm_return_if_fail (ctree != NULL); cm_return_if_fail (node != NULL); - cm_return_if_fail (!new_sibling || + cm_return_if_fail (!new_sibling || GTK_CMCTREE_ROW (new_sibling)->parent == new_parent); if (new_parent && GTK_CMCTREE_ROW (new_parent)->is_leaf) @@ -1822,7 +1821,7 @@ real_tree_move (GtkCMCTree *ctree, if (clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -1833,7 +1832,7 @@ real_tree_move (GtkCMCTree *ctree, { if (new_parent == GTK_CMCTREE_ROW (node)->parent) return; - + if (new_parent) new_sibling = GTK_CMCTREE_ROW (new_parent)->children; else @@ -1844,7 +1843,7 @@ real_tree_move (GtkCMCTree *ctree, new_sibling = GTK_CMCTREE_ROW (new_sibling)->sibling; } - if (new_parent == GTK_CMCTREE_ROW (node)->parent && + if (new_parent == GTK_CMCTREE_ROW (node)->parent && new_sibling == GTK_CMCTREE_ROW (node)->sibling) return; @@ -1853,10 +1852,10 @@ real_tree_move (GtkCMCTree *ctree, work = NULL; if (gtk_cmctree_is_viewable (ctree, node)) work = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, clist->focus_row)); - + gtk_cmctree_unlink (ctree, node, FALSE); gtk_cmctree_link (ctree, node, new_parent, new_sibling, FALSE); - + if (work) { while (work && !gtk_cmctree_is_viewable (ctree, work)) @@ -1886,10 +1885,10 @@ change_focus_row_expansion (GtkCMCTree *ctree clist = GTK_CMCLIST (ctree); - if (gtkut_pointer_is_grabbed (GTK_WIDGET (ctree)) && + if (gtkut_pointer_is_grabbed (GTK_WIDGET (ctree)) && gtk_widget_has_grab (GTK_WIDGET(ctree))) return; - + if (!(node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, clist->focus_row))) || GTK_CMCTREE_ROW (node)->is_leaf || !(GTK_CMCTREE_ROW (node)->children)) @@ -1918,7 +1917,7 @@ change_focus_row_expansion (GtkCMCTree *ctree } } -static void +static void real_tree_expand (GtkCMCTree *ctree, GtkCMCTreeNode *node) { @@ -1933,7 +1932,7 @@ real_tree_expand (GtkCMCTree *ctree, return; clist = GTK_CMCLIST (ctree); - + GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); GTK_CMCTREE_ROW (node)->expanded = TRUE; @@ -1946,13 +1945,13 @@ real_tree_expand (GtkCMCTree *ctree, (clist, >K_CMCTREE_ROW (node)->row, ctree->tree_column, &requisition); /* unref/unset closed pixbuf */ - if (GTK_CMCELL_PIXTEXT + if (GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf) { g_object_unref (GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf); - + GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = NULL; } @@ -1960,8 +1959,8 @@ real_tree_expand (GtkCMCTree *ctree, /* set/ref opened pixbuf */ if (GTK_CMCTREE_ROW (node)->pixbuf_opened) { - GTK_CMCELL_PIXTEXT - (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = g_object_ref (GTK_CMCTREE_ROW (node)->pixbuf_opened); } @@ -1974,7 +1973,7 @@ real_tree_expand (GtkCMCTree *ctree, gint tmp = 0; gint row; gint i; - + if (visible && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) { cell_width = g_new0 (gint, clist->columns); @@ -2044,7 +2043,7 @@ real_tree_expand (GtkCMCTree *ctree, requisition.width); } -static void +static void real_tree_collapse (GtkCMCTree *ctree, GtkCMCTreeNode *node) { @@ -2063,7 +2062,7 @@ real_tree_collapse (GtkCMCTree *ctree, clist = GTK_CMCLIST (ctree); GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + GTK_CMCTREE_ROW (node)->expanded = FALSE; level = GTK_CMCTREE_ROW (node)->level; @@ -2075,13 +2074,13 @@ real_tree_collapse (GtkCMCTree *ctree, (clist, >K_CMCTREE_ROW (node)->row, ctree->tree_column, &requisition); /* unref/unset opened pixbuf */ - if (GTK_CMCELL_PIXTEXT + if (GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf) { g_object_unref (GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf); - + GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = NULL; } @@ -2089,8 +2088,8 @@ real_tree_collapse (GtkCMCTree *ctree, /* set/ref closed pixbuf */ if (GTK_CMCTREE_ROW (node)->pixbuf_closed) { - GTK_CMCELL_PIXTEXT - (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = + GTK_CMCELL_PIXTEXT + (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->pixbuf = g_object_ref (GTK_CMCTREE_ROW (node)->pixbuf_closed); } @@ -2140,7 +2139,7 @@ real_tree_collapse (GtkCMCTree *ctree, /* resize tree_column if needed */ column_auto_resize (clist, >K_CMCTREE_ROW (node)->row, ctree->tree_column, requisition.width); - + } static void @@ -2231,7 +2230,7 @@ cell_size_request (GtkCMCList *clist, requisition->width = logical_rect.width; requisition->height = logical_rect.height; - + g_object_unref (G_OBJECT (layout)); } else @@ -2251,10 +2250,10 @@ cell_size_request (GtkCMCList *clist, } else width = height = 0; - + requisition->width += width; requisition->height = MAX (requisition->height, height); - + if (column == ctree->tree_column) { requisition->width += (ctree->tree_spacing + ctree->tree_indent * @@ -2335,7 +2334,7 @@ set_cell_contents (GtkCMCList *clist, case GTK_CMCELL_WIDGET: /* unimplemented */ break; - + default: break; } @@ -2391,7 +2390,7 @@ set_cell_contents (GtkCMCList *clist, default: break; } - + if (visible && clist->column[column].auto_resize && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) column_auto_resize (clist, clist_row, column, requisition.width); @@ -2401,7 +2400,7 @@ set_cell_contents (GtkCMCList *clist, g_object_unref (old_pixbuf); } -static void +static void set_node_info (GtkCMCTree *ctree, GtkCMCTreeNode *node, const gchar *text, @@ -2438,14 +2437,14 @@ set_node_info (GtkCMCTree *ctree, if (GTK_CMCTREE_ROW (node)->expanded) gtk_cmctree_node_set_pixtext (ctree, node, ctree->tree_column, text, spacing, pixbuf_opened); - else + else gtk_cmctree_node_set_pixtext (ctree, node, ctree->tree_column, text, spacing, pixbuf_closed); } static void -tree_delete (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_delete (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { tree_unselect (ctree, node, NULL); @@ -2454,8 +2453,8 @@ tree_delete (GtkCMCTree *ctree, } static void -tree_delete_row (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_delete_row (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { row_delete (ctree, GTK_CMCTREE_ROW (node)); @@ -2463,23 +2462,23 @@ tree_delete_row (GtkCMCTree *ctree, } static void -tree_update_level (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_update_level (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (!node) return; if (GTK_CMCTREE_ROW (node)->parent) - GTK_CMCTREE_ROW (node)->level = + GTK_CMCTREE_ROW (node)->level = GTK_CMCTREE_ROW (GTK_CMCTREE_ROW (node)->parent)->level + 1; else GTK_CMCTREE_ROW (node)->level = 1; } static void -tree_select (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_select (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (node && GTK_CMCTREE_ROW (node)->row.state != GTK_STATE_SELECTED && @@ -2489,8 +2488,8 @@ tree_select (GtkCMCTree *ctree, } static void -tree_unselect (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_unselect (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (node && GTK_CMCTREE_ROW (node)->row.state == GTK_STATE_SELECTED) @@ -2499,8 +2498,8 @@ tree_unselect (GtkCMCTree *ctree, } static void -tree_expand (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_expand (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (node && !GTK_CMCTREE_ROW (node)->expanded) @@ -2508,8 +2507,8 @@ tree_expand (GtkCMCTree *ctree, } static void -tree_collapse (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_collapse (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (node && GTK_CMCTREE_ROW (node)->expanded) @@ -2517,8 +2516,8 @@ tree_collapse (GtkCMCTree *ctree, } static void -tree_collapse_to_depth (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +tree_collapse_to_depth (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gint depth) { if (node && GTK_CMCTREE_ROW (node)->level == depth) @@ -2574,7 +2573,7 @@ row_new (GtkCMCTree *ctree) ctree_row->children = NULL; ctree_row->pixbuf_closed = NULL; ctree_row->pixbuf_opened = NULL; - + return ctree_row; } @@ -2640,7 +2639,7 @@ real_select_row (GtkCMCList *clist, GList *node; cm_return_if_fail (GTK_IS_CMCTREE (clist)); - + if ((node = g_list_nth (clist->row_list, row)) && GTK_CMCTREE_ROW (node)->row.selectable) g_signal_emit (G_OBJECT (clist), ctree_signals[TREE_SELECT_ROW],0, @@ -2663,11 +2662,11 @@ real_unselect_row (GtkCMCList *clist, } static void -tree_draw_node (GtkCMCTree *ctree, +tree_draw_node (GtkCMCTree *ctree, GtkCMCTreeNode *node) { GtkCMCList *clist; - + clist = GTK_CMCLIST (ctree); if (CLIST_UNFROZEN (clist) && gtk_cmctree_is_viewable (ctree, node)) @@ -2717,7 +2716,7 @@ real_tree_select (GtkCMCTree *ctree, { sel_row = list->data; list = list->next; - + if (node == sel_row) node_selected = TRUE; else @@ -2763,22 +2762,22 @@ real_tree_unselect (GtkCMCTree *ctree, clist->selection_end = clist->selection_end->prev; clist->selection = g_list_remove (clist->selection, node); - + GTK_CMCTREE_ROW (node)->row.state = GTK_STATE_NORMAL; tree_draw_node (ctree, node); } static void -select_row_recursive (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +select_row_recursive (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gpointer data) { if (!node || GTK_CMCTREE_ROW (node)->row.state == GTK_STATE_SELECTED || !GTK_CMCTREE_ROW (node)->row.selectable) return; - GTK_CMCLIST (ctree)->undo_unselection = + GTK_CMCLIST (ctree)->undo_unselection = g_list_prepend (GTK_CMCLIST (ctree)->undo_unselection, node); gtk_cmctree_select (ctree, node); } @@ -2788,7 +2787,7 @@ real_select_all (GtkCMCList *clist) { GtkCMCTree *ctree; GtkCMCTreeNode *node; - + cm_return_if_fail (GTK_IS_CMCTREE (clist)); ctree = GTK_CMCTREE (clist); @@ -2807,7 +2806,7 @@ real_select_all (GtkCMCList *clist) g_list_free (clist->undo_unselection); clist->undo_selection = NULL; clist->undo_unselection = NULL; - + clist->anchor_state = GTK_STATE_SELECTED; clist->anchor = -1; clist->drag_pos = -1; @@ -2832,9 +2831,9 @@ real_unselect_all (GtkCMCList *clist) GtkCMCTree *ctree; GtkCMCTreeNode *node; GList *list; - + cm_return_if_fail (GTK_IS_CMCTREE (clist)); - + ctree = GTK_CMCTREE (clist); switch (clist->selection_mode) @@ -2875,10 +2874,10 @@ real_unselect_all (GtkCMCList *clist) } static gboolean -ctree_is_hot_spot (GtkCMCTree *ctree, +ctree_is_hot_spot (GtkCMCTree *ctree, GtkCMCTreeNode *node, - gint row, - gint x, + gint row, + gint x, gint y) { GtkCMCTreeRow *tree_row; @@ -2906,7 +2905,7 @@ ctree_is_hot_spot (GtkCMCTree *ctree, (clist->row_height - 1) % 2); if (clist->column[ctree->tree_column].justification == GTK_JUSTIFY_RIGHT) - xl = (clist->column[ctree->tree_column].area.x + + xl = (clist->column[ctree->tree_column].area.x + clist->column[ctree->tree_column].area.width - 1 + clist->hoffset - (tree_row->level - 1) * ctree->tree_indent - hotspot_size); else @@ -2940,7 +2939,7 @@ gtk_cmctree_constructor (GType type, } GtkWidget* -gtk_cmctree_new_with_titles (gint columns, +gtk_cmctree_new_with_titles (gint columns, gint tree_column, gchar *titles[]) { @@ -2967,7 +2966,7 @@ gtk_cmctree_new_with_titles (gint columns, } GtkWidget * -gtk_cmctree_new (gint columns, +gtk_cmctree_new (gint columns, gint tree_column) { return gtk_cmctree_new_with_titles (columns, tree_column, NULL); @@ -2993,13 +2992,13 @@ real_insert_row (GtkCMCList *clist, if (GTK_CMCLIST_AUTO_SORT (clist) || !sibling) return g_list_position (clist->row_list, (GList *) node); - + return row; } -GtkCMCTreeNode * +GtkCMCTreeNode * gtk_cmctree_insert_node (GtkCMCTree *ctree, - GtkCMCTreeNode *parent, + GtkCMCTreeNode *parent, GtkCMCTreeNode *sibling, gchar *text[], guint8 spacing, @@ -3096,7 +3095,7 @@ gtk_cmctree_insert_gnode (GtkCMCTree *ctree, cm_return_val_if_fail (func != NULL, NULL); if (sibling) cm_return_val_if_fail (GTK_CMCTREE_ROW (sibling)->parent == parent, NULL); - + clist = GTK_CMCLIST (ctree); if (parent) @@ -3137,8 +3136,8 @@ gtk_cmctree_insert_gnode (GtkCMCTree *ctree, work, func, data); if (new_child) child = new_child; - } - + } + gtk_cmclist_thaw (clist); return cnode; @@ -3167,7 +3166,7 @@ gtk_cmctree_export_to_gnode (GtkCMCTree *ctre gnode = g_node_new (NULL); depth = g_node_depth (parent) + 1; - + if (!func (ctree, depth, gnode, node, data)) { g_node_destroy (gnode); @@ -3191,7 +3190,7 @@ gtk_cmctree_export_to_gnode (GtkCMCTree *ctre return gnode; } - + static void real_remove_row (GtkCMCList *clist, gint row) @@ -3207,7 +3206,7 @@ real_remove_row (GtkCMCList *clist, } void -gtk_cmctree_remove_node (GtkCMCTree *ctree, +gtk_cmctree_remove_node (GtkCMCTree *ctree, GtkCMCTreeNode *node) { GtkCMCList *clist; @@ -3256,7 +3255,7 @@ real_clear (GtkCMCList *clist) { ptr = work; work = GTK_CMCTREE_ROW (work)->sibling; - gtk_cmctree_post_recursive (ctree, ptr, GTK_CMCTREE_FUNC (tree_delete_row), + gtk_cmctree_post_recursive (ctree, ptr, GTK_CMCTREE_FUNC (tree_delete_row), NULL); } GTK_CMCLIST_UNSET_FLAG (clist, CMCLIST_AUTO_RESIZE_BLOCKED); @@ -3272,7 +3271,7 @@ real_clear (GtkCMCList *clist) void -gtk_cmctree_post_recursive (GtkCMCTree *ctree, +gtk_cmctree_post_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node, GtkCMCTreeFunc func, gpointer data) @@ -3300,7 +3299,7 @@ gtk_cmctree_post_recursive (GtkCMCTree *ctree, } void -gtk_cmctree_post_recursive_to_depth (GtkCMCTree *ctree, +gtk_cmctree_post_recursive_to_depth (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint depth, GtkCMCTreeFunc func, @@ -3338,7 +3337,7 @@ gtk_cmctree_post_recursive_to_depth (GtkCMCTree *c } void -gtk_cmctree_pre_recursive (GtkCMCTree *ctree, +gtk_cmctree_pre_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node, GtkCMCTreeFunc func, gpointer data) @@ -3366,9 +3365,9 @@ gtk_cmctree_pre_recursive (GtkCMCTree *ctree, } void -gtk_cmctree_pre_recursive_to_depth (GtkCMCTree *ctree, +gtk_cmctree_pre_recursive_to_depth (GtkCMCTree *ctree, GtkCMCTreeNode *node, - gint depth, + gint depth, GtkCMCTreeFunc func, gpointer data) { @@ -3405,9 +3404,9 @@ gtk_cmctree_pre_recursive_to_depth (GtkCMCTree *ct } gboolean -gtk_cmctree_is_viewable (GtkCMCTree *ctree, +gtk_cmctree_is_viewable (GtkCMCTree *ctree, GtkCMCTreeNode *node) -{ +{ GtkCMCTreeRow *work; cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE); @@ -3424,21 +3423,21 @@ gtk_cmctree_is_viewable (GtkCMCTree *ctree, return FALSE; } -GtkCMCTreeNode * +GtkCMCTreeNode * gtk_cmctree_last (GtkCMCTree *ctree, GtkCMCTreeNode *node) { cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL); - if (!node) + if (!node) return NULL; while (GTK_CMCTREE_ROW (node)->sibling) node = GTK_CMCTREE_ROW (node)->sibling; - + if (GTK_CMCTREE_ROW (node)->children) return gtk_cmctree_last (ctree, GTK_CMCTREE_ROW (node)->children); - + return node; } @@ -3447,10 +3446,10 @@ gtk_cmctree_find_node_ptr (GtkCMCTree *ctree, GtkCMCTreeRow *ctree_row) { GtkCMCTreeNode *node; - + cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), NULL); cm_return_val_if_fail (ctree_row != NULL, NULL); - + if (ctree_row->parent) node = GTK_CMCTREE_ROW (ctree_row->parent)->children; else @@ -3458,7 +3457,7 @@ gtk_cmctree_find_node_ptr (GtkCMCTree *ctree, while (GTK_CMCTREE_ROW (node) != ctree_row) node = GTK_CMCTREE_ROW (node)->sibling; - + return node; } @@ -3470,7 +3469,7 @@ gtk_cmctree_node_nth (GtkCMCTree *ctree, if ((row >= GTK_CMCLIST(ctree)->rows)) return NULL; - + return GTK_CMCTREE_NODE (g_list_nth (GTK_CMCLIST (ctree)->row_list, row)); } @@ -3487,7 +3486,7 @@ gtk_cmctree_find (GtkCMCTree *ctree, while (node) { - if (node == child) + if (node == child) return TRUE; if (GTK_CMCTREE_ROW (node)->children) { @@ -3519,16 +3518,16 @@ gtk_cmctree_find_by_row_data (GtkCMCTree *ctree, gpointer data) { GtkCMCTreeNode *work; - + if (!node) node = GTK_CMCTREE_NODE (GTK_CMCLIST (ctree)->row_list); - + while (node) { - if (GTK_CMCTREE_ROW (node)->row.data == data) + if (GTK_CMCTREE_ROW (node)->row.data == data) return node; if (GTK_CMCTREE_ROW (node)->children && - (work = gtk_cmctree_find_by_row_data + (work = gtk_cmctree_find_by_row_data (ctree, GTK_CMCTREE_ROW (node)->children, data))) return work; node = GTK_CMCTREE_ROW (node)->sibling; @@ -3632,14 +3631,14 @@ gtk_cmctree_find_all_by_row_data_custom (GtkCMCTree } gboolean -gtk_cmctree_is_hot_spot (GtkCMCTree *ctree, - gint x, +gtk_cmctree_is_hot_spot (GtkCMCTree *ctree, + gint x, gint y) { GtkCMCTreeNode *node; gint column; gint row; - + cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE); if (gtk_cmclist_get_selection_info (GTK_CMCLIST (ctree), x, y, &row, &column)) @@ -3658,12 +3657,12 @@ gtk_cmctree_is_hot_spot (GtkCMCTree *ctree, void gtk_cmctree_move (GtkCMCTree *ctree, GtkCMCTreeNode *node, - GtkCMCTreeNode *new_parent, + GtkCMCTreeNode *new_parent, GtkCMCTreeNode *new_sibling) { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); - + g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_MOVE], 0, node, new_parent, new_sibling); } @@ -3674,14 +3673,14 @@ gtk_cmctree_expand (GtkCMCTree *ctree, { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); - + if (GTK_CMCTREE_ROW (node)->is_leaf) return; g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_EXPAND], 0, node); } -void +void gtk_cmctree_expand_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { @@ -3707,7 +3706,7 @@ gtk_cmctree_expand_recursive (GtkCMCTree *ctree, gtk_cmclist_thaw (clist); } -void +void gtk_cmctree_expand_to_depth (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint depth) @@ -3741,14 +3740,14 @@ gtk_cmctree_collapse (GtkCMCTree *ctree, { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); - + if (GTK_CMCTREE_ROW (node)->is_leaf) return; g_signal_emit (G_OBJECT (ctree), ctree_signals[TREE_COLLAPSE], 0, node); } -void +void gtk_cmctree_collapse_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { @@ -3781,7 +3780,7 @@ gtk_cmctree_collapse_recursive (GtkCMCTree *ctree, gtk_cmclist_thaw (clist); } -void +void gtk_cmctree_collapse_to_depth (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint depth) @@ -3823,14 +3822,14 @@ gtk_cmctree_toggle_expansion (GtkCMCTree *ctree, { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); - + if (GTK_CMCTREE_ROW (node)->is_leaf) return; tree_toggle_expansion (ctree, node, NULL); } -void +void gtk_cmctree_toggle_expansion_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { @@ -3838,7 +3837,7 @@ gtk_cmctree_toggle_expansion_recursive (GtkCMCTree gboolean thaw = FALSE; cm_return_if_fail (GTK_IS_CMCTREE (ctree)); - + if (node && GTK_CMCTREE_ROW (node)->is_leaf) return; @@ -3849,7 +3848,7 @@ gtk_cmctree_toggle_expansion_recursive (GtkCMCTree gtk_cmclist_freeze (clist); thaw = TRUE; } - + gtk_cmctree_post_recursive (ctree, node, GTK_CMCTREE_FUNC (tree_toggle_expansion), NULL); @@ -3858,7 +3857,7 @@ gtk_cmctree_toggle_expansion_recursive (GtkCMCTree } void -gtk_cmctree_select (GtkCMCTree *ctree, +gtk_cmctree_select (GtkCMCTree *ctree, GtkCMCTreeNode *node) { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); @@ -3870,7 +3869,7 @@ gtk_cmctree_select (GtkCMCTree *ctree, } void -gtk_cmctree_unselect (GtkCMCTree *ctree, +gtk_cmctree_unselect (GtkCMCTree *ctree, GtkCMCTreeNode *node) { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); @@ -3881,22 +3880,22 @@ gtk_cmctree_unselect (GtkCMCTree *ctree, } void -gtk_cmctree_select_recursive (GtkCMCTree *ctree, +gtk_cmctree_select_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { gtk_cmctree_real_select_recursive (ctree, node, TRUE); } void -gtk_cmctree_unselect_recursive (GtkCMCTree *ctree, +gtk_cmctree_unselect_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { gtk_cmctree_real_select_recursive (ctree, node, FALSE); } void -gtk_cmctree_real_select_recursive (GtkCMCTree *ctree, - GtkCMCTreeNode *node, +gtk_cmctree_real_select_recursive (GtkCMCTree *ctree, + GtkCMCTreeNode *node, gint state) { GtkCMCList *clist; @@ -3906,7 +3905,7 @@ gtk_cmctree_real_select_recursive (GtkCMCTree *ctr clist = GTK_CMCLIST (ctree); - if ((state && + if ((state && (clist->selection_mode == GTK_SELECTION_BROWSE || clist->selection_mode == GTK_SELECTION_SINGLE)) || (!state && clist->selection_mode == GTK_SELECTION_BROWSE)) @@ -3921,7 +3920,7 @@ gtk_cmctree_real_select_recursive (GtkCMCTree *ctr if (clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -3931,10 +3930,10 @@ gtk_cmctree_real_select_recursive (GtkCMCTree *ctr if (state) gtk_cmctree_post_recursive (ctree, node, GTK_CMCTREE_FUNC (tree_select), NULL); - else + else gtk_cmctree_post_recursive (ctree, node, GTK_CMCTREE_FUNC (tree_unselect), NULL); - + if (thaw) gtk_cmclist_thaw (clist); } @@ -3945,7 +3944,7 @@ gtk_cmctree_real_select_recursive (GtkCMCTree *ctr ***********************************************************/ -void +void gtk_cmctree_node_set_text (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint column, @@ -3958,7 +3957,7 @@ gtk_cmctree_node_set_text (GtkCMCTree *ctree, if (column < 0 || column >= GTK_CMCLIST (ctree)->columns) return; - + clist = GTK_CMCLIST (ctree); GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents @@ -3968,7 +3967,7 @@ gtk_cmctree_node_set_text (GtkCMCTree *ctree, tree_draw_node (ctree, node); } -void +void gtk_cmctree_node_set_pixbuf (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint column, @@ -3994,7 +3993,7 @@ gtk_cmctree_node_set_pixbuf (GtkCMCTree *ctree, tree_draw_node (ctree, node); } -void +void gtk_cmctree_node_set_pixtext (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint column, @@ -4025,7 +4024,7 @@ gtk_cmctree_node_set_pixtext (GtkCMCTree *ctree, tree_draw_node (ctree, node); } -void +void gtk_cmctree_set_node_info (GtkCMCTree *ctree, GtkCMCTreeNode *node, const gchar *text, @@ -4037,7 +4036,7 @@ gtk_cmctree_set_node_info (GtkCMCTree *ctree, { gboolean old_leaf; gboolean old_expanded; - + cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); @@ -4048,7 +4047,7 @@ gtk_cmctree_set_node_info (GtkCMCTree *ctree, { GtkCMCTreeNode *work; GtkCMCTreeNode *ptr; - + work = GTK_CMCTREE_ROW (node)->children; while (work) { @@ -4071,7 +4070,7 @@ gtk_cmctree_set_node_info (GtkCMCTree *ctree, } GTK_CMCTREE_ROW (node)->expanded = (is_leaf) ? FALSE : expanded; - + tree_draw_node (ctree, node); } @@ -4116,7 +4115,7 @@ gtk_cmctree_node_set_shift (GtkCMCTree *ctree, static void remove_grab (GtkCMCList *clist) { - if (gtkut_pointer_is_grabbed (GTK_WIDGET (clist)) && + if (gtkut_pointer_is_grabbed (GTK_WIDGET (clist)) && gtk_widget_has_grab (GTK_WIDGET(clist))) { gtk_grab_remove (GTK_WIDGET (clist)); @@ -4165,7 +4164,7 @@ gtk_cmctree_node_set_selectable (GtkCMCTree *ctree GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); } gtk_cmctree_unselect (ctree, node); - } + } } gboolean @@ -4177,7 +4176,7 @@ gtk_cmctree_node_get_selectable (GtkCMCTree *ctree return GTK_CMCTREE_ROW (node)->row.selectable; } -GtkCMCellType +GtkCMCellType gtk_cmctree_node_get_cell_type (GtkCMCTree *ctree, GtkCMCTreeNode *node, gint column) @@ -4243,22 +4242,22 @@ gtk_cmctree_node_get_pixtext (GtkCMCTree *ctree, { cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE); cm_return_val_if_fail (node != NULL, FALSE); - + if (column < 0 || column >= GTK_CMCLIST (ctree)->columns) return FALSE; - + if (GTK_CMCTREE_ROW (node)->row.cell[column].type != GTK_CMCELL_PIXTEXT) return FALSE; - + if (text) *text = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[column])->text; if (spacing) - *spacing = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW + *spacing = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[column])->spacing; if (pixbuf) - *pixbuf = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW + *pixbuf = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[column])->pixbuf; - + return TRUE; } @@ -4274,12 +4273,12 @@ gtk_cmctree_get_node_info (GtkCMCTree *ctree, { cm_return_val_if_fail (GTK_IS_CMCTREE (ctree), FALSE); cm_return_val_if_fail (node != NULL, FALSE); - + if (text) - *text = GTK_CMCELL_PIXTEXT + *text = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->text; if (spacing) - *spacing = GTK_CMCELL_PIXTEXT + *spacing = GTK_CMCELL_PIXTEXT (GTK_CMCTREE_ROW (node)->row.cell[ctree->tree_column])->spacing; if (pixbuf_closed) *pixbuf_closed = GTK_CMCTREE_ROW (node)->pixbuf_closed; @@ -4289,7 +4288,7 @@ gtk_cmctree_get_node_info (GtkCMCTree *ctree, *is_leaf = GTK_CMCTREE_ROW (node)->is_leaf; if (expanded) *expanded = GTK_CMCTREE_ROW (node)->expanded; - + return TRUE; } @@ -4335,7 +4334,7 @@ gtk_cmctree_node_set_cell_style (GtkCMCTree *ctree if (GTK_CMCTREE_ROW (node)->row.cell[column].style) { g_object_ref (GTK_CMCTREE_ROW (node)->row.cell[column].style); - + if (gtk_widget_get_realized (GTK_WIDGET(ctree))) GTK_CMCTREE_ROW (node)->row.cell[column].style = gtk_style_attach (GTK_CMCTREE_ROW (node)->row.cell[column].style, @@ -4381,7 +4380,7 @@ gtk_cmctree_node_set_row_style (GtkCMCTree *ctree, if (GTK_CMCTREE_ROW (node)->row.style == style) return; - + visible = gtk_cmctree_is_viewable (ctree, node); if (visible && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist)) { @@ -4407,7 +4406,7 @@ gtk_cmctree_node_set_row_style (GtkCMCTree *ctree, if (GTK_CMCTREE_ROW (node)->row.style) { g_object_ref (GTK_CMCTREE_ROW (node)->row.style); - + if (gtk_widget_get_realized (GTK_WIDGET(ctree))) GTK_CMCTREE_ROW (node)->row.style = gtk_style_attach (GTK_CMCTREE_ROW (node)->row.style, @@ -4495,13 +4494,13 @@ gtk_cmctree_node_set_row_data_full (GtkCMCTree { GDestroyNotify dnotify; gpointer ddata; - + cm_return_if_fail (GTK_IS_CMCTREE (ctree)); cm_return_if_fail (node != NULL); dnotify = GTK_CMCTREE_ROW (node)->row.destroy; ddata = GTK_CMCTREE_ROW (node)->row.data; - + GTK_CMCTREE_ROW (node)->row.data = data; GTK_CMCTREE_ROW (node)->row.destroy = destroy; @@ -4537,19 +4536,19 @@ gtk_cmctree_node_moveto (GtkCMCTree *ctree, if (node) row = g_list_position (clist->row_list, (GList *)node); - + gtk_cmclist_moveto (clist, row, column, row_align, col_align); } -GtkVisibility +GtkVisibility gtk_cmctree_node_is_visible (GtkCMCTree *ctree, GtkCMCTreeNode *node) { gint row; - + cm_return_val_if_fail (ctree != NULL, 0); cm_return_val_if_fail (node != NULL, 0); - + row = g_list_position (GTK_CMCLIST (ctree)->row_list, (GList*) node); return gtk_cmclist_row_is_visible (GTK_CMCLIST (ctree), row); } @@ -4560,7 +4559,7 @@ gtk_cmctree_node_is_visible (GtkCMCTree *ctree, ***********************************************************/ void -gtk_cmctree_set_indent (GtkCMCTree *ctree, +gtk_cmctree_set_indent (GtkCMCTree *ctree, gint indent) { GtkCMCList *clist; @@ -4584,7 +4583,7 @@ gtk_cmctree_set_indent (GtkCMCTree *ctree, } void -gtk_cmctree_set_spacing (GtkCMCTree *ctree, +gtk_cmctree_set_spacing (GtkCMCTree *ctree, gint spacing) { GtkCMCList *clist; @@ -4611,7 +4610,7 @@ gtk_cmctree_set_spacing (GtkCMCTree *ctree, } void -gtk_cmctree_set_show_stub (GtkCMCTree *ctree, +gtk_cmctree_set_show_stub (GtkCMCTree *ctree, gboolean show_stub) { cm_return_if_fail (GTK_IS_CMCTREE (ctree)); @@ -4632,14 +4631,14 @@ gtk_cmctree_set_show_stub (GtkCMCTree *ctree, } } -void -gtk_cmctree_set_line_style (GtkCMCTree *ctree, +void +gtk_cmctree_set_line_style (GtkCMCTree *ctree, GtkCMCTreeLineStyle line_style) { } -void -gtk_cmctree_set_expander_style (GtkCMCTree *ctree, +void +gtk_cmctree_set_expander_style (GtkCMCTree *ctree, GtkCMCTreeExpanderStyle expander_style) { GtkCMCList *clist; @@ -4717,13 +4716,13 @@ tree_sort (GtkCMCTree *ctree, { if (clist->sort_type == GTK_SORT_ASCENDING) { - if (clist->compare + if (clist->compare (clist, GTK_CMCTREE_ROW (work), GTK_CMCTREE_ROW (cmp)) < 0) cmp = work; } else { - if (clist->compare + if (clist->compare (clist, GTK_CMCTREE_ROW (work), GTK_CMCTREE_ROW (cmp)) > 0) cmp = work; } @@ -4740,7 +4739,7 @@ tree_sort (GtkCMCTree *ctree, } void -gtk_cmctree_sort_recursive (GtkCMCTree *ctree, +gtk_cmctree_sort_recursive (GtkCMCTree *ctree, GtkCMCTreeNode *node) { GtkCMCList *clist; @@ -4755,7 +4754,7 @@ gtk_cmctree_sort_recursive (GtkCMCTree *ctree, if (clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -4765,7 +4764,7 @@ gtk_cmctree_sort_recursive (GtkCMCTree *ctree, if (!node || (node && gtk_cmctree_is_viewable (ctree, node))) focus_node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, clist->focus_row)); - + gtk_cmctree_post_recursive (ctree, node, GTK_CMCTREE_FUNC (tree_sort), NULL); if (!node) @@ -4787,7 +4786,7 @@ real_sort_list (GtkCMCList *clist) } void -gtk_cmctree_sort_node (GtkCMCTree *ctree, +gtk_cmctree_sort_node (GtkCMCTree *ctree, GtkCMCTreeNode *node) { GtkCMCList *clist; @@ -4802,7 +4801,7 @@ gtk_cmctree_sort_node (GtkCMCTree *ctree, if (clist->selection_mode == GTK_SELECTION_MULTIPLE) { GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL); - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -4839,18 +4838,18 @@ fake_unselect_all (GtkCMCList *clist, GTK_CMCTREE_ROW (focus_node)->row.selectable) { GTK_CMCTREE_ROW (focus_node)->row.state = GTK_STATE_SELECTED; - + if (CLIST_UNFROZEN (clist) && gtk_cmclist_row_is_visible (clist, row) != GTK_VISIBILITY_NONE) GTK_CMCLIST_GET_CLASS (clist)->draw_row (clist, NULL, row, GTK_CMCLIST_ROW (focus_node)); - } + } } clist->undo_selection = clist->selection; clist->selection = NULL; clist->selection_end = NULL; - + for (list = clist->undo_selection; list; list = list->next) { if (list->data == focus_node) @@ -4889,7 +4888,7 @@ resync_selection (GtkCMCList *clist, GdkEvent *event) return; ctree = GTK_CMCTREE (clist); - + clist->freeze_count++; i = MIN (clist->anchor, clist->drag_pos); @@ -4907,7 +4906,7 @@ resync_selection (GtkCMCList *clist, GdkEvent *event) { node = list->data; list = list->next; - + unselect = TRUE; if (gtk_cmctree_is_viewable (ctree, node)) @@ -4924,7 +4923,7 @@ resync_selection (GtkCMCList *clist, GdkEvent *event) node); } } - } + } if (clist->anchor < clist->drag_pos) { @@ -5021,9 +5020,9 @@ real_undo_selection (GtkCMCList *clist) } else clist->focus_row = clist->undo_anchor; - + clist->undo_anchor = -1; - + g_list_free (clist->undo_selection); g_list_free (clist->undo_unselection); clist->undo_selection = NULL; @@ -5130,7 +5129,7 @@ drag_dest_cell (GtkCMCList *clist, } if (dest_info->cell.row < -1) dest_info->cell.row = -1; - + x -= border_width + style->xthickness; dest_info->cell.column = COLUMN_FROM_XPIXEL (clist, x); @@ -5141,7 +5140,7 @@ drag_dest_cell (GtkCMCList *clist, gint h = 0; y_delta = y - ROW_TOP_YPIXEL (clist, dest_info->cell.row); - + if (GTK_CMCLIST_DRAW_DRAG_RECT(clist) && !GTK_CMCTREE_ROW (g_list_nth (clist->row_list, dest_info->cell.row))->is_leaf) @@ -5210,7 +5209,7 @@ gtk_cmctree_drag_motion (GtkWidget *widget, if (!dest_info) { dest_info = g_new (GtkCMCListDestInfo, 1); - + dest_info->cell.row = -1; dest_info->cell.column = -1; dest_info->insert_pos = GTK_CMCLIST_DRAG_NONE; @@ -5308,7 +5307,7 @@ gtk_cmctree_drag_data_received (GtkWidget *widg GtkCMCTreeNode *dest_node; drag_dest_cell (clist, x, y, &dest_info); - + source_node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, source_info->row)); dest_node = GTK_CMCTREE_NODE (g_list_nth (clist->row_list, @@ -5339,7 +5338,7 @@ gtk_cmctree_drag_data_received (GtkWidget *widg if (check_drag (ctree, source_node, dest_node, dest_info.insert_pos)) gtk_cmctree_move (ctree, source_node, - GTK_CMCTREE_ROW (dest_node)->parent, + GTK_CMCTREE_ROW (dest_node)->parent, GTK_CMCTREE_ROW (dest_node)->sibling); g_dataset_remove_data (context, "gtk-clist-drag-dest"); break; @@ -5352,7 +5351,7 @@ GType gtk_cmctree_node_get_type (void) { static GType our_type = 0; - + if (our_type == 0) our_type = g_pointer_type_register_static ("GtkCMCTreeNode"); blob - 68f61a31e784c7ddd82ec50e10f08577aee8d505 blob + 9fb3c48019c737e551331b62fbaf06f0fad2a34d --- src/gtk/gtksctree.c +++ src/gtk/gtksctree.c @@ -26,8 +26,6 @@ * */ -#include "config.h" - #include #include "gtksctree.h" blob - 79b4f2fa68fdf58072f9b8c16447bbd5d550da50 blob + 0d285b7c4b3e5aa40ba6496390b08d61e2f2e460 --- src/gtk/gtksctree.h +++ src/gtk/gtksctree.h @@ -4,7 +4,7 @@ #define __GTK_SCTREE_H__ #include -#include "gtk/gtkcmctree.h" +#include "gtkcmctree.h" /* This code is based on "gtkflist.{h,c}" from mc-4.5.42 .*/ @@ -44,10 +44,10 @@ struct _GtkSCTree { struct _GtkSCTreeClass { GtkCMCTreeClass parent_class; - + /* Signal: invoke the popup menu for rows */ void (* row_popup_menu) (GtkSCTree *sctree, GdkEventButton *event); - + /* Signal: invoke the popup menu for empty areas */ void (* empty_popup_menu) (GtkSCTree *sctree, GdkEventButton *event); @@ -61,8 +61,8 @@ struct _GtkSCTreeClass { GType gtk_sctree_get_type (void); -GtkWidget *gtk_sctree_new_with_titles (gint columns, - gint tree_column, +GtkWidget *gtk_sctree_new_with_titles (gint columns, + gint tree_column, gchar *titles[]); void gtk_sctree_select (GtkSCTree *sctree, GtkCMCTreeNode *node); @@ -124,7 +124,7 @@ void gtk_sctree_set_use_markup (GtkSCTree *sctre * Returns true if the coordinates are inside a tree expander on * one of the rows. */ gboolean -gtk_sctree_is_hot_spot (GtkSCTree *ctree, - gint x, +gtk_sctree_is_hot_spot (GtkSCTree *ctree, + gint x, gint y); #endif /* __GTK_SCTREE_H__ */ blob - fcc88d5d89275959f50670faf21b544dd2011d96 blob + 4eb717dd9d6b40fa6f322b0631956b3f40b2a27f --- src/gtk/gtkunit.c +++ src/gtk/gtkunit.c @@ -19,9 +19,6 @@ * . */ -#include "config.h" -#include "claws-features.h" - #include "gtkunit.h" #include blob - d66619c8914e396d3de0f25834feda26d8778fb5 blob + 03ef284e24ba5d1a2166b1501e0c4a52bd65b87a --- src/gtk/gtkutils.c +++ src/gtk/gtkutils.c @@ -16,17 +16,12 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include #include #include -#include "gtk/gtksctree.h" +#include "gtksctree.h" #include #include #include @@ -1284,7 +1279,6 @@ claws_input_add (gint source, return result; } -#if defined USE_GNUTLS static void auto_configure_done(const gchar *hostname, gint port, gboolean ssl, AutoConfigureData *data) { gboolean smtp = strcmp(data->tls_service, "submission") == 0 ? TRUE : FALSE; @@ -1465,7 +1459,6 @@ gboolean auto_configure_service_sync(const gchar *serv g_object_unref(resolver); return result; } -#endif gboolean gtkut_pointer_is_grabbed(GtkWidget *widget) { blob - 7e3809844c6ac1ad7613d9a772e20cbc6163df65 blob + 707cc88382da7354ed2bd9e1a7fc58f84805e13d --- src/gtk/gtkutils.h +++ src/gtk/gtkutils.h @@ -217,7 +217,6 @@ claws_input_add (gint source, } \ } -#if defined USE_GNUTLS typedef struct _AutoConfigureData { const gchar *ssl_service; const gchar *tls_service; @@ -242,7 +241,6 @@ typedef struct _AutoConfigureData { void auto_configure_service(AutoConfigureData *data); gboolean auto_configure_service_sync(const gchar *service, const gchar *domain, gchar **srvhost, guint16 *srvport); -#endif gboolean gtkut_pointer_is_grabbed(GtkWidget *widget); blob - fd7c9231b98954a9dbd6a857972a64cdb2f1516d blob + 2f0ecc9595c00995f072cc18f8c28e3649e74cc8 --- src/gtk/gtkvscrollbutton.c +++ src/gtk/gtkvscrollbutton.c @@ -19,7 +19,7 @@ * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with - * GTK+ at ftp://ftp.gtk.org/pub/gtk/. + * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ /* @@ -28,11 +28,6 @@ * Modified by the Sylpheed Team and others 2003 */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include "utils.h" @@ -235,11 +230,8 @@ void gtk_vscrollbutton_set_adjustment(GtkVScrollbutton if (scrollbutton->adjustment != adjustment) { if (scrollbutton->adjustment) { - g_signal_handlers_disconnect_matched(scrollbutton->adjustment, - G_SIGNAL_MATCH_DATA, - 0, 0, NULL, NULL, - (gpointer) scrollbutton); - g_object_unref(G_OBJECT(scrollbutton->adjustment)); + g_signal_handlers_disconnect_matched(scrollbutton->adjustment, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, (gpointer) scrollbutton); + g_object_unref(G_OBJECT(scrollbutton->adjustment)); } scrollbutton->adjustment = adjustment; @@ -323,10 +315,10 @@ gboolean gtk_vscrollbutton_scroll(GtkVScrollbutton *sc scrollbutton->timer = 0; } break; - + default: break; - + } if (new_value != value) { @@ -401,7 +393,7 @@ static gboolean gtk_real_vscrollbutton_timer(GtkVScrol return_val = FALSE; if (scrollbutton->need_timer) scrollbutton->timer = - g_timeout_add(SCROLL_TIMER_LENGTH, + g_timeout_add(SCROLL_TIMER_LENGTH, (GSourceFunc) gtk_real_vscrollbutton_timer, (gpointer) scrollbutton); else { @@ -421,11 +413,11 @@ static void gtk_vscrollbutton_set_sensitivity (GtkAd gfloat value; if (!gtk_widget_get_realized(GTK_WIDGET(scrollbutton))) return; if (scrollbutton->button != 0) return; /* not while something is pressed */ - + value = gtk_adjustment_get_value(adjustment); - gtk_widget_set_sensitive(scrollbutton->upbutton, + gtk_widget_set_sensitive(scrollbutton->upbutton, (value > gtk_adjustment_get_lower(adjustment))); - gtk_widget_set_sensitive(scrollbutton->downbutton, + gtk_widget_set_sensitive(scrollbutton->downbutton, (value < (gtk_adjustment_get_upper(adjustment) - gtk_adjustment_get_page_size(adjustment)))); } blob - c78dc15df6a7d025f6e4821cb5653e8b7b87f378 blob + d9a511234c003d50bddf78cc29c7cb3600ae2b66 --- src/gtk/inputdialog.c +++ src/gtk/inputdialog.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - e30e4a77cd4453c2b397066752a26b336fb44da2 blob + 358476b305bf279649a0a6daf28b4818173e60ee --- src/gtk/logwindow.c +++ src/gtk/logwindow.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - 6dc8e1e72612ed87d7c02ee6015a6c3b14793fbb blob + 7045166a436332dccd2be4ef7e4f4b386eda7fff --- src/gtk/manage_window.c +++ src/gtk/manage_window.c @@ -14,11 +14,9 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#include "config.h" - #include #include @@ -34,7 +32,7 @@ gint manage_window_focus_in(GtkWidget *widget, GdkEven if (!GTK_IS_WINDOW(widget)) return FALSE; - + /* title = gtk_window_get_title(GTK_WINDOW(widget)); debug_print("Focus in event: window: %p - %s\n", widget, title ? title : "no title"); */ blob - 732dadd851505c5828af22bffff43340b9825552 blob + 63db7fa1574c75519d4bf2d526203a364a0e8115 --- src/gtk/menu.c +++ src/gtk/menu.c @@ -17,11 +17,6 @@ * */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - 39a49744c7da5e37f175989c294240648f762895 blob + 69efd83e92ecdf58bfc87d45e5fab249af88674c --- src/gtk/prefswindow.c +++ src/gtk/prefswindow.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include blob - ae8f1ab0ab9a54c87996c26d3dcf20e0788cdc2b blob + d3472b90d35422837c15fd757bc10003ab8061cc --- src/gtk/progressdialog.c +++ src/gtk/progressdialog.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include #include #include @@ -199,7 +194,7 @@ gint progress_dialog_list_set_status(ProgressDialog *p } /*! - *\return gint Row where data were set + *\return gint Row where data were set */ gint progress_dialog_list_set(ProgressDialog *progress, gint row, @@ -234,13 +229,13 @@ static gint progress_dialog_insert_account(ProgressDia { GtkTreeIter iter; GtkListStore *store = progress->store; - gint result = -1; - + gint result = -1; + if (account == NULL && status == NULL && image == NULL) return -1; /* see if row exists, if not append */ - if (row < 0 || !gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), + if (row < 0 || !gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, row)) { result = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL); @@ -252,16 +247,16 @@ static gint progress_dialog_insert_account(ProgressDia * XXX: uhm, when does the iter invalidate? sure not while * just setting a row's column i hope? */ - + if (account) - gtk_list_store_set(store, &iter, + gtk_list_store_set(store, &iter, PROGRESS_ACCOUNT, account, -1); if (status) gtk_list_store_set(store, &iter, PROGRESS_STATE, status, -1); - if (image) + if (image) gtk_list_store_set(store, &iter, PROGRESS_IMAGE, image, -1); blob - a642bddb165276439f21607f7bd2cdfbd4af53c4 (mode 644) blob + /dev/null --- src/gtk/quicksearch.c +++ /dev/null @@ -1,1213 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Colin Leroy - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include - -#include -#include -#include - -#include -#include - -#include "utils.h" -#include "combobox.h" -#include "menu.h" -#include "prefs_common.h" -#include "description_window.h" -#include "matcher.h" -#include "matcher_parser.h" -#include "quicksearch.h" -#include "folderview.h" -#include "folder.h" -#include "prefs_matcher.h" -#include "claws.h" -#include "statusbar.h" -#include "advsearch.h" -#include "alertpanel.h" - -struct _QuickSearchRequest -{ - AdvancedSearchType type; - gchar *matchstring; -}; -typedef struct _QuickSearchRequest QuickSearchRequest; - -struct _QuickSearch -{ - GtkWidget *hbox_search; - GtkWidget *search_type_combo; - GtkWidget *search_string_entry; - GtkWidget *search_condition_expression; - GtkWidget *search_description; - GtkWidget *clear_search; - - gboolean active; - gchar *search_string; - - QuickSearchRequest request; - QuickSearchExecuteCallback callback; - gpointer callback_data; - gboolean running; - gboolean has_focus; - gboolean in_typing; - guint press_timeout_id; - - GList *normal_search_strings; - GList *extended_search_strings; - - AdvancedSearch *asearch; - gboolean want_reexec; - gboolean want_history; -}; - -static GdkColor qs_active_bgcolor = { - (gulong)0, - (gushort)0, - (gushort)0, - (gushort)0 -}; - -static GdkColor qs_active_color = { - (gulong)0, - (gushort)0, - (gushort)0, - (gushort)0 -}; - -static GdkColor qs_error_bgcolor = { - (gulong)0, - (gushort)0, - (gushort)0, - (gushort)0 -}; - -static GdkColor qs_error_color = { - (gulong)0, - (gushort)0, - (gushort)0, - (gushort)0 -}; - -typedef enum { - SEARCH_TYPE_COL_TEXT, - SEARCH_TYPE_COL_CHECKBOX, - SEARCH_TYPE_COL_CHECKBOX_ACTIVE, - SEARCH_TYPE_COL_ACTION, - NUM_SEARCH_TYPE_COLS -} QuickSearchTypeColumn; - -typedef enum { - QS_MENU_ACTION_SUBJECT, - QS_MENU_ACTION_FROM, - QS_MENU_ACTION_TO, - QS_MENU_ACTION_TAG, - QS_MENU_ACTION_MIXED, - QS_MENU_ACTION_EXTENDED, - QS_MENU_ACTION_SEPARATOR, - QS_MENU_ACTION_RECURSIVE, - QS_MENU_ACTION_STICKY, - QS_MENU_ACTION_TYPEAHEAD, - QS_MENU_ACTION_RUNONSELECT, - NUM_QS_MENU_ACTIONS -} QuickSearchMenuActions; - -static void search_type_changed_cb(GtkComboBox *combobox, - gpointer user_data); - -void quicksearch_set_on_progress_cb(QuickSearch* search, - gboolean (*cb)(gpointer data, guint at, guint matched, guint total), gpointer data) -{ - advsearch_set_on_progress_cb(search->asearch, cb, data); -} - -static void quicksearch_set_running(QuickSearch *quicksearch, gboolean run); -static void quicksearch_set_matchstring(QuickSearch *quicksearch, const gchar *matchstring); -static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active); -static void quicksearch_set_popdown_strings(QuickSearch *quicksearch); - -static void quicksearch_add_to_history(QuickSearch* quicksearch) -{ - gchar* search_string = quicksearch->request.matchstring; - - /* add to history, for extended search add only correct matching rules */ - if (quicksearch->want_history && !quicksearch->in_typing && search_string && strlen(search_string) != 0) { - switch (prefs_common.summary_quicksearch_type) { - case ADVANCED_SEARCH_EXTENDED: - if (advsearch_has_proper_predicate(quicksearch->asearch)) { - quicksearch->extended_search_strings = - add_history(quicksearch->extended_search_strings, - search_string); - prefs_common.summary_quicksearch_history = - add_history(prefs_common.summary_quicksearch_history, - search_string); - } - break; - default: - quicksearch->normal_search_strings = - add_history(quicksearch->normal_search_strings, - search_string); - prefs_common.summary_quicksearch_history = - add_history(prefs_common.summary_quicksearch_history, - search_string); - break; - } - - quicksearch_set_popdown_strings(quicksearch); - } - - quicksearch->want_history = FALSE; -} - -static void quicksearch_invoke_execute(QuickSearch *quicksearch, gboolean run_only_if_fast) -{ - if (quicksearch->running) { - quicksearch->want_reexec = TRUE; - advsearch_abort(quicksearch->asearch); - return; - } - - do { - gboolean active = quicksearch->request.matchstring != NULL - && g_strcmp0(quicksearch->request.matchstring, ""); - advsearch_set(quicksearch->asearch, quicksearch->request.type, - quicksearch->request.matchstring); - - if (run_only_if_fast && !advsearch_is_fast(quicksearch->asearch)) - return; - - quicksearch_add_to_history(quicksearch); - - quicksearch_set_active(quicksearch, active); - - quicksearch->want_reexec = FALSE; - quicksearch_set_running(quicksearch, TRUE); - if (quicksearch->callback != NULL) - quicksearch->callback(quicksearch, quicksearch->callback_data); - quicksearch_set_running(quicksearch, FALSE); - } while (quicksearch->want_reexec); -} - -gboolean quicksearch_run_on_folder(QuickSearch* quicksearch, FolderItem *folderItem, MsgInfoList **result) -{ - if (quicksearch_has_sat_predicate(quicksearch)) { - gboolean was_running = quicksearch_is_running(quicksearch); - gboolean searchres; - - if (!was_running) - quicksearch_set_running(quicksearch, TRUE); - - main_window_cursor_wait(mainwindow_get_mainwindow()); - searchres = advsearch_search_msgs_in_folders(quicksearch->asearch, result, folderItem, FALSE); - main_window_cursor_normal(mainwindow_get_mainwindow()); - - if (!was_running) - quicksearch_set_running(quicksearch, FALSE); - - if (quicksearch->want_reexec) { - advsearch_set(quicksearch->asearch, quicksearch->request.type, ""); - } - return searchres; - } else - return FALSE; -} - -gboolean quicksearch_is_fast(QuickSearch *quicksearch) -{ - return advsearch_is_fast(quicksearch->asearch); -} - -static void quicksearch_set_type(QuickSearch *quicksearch, gint type) -{ - prefs_common_get_prefs()->summary_quicksearch_type = type; - quicksearch->request.type = type; -} - -static gchar *quicksearch_get_text(QuickSearch * quicksearch) -{ - gchar *search_string = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry)))), 0, -1); - - return search_string; -} - -static void quicksearch_set_popdown_strings(QuickSearch *quicksearch) -{ - GtkWidget *search_string_entry = quicksearch->search_string_entry; - - combobox_unset_popdown_strings(GTK_COMBO_BOX_TEXT(search_string_entry)); - if (prefs_common.summary_quicksearch_type == ADVANCED_SEARCH_EXTENDED) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(search_string_entry), - quicksearch->extended_search_strings); - else - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(search_string_entry), - quicksearch->normal_search_strings); -} - -static void update_extended_buttons (QuickSearch *quicksearch) -{ - GtkWidget *expr_btn = quicksearch->search_condition_expression; - GtkWidget *ext_btn = quicksearch->search_description; - - cm_return_if_fail(expr_btn != NULL); - cm_return_if_fail(ext_btn != NULL); - - if (prefs_common.summary_quicksearch_type == ADVANCED_SEARCH_EXTENDED) { - gtk_widget_show(expr_btn); - gtk_widget_show(ext_btn); - } else { - gtk_widget_hide(expr_btn); - gtk_widget_hide(ext_btn); - } -} - -static gboolean searchbar_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - QuickSearch *qs) -{ - qs->has_focus = TRUE; - return FALSE; -} - -static gboolean searchbar_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - QuickSearch *qs) -{ - qs->has_focus = FALSE; - qs->in_typing = FALSE; - return FALSE; -} - -gboolean quicksearch_has_focus(QuickSearch *quicksearch) -{ - return quicksearch->has_focus; -} - -static void searchbar_run(QuickSearch *quicksearch, gboolean run_only_if_fast) -{ - gchar *search_string = quicksearch_get_text(quicksearch); - quicksearch_set_matchstring(quicksearch, search_string); - g_free(search_string); - - quicksearch->want_history = TRUE; - - quicksearch_invoke_execute(quicksearch, run_only_if_fast); -} - -static int searchbar_changed_timeout(void *data) -{ - QuickSearch *qs = (QuickSearch *)data; - if (qs && prefs_common.summary_quicksearch_dynamic) { - qs->in_typing = TRUE; - searchbar_run(qs, TRUE); - } - return FALSE; -} - -static void searchbar_changed_cb(GtkWidget *widget, QuickSearch *qs) -{ - if (!qs->has_focus && prefs_common.summary_quicksearch_autorun) { - gtk_widget_grab_focus(qs->search_string_entry); - searchbar_run(qs, TRUE); - return; - } - - if (prefs_common.summary_quicksearch_dynamic) { - if (qs->press_timeout_id != 0) { - g_source_remove(qs->press_timeout_id); - } - qs->press_timeout_id = g_timeout_add(prefs_common.qs_press_timeout, - searchbar_changed_timeout, qs); - } - - if (!qs->has_focus) - gtk_widget_grab_focus(qs->search_string_entry); -} - -static gboolean searchbar_pressed(GtkWidget *widget, GdkEventKey *event, - QuickSearch *quicksearch) -{ - if (event != NULL && (event->keyval == GDK_KEY_ISO_Left_Tab)) { - /* Shift+Tab moves focus "back" */ - gtk_widget_grab_focus(quicksearch->search_type_combo); - return TRUE; - } - if (event != NULL && (event->keyval == GDK_KEY_Tab)) { - /* Just Tab moves focus "forwards" */ - gtk_widget_grab_focus(quicksearch->clear_search); - return TRUE; - } - - if (event != NULL && (event->keyval == GDK_KEY_Escape)) { - gchar *str; - - quicksearch->in_typing = FALSE; - - str = quicksearch_get_text(quicksearch); - cm_return_val_if_fail(str != NULL, TRUE); - - /* If the string entry is empty -> hide quicksearch bar. If not -> empty it */ - if (!*str) { - summaryview_activate_quicksearch( - mainwindow_get_mainwindow()->summaryview, - FALSE); - } else { - quicksearch_set(quicksearch, prefs_common.summary_quicksearch_type, ""); - gtk_widget_grab_focus( - mainwindow_get_mainwindow()->summaryview->ctree); - } - g_free(str); - return TRUE; - } - - if (event != NULL && (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)) { - if (quicksearch->press_timeout_id != 0) { - g_source_remove(quicksearch->press_timeout_id); - quicksearch->press_timeout_id = 0; - } - quicksearch->in_typing = FALSE; - /* add expression to history list and exec quicksearch */ - searchbar_run(quicksearch, FALSE); - - g_signal_stop_emission_by_name(G_OBJECT(widget), "key_press_event"); - return TRUE; - } - - if (event && (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_Up)) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(quicksearch->search_string_entry), - event->keyval); - return TRUE; - } - - return FALSE; -} - -/* - * Strings describing how to use Extended Search - * - * When adding new lines, remember to put 2 strings for each line - */ -static gchar *search_descr_strings[] = { - "a", N_("all messages"), - "ag #", N_("messages whose age is greater than # days"), - "al #", N_("messages whose age is less than # days"), - "agh #", N_("messages whose age is greater than # hours"), - "alh #", N_("messages whose age is less than # hours"), - "b S", N_("messages which contain S in the message body"), - "B S", N_("messages which contain S in the whole message"), - "c S", N_("messages carbon-copied to S"), - "C S", N_("message is either To: or Cc: to S"), - "D", N_("deleted messages"), /** how I can filter deleted messages **/ - "da \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is after requested date " - "(time is optional)"), - "db \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is before requested date " - "(time is optional)"), - "e S", N_("messages which contain S in the Sender field"), - "E S", N_("true if execute \"S\" succeeds"), - "f S", N_("messages originating from user S"), - "F", N_("forwarded messages"), - "h S", N_("messages which contain S in any header name or value"), - "H S", N_("messages which contain S in the value of any header"), - "ha", N_("messages which have attachments"), - "i S", N_("messages which contain S in Message-ID header"), - "I S", N_("messages which contain S in In-Reply-To header"), - "k #", N_("messages which are marked with color #"), - "L", N_("locked messages"), - "n S", N_("messages which are in newsgroup S"), - "N", N_("new messages"), - "O", N_("old messages"), - "p", N_("incomplete messages (not entirely downloaded)"), - "r", N_("messages which you have replied to"), - "R", N_("read messages"), - "s S", N_("messages which contain S in subject"), - "se #", N_("messages whose score is equal to # points"), - "sg #", N_("messages whose score is greater than # points"), - "sl #", N_("messages whose score is lower than # points"), - "Se #", N_("messages whose size is equal to # bytes"), - "Sg #", N_("messages whose size is greater than # bytes"), - "Ss #", N_("messages whose size is smaller than # bytes"), - "t S", N_("messages which have been sent to S"), - "tg S", N_("messages which tags contain S"), - "tagged",N_("messages which have tag(s)"), - "T", N_("marked messages"), - "U", N_("unread messages"), - "v H V", N_("messages which contain V in header H"), - "x S", N_("messages which contain S in References header"), - "X \"cmd args\"", N_("messages returning 0 when passed to command - %F is message file"), - "", "" , - "&", N_("logical AND operator"), - "|", N_("logical OR operator"), - "! or ~", N_("logical NOT operator"), - "%", N_("case sensitive search"), - "#", N_("match using regular expressions instead of substring search"), - "", "" , - " ", N_("all filtering expressions are allowed, but cannot be mixed " - "through logical operators with the expressions above"), - NULL, NULL -}; - -static DescriptionWindow search_descr = { - NULL, - NULL, - FALSE, - 2, - N_("Extended Search"), - N_("Extended Search allows the user to define criteria that messages must " - "have in order to match and be displayed in the message list.\n" - "The following symbols can be used:"), - search_descr_strings -}; - -static void search_description_cb(GtkWidget *widget) -{ - search_descr.parent = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "description_window"); - description_window_create(&search_descr); -}; - -static gboolean clear_search_cb(GtkMenuItem *widget, gpointer data) -{ - QuickSearch *quicksearch = (QuickSearch *)data; - - quicksearch_set(quicksearch, prefs_common.summary_quicksearch_type, ""); - - return TRUE; -}; - -static void search_condition_expr_done(MatcherList * matchers) -{ - gchar *str; - - cm_return_if_fail( - mainwindow_get_mainwindow()->summaryview->quicksearch != NULL); - - if (matchers == NULL) - return; - - str = matcherlist_to_string(matchers); - - if (str != NULL) { - quicksearch_set(mainwindow_get_mainwindow()->summaryview->quicksearch, - prefs_common.summary_quicksearch_type, str); - g_free(str); - - /* add expression to history list and exec quicksearch */ - searchbar_run(mainwindow_get_mainwindow()->summaryview->quicksearch, FALSE); - } -} - -static gboolean search_condition_expr(GtkMenuItem *widget, gpointer data) -{ - gchar * cond_str; - MatcherList * matchers = NULL; - - cm_return_val_if_fail( - mainwindow_get_mainwindow()->summaryview->quicksearch != NULL, - FALSE); - - /* re-use the current quicksearch value, expanding it so it also works - * with extended symbols */ - cond_str = quicksearch_get_text(mainwindow_get_mainwindow()->summaryview->quicksearch); - - if (*cond_str != '\0') { - gchar *newstr = advsearch_expand_search_string(cond_str); - - if (newstr && newstr[0] != '\0') - matchers = matcher_parser_get_cond(newstr, FALSE); - g_free(newstr); - } - - prefs_matcher_open(matchers, search_condition_expr_done); - - if (matchers != NULL) - matcherlist_free(matchers); - - g_free(cond_str); - - return TRUE; -}; - -static void quicksearch_set_button(GtkButton *button, const gchar *icon, const gchar *text) -{ - GList *children = gtk_container_get_children(GTK_CONTAINER(button)); - GList *cur; - GtkWidget *box; - gboolean icon_visible; - - g_object_get(gtk_settings_get_default(), - "gtk-button-images", &icon_visible, - NULL); - - for (cur = children; cur; cur = cur->next) - gtk_container_remove(GTK_CONTAINER(button), GTK_WIDGET(cur->data)); - - g_list_free(children); - box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - - gtk_container_add(GTK_CONTAINER(button), box); - if (icon_visible || !text || !*text || icon != NULL) - gtk_box_pack_start(GTK_BOX(box), gtk_image_new_from_icon_name(icon, - GTK_ICON_SIZE_BUTTON), FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(box), gtk_label_new_with_mnemonic(text), FALSE, FALSE, 0); - gtk_widget_show_all(box); -} - -static gboolean search_type_combo_separator_func(GtkTreeModel *model, - GtkTreeIter *iter, gpointer data) -{ - gchar *txt = NULL; - - cm_return_val_if_fail(model != NULL, FALSE); - - gtk_tree_model_get(model, iter, 0, &txt, -1); - - if (txt == NULL) - return TRUE; - - g_free(txt); - return FALSE; -} - -static void quicksearch_error(gpointer data) -{ - alertpanel_error(_("Something went wrong during search. Please check your logs.")); -} - -static void select_correct_combobox_menuitem(QuickSearch *quicksearch) -{ - gint active_menuitem = 0; - gint active_type; - GtkWidget *combobox = quicksearch->search_type_combo; - - /* Figure out which menuitem to set as active. QS_MENU_ACTION_ aliases - * are in the same order as order of their menu items, so we can - * use them as index for gtk_combo_box_set_active(). - * - * However, ADVANCED_SEARCH_ aliases are in a different order, - * and even if they weren't, we do not want to depend on them - * always being in correct order, so we have to map them to - * our QS_MENU_ACTION_ aliases manually. */ - active_type = prefs_common_get_prefs()->summary_quicksearch_type; - switch (active_type) { - case ADVANCED_SEARCH_SUBJECT: - active_menuitem = QS_MENU_ACTION_SUBJECT; - break; - case ADVANCED_SEARCH_FROM: - active_menuitem = QS_MENU_ACTION_FROM; - break; - case ADVANCED_SEARCH_TO: - active_menuitem = QS_MENU_ACTION_TO; - break; - case ADVANCED_SEARCH_TAG: - active_menuitem = QS_MENU_ACTION_TAG; - break; - case ADVANCED_SEARCH_MIXED: - active_menuitem = QS_MENU_ACTION_MIXED; - break; - case ADVANCED_SEARCH_EXTENDED: - active_menuitem = QS_MENU_ACTION_EXTENDED; - break; - default: - g_warning("unhandled advsearch type %d in quicksearch", active_type); - break; - } - - /* We just want to quietly make the correct menuitem active - * without triggering handlers of the combobox "changed" signal, - * so we temporarily block handling of that signal. */ - g_signal_handlers_block_matched(G_OBJECT(combobox), - G_SIGNAL_MATCH_FUNC, 0, 0, 0, - (gpointer)search_type_changed_cb, - (gpointer)quicksearch); - gtk_combo_box_set_active(GTK_COMBO_BOX(combobox), active_menuitem); - g_signal_handlers_unblock_matched(G_OBJECT(combobox), - G_SIGNAL_MATCH_FUNC, 0, 0, 0, - (gpointer)search_type_changed_cb, - (gpointer)quicksearch); -} - -static gboolean set_search_type_checkboxes_func(GtkTreeModel *model, - GtkTreePath *path, - GtkTreeIter *iter, - gpointer data) -{ - gboolean has_checkbox; - gint action; - gboolean cur_active; - gboolean active = -1; - PrefsCommon *prefs = prefs_common_get_prefs(); - - gtk_tree_model_get(model, iter, - SEARCH_TYPE_COL_CHECKBOX, &has_checkbox, - SEARCH_TYPE_COL_CHECKBOX_ACTIVE, &cur_active, - SEARCH_TYPE_COL_ACTION, &action, - -1); - - if (!has_checkbox) - return FALSE; - - prefs = prefs_common_get_prefs(); - switch (action) { - case QS_MENU_ACTION_RECURSIVE: - active = prefs->summary_quicksearch_recurse; - break; - case QS_MENU_ACTION_STICKY: - active = prefs->summary_quicksearch_sticky; - break; - case QS_MENU_ACTION_TYPEAHEAD: - active = prefs->summary_quicksearch_dynamic; - break; - case QS_MENU_ACTION_RUNONSELECT: - active = prefs->summary_quicksearch_autorun; - break; - } - - if (active != cur_active) { - gtk_list_store_set(GTK_LIST_STORE(model), iter, - SEARCH_TYPE_COL_CHECKBOX_ACTIVE, active, - -1); - } - - return FALSE; -} - -/* A function to make status of the toggleable menu items - * in search type combobox reflect configured prefs */ -static void set_search_type_checkboxes(GtkComboBox *combobox) -{ - GtkTreeModel *model; - - cm_return_if_fail(combobox != NULL); - - model = gtk_combo_box_get_model(GTK_COMBO_BOX(combobox)); - - if (model == NULL) - return; - - gtk_tree_model_foreach(model, set_search_type_checkboxes_func, NULL); -} - -static void search_type_changed_cb(GtkComboBox *combobox, - gpointer user_data) -{ - QuickSearch *quicksearch = (QuickSearch *)user_data; - GtkTreeIter iter; - GtkTreeModel *model; - gboolean has_checkbox, checkbox_active; - gint action; - PrefsCommon *prefs = prefs_common_get_prefs(); - - cm_return_if_fail(quicksearch != NULL); - cm_return_if_fail(gtk_combo_box_get_active_iter(combobox, &iter)); - - model = gtk_combo_box_get_model(combobox); - - gtk_tree_model_get(model, &iter, - SEARCH_TYPE_COL_CHECKBOX, &has_checkbox, - SEARCH_TYPE_COL_CHECKBOX_ACTIVE, &checkbox_active, - SEARCH_TYPE_COL_ACTION, &action, - -1); - - /* React based on which menuitem was selected */ - switch (action) { - case QS_MENU_ACTION_SUBJECT: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_SUBJECT); - break; - case QS_MENU_ACTION_FROM: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_FROM); - break; - case QS_MENU_ACTION_TO: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_TO); - break; - case QS_MENU_ACTION_TAG: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_TAG); - break; - case QS_MENU_ACTION_MIXED: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_MIXED); - break; - case QS_MENU_ACTION_EXTENDED: - quicksearch_set_type(quicksearch, ADVANCED_SEARCH_EXTENDED); - break; - case QS_MENU_ACTION_RECURSIVE: - prefs->summary_quicksearch_recurse = !checkbox_active; - break; - case QS_MENU_ACTION_STICKY: - prefs->summary_quicksearch_sticky = !checkbox_active; - break; - case QS_MENU_ACTION_TYPEAHEAD: - prefs->summary_quicksearch_dynamic = !checkbox_active; - break; - case QS_MENU_ACTION_RUNONSELECT: - prefs->summary_quicksearch_autorun = !checkbox_active; - break; - } - update_extended_buttons(quicksearch); - /* If one of the toggleable items has been activated, there's - * work to be done */ - if (has_checkbox) { - /* TYPEAHEAD is mutually exclusive with RUNONSELECT */ - if (action == QS_MENU_ACTION_TYPEAHEAD && !checkbox_active) - prefs->summary_quicksearch_autorun = FALSE; - - /* RUNONSELECT is mutually exclusive with TYPEAHEAD */ - if (action == QS_MENU_ACTION_RUNONSELECT && !checkbox_active) - prefs->summary_quicksearch_dynamic = FALSE; - - /* Update state of the toggleable menu items */ - set_search_type_checkboxes(combobox); - - /* Activate one of the search types' menu entries, so that - * the current search type is visible on a closed combobox */ - select_correct_combobox_menuitem(quicksearch); - } - - /* update history list */ - quicksearch_set_popdown_strings(quicksearch); - - /* Update search results */ - quicksearch_invoke_execute(quicksearch, FALSE); - - /* Give focus to the text entry */ - gtk_widget_grab_focus(quicksearch->search_string_entry); -} - -QuickSearch *quicksearch_new() -{ - QuickSearch *quicksearch; - - GtkWidget *hbox_search; - GtkWidget *search_type_combo; - GtkWidget *search_string_entry; - GtkWidget *search_hbox; - GtkWidget *search_description; - GtkWidget *clear_search; - GtkWidget *search_condition_expression; - GtkWidget *vbox; - GtkListStore *menu; - GtkCellRenderer *renderer; - GtkTreeIter iter; - - quicksearch = g_new0(QuickSearch, 1); - - quicksearch->asearch = advsearch_new(); - advsearch_set_on_error_cb(quicksearch->asearch, quicksearch_error, NULL); - - /* init. values initally found in quicksearch_new(). - There's no need to init. all pointers to NULL since we use g_new0 - */ - quicksearch->active = FALSE; - quicksearch->running = FALSE; - quicksearch->in_typing = FALSE; - quicksearch->press_timeout_id = 0; - quicksearch->normal_search_strings = NULL; - quicksearch->extended_search_strings = NULL; - - /* quick search */ - hbox_search = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - - menu = gtk_list_store_new(4, - G_TYPE_STRING, - G_TYPE_BOOLEAN, - G_TYPE_BOOLEAN, - G_TYPE_INT); - - search_type_combo = gtk_combo_box_new_with_model(GTK_TREE_MODEL(menu)); - gtk_widget_set_focus_on_click(GTK_WIDGET(search_type_combo), FALSE); - gtk_combo_box_set_row_separator_func(GTK_COMBO_BOX(search_type_combo), - (GtkTreeViewRowSeparatorFunc)search_type_combo_separator_func, - NULL, NULL); - - renderer = gtk_cell_renderer_toggle_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(search_type_combo), renderer, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(search_type_combo), - renderer, - "visible", SEARCH_TYPE_COL_CHECKBOX, - "active", SEARCH_TYPE_COL_CHECKBOX_ACTIVE, - NULL); - renderer = gtk_cell_renderer_text_new(); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(search_type_combo), renderer, TRUE); - gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(search_type_combo), - renderer, "text", SEARCH_TYPE_COL_TEXT, NULL); - - gtk_box_pack_start(GTK_BOX(hbox_search), search_type_combo, FALSE, FALSE, HSPACING_NARROW_2); - - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Subject"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_SUBJECT, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("From"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_FROM, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("To"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_TO, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Tag"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_TAG, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("From/To/Cc/Subject/Tag"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_MIXED, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Extended"), - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_EXTENDED, - -1); - gtk_list_store_append(menu, &iter); /* Separator */ - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, NULL, - SEARCH_TYPE_COL_CHECKBOX, FALSE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_SEPARATOR, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Recursive"), - SEARCH_TYPE_COL_CHECKBOX, TRUE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_RECURSIVE, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Sticky"), - SEARCH_TYPE_COL_CHECKBOX, TRUE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_STICKY, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Type-ahead"), - SEARCH_TYPE_COL_CHECKBOX, TRUE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_TYPEAHEAD, - -1); - gtk_list_store_append(menu, &iter); - gtk_list_store_set(menu, &iter, - SEARCH_TYPE_COL_TEXT, _("Run on select"), - SEARCH_TYPE_COL_CHECKBOX, TRUE, - SEARCH_TYPE_COL_ACTION, QS_MENU_ACTION_RUNONSELECT, - -1); - - g_signal_connect(G_OBJECT(search_type_combo), "changed", - G_CALLBACK(search_type_changed_cb), quicksearch); - - gtk_widget_show(search_type_combo); - - search_string_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(search_string_entry), -1); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_box_pack_start(GTK_BOX(vbox), search_string_entry, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox_search), vbox, TRUE, TRUE, HSPACING_NARROW); - - gtk_widget_show(vbox); - gtk_widget_show(search_string_entry); - - search_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW+1); - clear_search = gtkut_stock_button("edit-clear", _("C_lear")); - gtk_box_pack_start(GTK_BOX(search_hbox), clear_search, - FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(clear_search), "clicked", - G_CALLBACK(clear_search_cb), quicksearch); - CLAWS_SET_TIP(clear_search, - _("Clear the current search")); - gtk_widget_show(clear_search); - - search_condition_expression = gtk_button_new_with_mnemonic(_("_Edit")); - gtk_box_pack_start(GTK_BOX(search_hbox), search_condition_expression, - FALSE, FALSE, 0); - g_signal_connect(G_OBJECT (search_condition_expression), "clicked", - G_CALLBACK(search_condition_expr), - quicksearch); - CLAWS_SET_TIP(search_condition_expression, - _("Edit search criteria")); - gtk_widget_show(search_condition_expression); - - search_description = gtkut_stock_button("dialog-information", _("_Information")); - gtk_box_pack_start(GTK_BOX(search_hbox), search_description, - FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(search_description), "clicked", - G_CALLBACK(search_description_cb), NULL); - CLAWS_SET_TIP(search_description, - _("Information about extended symbols")); - gtk_widget_show(search_description); - - gtk_box_pack_start(GTK_BOX(hbox_search), search_hbox, FALSE, FALSE, HSPACING_NARROW_2); - gtk_widget_show(search_hbox); - - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((search_string_entry)))), - "key_press_event", - G_CALLBACK(searchbar_pressed), - quicksearch); - - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((search_string_entry)))), - "changed", - G_CALLBACK(searchbar_changed_cb), - quicksearch); - - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((search_string_entry)))), - "focus_in_event", - G_CALLBACK(searchbar_focus_evt_in), - quicksearch); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((search_string_entry)))), - "focus_out_event", - G_CALLBACK(searchbar_focus_evt_out), - quicksearch); - - quicksearch->hbox_search = hbox_search; - quicksearch->search_type_combo = search_type_combo; - quicksearch->search_string_entry = search_string_entry; - quicksearch->search_condition_expression = search_condition_expression; - quicksearch->search_description = search_description; - quicksearch->active = FALSE; - quicksearch->running = FALSE; - quicksearch->clear_search = clear_search; - quicksearch->in_typing = FALSE; - quicksearch->press_timeout_id = 0; - quicksearch->normal_search_strings = NULL; - quicksearch->extended_search_strings = NULL; - - quicksearch_set_button(GTK_BUTTON(quicksearch->search_description), "dialog-information-symbolic", - _("_Information")); - quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), NULL, _("E_dit")); - quicksearch_set_button(GTK_BUTTON(quicksearch->clear_search), "edit-clear-symbolic", _("C_lear")); - - update_extended_buttons(quicksearch); - - GTKUT_GDKRGBA_TO_GDKCOLOR(prefs_common.color[COL_QS_ACTIVE_BG], - qs_active_bgcolor); - GTKUT_GDKRGBA_TO_GDKCOLOR(prefs_common.color[COL_QS_ACTIVE], - qs_active_color); - GTKUT_GDKRGBA_TO_GDKCOLOR(prefs_common.color[COL_QS_ERROR_BG], - qs_error_bgcolor); - GTKUT_GDKRGBA_TO_GDKCOLOR(prefs_common.color[COL_QS_ERROR], - qs_error_color); - - /* Update state of the search type combobox to reflect - * current quicksearch prefs */ - set_search_type_checkboxes(GTK_COMBO_BOX(search_type_combo)); - select_correct_combobox_menuitem(quicksearch); - - return quicksearch; -} - -void quicksearch_relayout(QuickSearch *quicksearch) -{ - switch (prefs_common.layout_mode) { - case NORMAL_LAYOUT: - quicksearch_set_button(GTK_BUTTON(quicksearch->search_description), - "dialog-information-symbolic", _("_Information")); - quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), NULL, _("E_dit")); - quicksearch_set_button(GTK_BUTTON(quicksearch->clear_search), "edit-clear-symbolic", _("C_lear")); - break; - case VERTICAL_LAYOUT: - quicksearch_set_button(GTK_BUTTON(quicksearch->search_description), "dialog-information-symbolic", ""); - quicksearch_set_button(GTK_BUTTON(quicksearch->search_condition_expression), NULL, _("E_dit")); - quicksearch_set_button(GTK_BUTTON(quicksearch->clear_search), "edit-clear-symbolic", ""); - break; - } -} - -GtkWidget *quicksearch_get_widget(QuickSearch *quicksearch) -{ - return quicksearch->hbox_search; -} - -GtkWidget *quicksearch_get_entry(QuickSearch *quicksearch) -{ - return gtk_bin_get_child(GTK_BIN(quicksearch->search_string_entry)); -} - -void quicksearch_show(QuickSearch *quicksearch) -{ - gint active_type; - MainWindow *mainwin = mainwindow_get_mainwindow(); - gtk_widget_show(quicksearch->hbox_search); - update_extended_buttons(quicksearch); - gtk_widget_grab_focus(quicksearch->search_string_entry); - - if (!mainwin || !mainwin->summaryview) { - return; - } - - active_type = prefs_common_get_prefs()->summary_quicksearch_type; - quicksearch_set_type(quicksearch, active_type); -} - -void quicksearch_hide(QuickSearch *quicksearch) -{ - if (quicksearch_has_sat_predicate(quicksearch)) { - quicksearch_set(quicksearch, prefs_common.summary_quicksearch_type, ""); - quicksearch_set_active(quicksearch, FALSE); - } - gtk_widget_hide(quicksearch->hbox_search); -} - -/* - *\brief Sets the matchstring. - * - *\param quicksearch quicksearch to set - *\param matchstring the match string; it is duplicated, not stored - */ -static void quicksearch_set_matchstring(QuickSearch *quicksearch, - const gchar *matchstring) -{ - g_free(quicksearch->request.matchstring); - quicksearch->request.matchstring = g_strdup(matchstring); -} - -void quicksearch_set(QuickSearch *quicksearch, AdvancedSearchType type, const gchar *matchstring) -{ - quicksearch_set_type(quicksearch, type); - select_correct_combobox_menuitem(quicksearch); - - if (!matchstring || !(*matchstring)) - quicksearch->in_typing = FALSE; - - quicksearch_set_matchstring(quicksearch, matchstring); - - g_signal_handlers_block_by_func(G_OBJECT(gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry)))), - G_CALLBACK(searchbar_changed_cb), quicksearch); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry)))), - matchstring); - g_signal_handlers_unblock_by_func(G_OBJECT(gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry)))), - G_CALLBACK(searchbar_changed_cb), quicksearch); - - prefs_common.summary_quicksearch_type = type; - - quicksearch_invoke_execute(quicksearch, FALSE); -} - -gboolean quicksearch_has_sat_predicate(QuickSearch *quicksearch) -{ - return quicksearch->active && advsearch_has_proper_predicate(quicksearch->asearch); -} - -static void quicksearch_set_active(QuickSearch *quicksearch, gboolean active) -{ - gboolean error = FALSE; - - quicksearch->active = active; - - if (active && - (prefs_common.summary_quicksearch_type == ADVANCED_SEARCH_EXTENDED - && !advsearch_has_proper_predicate(quicksearch->asearch))) - error = TRUE; - - if (active) { - gtk_widget_modify_base( - gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry))), - GTK_STATE_NORMAL, error ? &qs_error_bgcolor : &qs_active_bgcolor); - gtk_widget_modify_text( - gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry))), - GTK_STATE_NORMAL, error ? &qs_error_color : &qs_active_color); - } else { - gtk_widget_modify_base( - gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry))), - GTK_STATE_NORMAL, NULL); - gtk_widget_modify_text( - gtk_bin_get_child(GTK_BIN((quicksearch->search_string_entry))), - GTK_STATE_NORMAL, NULL); - } - - if (!active) { - advsearch_abort(quicksearch->asearch); - } -} - -void quicksearch_set_execute_callback(QuickSearch *quicksearch, - QuickSearchExecuteCallback callback, - gpointer data) -{ - quicksearch->callback = callback; - quicksearch->callback_data = data; -} - -static void quicksearch_set_running(QuickSearch *quicksearch, gboolean run) -{ - quicksearch->running = run; -} - -gboolean quicksearch_is_running(QuickSearch *quicksearch) -{ - return quicksearch->running; -} - -gboolean quicksearch_is_in_typing(QuickSearch *quicksearch) -{ - return quicksearch->in_typing; -} - -void quicksearch_set_search_strings(QuickSearch *quicksearch) -{ - GList *strings = prefs_common.summary_quicksearch_history; - gchar *newstr = NULL; - MatcherList *matcher_list = NULL; - - if (!strings) - return; - - matcher_parser_disable_warnings(TRUE); - - do { - newstr = advsearch_expand_search_string((gchar *) strings->data); - if (newstr && newstr[0] != '\0') { - if (!strchr(newstr, ' ')) { - quicksearch->normal_search_strings = - g_list_append( - quicksearch->normal_search_strings, - g_strdup(strings->data)); - } else { - matcher_list = matcher_parser_get_cond(newstr, FALSE); - - if (matcher_list) { - quicksearch->extended_search_strings = - g_list_prepend( - quicksearch->extended_search_strings, - g_strdup(strings->data)); - matcherlist_free(matcher_list); - } else - quicksearch->normal_search_strings = - g_list_prepend( - quicksearch->normal_search_strings, - g_strdup(strings->data)); - } - } - g_free(newstr); - - } while ((strings = g_list_next(strings)) != NULL); - - matcher_parser_disable_warnings(FALSE); - - quicksearch->normal_search_strings = g_list_reverse(quicksearch->normal_search_strings); - quicksearch->extended_search_strings = g_list_reverse(quicksearch->extended_search_strings); - - quicksearch_set_popdown_strings(quicksearch); -} blob - a4d9079f09db3fadf9de9325418c842300a64b0e (mode 644) blob + /dev/null --- src/gtk/quicksearch.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Colin Leroy - * and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef QUICKSEARCH_H -#define QUICKSEARCH_H 1 - -#include "advsearch.h" - -typedef struct _QuickSearch QuickSearch; -typedef void (*QuickSearchExecuteCallback) (QuickSearch *quicksearch, gpointer data); - -#include "procmsg.h" - -QuickSearch *quicksearch_new(); -GtkWidget *quicksearch_get_widget(QuickSearch *quicksearch); -GtkWidget *quicksearch_get_entry(QuickSearch *quicksearch); -void quicksearch_show(QuickSearch *quicksearch); -void quicksearch_hide(QuickSearch *quicksearch); -void quicksearch_set(QuickSearch *quicksearch, AdvancedSearchType type, const gchar *matchstring); -void quicksearch_set_recursive(QuickSearch *quicksearch, gboolean recursive); -gboolean quicksearch_has_sat_predicate(QuickSearch *quicksearch); -void quicksearch_set_execute_callback(QuickSearch *quicksearch, - QuickSearchExecuteCallback callback, - gpointer data); -void quicksearch_set_on_progress_cb(QuickSearch* search, - gboolean (*cb)(gpointer data, guint at, guint matched, guint total), gpointer data); - -gboolean quicksearch_run_on_folder(QuickSearch* quicksearch, FolderItem *folderItem, MsgInfoList **result); - -gboolean quicksearch_is_running(QuickSearch *quicksearch); -gboolean quicksearch_has_focus(QuickSearch *quicksearch); -gboolean quicksearch_is_fast(QuickSearch *quicksearch); -gboolean quicksearch_is_in_typing(QuickSearch *quicksearch); -void quicksearch_relayout(QuickSearch *quicksearch); -void quicksearch_set_search_strings(QuickSearch *quicksearch); -#endif /* QUICKSEARCH_H */ blob - 770e5a0d5e1f01aee61d06ecd4f6b467c81ba74a blob + 0dfecab1c2342a29928dd0d3a68f5ca8a5e75462 --- src/imap.c +++ src/imap.c @@ -38,13 +38,9 @@ #include #include #include -#if HAVE_ICONV -# include -#endif +#include -#ifdef USE_GNUTLS -# include "ssl.h" -#endif +#include "ssl.h" #include "folder.h" #include "session.h" @@ -61,15 +57,13 @@ #include "claws.h" #include "statusbar.h" #include "msgcache.h" -#include "imap-thread.h" +#include "etpan/imap-thread.h" #include "account.h" #include "tags.h" #include "main.h" #include "passwordstore.h" #include "file-utils.h" -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif typedef struct _IMAPFolder IMAPFolder; typedef struct _IMAPSession IMAPSession; @@ -144,9 +138,7 @@ struct _IMAPNameSpace #define IMAP4_PORT 143 -#ifdef USE_GNUTLS #define IMAPS_PORT 993 -#endif #define IMAP_CMD_LIMIT 1000 @@ -218,14 +210,6 @@ static gint imap_copy_msgs (Folder *folder, MsgInfoList *msglist, GHashTable *relation); -static gint search_msgs (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data); - static gint imap_remove_msg (Folder *folder, FolderItem *item, gint uid); @@ -341,9 +325,7 @@ static gint imap_cmd_login (IMAPSession *session, const gchar *pass, const gchar *type); static gint imap_cmd_noop (IMAPSession *session); -#ifdef USE_GNUTLS static gint imap_cmd_starttls (IMAPSession *session); -#endif static gint imap_cmd_select (IMAPSession *session, const gchar *folder, gint *exists, @@ -450,7 +432,6 @@ FolderClass *imap_get_class(void) imap_class.type = F_IMAP; imap_class.idstr = "imap"; imap_class.uistr = "IMAP"; - imap_class.supports_server_search = TRUE; /* Folder functions */ imap_class.new_folder = imap_folder_new; @@ -482,7 +463,6 @@ FolderClass *imap_get_class(void) imap_class.add_msgs = imap_add_msgs; imap_class.copy_msg = imap_copy_msg; imap_class.copy_msgs = imap_copy_msgs; - imap_class.search_msgs = search_msgs; imap_class.remove_msg = imap_remove_msg; imap_class.remove_msgs = imap_remove_msgs; imap_class.expunge = imap_expunge; @@ -730,11 +710,9 @@ static void imap_handle_error(Session *session, const case MAILIMAP_ERROR_SASL: MY_LOG_WARNING(g_strconcat(_("IMAP error on %s:"), " ", _("SASL error"), "\n", NULL), session_server) break; -#ifdef USE_GNUTLS case MAILIMAP_ERROR_SSL: MY_LOG_WARNING(g_strconcat(_("IMAP error on %s:"), " ", _("TLS error"), "\n", NULL), session_server) break; -#endif default: MY_LOG_WARNING(g_strconcat(_("IMAP error on %s:"), " ", _("Unknown error [%d]"), "\n", NULL), session_server, libetpan_errcode) @@ -898,11 +876,9 @@ static gint imap_auth(IMAPSession *session, const gcha case IMAP_AUTH_PLAIN: ok = imap_cmd_login(session, user, pass, "PLAIN"); break; -#ifdef USE_GNUTLS case IMAP_AUTH_OAUTH2: ok = imap_cmd_login(session, user, pass, "XOAUTH2"); break; -#endif case IMAP_AUTH_LOGIN: ok = imap_cmd_login(session, user, pass, "LOGIN"); break; @@ -921,9 +897,7 @@ static gint imap_auth(IMAPSession *session, const gcha "\t SCRAM-SHA-384 %d\n" "\t SCRAM-SHA-512 %d\n" "\t PLAIN %d\n" -#ifdef USE_GNUTLS "\t OAUTH2 %d\n" -#endif "\t LOGIN %d\n" "\t GSSAPI %d\n", imap_has_capability(session, "ANONYMOUS"), @@ -933,9 +907,7 @@ static gint imap_auth(IMAPSession *session, const gcha imap_has_capability(session, "SCRAM-SHA-384"), imap_has_capability(session, "SCRAM-SHA-512"), imap_has_capability(session, "PLAIN"), -#ifdef USE_GNUTLS imap_has_capability(session, "XOAUTH2"), -#endif imap_has_capability(session, "LOGIN"), imap_has_capability(session, "GSSAPI")); if (ok == MAILIMAP_ERROR_LOGIN && imap_has_capability(session, "SCRAM-SHA-512")) @@ -956,10 +928,8 @@ static gint imap_auth(IMAPSession *session, const gcha ok = imap_cmd_login(session, user, pass, "GSSAPI"); if (ok == MAILIMAP_ERROR_LOGIN) /* we always try plaintext login before giving up */ ok = imap_cmd_login(session, user, pass, "plaintext"); -#ifdef USE_GNUTLS if (ok == MAILIMAP_ERROR_LOGIN && imap_has_capability(session, "XOAUTH2")) ok = imap_cmd_login(session, user, pass, "XOAUTH2"); -#endif } if (ok == MAILIMAP_NO_ERROR) @@ -1006,12 +976,10 @@ static gint imap_auth(IMAPSession *session, const gcha "compiled with SASL support and the " "LOGIN SASL plugin is installed."); } -#ifdef USE_GNUTLS if (type == IMAP_AUTH_OAUTH2) { ext_info = _("\n\nOAuth2 error. Check and correct your OAuth2 " "account preferences."); } -#endif if (time(NULL) - last_login_err > 10) { if (prefs_common.show_recv_err_dialog) { alertpanel_error_log(_("Connection to %s failed: " @@ -1176,29 +1144,11 @@ static IMAPSession *imap_session_new(Folder * folder, int authenticated = FALSE; gchar *buf; -#ifdef USE_GNUTLS - /* FIXME: IMAP over SSL only... */ SSLType ssl_type; port = account->set_imapport ? account->imapport : account->ssl_imap == SSL_TUNNEL ? IMAPS_PORT : IMAP4_PORT; ssl_type = account->ssl_imap; -#else - if (account->ssl_imap != SSL_NONE) { - if (alertpanel_full(_("Insecure connection"), - _("This connection is configured to be secured " - "using TLS, but TLS is not available " - "in this build of Claws Mail. \n\n" - "Do you want to continue connecting to this " - "server? The communication would not be " - "secure."), - NULL, _("_Cancel"), NULL, _("Con_tinue connecting"), NULL, NULL, - ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING) != G_ALERTALTERNATE) - return NULL; - } - port = account->set_imapport ? account->imapport - : IMAP4_PORT; -#endif imap_init(folder); IMAP_FOLDER(folder)->max_set_size = account->imap_batch_size; @@ -1231,11 +1181,9 @@ static IMAPSession *imap_session_new(Folder * folder, authenticated = FALSE; } else { -#ifdef USE_GNUTLS if (r == MAILIMAP_ERROR_SSL) log_error(LOG_PROTOCOL, _("TLS handshake failed\n")); else -#endif imap_handle_error(NULL, account->recv_server, r); if(prefs_common.show_recv_err_dialog) { @@ -1267,7 +1215,6 @@ static IMAPSession *imap_session_new(Folder * folder, session->folder = folder; IMAP_FOLDER(session->folder)->last_seen_separator = 0; -#ifdef USE_GNUTLS if (account->ssl_imap == SSL_STARTTLS) { gint ok; @@ -1287,7 +1234,6 @@ static IMAPSession *imap_session_new(Folder * folder, session->cmd_count = 1; } SESSION(session)->use_tls_sni = account->use_tls_sni; -#endif log_message(LOG_PROTOCOL, "IMAP connection is %s-authenticated\n", (session->authenticated) ? "pre" : "un"); @@ -1304,10 +1250,8 @@ static gint imap_session_authenticate(IMAPSession *ses gboolean failed = FALSE; gint ok = MAILIMAP_NO_ERROR; g_return_val_if_fail(account->userid != NULL, MAILIMAP_ERROR_BAD_STATE); -#ifdef USE_OAUTH2 if(account->imap_auth_type == IMAP_AUTH_OAUTH2) oauth2_check_passwds (account); -#endif if (!password_get(account->userid, account->recv_server, "imap", SESSION(session)->port, &acc_pass)) { acc_pass = passwd_store_get_account(account->account_id, @@ -2014,426 +1958,6 @@ static gint imap_copy_msgs(Folder *folder, FolderItem return ret; } -static gboolean imap_matcher_type_is_local(gint matchertype) -{ - switch (matchertype) { - case MATCHCRITERIA_FROM: - case MATCHCRITERIA_TO: - case MATCHCRITERIA_CC: - case MATCHCRITERIA_TO_OR_CC: - case MATCHCRITERIA_SUBJECT: - case MATCHCRITERIA_REFERENCES: - case MATCHCRITERIA_MESSAGEID: - case MATCHCRITERIA_INREPLYTO: - case MATCHCRITERIA_AGE_GREATER: - case MATCHCRITERIA_AGE_LOWER: - case MATCHCRITERIA_FORWARDED: - case MATCHCRITERIA_SPAM: - case MATCHCRITERIA_UNREAD: - case MATCHCRITERIA_NEW: - case MATCHCRITERIA_MARKED: - case MATCHCRITERIA_REPLIED: - case MATCHCRITERIA_DELETED: - case MATCHCRITERIA_SIZE_GREATER: - case MATCHCRITERIA_SIZE_SMALLER: - case MATCHCRITERIA_SIZE_EQUAL: - return TRUE; - } - return FALSE; -} - -static IMAPSearchKey* search_make_key(MatcherProp* match, gboolean* is_all) -{ - if (match->matchtype == MATCHTYPE_MATCHCASE || match->matchtype == MATCHTYPE_MATCH) { - IMAPSearchKey* result = NULL; - gboolean invert = FALSE; - gint matchertype = match->criteria; - - if (is_all) { - *is_all = FALSE; - } - - switch (matchertype) { - case MATCHCRITERIA_NOT_NEW: invert = TRUE; matchertype = MATCHCRITERIA_NEW; break; - case MATCHCRITERIA_NOT_MARKED: invert = TRUE; matchertype = MATCHCRITERIA_MARKED; break; - case MATCHCRITERIA_NOT_FORWARDED: invert = TRUE; matchertype = MATCHCRITERIA_FORWARDED; break; - case MATCHCRITERIA_NOT_SPAM: invert = TRUE; matchertype = MATCHCRITERIA_SPAM; break; - case MATCHCRITERIA_NOT_SUBJECT: invert = TRUE; matchertype = MATCHCRITERIA_SUBJECT; break; - case MATCHCRITERIA_NOT_FROM: invert = TRUE; matchertype = MATCHCRITERIA_FROM; break; - case MATCHCRITERIA_NOT_TO: invert = TRUE; matchertype = MATCHCRITERIA_TO; break; - case MATCHCRITERIA_NOT_CC: invert = TRUE; matchertype = MATCHCRITERIA_CC; break; - case MATCHCRITERIA_NOT_REFERENCES: invert = TRUE; matchertype = MATCHCRITERIA_REFERENCES; break; - case MATCHCRITERIA_NOT_HEADER: invert = TRUE; matchertype = MATCHCRITERIA_HEADER; break; - case MATCHCRITERIA_NOT_TAG: invert = TRUE; matchertype = MATCHCRITERIA_TAG; break; - case MATCHCRITERIA_NOT_HEADERS_PART: invert = TRUE; matchertype = MATCHCRITERIA_HEADERS_PART; break; - case MATCHCRITERIA_NOT_HEADERS_CONT: invert = TRUE; matchertype = MATCHCRITERIA_HEADERS_CONT; break; - case MATCHCRITERIA_NOT_MESSAGE: invert = TRUE; matchertype = MATCHCRITERIA_MESSAGE; break; - case MATCHCRITERIA_NOT_BODY_PART: invert = TRUE; matchertype = MATCHCRITERIA_BODY_PART; break; - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: invert = TRUE; matchertype = MATCHCRITERIA_TO_OR_CC; break; - case MATCHCRITERIA_NOT_MESSAGEID: invert = TRUE; matchertype = MATCHCRITERIA_MESSAGEID; break; - case MATCHCRITERIA_NOT_INREPLYTO: invert = TRUE; matchertype = MATCHCRITERIA_INREPLYTO; break; - } - - /* - * this aborts conversion even for predicates understood by the following code. - * while that might seem wasteful, claws local search for information listed below - * has proven faster than IMAP search plus network roundtrips. once this changes, - * consider removing these exceptions. - */ - if (imap_matcher_type_is_local(matchertype)) - return NULL; - - /* the Message-ID header is also cached */ - if (matchertype == MATCHCRITERIA_HEADER && g_strcmp0("Message-ID", match->header) == 0) { - return NULL; - } - - switch (matchertype) { - case MATCHCRITERIA_FORWARDED: - result = imap_search_new(IMAP_SEARCH_CRITERIA_TAG, NULL, RTAG_FORWARDED, 0); - break; - - case MATCHCRITERIA_SPAM: - result = imap_search_new(IMAP_SEARCH_CRITERIA_TAG, NULL, RTAG_JUNK, 0); - break; - - case MATCHCRITERIA_MESSAGEID: - result = imap_search_new(IMAP_SEARCH_CRITERIA_HEADER, "Message-ID", match->expr, 0); - break; - - case MATCHCRITERIA_INREPLYTO: - result = imap_search_new(IMAP_SEARCH_CRITERIA_HEADER, "In-Reply-To", match->expr, 0); - break; - - case MATCHCRITERIA_REFERENCES: - result = imap_search_new(IMAP_SEARCH_CRITERIA_HEADER, "References", match->expr, 0); - break; - - case MATCHCRITERIA_TO_OR_CC: - result = imap_search_or( - imap_search_new(IMAP_SEARCH_CRITERIA_TO, NULL, match->expr, 0), - imap_search_new(IMAP_SEARCH_CRITERIA_CC, NULL, match->expr, 0) - ); - break; - - case MATCHCRITERIA_HEADERS_PART: - case MATCHCRITERIA_HEADERS_CONT: - result = imap_search_and( - imap_search_not(imap_search_new(IMAP_SEARCH_CRITERIA_BODY, NULL, match->expr, 0)), - imap_search_new(IMAP_SEARCH_CRITERIA_MESSAGE, NULL, match->expr, 0) - ); - break; - - case MATCHCRITERIA_SIZE_EQUAL: - result = imap_search_and( - imap_search_not(imap_search_new(IMAP_SEARCH_CRITERIA_SIZE_SMALLER, NULL, NULL, match->value)), - imap_search_not(imap_search_new(IMAP_SEARCH_CRITERIA_SIZE_GREATER, NULL, NULL, match->value)) - ); - break; - - case MATCHCRITERIA_NOT_UNREAD: - result = imap_search_new(IMAP_SEARCH_CRITERIA_READ, NULL, NULL, 0); - break; - - case MATCHCRITERIA_UNREAD: - result = imap_search_new(IMAP_SEARCH_CRITERIA_UNREAD, NULL, NULL, 0); - break; - - case MATCHCRITERIA_NEW: - result = imap_search_new(IMAP_SEARCH_CRITERIA_NEW, NULL, NULL, 0); - break; - - case MATCHCRITERIA_MARKED: - result = imap_search_new(IMAP_SEARCH_CRITERIA_MARKED, NULL, NULL, 0); - break; - - case MATCHCRITERIA_DELETED: - result = imap_search_new(IMAP_SEARCH_CRITERIA_DELETED, NULL, NULL, 0); - break; - - case MATCHCRITERIA_REPLIED: - result = imap_search_new(IMAP_SEARCH_CRITERIA_REPLIED, NULL, NULL, 0); - break; - - case MATCHCRITERIA_TAG: - { - gchar *tmp = imap_utf8_to_modified_utf7(match->expr, TRUE); - result = imap_search_new(IMAP_SEARCH_CRITERIA_TAG, NULL, tmp, 0); - g_free(tmp); - } - break; - - case MATCHCRITERIA_SUBJECT: - result = imap_search_new(IMAP_SEARCH_CRITERIA_SUBJECT, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_FROM: - result = imap_search_new(IMAP_SEARCH_CRITERIA_FROM, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_TO: - result = imap_search_new(IMAP_SEARCH_CRITERIA_TO, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_CC: - result = imap_search_new(IMAP_SEARCH_CRITERIA_CC, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_AGE_GREATER: - result = imap_search_new(IMAP_SEARCH_CRITERIA_AGE_GREATER, NULL, NULL, match->value); - break; - - case MATCHCRITERIA_AGE_LOWER: - result = imap_search_new(IMAP_SEARCH_CRITERIA_AGE_LOWER, NULL, NULL, match->value); - break; - - case MATCHCRITERIA_BODY_PART: - result = imap_search_new(IMAP_SEARCH_CRITERIA_BODY, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_MESSAGE: - result = imap_search_new(IMAP_SEARCH_CRITERIA_MESSAGE, NULL, match->expr, 0); - break; - - case MATCHCRITERIA_HEADER: - result = imap_search_new(IMAP_SEARCH_CRITERIA_HEADER, match->header, match->expr, 0); - break; - - case MATCHCRITERIA_SIZE_GREATER: - result = imap_search_new(IMAP_SEARCH_CRITERIA_SIZE_GREATER, NULL, NULL, match->value); - break; - - case MATCHCRITERIA_SIZE_SMALLER: - result = imap_search_new(IMAP_SEARCH_CRITERIA_SIZE_SMALLER, NULL, NULL, match->value); - break; - - default: - result = imap_search_new(IMAP_SEARCH_CRITERIA_ALL, NULL, NULL, 0); - if (is_all) { - *is_all = TRUE; - } - break; - } - - if (invert) { - result = imap_search_not(result); - if (is_all && *is_all) { - *is_all = FALSE; - } - } - - return result; - } - - return NULL; -} - -static void imap_change_search_charset(IMAPFolder *folder) -{ - /* If server supports charset in searches, but the last used one failed, - * changed to the next preferred charset. If none are still available, - * disable charset searches. - * Charsets are tried in the following order: - * UTF-8, locale's charset, UTF-7. - */ - - if (folder->search_charset_supported) { - if (folder->search_charset && !strcmp(folder->search_charset, conv_get_locale_charset_str_no_utf8())) - folder->search_charset = "UTF-8"; - else if (folder->search_charset && !strcmp(folder->search_charset, "UTF-8")) - folder->search_charset = "UTF-7"; - else { - folder->search_charset = NULL; - folder->search_charset_supported = FALSE; - } - } -} - -static MatcherProp *imap_matcher_prop_set_charset(IMAPFolder *folder, - MatcherProp *utf8_prop, - gchar **charset) -{ - /* If the match is going to be done locally, or the criteria is on - * tag (special-cased to modified-UTF-7), or the expression searched - * is ASCII, don't bother converting. - */ - if (imap_matcher_type_is_local(utf8_prop->criteria) - || utf8_prop->criteria == MATCHCRITERIA_TAG - || utf8_prop->criteria == MATCHCRITERIA_NOT_TAG - || utf8_prop->expr == NULL - || is_ascii_str(utf8_prop->expr)) - return matcherprop_new(utf8_prop->criteria, - utf8_prop->header, - utf8_prop->matchtype, - utf8_prop->expr, - utf8_prop->value); - else { - gchar *conv_expr = NULL; - - /* If the search is server-side and the server doesn't support - * searching with the charsets we handle, bail out. - */ - if (folder->search_charset_supported == FALSE) - return NULL; - - /* Else, convert. */ - if (*charset == NULL) - *charset = g_strdup(folder->search_charset); - - conv_expr = conv_codeset_strdup(utf8_prop->expr, CS_UTF_8, *charset); - - if (conv_expr == NULL) - conv_expr = g_strdup(utf8_prop->expr); - - return matcherprop_new(utf8_prop->criteria, - utf8_prop->header, - utf8_prop->matchtype, - conv_expr, - utf8_prop->value); - } -} - -static gint search_msgs (Folder *folder, - FolderItem *container, - MsgNumberList **msgs, - gboolean *on_server, - MatcherList *predicate, - SearchProgressNotify progress_cb, - gpointer progress_data) -{ - IMAPSearchKey* key = NULL; - GSList* cur; - int result = -1; - clist* uidlist = NULL; - gboolean server_filtering_useless = FALSE; - IMAPSession *session; - gchar *charset_to_use = NULL; - - if (on_server == NULL || !*on_server) { - return folder_item_search_msgs_local(folder, container, msgs, on_server, - predicate, progress_cb, progress_data); - } - - for (cur = predicate->matchers; cur != NULL; cur = cur->next) { - IMAPSearchKey* matcherPart = NULL; - MatcherProp* prop = (MatcherProp*) cur->data; - gboolean is_all; - MatcherProp *imap_prop = imap_matcher_prop_set_charset(IMAP_FOLDER(folder), prop, &charset_to_use); - - if (imap_prop == NULL) { - /* Couldn't convert matcherprop to IMAP - probably not ascii - * and server doesn't support the charsets we do. */ - return -1; - } - - matcherPart = search_make_key(imap_prop, &is_all); - - matcherprop_free(imap_prop); - - if (on_server) { - *on_server &= matcherPart != NULL && prop->matchtype == MATCHTYPE_MATCHCASE; - } - - if (matcherPart) { - if (key == NULL) { - key = matcherPart; - server_filtering_useless = is_all; - } else if (predicate->bool_and) { - key = imap_search_and(key, matcherPart); - server_filtering_useless &= is_all; - } else { - key = imap_search_or(key, matcherPart); - server_filtering_useless |= is_all; - } - } - } - - if (server_filtering_useless) { - imap_search_free(key); - key = NULL; - } - - if (key == NULL && progress_cb != NULL) { - GSList* cur; - GSList* list; - int count = 0; - - progress_cb(progress_data, TRUE, 0, 0, container->total_msgs); - progress_cb(progress_data, TRUE, container->total_msgs, 0, container->total_msgs); - - list = folder_item_get_msg_list(container); - for (cur = list; cur != NULL; cur = cur->next) { - *msgs = g_slist_prepend(*msgs, GUINT_TO_POINTER(((MsgInfo*) cur->data)->msgnum)); - count++; - } - procmsg_msg_list_free(list); - - *msgs = g_slist_reverse(*msgs); - - return count; - } - - session = imap_session_get(folder); - if (!session) { - return -1; - } - result = imap_select(session, IMAP_FOLDER(folder), FOLDER_ITEM(container), - NULL, NULL, NULL, NULL, NULL, TRUE); - if (result != MAILIMAP_NO_ERROR) - return -1; - - if (progress_cb) - progress_cb(progress_data, TRUE, 0, 0, container->total_msgs); - result = imap_threaded_search(folder, IMAP_SEARCH_TYPE_KEYED, key, charset_to_use, NULL, &uidlist); - if (progress_cb) - progress_cb(progress_data, TRUE, container->total_msgs, 0, container->total_msgs); - - if (result == MAILIMAP_ERROR_PROTOCOL) { - debug_print("Server side search unavailable, using local search\n"); - imap_handle_error(SESSION(session), NULL, result); - result = folder_item_search_msgs_local(folder, container, msgs, NULL, - predicate, progress_cb, progress_data); - if (result < 0) { - debug_print("search_msgs - got protocol error, aborting\n"); - alertpanel_error_log(_("Search failed due to server error.")); - return -1; - } - - return result; - } - - if (result == MAILIMAP_NO_ERROR) { - gint result = 0; - - *msgs = imap_uid_list_from_lep(uidlist, &result); - - mailimap_search_result_free(uidlist); - - if (charset_to_use != NULL) - g_free(charset_to_use); - - return result; - } else if (charset_to_use != NULL) { - /* If search failed and was on an 8-bit string, try the next - * available charset to search if there still are some. - */ - g_free(charset_to_use); - - imap_change_search_charset(IMAP_FOLDER(folder)); - if (IMAP_FOLDER(folder)->search_charset_supported) - return search_msgs(folder, container, msgs, on_server, predicate, - progress_cb, progress_data); - else { - imap_handle_error(SESSION(session), NULL, result); - return -1; - } - } else { - imap_handle_error(SESSION(session), NULL, result); - return -1; - } -} - - static gint imap_do_remove_msgs(Folder *folder, FolderItem *dest, MsgInfoList *msglist, GHashTable *relation) { @@ -3962,7 +3486,6 @@ static gint imap_cmd_login(IMAPSession *session, if (!strcmp(type, "plaintext") && imap_has_capability(session, "LOGINDISABLED")) { ok = MAILIMAP_ERROR_BAD_STATE; if (imap_has_capability(session, "STARTTLS")) { -#ifdef USE_GNUTLS log_warning(LOG_PROTOCOL, _("Server requires STARTTLS to log in.\n")); ok = imap_cmd_starttls(session); if (ok != MAILIMAP_NO_ERROR) { @@ -3977,14 +3500,6 @@ static gint imap_cmd_login(IMAPSession *session, return r; } } -#else - log_error(LOG_PROTOCOL, _("Connection to %s failed: " - "server requires STARTTLS, but Claws Mail " - "has been compiled without STARTTLS " - "support.\n"), - SESSION(session)->server); - return MAILIMAP_ERROR_LOGIN; -#endif } else { log_error(LOG_PROTOCOL, _("Server logins are disabled.\n")); return MAILIMAP_ERROR_LOGIN; @@ -4046,7 +3561,6 @@ static gint imap_cmd_noop(IMAPSession *session) return MAILIMAP_NO_ERROR; } -#ifdef USE_GNUTLS static gint imap_cmd_starttls(IMAPSession *session) { int r; @@ -4060,7 +3574,6 @@ static gint imap_cmd_starttls(IMAPSession *session) } return MAILIMAP_NO_ERROR; } -#endif static gint imap_cmd_select(IMAPSession *session, const gchar *folder, gint *exists, gint *recent, gint *unseen, blob - 5bd18da1bd4c06fc4b725e11c900aab17e54001a blob + b19236b23063d3be6534e51caea4bbebf1d776ff --- src/inc.c +++ src/inc.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include @@ -60,9 +55,7 @@ #include "hooks.h" #include "logwindow.h" #include "passwordstore.h" -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif static GList *inc_dialog_list = NULL; @@ -549,14 +542,9 @@ static void inc_session_destroy(IncSession *session) static gint pop3_get_port(Pop3Session *pop3_session) { -#ifdef USE_GNUTLS return pop3_session->ac_prefs->set_popport ? pop3_session->ac_prefs->popport : pop3_session->ac_prefs->ssl_pop == SSL_TUNNEL ? 995 : 110; -#else - return pop3_session->ac_prefs->set_popport ? - pop3_session->ac_prefs->popport : 110; -#endif } static gint inc_start(IncProgressDialog *inc_dialog) @@ -583,11 +571,10 @@ static gint inc_start(IncProgressDialog *inc_dialog) manage_window_focus_in (inc_dialog->dialog->window, NULL, NULL); -#ifdef USE_OAUTH2 + if(pop3_session->ac_prefs->use_pop_auth && pop3_session->ac_prefs->pop_auth_type == POPAUTH_OAUTH2) oauth2_check_passwds (pop3_session->ac_prefs); -#endif if (password_get(pop3_session->user, pop3_session->ac_prefs->recv_server, @@ -793,25 +780,10 @@ static IncState inc_pop3_session_do(IncSession *sessio account_name = ac->account_name; port = pop3_get_port(pop3_session); -#ifdef USE_GNUTLS SESSION(pop3_session)->ssl_type = ac->ssl_pop; if (ac->ssl_pop != SSL_NONE) SESSION(pop3_session)->nonblocking = ac->use_nonblocking_ssl; -#else - if (ac->ssl_pop != SSL_NONE) { - if (alertpanel_full(_("Insecure connection"), - _("This connection is configured to be secured " - "using TLS, but TLS is not available " - "in this build of Claws Mail. \n\n" - "Do you want to continue connecting to this " - "server? The communication would not be " - "secure."), - NULL, _("_Cancel"), NULL, _("Con_tinue connecting"), NULL, NULL, - ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING) != G_ALERTALTERNATE) - return INC_CANCEL; - } -#endif buf = g_strdup_printf(_("Account '%s': Connecting to POP3 server: %s:%d..."), account_name, server, port); blob - bfa64dceab1deb374671d8ce60c47a2caf79a38d blob + c7c879dec8d039e71d0ccb47979469b02911b315 --- src/inc.h +++ src/inc.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef __INC_H__ @@ -27,7 +27,7 @@ #include #include "mainwindow.h" -#include "progressdialog.h" +#include "gtk/progressdialog.h" #include "prefs_account.h" #include "session.h" #include "pop.h" blob - ceeb89750af1aa00bd750dd6fd666c7b918882fa blob + d538b199d205852908403d3cf40e813f56727c99 --- src/localfolder.c +++ src/localfolder.c @@ -17,8 +17,6 @@ * */ -#include "config.h" - #include #include "folder.h" blob - 731f5f65a2fb8bf2309241cef64564d1f34ccd8d blob + 41a8cb9425926796583bc46093dfc1925c44ce7e --- src/main.c +++ src/main.c @@ -16,13 +16,8 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif +#include "common/defs.h" -#include "defs.h" - #include #include #include @@ -56,7 +51,6 @@ #include "prefs_ext_prog.h" #include "prefs_message.h" #include "prefs_receive.h" -#include "prefs_quote.h" #include "prefs_summaries.h" #include "prefs_themes.h" #include "prefs_other.h" @@ -88,21 +82,14 @@ #include "matcher.h" #include "hooks.h" #include "menu.h" -#include "quicksearch.h" -#include "advsearch.h" #include "avatars.h" #include "passwordstore.h" #include "file-utils.h" - -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif -#include "imap-thread.h" +#include "etpan/imap-thread.h" #include "stock_pixmap.h" -#ifdef USE_GNUTLS -# include "ssl.h" -#endif +#include "ssl.h" #include "version.h" @@ -352,18 +339,14 @@ static void main_dump_features_list(gboolean show_debu debug_print("Compiled-in features:\n"); else g_print("Compiled-in features:\n"); -#if USE_GNUTLS if (show_debug_only) debug_print(" GnuTLS\n"); else g_print(" GnuTLS\n"); -#endif -#if HAVE_ICONV if (show_debug_only) debug_print(" iconv\n"); else g_print(" iconv\n"); -#endif if (show_debug_only) debug_print(" libetpan %d.%d\n", LIBETPAN_VERSION_MAJOR, LIBETPAN_VERSION_MINOR); else @@ -424,7 +407,7 @@ int main(int argc, char *argv[]) CHDIR_RETURN_VAL_IF_FAIL(get_home_dir(), 1); if (!is_dir_exist(get_rc_dir())) { - if (copy_dir(SYSCONFDIR "/skel/.claws-mail", get_rc_dir()) < 0) { + if (copy_dir("/etc/skel/.claws-mail", get_rc_dir()) < 0) { if (!is_dir_exist(get_rc_dir()) && make_dir(get_rc_dir()) < 0) { exit(1); } @@ -476,13 +459,11 @@ int main(int argc, char *argv[]) prefs_ext_prog_init(); prefs_wrapping_init(); prefs_compose_writing_init(); - prefs_quote_init(); prefs_summaries_init(); prefs_message_init(); prefs_other_init(); prefs_receive_init(); prefs_send_init(); - matcher_init(); codeconv_set_allow_jisx0201_kana(prefs_common.allow_jisx0201_kana); codeconv_set_broken_are_utf8(prefs_common.broken_are_utf8); @@ -518,9 +499,7 @@ int main(int argc, char *argv[]) prefs_account_init(); account_read_config_all(); -#ifdef USE_OAUTH2 account_read_oauth2_all(); -#endif imap_main_init(prefs_common.skip_ssl_cert_check); imap_main_set_timeout(prefs_common.io_timeout_secs); @@ -561,9 +540,6 @@ int main(int argc, char *argv[]) folder_set_missing_folders(); folderview_set(folderview); - prefs_matcher_read_config(); - quicksearch_set_search_strings(mainwin->summaryview->quicksearch); - /* make one all-folder processing before using claws */ main_window_cursor_wait(mainwin); folder_func_to_all_folders(initial_processing, (gpointer *)mainwin); @@ -592,11 +568,6 @@ int main(int argc, char *argv[]) num_folder_class = g_list_length(folder_get_list()); - if (g_list_length(folder_get_list()) != num_folder_class) { - debug_print("new folders loaded, reloading processing rules\n"); - prefs_matcher_read_config(); - } - if (never_ran) { prefs_common_write_config(); } @@ -767,7 +738,6 @@ static void exit_claws(MainWindow *mainwin) main_window_destroy_all(); - matcher_done(); prefs_toolbar_done(); avatars_done(); @@ -776,7 +746,6 @@ static void exit_claws(MainWindow *mainwin) prefs_ext_prog_done(); prefs_wrapping_done(); prefs_compose_writing_done(); - prefs_quote_done(); prefs_summaries_done(); prefs_message_done(); prefs_other_done(); @@ -1077,7 +1046,6 @@ static void parse_cmd_opt(int argc, char *argv[]) g_print("%s\n", _(" --help -h display this help")); g_print("%s\n", _(" --version -v output version information")); g_print("%s\n", _(" --version-full -V output version and built-in features information")); - g_print("%s\n", _(" --config-dir output configuration directory")); g_print("%s\n", _(" --alternate-config-dir directory\n" " use specified configuration directory")); g_print("%s\n", _(" --geometry -geometry [WxH][+X+Y]\n" @@ -1085,9 +1053,6 @@ static void parse_cmd_opt(int argc, char *argv[]) g_free(base); exit(1); - } else if (!strcmp(argv[i], "--config-dir")) { - g_print(RC_DIR "\n"); - exit(0); } else if (!strcmp(argv[i], "--alternate-config-dir")) { if (i+1 < argc) { set_rc_dir(argv[i+1]); @@ -1645,84 +1610,6 @@ static void lock_socket_input_cb(gpointer data, } else if (!STRNCMP(buf, "import ")) { const gchar *mbox_file = buf + 7; mainwindow_import_mbox(mbox_file); - } else if (!STRNCMP(buf, "search ")) { - FolderItem* folderItem = NULL; - GSList *messages = NULL; - gchar *folder_name = NULL; - gchar *request = NULL; - AdvancedSearch *search; - gboolean recursive; - AdvancedSearchType searchType = ADVANCED_SEARCH_EXTENDED; - - search = advsearch_new(); - - folder_name = g_strdup(buf+7); - strretchomp(folder_name); - - if (fd_gets(sock, buf, sizeof(buf) - 1) <= 0) - goto search_exit; - buf[sizeof(buf) - 1] = '\0'; - - switch (toupper(buf[0])) { - case 'S': searchType = ADVANCED_SEARCH_SUBJECT; break; - case 'F': searchType = ADVANCED_SEARCH_FROM; break; - case 'T': searchType = ADVANCED_SEARCH_TO; break; - case 'M': searchType = ADVANCED_SEARCH_MIXED; break; - case 'G': searchType = ADVANCED_SEARCH_TAG; break; - case 'E': searchType = ADVANCED_SEARCH_EXTENDED; break; - } - - if (fd_gets(sock, buf, sizeof(buf) - 1) <= 0) - goto search_exit; - - buf[sizeof(buf) - 1] = '\0'; - request = g_strdup(buf); - strretchomp(request); - - recursive = TRUE; - if (fd_gets(sock, buf, sizeof(buf) - 1) > 0) - recursive = buf[0] != '0'; - - buf[sizeof(buf) - 1] = '\0'; - - debug_print("search: %s %i %s %i\n", folder_name, searchType, request, recursive); - - folderItem = folder_find_item_from_identifier(folder_name); - - if (folderItem == NULL) { - debug_print("Unknown folder item : '%s', searching folder\n",folder_name); - Folder* folder = folder_find_from_path(folder_name); - if (folder != NULL) - folderItem = FOLDER_ITEM(folder->node->data); - else - debug_print("Unknown folder: '%s'\n",folder_name); - } else { - debug_print("%s %s\n",folderItem->name, folderItem->path); - } - - if (folderItem != NULL) { - advsearch_set(search, searchType, request); - advsearch_search_msgs_in_folders(search, &messages, folderItem, recursive); - } else { - g_print("Folder '%s' not found.\n'", folder_name); - } - - GSList *cur; - for (cur = messages; cur != NULL; cur = cur->next) { - MsgInfo* msg = (MsgInfo *)cur->data; - gchar *file = procmsg_get_message_file_path(msg); - CM_FD_WRITE_ALL(file); - CM_FD_WRITE_ALL("\n"); - g_free(file); - } - CM_FD_WRITE_ALL(".\n"); - -search_exit: - g_free(folder_name); - g_free(request); - advsearch_free(search); - if (messages != NULL) - procmsg_msg_list_free(messages); } else if (!STRNCMP(buf, "exit")) { if (prefs_common.clean_on_exit && !prefs_common.ask_on_clean) { procmsg_empty_all_trash(); blob - a1421a05256375dcaf86186a103d9a295b9b0b65 blob + 5f56a0496b38d7a369d2d6f60104d27b9a68b995 --- src/mainwindow.c +++ src/mainwindow.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include @@ -31,9 +30,7 @@ #include "folderview.h" #include "folder_item_prefs.h" #include "foldersel.h" -#include "quicksearch.h" #include "summaryview.h" -#include "summary_search.h" #include "messageview.h" #include "mimeview.h" #include "message_search.h" @@ -137,8 +134,6 @@ static void app_exit_cb (GtkAction *action, static void search_cb (GtkAction *action, gpointer data); -static void search_folder_cb (GtkAction *action, - gpointer data); static void toggle_message_cb (GtkAction *action, gpointer data); @@ -375,8 +370,6 @@ static void mailing_list_compose(GtkWidget *w, gpointe static void mailing_list_open_uri(GtkWidget *w, gpointer *data); -static void mainwindow_quicksearch (GtkAction *action, - gpointer data); static gboolean any_folder_want_synchronise(void); static void save_part_as_cb(GtkAction *action, gpointer data); @@ -458,8 +451,6 @@ static GtkActionEntry mainwin_entries[] = {"Edit/SelectThread", NULL, N_("Select _thread"), NULL, NULL, G_CALLBACK(select_thread_cb) }, {"Edit/---", NULL, "---", NULL, NULL, NULL }, {"Edit/Find", NULL, N_("_Find in current message..."), "F", NULL, G_CALLBACK(search_cb) }, - {"Edit/SearchFolder", NULL, N_("_Search folder..."), "F", NULL, G_CALLBACK(search_folder_cb) }, - {"Edit/QuickSearch", NULL, N_("_Quick search"), "slash", NULL, G_CALLBACK(mainwindow_quicksearch) }, {"View/ShowHide", NULL, N_("Show or hi_de"), NULL, NULL, NULL }, {"View/ShowHide/Toolbar", NULL, N_("_Toolbar"), NULL, NULL, NULL }, @@ -840,17 +831,6 @@ static gboolean mainwindow_key_pressed (GtkWidget *wid if (!mainwin || !event) return FALSE; - if (quicksearch_has_focus(mainwin->summaryview->quicksearch)) - { - GtkWidget *entry = - quicksearch_get_entry(mainwin->summaryview->quicksearch); - gboolean handled; - g_signal_emit_by_name(entry, "key-press-event", event, &handled); - if (handled) { - return TRUE; - } - } - switch (event->keyval) { case GDK_KEY_Q: /* Quit */ BREAK_ON_MODIFIER_KEY(); @@ -1004,8 +984,6 @@ MainWindow *main_window_create() MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SelectThread", "Edit/SelectThread", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Separator1", "Edit/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "Find", "Edit/Find", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "SearchFolder", "Edit/SearchFolder", GTK_UI_MANAGER_MENUITEM) - MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/Edit", "QuickSearch", "Edit/QuickSearch", GTK_UI_MANAGER_MENUITEM) /* View menu */ MENUITEM_ADDUI_MANAGER(mainwin->ui_manager, "/Menu/View", "ShowHide", "View/ShowHide", GTK_UI_MANAGER_MENU) @@ -2332,8 +2310,6 @@ void main_window_set_menu_sensitive(MainWindow *mainwi SET_SENSITIVE("Menu/Edit/SelectThread", M_TARGET_EXIST, M_SUMMARY_ISLIST); SET_SENSITIVE("Menu/Edit/Find", M_SINGLE_TARGET_EXIST); - SET_SENSITIVE("Menu/Edit/QuickSearch", M_IN_MSGLIST); - SET_SENSITIVE("Menu/Edit/SearchFolder", M_TARGET_EXIST, M_SUMMARY_ISLIST); SET_SENSITIVE("Menu/View/SetColumns/Folderlist", M_UNLOCKED, M_SUMMARY_ISLIST); SET_SENSITIVE("Menu/View/Sort", M_EXEC, M_SUMMARY_ISLIST); @@ -2491,14 +2467,10 @@ void main_window_set_menu_sensitive(MainWindow *mainwi if (mainwin->summaryview->folder_item && !mainwin->summaryview->folder_item->threaded) cm_toggle_menu_set_active_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE); - if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) || - quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch)) + if (mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_msgs) cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadThreads", FALSE); - if ((mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) || - quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch)) + if (mainwin->summaryview->folder_item && mainwin->summaryview->folder_item->hide_read_threads) cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideReadMessages", FALSE); - if (quicksearch_has_sat_predicate(mainwin->summaryview->quicksearch)) - cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/HideDelMessages", FALSE); cm_menu_set_sensitive_full(mainwin->ui_manager, "Menu/View/Goto/PrevHistory", messageview_nav_has_prev(mainwin->messageview)); @@ -3077,20 +3049,6 @@ static void search_cb(GtkAction *action, gpointer data message_search(mainwin->messageview); } -static void search_folder_cb(GtkAction *action, gpointer data) -{ - MainWindow *mainwin = (MainWindow *)data; - FolderItem *item = mainwin->summaryview->folder_item; - cm_return_if_fail(item != NULL); - summary_search(mainwin->summaryview); -} - -static void mainwindow_quicksearch(GtkAction *action, gpointer data) -{ - MainWindow *mainwin = (MainWindow *)data; - summaryview_activate_quicksearch(mainwin->summaryview, TRUE); -} - static void toggle_message_cb(GtkAction *action, gpointer data) { MainWindow *mainwin = (MainWindow *)data; blob - 15a498895058cb8e3e9760a152ac2742005ea18a blob + f44f088425ad5df9156021c2a062bec978e6d0c6 --- src/mainwindow.h +++ src/mainwindow.h @@ -24,7 +24,7 @@ typedef struct _MainWindow MainWindow; #include "viewtypes.h" -#include "logwindow.h" +#include "gtk/logwindow.h" #include "procmsg.h" #include "toolbar.h" blob - 0b006273be5cf705a31f5710dfb24663ed010542 blob + 27207812435ea4ca1c34a8245405d5855c80852f --- src/manual.c +++ src/manual.c @@ -76,7 +76,7 @@ gboolean manual_available(ManualType type) switch (type) { case MANUAL_MANUAL_CLAWS: - dir = get_local_path_with_locale(MANUALDIR); + dir = get_local_path_with_locale("/dev/null"); // TODO: was MANUALDIR if (dir != NULL) { uri = g_strconcat(dir, G_DIR_SEPARATOR_S, MANUAL_HTML_INDEX, NULL); g_free(dir); @@ -101,7 +101,7 @@ void manual_open(ManualType type, gchar *url_anchor) switch (type) { case MANUAL_MANUAL_CLAWS: - dir = get_local_path_with_locale(MANUALDIR); + dir = get_local_path_with_locale("/dev/null"); // TODO: was MANUALDIR if (dir != NULL) { gchar *tmp_anchor = NULL; if (url_anchor && *url_anchor != '\0') blob - 57c5c8537c81317f51a4766c89a4a7f4a8f1be2d (mode 644) blob + /dev/null --- src/matcher.c +++ /dev/null @@ -1,2091 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2002-2023 by the Claws Mail Team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "defs.h" -#include "utils.h" -#include "procheader.h" -#include "matcher.h" -#include "matcher_parser.h" -#include "prefs_gtk.h" -#include "addr_compl.h" -#include "codeconv.h" -#include "quoted-printable.h" -#include "claws.h" -#include "prefs_common.h" -#include "log.h" -#include "tags.h" -#include "folder_item_prefs.h" -#include "procmsg.h" -#include "file-utils.h" - -/*! - *\brief Keyword lookup element - */ -struct _MatchParser { - gint id; /*!< keyword id */ - gchar *str; /*!< keyword */ -}; -typedef struct _MatchParser MatchParser; - -/*! - *\brief Table with strings and ids used by the lexer and - * the parser. New keywords can be added here. - */ -static const MatchParser matchparser_tab[] = { - /* msginfo flags */ - {MATCHCRITERIA_ALL, "all"}, - {MATCHCRITERIA_UNREAD, "unread"}, - {MATCHCRITERIA_NOT_UNREAD, "~unread"}, - {MATCHCRITERIA_NEW, "new"}, - {MATCHCRITERIA_NOT_NEW, "~new"}, - {MATCHCRITERIA_MARKED, "marked"}, - {MATCHCRITERIA_NOT_MARKED, "~marked"}, - {MATCHCRITERIA_DELETED, "deleted"}, - {MATCHCRITERIA_NOT_DELETED, "~deleted"}, - {MATCHCRITERIA_REPLIED, "replied"}, - {MATCHCRITERIA_NOT_REPLIED, "~replied"}, - {MATCHCRITERIA_FORWARDED, "forwarded"}, - {MATCHCRITERIA_NOT_FORWARDED, "~forwarded"}, - {MATCHCRITERIA_LOCKED, "locked"}, - {MATCHCRITERIA_NOT_LOCKED, "~locked"}, - {MATCHCRITERIA_IGNORE_THREAD, "ignore_thread"}, - {MATCHCRITERIA_NOT_IGNORE_THREAD, "~ignore_thread"}, - {MATCHCRITERIA_WATCH_THREAD, "watch_thread"}, - {MATCHCRITERIA_NOT_WATCH_THREAD, "~watch_thread"}, - {MATCHCRITERIA_SPAM, "spam"}, - {MATCHCRITERIA_NOT_SPAM, "~spam"}, - {MATCHCRITERIA_HAS_ATTACHMENT, "has_attachment"}, - {MATCHCRITERIA_HAS_NO_ATTACHMENT, "~has_attachment"}, - {MATCHCRITERIA_SIGNED, "signed"}, - {MATCHCRITERIA_NOT_SIGNED, "~signed"}, - - /* msginfo headers */ - {MATCHCRITERIA_SUBJECT, "subject"}, - {MATCHCRITERIA_NOT_SUBJECT, "~subject"}, - {MATCHCRITERIA_FROM, "from"}, - {MATCHCRITERIA_NOT_FROM, "~from"}, - {MATCHCRITERIA_TO, "to"}, - {MATCHCRITERIA_NOT_TO, "~to"}, - {MATCHCRITERIA_CC, "cc"}, - {MATCHCRITERIA_NOT_CC, "~cc"}, - {MATCHCRITERIA_TO_OR_CC, "to_or_cc"}, - {MATCHCRITERIA_NOT_TO_AND_NOT_CC, "~to_or_cc"}, - {MATCHCRITERIA_TAG, "tag"}, - {MATCHCRITERIA_NOT_TAG, "~tag"}, - {MATCHCRITERIA_TAGGED, "tagged"}, - {MATCHCRITERIA_NOT_TAGGED, "~tagged"}, - {MATCHCRITERIA_AGE_GREATER, "age_greater"}, - {MATCHCRITERIA_AGE_LOWER, "age_lower"}, - {MATCHCRITERIA_AGE_GREATER_HOURS, "age_greater_hours"}, - {MATCHCRITERIA_AGE_LOWER_HOURS, "age_lower_hours"}, - {MATCHCRITERIA_DATE_AFTER, "date_after"}, - {MATCHCRITERIA_DATE_BEFORE, "date_before"}, - {MATCHCRITERIA_MESSAGEID, "messageid"}, - {MATCHCRITERIA_NOT_MESSAGEID, "~messageid"}, - {MATCHCRITERIA_INREPLYTO, "inreplyto"}, - {MATCHCRITERIA_NOT_INREPLYTO, "~inreplyto"}, - {MATCHCRITERIA_REFERENCES, "references"}, - {MATCHCRITERIA_NOT_REFERENCES, "~references"}, - {MATCHCRITERIA_SCORE_GREATER, "score_greater"}, - {MATCHCRITERIA_SCORE_LOWER, "score_lower"}, - {MATCHCRITERIA_SCORE_EQUAL, "score_equal"}, - {MATCHCRITERIA_PARTIAL, "partial"}, - {MATCHCRITERIA_NOT_PARTIAL, "~partial"}, - {MATCHCRITERIA_FOUND_IN_ADDRESSBOOK, "found_in_addressbook"}, - {MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK, "~found_in_addressbook"}, - - {MATCHCRITERIA_SIZE_GREATER, "size_greater"}, - {MATCHCRITERIA_SIZE_SMALLER, "size_smaller"}, - {MATCHCRITERIA_SIZE_EQUAL, "size_equal"}, - - /* content have to be read */ - {MATCHCRITERIA_HEADER, "header"}, - {MATCHCRITERIA_NOT_HEADER, "~header"}, - {MATCHCRITERIA_HEADERS_PART, "headers_part"}, - {MATCHCRITERIA_NOT_HEADERS_PART, "~headers_part"}, - {MATCHCRITERIA_HEADERS_CONT, "headers_cont"}, - {MATCHCRITERIA_NOT_HEADERS_CONT, "~headers_cont"}, - {MATCHCRITERIA_MESSAGE, "message"}, - {MATCHCRITERIA_NOT_MESSAGE, "~message"}, - {MATCHCRITERIA_BODY_PART, "body_part"}, - {MATCHCRITERIA_NOT_BODY_PART, "~body_part"}, - {MATCHCRITERIA_TEST, "test"}, - {MATCHCRITERIA_NOT_TEST, "~test"}, - - /* match type */ - {MATCHTYPE_MATCHCASE, "matchcase"}, - {MATCHTYPE_MATCH, "match"}, - {MATCHTYPE_REGEXPCASE, "regexpcase"}, - {MATCHTYPE_REGEXP, "regexp"}, - - /* actions */ - {MATCHACTION_SCORE, "score"}, /* for backward compatibility */ - {MATCHACTION_MOVE, "move"}, - {MATCHACTION_COPY, "copy"}, - {MATCHACTION_DELETE, "delete"}, - {MATCHACTION_MARK, "mark"}, - {MATCHACTION_UNMARK, "unmark"}, - {MATCHACTION_LOCK, "lock"}, - {MATCHACTION_UNLOCK, "unlock"}, - {MATCHACTION_MARK_AS_READ, "mark_as_read"}, - {MATCHACTION_MARK_AS_UNREAD, "mark_as_unread"}, - {MATCHACTION_FORWARD, "forward"}, - {MATCHACTION_FORWARD_AS_ATTACHMENT, "forward_as_attachment"}, - {MATCHACTION_EXECUTE, "execute"}, - {MATCHACTION_COLOR, "color"}, - {MATCHACTION_REDIRECT, "redirect"}, - {MATCHACTION_CHANGE_SCORE, "change_score"}, - {MATCHACTION_SET_SCORE, "set_score"}, - {MATCHACTION_STOP, "stop"}, - {MATCHACTION_HIDE, "hide"}, - {MATCHACTION_IGNORE, "ignore"}, - {MATCHACTION_WATCH, "watch"}, - {MATCHACTION_ADD_TO_ADDRESSBOOK, "add_to_addressbook"}, - {MATCHACTION_SET_TAG, "set_tag"}, - {MATCHACTION_UNSET_TAG, "unset_tag"}, - {MATCHACTION_CLEAR_TAGS, "clear_tags"}, -}; - -enum { - MATCH_ANY = 0, - MATCH_ALL = 1, - MATCH_ONE = 2 -}; - -enum { - CONTEXT_SUBJECT, - CONTEXT_FROM, - CONTEXT_TO, - CONTEXT_CC, - CONTEXT_NEWSGROUPS, - CONTEXT_MESSAGEID, - CONTEXT_IN_REPLY_TO, - CONTEXT_REFERENCES, - CONTEXT_HEADER, - CONTEXT_HEADER_LINE, - CONTEXT_BODY_LINE, - CONTEXT_TAG, - N_CONTEXT_STRS -}; - -static gchar *context_str[N_CONTEXT_STRS]; - -void matcher_init(void) -{ - if (context_str[CONTEXT_SUBJECT] != NULL) - return; - - context_str[CONTEXT_SUBJECT] = g_strdup_printf(_("%s header"), "Subject:"); - context_str[CONTEXT_FROM] = g_strdup_printf(_("%s header"), "From:"); - context_str[CONTEXT_TO] = g_strdup_printf(_("%s header"), "To:"); - context_str[CONTEXT_CC] = g_strdup_printf(_("%s header"), "Cc:"); - context_str[CONTEXT_NEWSGROUPS] = g_strdup_printf(_("%s header"), "Newsgroups:"); - context_str[CONTEXT_MESSAGEID] = g_strdup_printf(_("%s header"), "Message-ID:"); - context_str[CONTEXT_IN_REPLY_TO] = g_strdup_printf(_("%s header"), "In-Reply-To:"); - context_str[CONTEXT_REFERENCES] = g_strdup_printf(_("%s header"), "References:"); - context_str[CONTEXT_HEADER] = g_strdup(_("header")); - context_str[CONTEXT_HEADER_LINE] = g_strdup(_("header line")); - context_str[CONTEXT_BODY_LINE] = g_strdup(_("body line")); - context_str[CONTEXT_TAG] = g_strdup(_("tag")); -} - -void matcher_done(void) -{ - int i; - for (i = 0; i < N_CONTEXT_STRS; i++) { - g_free(context_str[i]); - context_str[i] = NULL; - } -} - -extern gboolean debug_filtering_session; - -/*! - *\brief Look up table with keywords defined in \sa matchparser_tab - */ -static GHashTable *matchparser_hashtab; - -/*! - *\brief Translate keyword id to keyword string - * - *\param id Id of keyword - * - *\return const gchar * Keyword - */ -const gchar *get_matchparser_tab_str(gint id) -{ - gint i; - - for (i = 0; i < sizeof matchparser_tab / sizeof matchparser_tab[0]; i++) { - if (matchparser_tab[i].id == id) - return matchparser_tab[i].str; - } - return NULL; -} - -/*! - *\brief Create keyword lookup table - */ -static void create_matchparser_hashtab(void) -{ - int i; - - if (matchparser_hashtab) return; - matchparser_hashtab = g_hash_table_new(g_str_hash, g_str_equal); - for (i = 0; i < sizeof matchparser_tab / sizeof matchparser_tab[0]; i++) - g_hash_table_insert(matchparser_hashtab, - matchparser_tab[i].str, - (gpointer) &matchparser_tab[i]); -} - -/*! - *\brief Return a keyword id from a keyword string - * - *\param str Keyword string - * - *\return gint Keyword id - */ -gint get_matchparser_tab_id(const gchar *str) -{ - MatchParser *res; - - if (NULL != (res = g_hash_table_lookup(matchparser_hashtab, str))) { - return res->id; - } else - return -1; -} - -/* **************** data structure allocation **************** */ - -/*! - *\brief Allocate a structure for a filtering / scoring - * "condition" (a matcher structure) - * - *\param criteria Criteria ID (MATCHCRITERIA_XXXX) - *\param header Header string (if criteria is MATCHCRITERIA_HEADER - or MATCHCRITERIA_FOUND_IN_ADDRESSBOOK) - *\param matchtype Type of action (MATCHTYPE_XXX) - *\param expr String value or expression to check - *\param value Integer value to check - * - *\return MatcherProp * Pointer to newly allocated structure - */ -MatcherProp *matcherprop_new(gint criteria, const gchar *header, - gint matchtype, const gchar *expr, - int value) -{ - MatcherProp *prop = g_new0(MatcherProp, 1); - - prop->criteria = criteria; - prop->matchtype = matchtype; - prop->value = value; - if (header) - prop->header = g_strdup(header); - if (expr) - prop->expr = g_strdup(expr); - return prop; -} - -/*! - *\brief Free a matcher structure - * - *\param prop Pointer to matcher structure allocated with - * #matcherprop_new - */ -void matcherprop_free(MatcherProp *prop) -{ - g_free(prop->expr); - g_free(prop->header); - if (prop->preg != NULL) { - regfree(prop->preg); - g_free(prop->preg); - } - g_free(prop->casefold_expr); - g_free(prop); -} - -/*! - *\brief Copy a matcher structure - * - *\param src Matcher structure to copy - * - *\return MatcherProp * Pointer to newly allocated matcher structure - */ -MatcherProp *matcherprop_copy(const MatcherProp *src) -{ - MatcherProp *prop = g_new0(MatcherProp, 1); - - prop->criteria = src->criteria; - prop->matchtype = src->matchtype; - prop->value = src->value; - prop->error = src->error; - if (src->header) - prop->header = g_strdup(src->header); - if (src->expr) - prop->expr = g_strdup(src->expr); - if (src->casefold_expr) - prop->casefold_expr = g_strdup(src->casefold_expr); - return prop; -} - -/* ************** match ******************************/ - -static gboolean match_with_addresses_in_addressbook - (MatcherProp *prop, GSList *address_list, gint type, - gchar* folderpath, gint match) -{ - GSList *walk = NULL; - gboolean found = FALSE; - gchar *path = NULL; - - cm_return_val_if_fail(address_list != NULL, FALSE); - - debug_print("match_with_addresses_in_addressbook(%d, %s)\n", - g_slist_length(address_list), folderpath?folderpath:"(null)"); - - if (folderpath == NULL || - strcasecmp(folderpath, "Any") == 0 || - *folderpath == '\0') - path = NULL; - else - path = folderpath; - - start_address_completion(path); - - for (walk = address_list; walk != NULL; walk = walk->next) { - /* exact matching of email address */ - guint num_addr = complete_address(walk->data); - found = FALSE; - if (num_addr > 1) { - /* skip first item (this is the search string itself) */ - int i = 1; - for (; i < num_addr && !found; i++) { - gchar *addr = get_complete_address(i); - extract_address(addr); - if (strcasecmp(addr, walk->data) == 0) { - found = TRUE; - } - g_free(addr); - } - } - g_free(walk->data); - - if (match == MATCH_ALL) { - /* if matching all addresses, stop if one doesn't match */ - if (!found) { - break; - } - } else if (match == MATCH_ANY) { - /* if matching any address, stop if one does match */ - if (found) { - break; - } - } - /* MATCH_ONE: there should be only one loop iteration */ - } - - end_address_completion(); - - return found; -} - -/*! - *\brief Find out if a string matches a condition - * - *\param prop Matcher structure - *\param str String to check - * - *\return gboolean TRUE if str matches the condition in the - * matcher structure - */ -static gboolean matcherprop_string_match(MatcherProp *prop, const gchar *str, - const gchar *debug_context) -{ - gchar *str1; - const gchar *down_expr; - gboolean ret = FALSE; - gboolean should_free = FALSE; - if (str == NULL) - return FALSE; - - if (prop->matchtype == MATCHTYPE_REGEXPCASE || - prop->matchtype == MATCHTYPE_MATCHCASE) { - str1 = g_utf8_casefold(str, -1); - if (!prop->casefold_expr) { - prop->casefold_expr = g_utf8_casefold(prop->expr, -1); - } - down_expr = prop->casefold_expr; - - should_free = TRUE; - } else { - str1 = (gchar *)str; - down_expr = (gchar *)prop->expr; - should_free = FALSE; - } - - switch (prop->matchtype) { - case MATCHTYPE_REGEXPCASE: - case MATCHTYPE_REGEXP: - if (!prop->preg && (prop->error == 0)) { - prop->preg = g_new0(regex_t, 1); - /* if regexp then don't use the escaped string */ - if (regcomp(prop->preg, down_expr, - REG_NOSUB | REG_EXTENDED - | ((prop->matchtype == MATCHTYPE_REGEXPCASE) - ? REG_ICASE : 0)) != 0) { - prop->error = 1; - regfree(prop->preg); - g_free(prop->preg); - prop->preg = NULL; - } - } - if (prop->preg == NULL) { - ret = FALSE; - goto free_strs; - } - - if (regexec(prop->preg, str1, 0, NULL, 0) == 0) - ret = TRUE; - else - ret = FALSE; - break; - case MATCHTYPE_MATCHCASE: - case MATCHTYPE_MATCH: - ret = (strstr(str1, down_expr) != NULL); - break; - default: - break; - } - -free_strs: - if (should_free) { - g_free(str1); - } - return ret; -} - -/*! - *\brief Find out if the string-ed list matches a condition - * - *\param prop Matcher structure - *\param list GSList of strings to check - * - *\return gboolean TRUE if str matches the condition in the - * matcher structure - */ -static gboolean matcherprop_list_match(MatcherProp *prop, const GSList *list, -const gchar *debug_context) -{ - const GSList *cur; - - for(cur = list; cur != NULL; cur = cur->next) { - if (matcherprop_string_match(prop, (gchar *)cur->data, debug_context)) - return TRUE; - } - return FALSE; -} - -static gboolean matcherprop_header_line_match(MatcherProp *prop, const gchar *hdr, - const gchar *str, const gboolean both, - const gchar *debug_context) -{ - gboolean res = FALSE; - - if (hdr == NULL || str == NULL) - return FALSE; - - if (both) { - /* Search in all header names and content. - */ - gchar *line = g_strdup_printf("%s %s", hdr, str); - res = matcherprop_string_match(prop, line, debug_context); - g_free(line); - } else { - /* Search only in content and exclude private headers. - * E.g.: searching for "H foo" in folder x/foo would return - * *all* mail as SCF and RMID will match. - * Searching for "H sent" would return all resent messages - * as "Resent-From: whatever" will match. - */ - if (procheader_header_is_internal(hdr)) - return FALSE; - res = matcherprop_string_match(prop, str, debug_context); - } - - return res; -} - -typedef struct _thread_data { - const gchar *cmd; - gboolean done; -} thread_data; - -static void *matcher_test_thread(void *data) -{ - thread_data *td = (thread_data *)data; - int result = -1; - - pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); - pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); - - result = system(td->cmd); - td->done = TRUE; /* let the caller thread join() */ - return GINT_TO_POINTER(result); -} - -/*! - *\brief Execute a command defined in the matcher structure - * - *\param prop Pointer to matcher structure - *\param info Pointer to message info structure - * - *\return gboolean TRUE if command was executed successfully - */ -static gboolean matcherprop_match_test(const MatcherProp *prop, - MsgInfo *info) -{ - gchar *file; - gchar *cmd; - gint retval; - pthread_t pt; - thread_data *td = g_new0(thread_data, 1); - void *res = NULL; - time_t start_time = time(NULL); - - file = procmsg_get_message_file(info); - if (file == NULL) { - g_free(td); - return FALSE; - } - g_free(file); - - cmd = matching_build_command(prop->expr, info); - if (cmd == NULL) { - g_free(td); - return FALSE; - } - - td->cmd = cmd; - td->done = FALSE; - if (pthread_create(&pt, NULL, matcher_test_thread, td) != 0) - retval = system(cmd); - else { - debug_print("waiting for test thread\n"); - while(!td->done) { - /* don't let the interface freeze while waiting */ - if (time(NULL) - start_time > 0) { - claws_do_idle(); - } - if (time(NULL) - start_time > 30) { - pthread_cancel(pt); - td->done = TRUE; - retval = -1; - } - } - pthread_join(pt, &res); - retval = GPOINTER_TO_INT(res); - debug_print(" test thread returned %d\n", retval); - } - g_free(td); - debug_print("Command exit code: %d\n", retval); - - g_free(cmd); - return (retval == 0); -} - -/*! - *\brief Check if a message matches the condition in a matcher - * structure. - * - *\param prop Pointer to matcher structure - *\param info Pointer to message info - * - *\return gboolean TRUE if a match - */ -static gboolean matcherprop_match(MatcherProp *prop, - MsgInfo *info) -{ - time_t t; - gint age; - gint age_mult_hours = 1; - - switch(prop->criteria) { - case MATCHCRITERIA_ALL: - return TRUE; - case MATCHCRITERIA_UNREAD: - return MSG_IS_UNREAD(info->flags); - case MATCHCRITERIA_NOT_UNREAD: - return !MSG_IS_UNREAD(info->flags); - case MATCHCRITERIA_NEW: - return MSG_IS_NEW(info->flags); - case MATCHCRITERIA_NOT_NEW: - return !MSG_IS_NEW(info->flags); - case MATCHCRITERIA_MARKED: - return MSG_IS_MARKED(info->flags); - case MATCHCRITERIA_NOT_MARKED: - return !MSG_IS_MARKED(info->flags); - case MATCHCRITERIA_DELETED: - return MSG_IS_DELETED(info->flags); - case MATCHCRITERIA_NOT_DELETED: - return !MSG_IS_DELETED(info->flags); - case MATCHCRITERIA_REPLIED: - return MSG_IS_REPLIED(info->flags); - case MATCHCRITERIA_NOT_REPLIED: - return !MSG_IS_REPLIED(info->flags); - case MATCHCRITERIA_FORWARDED: - return MSG_IS_FORWARDED(info->flags); - case MATCHCRITERIA_NOT_FORWARDED: - return !MSG_IS_FORWARDED(info->flags); - case MATCHCRITERIA_LOCKED: - return MSG_IS_LOCKED(info->flags); - case MATCHCRITERIA_NOT_LOCKED: - return !MSG_IS_LOCKED(info->flags); - case MATCHCRITERIA_SPAM: - return MSG_IS_SPAM(info->flags); - case MATCHCRITERIA_NOT_SPAM: - return !MSG_IS_SPAM(info->flags); - case MATCHCRITERIA_HAS_ATTACHMENT: - return MSG_IS_WITH_ATTACHMENT(info->flags); - case MATCHCRITERIA_HAS_NO_ATTACHMENT: - return !MSG_IS_WITH_ATTACHMENT(info->flags); - case MATCHCRITERIA_SIGNED: - return MSG_IS_SIGNED(info->flags); - case MATCHCRITERIA_NOT_SIGNED: - return !MSG_IS_SIGNED(info->flags); - case MATCHCRITERIA_IGNORE_THREAD: - return MSG_IS_IGNORE_THREAD(info->flags); - case MATCHCRITERIA_NOT_IGNORE_THREAD: - return !MSG_IS_IGNORE_THREAD(info->flags); - case MATCHCRITERIA_WATCH_THREAD: - return MSG_IS_WATCH_THREAD(info->flags); - case MATCHCRITERIA_NOT_WATCH_THREAD: - return !MSG_IS_WATCH_THREAD(info->flags); - case MATCHCRITERIA_SUBJECT: - return matcherprop_string_match(prop, info->subject, context_str[CONTEXT_SUBJECT]); - case MATCHCRITERIA_NOT_SUBJECT: - return !matcherprop_string_match(prop, info->subject, context_str[CONTEXT_SUBJECT]); - case MATCHCRITERIA_FROM: - return matcherprop_string_match(prop, info->from, context_str[CONTEXT_FROM]); - case MATCHCRITERIA_NOT_FROM: - return !matcherprop_string_match(prop, info->from, context_str[CONTEXT_FROM]); - case MATCHCRITERIA_TO: - return matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]); - case MATCHCRITERIA_NOT_TO: - return !matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]); - case MATCHCRITERIA_CC: - return matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]); - case MATCHCRITERIA_NOT_CC: - return !matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]); - case MATCHCRITERIA_TO_OR_CC: - return matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]) - || matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]); - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: - return !matcherprop_string_match(prop, info->to, context_str[CONTEXT_TO]) - && !matcherprop_string_match(prop, info->cc, context_str[CONTEXT_CC]); - case MATCHCRITERIA_AGE_GREATER: - age_mult_hours = 24; - /* Fallthrough intended */ - case MATCHCRITERIA_AGE_GREATER_HOURS: - t = time(NULL); - age = ((t - info->date_t) / (60 * 60 * age_mult_hours)); - return (age >= prop->value); - case MATCHCRITERIA_DATE_AFTER: - return prop->value < info->date_t; - case MATCHCRITERIA_AGE_LOWER: - age_mult_hours = 24; - /* Fallthrough intended */ - case MATCHCRITERIA_AGE_LOWER_HOURS: - t = time(NULL); - age = ((t - info->date_t) / (60 * 60 * age_mult_hours)); - return (age < prop->value); - case MATCHCRITERIA_DATE_BEFORE: - return prop->value > info->date_t; - case MATCHCRITERIA_SCORE_GREATER: - return (info->score > prop->value); - case MATCHCRITERIA_SCORE_LOWER: - return (info->score < prop->value); - case MATCHCRITERIA_SCORE_EQUAL: - return (info->score == prop->value); - case MATCHCRITERIA_SIZE_GREATER: - /* FIXME: info->size is a goffset */ - return (info->size > (goffset) prop->value); - case MATCHCRITERIA_SIZE_SMALLER: - /* FIXME: info->size is a goffset */ - return (info->size < (goffset) prop->value); - case MATCHCRITERIA_SIZE_EQUAL: - /* FIXME: info->size is a goffset */ - return (info->size == (goffset) prop->value); - case MATCHCRITERIA_PARTIAL: - /* FIXME: info->size is a goffset */ - return (info->total_size != 0 && info->size != (goffset)info->total_size); - case MATCHCRITERIA_NOT_PARTIAL: - /* FIXME: info->size is a goffset */ - return (info->total_size == 0 || info->size == (goffset)info->total_size); - case MATCHCRITERIA_MESSAGEID: - return matcherprop_string_match(prop, info->msgid, context_str[CONTEXT_MESSAGEID]); - case MATCHCRITERIA_NOT_MESSAGEID: - return !matcherprop_string_match(prop, info->msgid, context_str[CONTEXT_MESSAGEID]); - case MATCHCRITERIA_INREPLYTO: - return matcherprop_string_match(prop, info->inreplyto, context_str[CONTEXT_IN_REPLY_TO]); - case MATCHCRITERIA_NOT_INREPLYTO: - return !matcherprop_string_match(prop, info->inreplyto, context_str[CONTEXT_IN_REPLY_TO]); - case MATCHCRITERIA_REFERENCES: - return matcherprop_list_match(prop, info->references, context_str[CONTEXT_REFERENCES]); - case MATCHCRITERIA_NOT_REFERENCES: - return !matcherprop_list_match(prop, info->references, context_str[CONTEXT_REFERENCES]); - case MATCHCRITERIA_TEST: - return matcherprop_match_test(prop, info); - case MATCHCRITERIA_NOT_TEST: - return !matcherprop_match_test(prop, info); - default: - return FALSE; - } -} - -/* ********************* MatcherList *************************** */ - -/*! - *\brief Create a new list of matchers - * - *\param matchers List of matcher structures - *\param bool_and Operator - * - *\return MatcherList * New list - */ -MatcherList *matcherlist_new(GSList *matchers, gboolean bool_and) -{ - MatcherList *cond; - - cond = g_new0(MatcherList, 1); - - cond->matchers = matchers; - cond->bool_and = bool_and; - - return cond; -} - -#ifdef G_OS_UNIX -/*! - *\brief Builds a single regular expresion from an array of srings. - * - *\param strings The lines containing the different sub-regexp. - * - *\return The newly allocated regexp string. - */ -static gchar *build_complete_regexp(gchar **strings) -{ - int i = 0; - gchar *expr = NULL; - while (strings && strings[i] && *strings[i]) { - int old_len = expr ? strlen(expr):0; - int new_len = 0; - gchar *tmpstr = NULL; - - if (g_utf8_validate(strings[i], -1, NULL)) - tmpstr = g_strdup(strings[i]); - else - tmpstr = conv_codeset_strdup(strings[i], - conv_get_locale_charset_str_no_utf8(), - CS_INTERNAL); - - if (strstr(tmpstr, "\n")) - *(strstr(tmpstr, "\n")) = '\0'; - - new_len = strlen(tmpstr); - - expr = g_realloc(expr, - expr ? (old_len + strlen("|()") + new_len + 1) - : (strlen("()") + new_len + 1)); - - if (old_len) { - strcpy(expr + old_len, "|("); - strcpy(expr + old_len + 2, tmpstr); - strcpy(expr + old_len + 2 + new_len, ")"); - } else { - strcpy(expr+old_len, "("); - strcpy(expr+old_len + 1, tmpstr); - strcpy(expr+old_len + 1 + new_len, ")"); - } - g_free(tmpstr); - i++; - } - return expr; -} -#endif - -/*! - *\brief Create a new list of matchers from a multi-line string - * - *\param lines String with "\n"-separated expressions - *\param bool_and Operator - *\param case_sensitive If the matching is case sensitive or not - * - *\return MatcherList * New matcher list - */ -MatcherList *matcherlist_new_from_lines(gchar *lines, gboolean bool_and, - gboolean case_sensitive) -{ - MatcherProp *m = NULL; - GSList *matchers = NULL; - gchar **strings = g_strsplit(lines, "\n", -1); - -#ifdef G_OS_UNIX - gchar *expr = NULL; - expr = build_complete_regexp(strings); - debug_print("building matcherprop for expr '%s'\n", expr?expr:"NULL"); - - m = matcherprop_new(MATCHCRITERIA_SUBJECT, NULL, - case_sensitive? MATCHTYPE_REGEXP: MATCHTYPE_REGEXPCASE, - expr, 0); - if (m == NULL) { - /* print error message */ - debug_print("failed to allocate memory for matcherprop\n"); - } else { - matchers = g_slist_append(matchers, m); - } - - g_free(expr); -#else - int i = 0; - while (strings && strings[i] && *strings[i]) { - m = matcherprop_new(MATCHCRITERIA_SUBJECT, NULL, - case_sensitive? MATCHTYPE_MATCH: MATCHTYPE_MATCHCASE, - strings[i], 0); - if (m == NULL) { - /* print error message */ - debug_print("failed to allocate memory for matcherprop\n"); - } else { - matchers = g_slist_append(matchers, m); - } - i++; - } -#endif - g_strfreev(strings); - - return matcherlist_new(matchers, bool_and); -} - -/*! - *\brief Frees a list of matchers - * - *\param cond List of matchers - */ -void matcherlist_free(MatcherList *cond) -{ - GSList *l; - - cm_return_if_fail(cond); - for (l = cond->matchers ; l != NULL ; l = g_slist_next(l)) { - matcherprop_free((MatcherProp *) l->data); - } - g_slist_free(cond->matchers); - g_free(cond); -} - -/*! - *\brief Check if a header matches a matcher condition - * - *\param matcher Matcher structure to check header for - *\param buf Header name - * - *\return boolean TRUE if matching header - */ -static gboolean matcherprop_match_one_header(MatcherProp *matcher, - gchar *buf) -{ - gboolean result = FALSE; - Header *header = NULL; - - switch (matcher->criteria) { - case MATCHCRITERIA_HEADER: - case MATCHCRITERIA_NOT_HEADER: - header = procheader_parse_header(buf); - if (!header) - return FALSE; - if (procheader_headername_equal(header->name, - matcher->header)) { - if (matcher->criteria == MATCHCRITERIA_HEADER) - result = matcherprop_string_match(matcher, header->body, context_str[CONTEXT_HEADER]); - else - result = !matcherprop_string_match(matcher, header->body, context_str[CONTEXT_HEADER]); - procheader_header_free(header); - return result; - } - else { - procheader_header_free(header); - } - break; - case MATCHCRITERIA_HEADERS_PART: - case MATCHCRITERIA_HEADERS_CONT: - case MATCHCRITERIA_MESSAGE: - header = procheader_parse_header(buf); - if (!header) - return FALSE; - result = matcherprop_header_line_match(matcher, - header->name, header->body, - (matcher->criteria == MATCHCRITERIA_HEADERS_PART), - context_str[CONTEXT_HEADER_LINE]); - procheader_header_free(header); - return result; - case MATCHCRITERIA_NOT_HEADERS_CONT: - case MATCHCRITERIA_NOT_HEADERS_PART: - case MATCHCRITERIA_NOT_MESSAGE: - header = procheader_parse_header(buf); - if (!header) - return FALSE; - result = !matcherprop_header_line_match(matcher, - header->name, header->body, - (matcher->criteria == MATCHCRITERIA_NOT_HEADERS_PART), - context_str[CONTEXT_HEADER_LINE]); - procheader_header_free(header); - return result; - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - { - GSList *address_list = NULL; - gint match = MATCH_ONE; - gboolean found = FALSE; - - /* how many address headers are we trying to match? */ - if (strcasecmp(matcher->header, "Any") == 0) - match = MATCH_ANY; - else if (strcasecmp(matcher->header, "All") == 0) - match = MATCH_ALL; - - if (match == MATCH_ONE) { - /* matching one address header exactly, is that the right one? */ - header = procheader_parse_header(buf); - if (!header || - !procheader_headername_equal(header->name, matcher->header)) { - procheader_header_free(header); - return FALSE; - } - address_list = address_list_append(address_list, header->body); - if (address_list == NULL) { - procheader_header_free(header); - return FALSE; - } - procheader_header_free(header); - - } else { - header = procheader_parse_header(buf); - if (!header) - return FALSE; - /* address header is one of the headers we have to match when checking - for any address header or all address headers? */ - if (procheader_headername_equal(header->name, "From") || - procheader_headername_equal(header->name, "To") || - procheader_headername_equal(header->name, "Cc") || - procheader_headername_equal(header->name, "Reply-To") || - procheader_headername_equal(header->name, "Sender") || - procheader_headername_equal(header->name, "Resent-From") || - procheader_headername_equal(header->name, "Resent-To")) - address_list = address_list_append(address_list, header->body); - procheader_header_free(header); - if (address_list == NULL) - return FALSE; - } - - found = match_with_addresses_in_addressbook - (matcher, address_list, matcher->criteria, - matcher->expr, match); - g_slist_free(address_list); - - if (matcher->criteria == MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK) - return !found; - else - return found; - } - } - - return FALSE; -} - -/*! - *\brief Check if the matcher structure wants headers to - * be matched - * - *\param matcher Matcher structure - * - *\return gboolean TRUE if the matcher structure describes - * a header match condition - */ -static gboolean matcherprop_criteria_headers(const MatcherProp *matcher) -{ - switch (matcher->criteria) { - case MATCHCRITERIA_HEADER: - case MATCHCRITERIA_NOT_HEADER: - case MATCHCRITERIA_HEADERS_PART: - case MATCHCRITERIA_HEADERS_CONT: - case MATCHCRITERIA_NOT_HEADERS_PART: - case MATCHCRITERIA_NOT_HEADERS_CONT: - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - return TRUE; - default: - return FALSE; - } -} - -/*! - *\brief Check if the matcher structure wants the message - * to be matched (just perform an action on any - * message) - * - *\param matcher Matcher structure - * - *\return gboolean TRUE if matcher condition should match - * a message - */ -static gboolean matcherprop_criteria_message(MatcherProp *matcher) -{ - switch (matcher->criteria) { - case MATCHCRITERIA_MESSAGE: - case MATCHCRITERIA_NOT_MESSAGE: - return TRUE; - default: - return FALSE; - } -} - -/*! - *\brief Check if a list of conditions matches one header in - * a message file. - * - *\param matchers List of conditions - *\param fp Message file - * - *\return gboolean TRUE if one of the headers is matched by - * the list of conditions. - */ -static gboolean matcherlist_match_headers(MatcherList *matchers, FILE *fp) -{ - GSList *l; - gchar *buf = NULL; - gint ret; - - while ((ret = procheader_get_one_field(&buf, fp, NULL)) != -1) { - for (l = matchers->matchers ; l != NULL ; l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - gint match = MATCH_ANY; - - if (matcher->done) - continue; - - /* determine the match range (all, any are our concern here) */ - if (matcher->criteria == MATCHCRITERIA_NOT_HEADERS_PART || - matcher->criteria == MATCHCRITERIA_NOT_HEADERS_CONT || - matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) { - match = MATCH_ALL; - - } else if (matcher->criteria == MATCHCRITERIA_FOUND_IN_ADDRESSBOOK || - matcher->criteria == MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK) { - Header *header = NULL; - - /* address header is one of the headers we have to match when checking - for any address header or all address headers? */ - header = procheader_parse_header(buf); - if (header && - (procheader_headername_equal(header->name, "From") || - procheader_headername_equal(header->name, "To") || - procheader_headername_equal(header->name, "Cc") || - procheader_headername_equal(header->name, "Reply-To") || - procheader_headername_equal(header->name, "Sender") || - procheader_headername_equal(header->name, "Resent-From") || - procheader_headername_equal(header->name, "Resent-To"))) { - - if (strcasecmp(matcher->header, "Any") == 0) - match = MATCH_ANY; - else if (strcasecmp(matcher->header, "All") == 0) - match = MATCH_ALL; - else - match = MATCH_ONE; - } else { - if (!header) - continue; - /* matching one address header exactly, is that the right one? - further call to matcherprop_match_one_header() will tell us */ - } - procheader_header_free(header); - } - - /* ZERO line must NOT match for the rule to match. - */ - if (match == MATCH_ALL) { - if (matcherprop_match_one_header(matcher, buf)) { - matcher->result = TRUE; - } else { - matcher->result = FALSE; - matcher->done = TRUE; - } - /* else, just one line matching is enough for the rule to match - */ - } else if (matcherprop_criteria_headers(matcher) || - matcherprop_criteria_message(matcher)) { - if (matcherprop_match_one_header(matcher, buf)) { - matcher->result = TRUE; - matcher->done = TRUE; - } - } - - /* if the rule matched and the matchers are OR, no need to - * check the others */ - if (matcher->result && matcher->done) { - if (!matchers->bool_and) { - g_free(buf); - return TRUE; - } - } - } - g_free(buf); - buf = NULL; - } - - return FALSE; -} - -/*! - *\brief Check if a matcher wants to check the message body - * - *\param matcher Matcher structure - * - *\return gboolean TRUE if body must be matched. - */ -static gboolean matcherprop_criteria_body(const MatcherProp *matcher) -{ - switch (matcher->criteria) { - case MATCHCRITERIA_BODY_PART: - case MATCHCRITERIA_NOT_BODY_PART: - return TRUE; - default: - return FALSE; - } -} - -static gboolean matcherlist_match_binary_content(MatcherList *matchers, MimeInfo *partinfo) -{ - FILE *outfp; - gchar buf[BUFFSIZE]; - GSList *l; - - if (!partinfo || partinfo->type == MIMETYPE_TEXT) - return FALSE; - else - outfp = procmime_get_binary_content(partinfo); - - if (!outfp) - return FALSE; - - while (fgets(buf, sizeof(buf), outfp) != NULL) { - strretchomp(buf); - - for (l = matchers->matchers ; l != NULL ; l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - - if (matcher->done) - continue; - - /* Don't scan non-text parts when looking in body, only - * when looking in whole message - */ - if (matcher->criteria == MATCHCRITERIA_NOT_BODY_PART || - matcher->criteria == MATCHCRITERIA_BODY_PART) - continue; - - /* if the criteria is ~body_part or ~message, ZERO lines - * must match for the rule to match. - */ - if (matcher->criteria == MATCHCRITERIA_NOT_BODY_PART || - matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) { - if (matcherprop_string_match(matcher, buf, - context_str[CONTEXT_BODY_LINE])) { - matcher->result = FALSE; - matcher->done = TRUE; - } else - matcher->result = TRUE; - /* else, just one line has to match */ - } else if (matcherprop_criteria_body(matcher) || - matcherprop_criteria_message(matcher)) { - if (matcherprop_string_match(matcher, buf, - context_str[CONTEXT_BODY_LINE])) { - matcher->result = TRUE; - matcher->done = TRUE; - } - } - - /* if the matchers are OR'ed and the rule matched, - * no need to check the others. */ - if (matcher->result && matcher->done) { - if (!matchers->bool_and) { - fclose(outfp); - return TRUE; - } - } - } - } - - fclose(outfp); - return FALSE; -} - -static gboolean match_content_cb(const gchar *buf, gpointer data) -{ - MatcherList *matchers = (MatcherList *)data; - gboolean all_done = TRUE; - GSList *l; - - for (l = matchers->matchers ; l != NULL ; l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - - if (matcher->done) - continue; - - /* if the criteria is ~body_part or ~message, ZERO lines - * must match for the rule to match. - */ - if (matcher->criteria == MATCHCRITERIA_NOT_BODY_PART || - matcher->criteria == MATCHCRITERIA_NOT_MESSAGE) { - if (matcherprop_string_match(matcher, buf, - context_str[CONTEXT_BODY_LINE])) { - matcher->result = FALSE; - matcher->done = TRUE; - } else - matcher->result = TRUE; - /* else, just one line has to match */ - } else if (matcherprop_criteria_body(matcher) || - matcherprop_criteria_message(matcher)) { - if (matcherprop_string_match(matcher, buf, - context_str[CONTEXT_BODY_LINE])) { - matcher->result = TRUE; - matcher->done = TRUE; - } - } - - /* if the matchers are OR'ed and the rule matched, - * no need to check the others. */ - if (matcher->result && matcher->done) { - if (!matchers->bool_and) { - return TRUE; - } - } - - if (!matcher->done) - all_done = FALSE; - } - return all_done; -} - -static gboolean matcherlist_match_text_content(MatcherList *matchers, MimeInfo *partinfo) -{ - if (partinfo->type != MIMETYPE_TEXT) - return FALSE; - - return procmime_scan_text_content(partinfo, match_content_cb, matchers); -} - -/*! - *\brief Check if a line in a message file's body matches - * the criteria - * - *\param matchers List of conditions - *\param fp Message file - * - *\return gboolean TRUE if successful match - */ -static gboolean matcherlist_match_body(MatcherList *matchers, gboolean body_only, MsgInfo *info) -{ - MimeInfo *mimeinfo = NULL; - MimeInfo *partinfo = NULL; - gboolean first_text_found = FALSE; - - cm_return_val_if_fail(info != NULL, FALSE); - - mimeinfo = procmime_scan_message(info); - - /* Skip headers */ - partinfo = procmime_mimeinfo_next(mimeinfo); - - for (; partinfo != NULL; partinfo = procmime_mimeinfo_next(partinfo)) { - - if (partinfo->type != MIMETYPE_TEXT && body_only) - continue; - - if (partinfo->type == MIMETYPE_TEXT) { - first_text_found = TRUE; - if (matcherlist_match_text_content(matchers, partinfo)) { - procmime_mimeinfo_free_all(&mimeinfo); - return TRUE; - } - } else if (matcherlist_match_binary_content(matchers, partinfo)) { - procmime_mimeinfo_free_all(&mimeinfo); - return TRUE; - } - - if (body_only && first_text_found) - break; - } - procmime_mimeinfo_free_all(&mimeinfo); - - return FALSE; -} - -/*! - *\brief Check if a message file matches criteria - * - *\param matchers Criteria - *\param info Message info - *\param result Default result - * - *\return gboolean TRUE if matched - */ -static gboolean matcherlist_match_file(MatcherList *matchers, MsgInfo *info, - gboolean result) -{ - gboolean read_headers; - gboolean read_body; - gboolean body_only; - GSList *l; - FILE *fp; - gchar *file; - - /* file need to be read ? */ - - read_headers = FALSE; - read_body = FALSE; - body_only = TRUE; - for (l = matchers->matchers ; l != NULL ; l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - - if (matcherprop_criteria_headers(matcher)) - read_headers = TRUE; - if (matcherprop_criteria_body(matcher)) - read_body = TRUE; - if (matcherprop_criteria_message(matcher)) { - read_headers = TRUE; - read_body = TRUE; - body_only = FALSE; - } - matcher->result = FALSE; - matcher->done = FALSE; - } - - if (!read_headers && !read_body) - return result; - - file = procmsg_get_message_file_full(info, read_headers, read_body); - if (file == NULL) - return FALSE; - - if ((fp = g_fopen(file, "rb")) == NULL) { - FILE_OP_ERROR(file, "g_fopen"); - g_free(file); - return result; - } - - /* read the headers */ - - if (read_headers) { - if (matcherlist_match_headers(matchers, fp)) - read_body = FALSE; - } else { - procheader_skip_headers(fp); - } - - /* read the body */ - if (read_body) { - matcherlist_match_body(matchers, body_only, info); - } - - for (l = matchers->matchers; l != NULL; l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - - if (matcherprop_criteria_headers(matcher) || - matcherprop_criteria_body(matcher) || - matcherprop_criteria_message(matcher)) { - if (matcher->result) { - if (!matchers->bool_and) { - result = TRUE; - break; - } - } - else { - if (matchers->bool_and) { - result = FALSE; - break; - } - } - } - } - - g_free(file); - - fclose(fp); - - return result; -} - -/*! - *\brief Test list of conditions on a message. - * - *\param matchers List of conditions - *\param info Message info - * - *\return gboolean TRUE if matched - */ -gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info) -{ - GSList *l; - gboolean result; - - if (!matchers) - return FALSE; - - if (matchers->bool_and) - result = TRUE; - else - result = FALSE; - - /* test the cached elements */ - - for (l = matchers->matchers; l != NULL ;l = g_slist_next(l)) { - MatcherProp *matcher = (MatcherProp *) l->data; - - switch(matcher->criteria) { - case MATCHCRITERIA_ALL: - case MATCHCRITERIA_UNREAD: - case MATCHCRITERIA_NOT_UNREAD: - case MATCHCRITERIA_NEW: - case MATCHCRITERIA_NOT_NEW: - case MATCHCRITERIA_MARKED: - case MATCHCRITERIA_NOT_MARKED: - case MATCHCRITERIA_DELETED: - case MATCHCRITERIA_NOT_DELETED: - case MATCHCRITERIA_REPLIED: - case MATCHCRITERIA_NOT_REPLIED: - case MATCHCRITERIA_FORWARDED: - case MATCHCRITERIA_NOT_FORWARDED: - case MATCHCRITERIA_LOCKED: - case MATCHCRITERIA_NOT_LOCKED: - case MATCHCRITERIA_SPAM: - case MATCHCRITERIA_NOT_SPAM: - case MATCHCRITERIA_HAS_ATTACHMENT: - case MATCHCRITERIA_HAS_NO_ATTACHMENT: - case MATCHCRITERIA_SIGNED: - case MATCHCRITERIA_NOT_SIGNED: - case MATCHCRITERIA_IGNORE_THREAD: - case MATCHCRITERIA_NOT_IGNORE_THREAD: - case MATCHCRITERIA_WATCH_THREAD: - case MATCHCRITERIA_NOT_WATCH_THREAD: - case MATCHCRITERIA_SUBJECT: - case MATCHCRITERIA_NOT_SUBJECT: - case MATCHCRITERIA_FROM: - case MATCHCRITERIA_NOT_FROM: - case MATCHCRITERIA_TO: - case MATCHCRITERIA_NOT_TO: - case MATCHCRITERIA_CC: - case MATCHCRITERIA_NOT_CC: - case MATCHCRITERIA_TO_OR_CC: - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: - case MATCHCRITERIA_TAG: - case MATCHCRITERIA_NOT_TAG: - case MATCHCRITERIA_TAGGED: - case MATCHCRITERIA_NOT_TAGGED: - case MATCHCRITERIA_AGE_GREATER: - case MATCHCRITERIA_AGE_LOWER: - case MATCHCRITERIA_AGE_GREATER_HOURS: - case MATCHCRITERIA_AGE_LOWER_HOURS: - case MATCHCRITERIA_DATE_AFTER: - case MATCHCRITERIA_DATE_BEFORE: - case MATCHCRITERIA_NEWSGROUPS: - case MATCHCRITERIA_NOT_NEWSGROUPS: - case MATCHCRITERIA_MESSAGEID: - case MATCHCRITERIA_NOT_MESSAGEID: - case MATCHCRITERIA_INREPLYTO: - case MATCHCRITERIA_NOT_INREPLYTO: - case MATCHCRITERIA_REFERENCES: - case MATCHCRITERIA_NOT_REFERENCES: - case MATCHCRITERIA_SCORE_GREATER: - case MATCHCRITERIA_SCORE_LOWER: - case MATCHCRITERIA_SCORE_EQUAL: - case MATCHCRITERIA_SIZE_GREATER: - case MATCHCRITERIA_SIZE_SMALLER: - case MATCHCRITERIA_SIZE_EQUAL: - case MATCHCRITERIA_TEST: - case MATCHCRITERIA_NOT_TEST: - case MATCHCRITERIA_PARTIAL: - case MATCHCRITERIA_NOT_PARTIAL: - if (matcherprop_match(matcher, info)) { - if (!matchers->bool_and) { - return TRUE; - } - } - else { - if (matchers->bool_and) { - return FALSE; - } - } - } - } - - /* test the condition on the file */ - - if (matcherlist_match_file(matchers, info, result)) { - if (!matchers->bool_and) { - return TRUE; - } - } else { - if (matchers->bool_and) { - return FALSE; - } - } - return result; -} - - -static gint quote_filter_str(gchar * result, guint size, - const gchar * path) -{ - const gchar * p; - gchar * result_p; - guint remaining; - - result_p = result; - remaining = size; - - for(p = path ; * p != '\0' ; p ++) { - - if ((* p != '\"') && (* p != '\\')) { - if (remaining > 0) { - * result_p = * p; - result_p ++; - remaining --; - } - else { - result[size - 1] = '\0'; - return -1; - } - } - else { - if (remaining >= 2) { - * result_p = '\\'; - result_p ++; - * result_p = * p; - result_p ++; - remaining -= 2; - } - else { - result[size - 1] = '\0'; - return -1; - } - } - } - if (remaining > 0) { - * result_p = '\0'; - } - else { - result[size - 1] = '\0'; - return -1; - } - - return 0; -} - - -gchar * matcher_quote_str(const gchar * src) -{ - gchar * res; - gint len; - - len = strlen(src) * 2 + 1; - res = g_malloc(len); - quote_filter_str(res, len, src); - - return res; -} - -/*! - *\brief Convert a matcher structure to a string - * - *\param matcher Matcher structure - * - *\return gchar * Newly allocated string - */ -gchar *matcherprop_to_string(MatcherProp *matcher) -{ - gchar *matcher_str = NULL; - const gchar *criteria_str; - const gchar *matchtype_str; - int i; - gchar * quoted_expr; - gchar * quoted_header; - - criteria_str = NULL; - for (i = 0; i < (int) (sizeof(matchparser_tab) / sizeof(MatchParser)); i++) { - if (matchparser_tab[i].id == matcher->criteria) - criteria_str = matchparser_tab[i].str; - } - if (criteria_str == NULL) - return NULL; - - switch (matcher->criteria) { - case MATCHCRITERIA_AGE_GREATER: - case MATCHCRITERIA_AGE_LOWER: - case MATCHCRITERIA_AGE_GREATER_HOURS: - case MATCHCRITERIA_AGE_LOWER_HOURS: - case MATCHCRITERIA_SCORE_GREATER: - case MATCHCRITERIA_SCORE_LOWER: - case MATCHCRITERIA_SCORE_EQUAL: - case MATCHCRITERIA_SIZE_GREATER: - case MATCHCRITERIA_SIZE_SMALLER: - case MATCHCRITERIA_SIZE_EQUAL: - return g_strdup_printf("%s %i", criteria_str, matcher->value); - case MATCHCRITERIA_ALL: - case MATCHCRITERIA_UNREAD: - case MATCHCRITERIA_NOT_UNREAD: - case MATCHCRITERIA_NEW: - case MATCHCRITERIA_NOT_NEW: - case MATCHCRITERIA_MARKED: - case MATCHCRITERIA_NOT_MARKED: - case MATCHCRITERIA_DELETED: - case MATCHCRITERIA_NOT_DELETED: - case MATCHCRITERIA_REPLIED: - case MATCHCRITERIA_NOT_REPLIED: - case MATCHCRITERIA_FORWARDED: - case MATCHCRITERIA_NOT_FORWARDED: - case MATCHCRITERIA_LOCKED: - case MATCHCRITERIA_NOT_LOCKED: - case MATCHCRITERIA_SPAM: - case MATCHCRITERIA_NOT_SPAM: - case MATCHCRITERIA_HAS_ATTACHMENT: - case MATCHCRITERIA_HAS_NO_ATTACHMENT: - case MATCHCRITERIA_SIGNED: - case MATCHCRITERIA_NOT_SIGNED: - case MATCHCRITERIA_PARTIAL: - case MATCHCRITERIA_NOT_PARTIAL: - case MATCHCRITERIA_IGNORE_THREAD: - case MATCHCRITERIA_NOT_IGNORE_THREAD: - case MATCHCRITERIA_WATCH_THREAD: - case MATCHCRITERIA_NOT_WATCH_THREAD: - case MATCHCRITERIA_TAGGED: - case MATCHCRITERIA_NOT_TAGGED: - return g_strdup(criteria_str); - case MATCHCRITERIA_TEST: - case MATCHCRITERIA_NOT_TEST: - case MATCHCRITERIA_DATE_AFTER: - case MATCHCRITERIA_DATE_BEFORE: - quoted_expr = matcher_quote_str(matcher->expr); - matcher_str = g_strdup_printf("%s \"%s\"", - criteria_str, quoted_expr); - g_free(quoted_expr); - return matcher_str; - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - quoted_header = matcher_quote_str(matcher->header); - quoted_expr = matcher_quote_str(matcher->expr); - matcher_str = g_strdup_printf("%s \"%s\" in \"%s\"", - criteria_str, quoted_header, quoted_expr); - g_free(quoted_header); - g_free(quoted_expr); - return matcher_str; - } - - matchtype_str = NULL; - for (i = 0; i < sizeof matchparser_tab / sizeof matchparser_tab[0]; i++) { - if (matchparser_tab[i].id == matcher->matchtype) - matchtype_str = matchparser_tab[i].str; - } - - if (matchtype_str == NULL) - return NULL; - - switch (matcher->matchtype) { - case MATCHTYPE_MATCH: - case MATCHTYPE_MATCHCASE: - case MATCHTYPE_REGEXP: - case MATCHTYPE_REGEXPCASE: - quoted_expr = matcher_quote_str(matcher->expr); - if (matcher->header) { - quoted_header = matcher_quote_str(matcher->header); - matcher_str = g_strdup_printf - ("%s \"%s\" %s \"%s\"", - criteria_str, quoted_header, - matchtype_str, quoted_expr); - g_free(quoted_header); - } - else - matcher_str = g_strdup_printf - ("%s %s \"%s\"", criteria_str, - matchtype_str, quoted_expr); - g_free(quoted_expr); - break; - } - - return matcher_str; -} - -/*! - *\brief Convert a list of conditions to a string - * - *\param matchers List of conditions - * - *\return gchar * Newly allocated string - */ -gchar *matcherlist_to_string(const MatcherList *matchers) -{ - gint count; - gchar **vstr; - GSList *l; - gchar **cur_str; - gchar *result = NULL; - - count = g_slist_length(matchers->matchers); - vstr = g_new(gchar *, count + 1); - - for (l = matchers->matchers, cur_str = vstr; l != NULL; - l = g_slist_next(l), cur_str ++) { - *cur_str = matcherprop_to_string((MatcherProp *) l->data); - if (*cur_str == NULL) - break; - } - *cur_str = NULL; - - if (matchers->bool_and) - result = g_strjoinv(" & ", vstr); - else - result = g_strjoinv(" | ", vstr); - - for (cur_str = vstr ; *cur_str != NULL ; cur_str ++) - g_free(*cur_str); - g_free(vstr); - - return result; -} - - -#define STRLEN_ZERO(s) ((s) ? strlen(s) : 0) -#define STRLEN_DEFAULT(s,d) ((s) ? strlen(s) : STRLEN_ZERO(d)) - -static void add_str_default(gchar ** dest, - const gchar * s, const gchar * d) -{ - gchar quoted_str[4096]; - const gchar * str; - - if (s != NULL) - str = s; - else - str = d; - - quote_cmd_argument(quoted_str, sizeof(quoted_str), str); - strcpy(* dest, quoted_str); - - (* dest) += strlen(* dest); -} - -/* matching_build_command() - preferably cmd should be unescaped */ -/*! - *\brief Build the command-line to execute - * - *\param cmd String with command-line specifiers - *\param info Message info to use for command - * - *\return gchar * Newly allocated string - */ -gchar *matching_build_command(const gchar *cmd, MsgInfo *info) -{ - const gchar *s = cmd; - gchar *filename = NULL; - gchar *processed_cmd; - gchar *p; - gint size; - - const gchar *const no_subject = _("(none)") ; - const gchar *const no_from = _("(none)") ; - const gchar *const no_to = _("(none)") ; - const gchar *const no_cc = _("(none)") ; - const gchar *const no_date = _("(none)") ; - const gchar *const no_msgid = _("(none)") ; - const gchar *const no_references = _("(none)") ; - - size = STRLEN_ZERO(cmd) + 1; - while (*s != '\0') { - if (*s == '%') { - s++; - switch (*s) { - case '%': - size -= 1; - break; - case 's': /* subject */ - size += STRLEN_DEFAULT(info->subject, no_subject) - 2; - break; - case 'f': /* from */ - size += STRLEN_DEFAULT(info->from, no_from) - 2; - break; - case 't': /* to */ - size += STRLEN_DEFAULT(info->to, no_to) - 2; - break; - case 'c': /* cc */ - size += STRLEN_DEFAULT(info->cc, no_cc) - 2; - break; - case 'd': /* date */ - size += STRLEN_DEFAULT(info->date, no_date) - 2; - break; - case 'i': /* message-id */ - size += STRLEN_DEFAULT(info->msgid, no_msgid) - 2; - break; - case 'r': /* references */ - /* FIXME: using the inreplyto header for reference */ - size += STRLEN_DEFAULT(info->inreplyto, no_references) - 2; - break; - case 'F': /* file */ - if (filename == NULL) - filename = folder_item_fetch_msg(info->folder, info->msgnum); - - if (filename == NULL) { - g_warning("filename is not set"); - return NULL; - } - else { - size += strlen(filename) - 2; - } - break; - } - s++; - } - else s++; - } - - /* as the string can be quoted, we double the result */ - size *= 2; - - processed_cmd = g_new0(gchar, size); - s = cmd; - p = processed_cmd; - - while (*s != '\0') { - if (*s == '%') { - s++; - switch (*s) { - case '%': - *p = '%'; - p++; - break; - case 's': /* subject */ - add_str_default(&p, info->subject, - no_subject); - break; - case 'f': /* from */ - add_str_default(&p, info->from, - no_from); - break; - case 't': /* to */ - add_str_default(&p, info->to, - no_to); - break; - case 'c': /* cc */ - add_str_default(&p, info->cc, - no_cc); - break; - case 'd': /* date */ - add_str_default(&p, info->date, - no_date); - break; - case 'i': /* message-id */ - add_str_default(&p, info->msgid, - no_msgid); - break; - case 'r': /* references */ - /* FIXME: using the inreplyto header for references */ - add_str_default(&p, info->inreplyto, no_references); - break; - case 'F': /* file */ - if (filename != NULL) - add_str_default(&p, filename, NULL); - break; - default: - *p = '%'; - p++; - *p = *s; - p++; - break; - } - s++; - } - else { - *p = *s; - p++; - s++; - } - } - g_free(filename); - - return processed_cmd; -} -#undef STRLEN_DEFAULT -#undef STRLEN_ZERO - -/* ************************************************************ */ - - -/*! - *\brief Write filtering list to file - * - *\param fp File - *\param prefs_filtering List of filtering conditions - */ -static int prefs_filtering_write(FILE *fp, GSList *prefs_filtering) -{ - return 0; -} - -typedef struct _NodeLoopData { - FILE *fp; - gboolean error; -} NodeLoopData; - -/*! - *\brief Write matchers from a folder item - * - *\param node Node with folder info - *\param data File pointer - * - *\return gboolean FALSE - */ -static gboolean prefs_matcher_write_func(GNode *node, gpointer d) -{ - FolderItem *item; - NodeLoopData *data = (NodeLoopData *)d; - gchar *id; - GSList *prefs_filtering; - - item = node->data; - /* prevent warning */ - if (item->path == NULL) - return FALSE; - id = folder_item_get_identifier(item); - if (id == NULL) - return FALSE; - prefs_filtering = item->prefs->processing; - - if (prefs_filtering != NULL) { - if (fprintf(data->fp, "[%s]\n", id) < 0) { - data->error = TRUE; - goto fail; - } - if (prefs_filtering_write(data->fp, prefs_filtering) < 0) { - data->error = TRUE; - goto fail; - } - if (fputc('\n', data->fp) == EOF) { - data->error = TRUE; - goto fail; - } - } -fail: - g_free(id); - - return FALSE; -} - -/*! - *\brief Save matchers from folder items - * - *\param fp File - */ -static int prefs_matcher_save(FILE *fp) -{ - GList *cur; - NodeLoopData data; - - data.fp = fp; - data.error = FALSE; - - for (cur = folder_get_list() ; cur != NULL ; cur = g_list_next(cur)) { - Folder *folder; - - folder = (Folder *) cur->data; - g_node_traverse(folder->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, - prefs_matcher_write_func, &data); - } - - if (data.error == TRUE) - return -1; - return 0; -} - -/*! - *\brief Write filtering / matcher configuration file - */ -void prefs_matcher_write_config(void) -{ - gchar *rcpath; - PrefFile *pfile; - - debug_print("Writing matcher configuration...\n"); - - rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - MATCHER_RC, NULL); - - if ((pfile = prefs_write_open(rcpath)) == NULL) { - g_warning("failed to write configuration to file"); - g_free(rcpath); - return; - } - - g_free(rcpath); - - if (prefs_matcher_save(pfile->fp) < 0) { - g_warning("failed to write configuration to file"); - prefs_file_close_revert(pfile); - } else if (prefs_file_close(pfile) < 0) { - g_warning("failed to save configuration to file"); - } -} - -/*! - *\brief Read matcher configuration - */ -void prefs_matcher_read_config(void) -{ - gchar *rcpath; - FILE *f; - - create_matchparser_hashtab(); - rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, MATCHER_RC, NULL); - - f = g_fopen(rcpath, "rb"); - g_free(rcpath); - - if (f != NULL) { - matcher_parser_start_parsing(f); - fclose(matcher_parserin); - } -} blob - 8a068bb19927e63cb445f7eb18f5f6d79d67c6ab blob + 7afdd06718b1650570a0f38212dc569369e0fde2 --- src/matcher.h +++ src/matcher.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef MATCHER_H @@ -26,10 +26,6 @@ #include "proctypes.h" #include "matchertypes.h" -/* constants generated by yacc */ -#include "matcher_parser_lex.h" -#include "matcher_parser_parse.h" - struct _MatcherProp { int matchtype; int criteria; @@ -67,97 +63,13 @@ struct _MatcherList { #define MB_(name) \ MATCHERBOOL_ ## name = MATCHER_ ## name -enum { - /* match */ - MC_(ALL), - MC_(UNREAD), MC_(NOT_UNREAD), - MC_(NEW), MC_(NOT_NEW), - MC_(MARKED), MC_(NOT_MARKED), - MC_(DELETED), MC_(NOT_DELETED), - MC_(REPLIED), MC_(NOT_REPLIED), - MC_(FORWARDED), MC_(NOT_FORWARDED), - MC_(LOCKED), MC_(NOT_LOCKED), - MC_(SPAM),MC_(NOT_SPAM), - MC_(HAS_ATTACHMENT), MC_(HAS_NO_ATTACHMENT), - MC_(SIGNED), MC_(NOT_SIGNED), - MC_(PARTIAL), MC_(NOT_PARTIAL), - MC_(COLORLABEL), MC_(NOT_COLORLABEL), - MC_(IGNORE_THREAD), MC_(NOT_IGNORE_THREAD), - MC_(WATCH_THREAD), MC_(NOT_WATCH_THREAD), - MC_(SUBJECT), MC_(NOT_SUBJECT), - MC_(FROM), MC_(NOT_FROM), - MC_(TO), MC_(NOT_TO), - MC_(CC), MC_(NOT_CC), - MC_(TO_OR_CC), MC_(NOT_TO_AND_NOT_CC), - MC_(AGE_GREATER), MC_(AGE_LOWER), - MC_(AGE_GREATER_HOURS), MC_(AGE_LOWER_HOURS), - MC_(DATE_AFTER), MC_(DATE_BEFORE), - MC_(NEWSGROUPS), MC_(NOT_NEWSGROUPS), - MC_(MESSAGEID), MC_(NOT_MESSAGEID), - MC_(INREPLYTO), MC_(NOT_INREPLYTO), - MC_(REFERENCES), MC_(NOT_REFERENCES), - MC_(SCORE_GREATER), MC_(SCORE_LOWER), - MC_(HEADER), MC_(NOT_HEADER), - MC_(HEADERS_PART), MC_(NOT_HEADERS_PART), - MC_(HEADERS_CONT), MC_(NOT_HEADERS_CONT), - MC_(MESSAGE), MC_(NOT_MESSAGE), - MC_(BODY_PART), MC_(NOT_BODY_PART), - MC_(TEST), MC_(NOT_TEST), - MC_(SCORE_EQUAL), - MC_(SIZE_GREATER), - MC_(SIZE_SMALLER), - MC_(SIZE_EQUAL), - MC_(FOUND_IN_ADDRESSBOOK),MC_(NOT_FOUND_IN_ADDRESSBOOK), - MC_(TAG),MC_(NOT_TAG), - MC_(TAGGED),MC_(NOT_TAGGED), - /* match type */ - MT_(MATCHCASE), - MT_(MATCH), - MT_(REGEXPCASE), - MT_(REGEXP), - /* actions */ - MA_(SCORE), - MA_(EXECUTE), - MA_(MOVE), - MA_(COPY), - MA_(DELETE), - MA_(MARK), - MA_(UNMARK), - MA_(LOCK), - MA_(UNLOCK), - MA_(MARK_AS_READ), - MA_(MARK_AS_UNREAD), - MA_(MARK_AS_SPAM), - MA_(MARK_AS_HAM), - MA_(FORWARD), - MA_(FORWARD_AS_ATTACHMENT), - MA_(COLOR), - MA_(REDIRECT), - MA_(CHANGE_SCORE), - MA_(SET_SCORE), - MA_(STOP), - MA_(HIDE), - MA_(IGNORE), - MA_(WATCH), - MA_(ADD_TO_ADDRESSBOOK), - MA_(SET_TAG), - MA_(UNSET_TAG), - MA_(CLEAR_TAGS), - /* boolean operations */ - MB_(OR), - MB_(AND) -}; - void matcher_init(void); void matcher_done(void); -const gchar *get_matchparser_tab_str (gint id); -gint get_matchparser_tab_id (const gchar *str); - -MatcherProp *matcherprop_new (gint criteria, +MatcherProp *matcherprop_new (gint criteria, const gchar *header, - gint matchtype, + gint matchtype, const gchar *expr, int value); void matcherprop_free (MatcherProp *prop); @@ -166,7 +78,7 @@ MatcherProp *matcherprop_parse (gchar **str); MatcherProp *matcherprop_copy (const MatcherProp *src); -MatcherList * matcherlist_new (GSList *matchers, +MatcherList * matcherlist_new (GSList *matchers, gboolean bool_and); MatcherList * matcherlist_new_from_lines(gchar *lines, gboolean bool_and, blob - ce771842100df6b2004d3507b926ef6f7c4a9e2a (mode 644) blob + /dev/null --- src/matcher_parser.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (c) 2001-2002 by Hiroyuki Yamamoto & The Claws Mail Team. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef MATCHER_PARSER_H -#define MATCHER_PARSER_H - -#include - -extern FILE *matcher_parserin; -extern int matcher_parserlineno; - -void matcher_parser_disable_warnings (const gboolean disable); -void matcher_parser_start_parsing (FILE *f); -int matcher_parserparse (void); - -MatcherList *matcher_parser_get_cond (gchar *str, gboolean *is_fast); -MatcherProp *matcher_parser_get_prop (gchar *str); -GSList *matcher_parser_get_action_list(gchar *str); - -#endif blob - 754aca19bfefd786cd83a8cd72c9323a7a74578e (mode 644) blob + /dev/null --- src/matcher_parser_lex.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* The following defines are adapted from GDB sources (cp-name-parser.y): - - Copyright (C) 2003-2014 Free Software Foundation, Inc. - - Parts of the lexer are based on c-exp.y from GDB. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth matcher_parsermaxdepth -#define yyparse matcher_parserparse -#define yylex matcher_parserlex -#define yyerror matcher_parsererror -#define yylval matcher_parserlval -#define yychar matcher_parserchar -#define yydebug matcher_parserdebug -#define yypact matcher_parserpact -#define yyr1 matcher_parserr1 -#define yyr2 matcher_parserr2 -#define yydef matcher_parserdef -#define yychk matcher_parserchk -#define yypgo matcher_parserpgo -#define yyact matcher_parseract -#define yyexca matcher_parserexca -#define yyerrflag matcher_parsererrflag -#define yynerrs matcher_parsernerrs -#define yyps matcher_parserps -#define yypv matcher_parserpv -#define yys matcher_parsers -#define yy_yys matcher_parseryys -#define yystate matcher_parserstate -#define yytmp matcher_parsertmp -#define yyv matcher_parserv -#define yy_yyv matcher_parseryyv -#define yyval matcher_parserval -#define yylloc matcher_parserlloc -#define yyreds matcher_parserreds /* With YYDEBUG defined */ -#define yytoks matcher_parsertoks /* With YYDEBUG defined */ -#define yylhs matcher_parseryylhs -#define yylen matcher_parseryylen -#define yydefred matcher_parseryydefred -#define yydgoto matcher_parseryydgoto -#define yysindex matcher_parseryysindex -#define yyrindex matcher_parseryyrindex -#define yygindex matcher_parseryygindex -#define yytable matcher_parseryytable -#define yycheck matcher_parseryycheck -#define yyrestart matcher_parserrestart blob - cdd412cb9e9c3f658e84cb1e5fab0bd15c4ec191 (mode 644) blob + /dev/null --- src/matcher_parser_lex.l +++ /dev/null @@ -1,131 +0,0 @@ -%option nounput never-interactive - -%{ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (c) 2001-2007 by Hiroyuki Yamamoto & The Claws Mail Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include -#include - -#include "codeconv.h" -#include "matcher.h" -#include "matcher_parser_lex.h" - -#ifndef YYSTYPE -#include "matcher_parser_parse.h" -#endif - -#define MAX_STR_CONST 8192 - -static char string_buf[MAX_STR_CONST]; -static char *string_buf_ptr; - -static void add_char(char ch) -{ - if (string_buf_ptr - string_buf < sizeof(string_buf)) - *string_buf_ptr++ = ch; -} - - -/* this function will reinitializes the parser */ - -void matcher_parser_init(void) -{ - BEGIN(0); -} -%} - -%option prefix="matcher_parser" -%option outfile="lex.yy.c" -%option yylineno - -%x string -%x section - -%% - -"in" return MATCHER_IN; - - /* - * a keyword consists of alpha and underscore - * characters, possibly preceded by a tilde (~) - */ - -(~|[a-z])[a-z_]* { - gint id; - - if (-1 == (id = get_matchparser_tab_id(yytext))) { - REJECT; - } else - return id; - } -[ \t]+ -"\n" return MATCHER_EOL; -"&" return MATCHER_AND; -"|" return MATCHER_OR; -\" { - BEGIN(string); - string_buf_ptr = string_buf; - } -\" { - /* get out of the state: string ends. */ - BEGIN(0); - *string_buf_ptr = '\0'; - if (!g_utf8_validate(string_buf, -1, NULL)) { - gchar *tmp = conv_codeset_strdup(string_buf, conv_get_locale_charset_str(), CS_INTERNAL); - if (tmp) { - g_strlcpy(string_buf, tmp, sizeof(string_buf)); - g_free(tmp); - } - } - yylval.str = string_buf; - return MATCHER_STRING; - } -\\. { - /* take care of quoted characters */ - add_char(yytext[1]); - } -. { - add_char(yytext[0]); - } -^\[.*\]$ { - /* for section name in configuration file */ - BEGIN(0); - yylval.str = yytext + 1; - yytext[strlen(yytext) - 1] = '\0'; - return MATCHER_SECTION; - } -[-+]?[0-9]+ { - yylval.str = yytext; - return MATCHER_INTEGER; - } -rulename { - return MATCHER_RULENAME; - } -disabled { - return MATCHER_DISABLED; - } -account { - return MATCHER_ACCOUNT; - } -enabled { - return MATCHER_ENABLED; - } -. { /* silently eat unmatched input at lexer level */ } -%% blob - 8228522c79b522e1aa084e572fb0120f1561fc40 (mode 644) blob + /dev/null --- src/matcher_parser_parse.y +++ /dev/null @@ -1,1363 +0,0 @@ -%{ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (c) 2001-2014 by Hiroyuki Yamamoto & The Claws Mail Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "defs.h" - -#include -#include - -#include "utils.h" -#include "procheader.h" -#include "matcher.h" -#include "matcher_parser.h" -#include "matcher_parser_lex.h" -#include "folder_item_prefs.h" - -static gint error = 0; -static gint bool_op = 0; -static gint match_type = 0; -static gchar *header = NULL; - -static MatcherProp *prop; - -static GSList *matchers_list = NULL; - -static gboolean enabled = TRUE; -static gchar *name = NULL; -static gint account_id = 0; -static MatcherList *cond; -static GSList *action_list = NULL; -static gboolean matcher_is_fast = TRUE; -static gboolean disable_warnings = FALSE; - -static gboolean filtering_ptr_externally_managed = FALSE; - -static GSList **prefs_filtering = NULL; -static int enable_compatibility = 0; - -enum { - MATCHER_PARSE_FILE, - MATCHER_PARSE_NO_EOL, - MATCHER_PARSE_ENABLED, - MATCHER_PARSE_NAME, - MATCHER_PARSE_ACCOUNT, - MATCHER_PARSE_CONDITION, - MATCHER_PARSE_FILTERING_ACTION, -}; - -static int matcher_parse_op = MATCHER_PARSE_FILE; - - -/* ******************************************************************** */ -/* redeclarations to avoid warnings */ -void matcher_parserrestart(FILE *input_file); -void matcher_parser_init(void); -void matcher_parser_switch_to_buffer(void * new_buffer); -void matcher_parser_delete_buffer(void * b); -void matcher_parserpop_buffer_state(void); -int matcher_parserlex(void); - -void matcher_parser_disable_warnings(const gboolean disable) -{ - disable_warnings = disable; -} - -void matcher_parser_start_parsing(FILE *f) -{ - matcher_parserlineno = 1; - matcher_parserrestart(f); - account_id = 0; - matcher_parserparse(); -} - - -void * matcher_parser_scan_string(const char * str); - -static gboolean check_quote_symetry(gchar *str) -{ - const gchar *walk; - int ret = 0; - - if (str == NULL) - return TRUE; /* heh, that's symetric */ - if (*str == '\0') - return TRUE; - for (walk = str; *walk; walk++) { - if (*walk == '\"') { - if (walk == str /* first char */ - || *(walk - 1) != '\\') /* not escaped */ - ret ++; - } - } - return !(ret % 2); -} - -MatcherList *matcher_parser_get_name(gchar *str) -{ - void *bufstate; - - if (!check_quote_symetry(str)) { - cond = NULL; - return cond; - } - - /* bad coding to enable the sub-grammar matching - in yacc */ - matcher_parserlineno = 1; - matcher_parse_op = MATCHER_PARSE_NAME; - matcher_parserrestart(NULL); - matcher_parserpop_buffer_state(); - matcher_parser_init(); - bufstate = matcher_parser_scan_string(str); - matcher_parserparse(); - matcher_parse_op = MATCHER_PARSE_FILE; - matcher_parser_delete_buffer(bufstate); - return cond; -} - -MatcherList *matcher_parser_get_enabled(gchar *str) -{ - void *bufstate; - - if (!check_quote_symetry(str)) { - cond = NULL; - return cond; - } - - /* bad coding to enable the sub-grammar matching - in yacc */ - matcher_parserlineno = 1; - matcher_parse_op = MATCHER_PARSE_ENABLED; - matcher_parserrestart(NULL); - matcher_parserpop_buffer_state(); - matcher_parser_init(); - bufstate = matcher_parser_scan_string(str); - matcher_parserparse(); - matcher_parse_op = MATCHER_PARSE_FILE; - matcher_parser_delete_buffer(bufstate); - return cond; -} - -MatcherList *matcher_parser_get_account(gchar *str) -{ - void *bufstate; - - if (!check_quote_symetry(str)) { - cond = NULL; - return cond; - } - - /* bad coding to enable the sub-grammar matching - in yacc */ - matcher_parserlineno = 1; - matcher_parse_op = MATCHER_PARSE_ACCOUNT; - matcher_parserrestart(NULL); - matcher_parserpop_buffer_state(); - matcher_parser_init(); - bufstate = matcher_parser_scan_string(str); - matcher_parserparse(); - matcher_parse_op = MATCHER_PARSE_FILE; - matcher_parser_delete_buffer(bufstate); - return cond; -} - -MatcherList *matcher_parser_get_cond(gchar *str, gboolean *is_fast) -{ - void *bufstate; - - if (!check_quote_symetry(str)) { - cond = NULL; - return cond; - } - - matcher_is_fast = TRUE; - /* bad coding to enable the sub-grammar matching - in yacc */ - matcher_parserlineno = 1; - matcher_parse_op = MATCHER_PARSE_CONDITION; - matcher_parserrestart(NULL); - matcher_parserpop_buffer_state(); - matcher_parser_init(); - bufstate = matcher_parser_scan_string(str); - matcher_parserparse(); - matcher_parse_op = MATCHER_PARSE_FILE; - matcher_parser_delete_buffer(bufstate); - if (is_fast) - *is_fast = matcher_is_fast; - return cond; -} - -GSList *matcher_parser_get_action_list(gchar *str) -{ - void *bufstate; - - if (!check_quote_symetry(str)) { - action_list = NULL; - return action_list; - } - - /* bad coding to enable the sub-grammar matching - in yacc */ - matcher_parserlineno = 1; - matcher_parse_op = MATCHER_PARSE_FILTERING_ACTION; - matcher_parserrestart(NULL); - matcher_parserpop_buffer_state(); - matcher_parser_init(); - bufstate = matcher_parser_scan_string(str); - matcher_parserparse(); - matcher_parse_op = MATCHER_PARSE_FILE; - matcher_parser_delete_buffer(bufstate); - return action_list; -} - -MatcherProp *matcher_parser_get_prop(gchar *str) -{ - MatcherList *list; - MatcherProp *prop; - - matcher_parserlineno = 1; - list = matcher_parser_get_cond(str, NULL); - if (list == NULL) - return NULL; - - if (list->matchers == NULL) - return NULL; - - if (list->matchers->next != NULL) - return NULL; - - prop = list->matchers->data; - - g_slist_free(list->matchers); - g_free(list); - - return prop; -} - -void matcher_parsererror(char *str) -{ - GSList *l; - - if (matchers_list) { - for (l = matchers_list; l != NULL; l = g_slist_next(l)) { - matcherprop_free((MatcherProp *) - l->data); - l->data = NULL; - } - g_slist_free(matchers_list); - matchers_list = NULL; - } - cond = NULL; - if (!disable_warnings) - g_warning("filtering parsing: %i: %s", - matcher_parserlineno, str); - error = 1; -} - -int matcher_parserwrap(void) -{ - return 1; -} -%} - -%union { - char *str; - int value; -} -%token MATCHER_ALL MATCHER_UNREAD MATCHER_NOT_UNREAD -%token MATCHER_NEW MATCHER_NOT_NEW MATCHER_MARKED -%token MATCHER_NOT_MARKED MATCHER_DELETED MATCHER_NOT_DELETED -%token MATCHER_REPLIED MATCHER_NOT_REPLIED MATCHER_FORWARDED -%token MATCHER_NOT_FORWARDED MATCHER_SUBJECT MATCHER_NOT_SUBJECT -%token MATCHER_FROM MATCHER_NOT_FROM MATCHER_TO MATCHER_NOT_TO -%token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC -%token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS -%token MATCHER_AGE_GREATER_HOURS MATCHER_AGE_LOWER_HOURS -%token MATCHER_DATE_AFTER MATCHER_DATE_BEFORE -%token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO -%token MATCHER_MESSAGEID MATCHER_NOT_MESSAGEID -%token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER -%token MATCHER_SCORE_LOWER MATCHER_HEADER MATCHER_NOT_HEADER -%token MATCHER_HEADERS_PART MATCHER_NOT_HEADERS_PART MATCHER_MESSAGE -%token MATCHER_HEADERS_CONT MATCHER_NOT_HEADERS_CONT -%token MATCHER_NOT_MESSAGE MATCHER_BODY_PART MATCHER_NOT_BODY_PART -%token MATCHER_TEST MATCHER_NOT_TEST MATCHER_MATCHCASE MATCHER_MATCH -%token MATCHER_REGEXPCASE MATCHER_REGEXP MATCHER_SCORE MATCHER_MOVE -%token MATCHER_FOUND_IN_ADDRESSBOOK MATCHER_NOT_FOUND_IN_ADDRESSBOOK MATCHER_IN -%token MATCHER_COPY MATCHER_DELETE MATCHER_MARK MATCHER_UNMARK -%token MATCHER_LOCK MATCHER_UNLOCK -%token MATCHER_EXECUTE -%token MATCHER_MARK_AS_READ MATCHER_MARK_AS_UNREAD MATCHER_FORWARD -%token MATCHER_MARK_AS_SPAM MATCHER_MARK_AS_HAM -%token MATCHER_FORWARD_AS_ATTACHMENT MATCHER_EOL -%token MATCHER_OR MATCHER_AND -%token MATCHER_COLOR MATCHER_SCORE_EQUAL MATCHER_REDIRECT -%token MATCHER_SIZE_GREATER MATCHER_SIZE_SMALLER MATCHER_SIZE_EQUAL -%token MATCHER_LOCKED MATCHER_NOT_LOCKED -%token MATCHER_PARTIAL MATCHER_NOT_PARTIAL -%token MATCHER_COLORLABEL MATCHER_NOT_COLORLABEL -%token MATCHER_IGNORE_THREAD MATCHER_NOT_IGNORE_THREAD -%token MATCHER_WATCH_THREAD MATCHER_NOT_WATCH_THREAD -%token MATCHER_CHANGE_SCORE MATCHER_SET_SCORE -%token MATCHER_ADD_TO_ADDRESSBOOK -%token MATCHER_STOP MATCHER_HIDE MATCHER_IGNORE MATCHER_WATCH -%token MATCHER_SPAM MATCHER_NOT_SPAM -%token MATCHER_HAS_ATTACHMENT MATCHER_HAS_NO_ATTACHMENT -%token MATCHER_SIGNED MATCHER_NOT_SIGNED -%token MATCHER_TAG MATCHER_NOT_TAG MATCHER_SET_TAG MATCHER_UNSET_TAG -%token MATCHER_TAGGED MATCHER_NOT_TAGGED MATCHER_CLEAR_TAGS - -%start file - -%token MATCHER_ENABLED MATCHER_DISABLED -%token MATCHER_RULENAME -%token MATCHER_ACCOUNT -%token MATCHER_STRING -%token MATCHER_SECTION -%token MATCHER_INTEGER - -%% - -file: -{ -} -file_line_list; - -file_line_list: -file_line -file_line_list -| file_line -; - -file_line: -section_notification -| -{ action_list = NULL; } -instruction -| error MATCHER_EOL -{ - yyerrok; -}; - -section_notification: -MATCHER_SECTION MATCHER_EOL -{ - gchar *folder = $1; - FolderItem *item = NULL; - - if (matcher_parse_op == MATCHER_PARSE_FILE) { - enable_compatibility = 0; - if (!strcmp(folder, "global")) { - /* backward compatibility */ - enable_compatibility = 1; - } - else { - item = folder_find_item_from_identifier(folder); - if (item != NULL) { - prefs_filtering = &item->prefs->processing; - } else { - prefs_filtering = NULL; - } - } - } -} -; - -instruction: -enabled name account condition filtering MATCHER_EOL -| enabled name account condition filtering -| enabled name condition filtering MATCHER_EOL -| enabled name condition filtering -| name condition filtering MATCHER_EOL -| name condition filtering -{ - if (matcher_parse_op == MATCHER_PARSE_NO_EOL) - YYACCEPT; - else { - matcher_parsererror("parse error [no eol]"); - YYERROR; - } -} -| enabled -{ - if (matcher_parse_op == MATCHER_PARSE_ENABLED) - YYACCEPT; - else { - matcher_parsererror("parse error [enabled]"); - YYERROR; - } -} -| account -{ - if (matcher_parse_op == MATCHER_PARSE_ACCOUNT) - YYACCEPT; - else { - matcher_parsererror("parse error [account]"); - YYERROR; - } -} -| name -{ - if (matcher_parse_op == MATCHER_PARSE_NAME) - YYACCEPT; - else { - matcher_parsererror("parse error [name]"); - YYERROR; - } -} -| condition -{ - if (matcher_parse_op == MATCHER_PARSE_CONDITION) - YYACCEPT; - else { - matcher_parsererror("parse error [condition]"); - YYERROR; - } -} -| filtering_action_list -{ - if (matcher_parse_op == MATCHER_PARSE_FILTERING_ACTION) - YYACCEPT; - else { - matcher_parsererror("parse error [filtering action]"); - YYERROR; - } -} -| MATCHER_EOL -; - -enabled: -MATCHER_ENABLED -{ - enabled = TRUE; -} -| MATCHER_DISABLED -{ - enabled = FALSE; -} -; - -name: -MATCHER_RULENAME MATCHER_STRING -{ - name = g_strdup($2); -} -; - -account: -MATCHER_ACCOUNT MATCHER_INTEGER -{ - account_id = strtol($2, NULL, 10); -} -; - -filtering: -filtering_action_list -{ - enabled = TRUE; - account_id = 0; - g_free(name); - name = NULL; - cond = NULL; - action_list = NULL; -} -; - -filtering_action_list: -filtering_action_b filtering_action_list -| filtering_action_b -; - -filtering_action_b: -filtering_action -{ -} -; - -match_type: -MATCHER_MATCHCASE -{ - match_type = MATCHTYPE_MATCHCASE; -} -| MATCHER_MATCH -{ - match_type = MATCHTYPE_MATCH; -} -| MATCHER_REGEXPCASE -{ - match_type = MATCHTYPE_REGEXPCASE; -} -| MATCHER_REGEXP -{ - match_type = MATCHTYPE_REGEXP; -} -; - -condition: -condition_list -{ - cond = matcherlist_new(matchers_list, (bool_op == MATCHERBOOL_AND)); - matchers_list = NULL; -} -; - -condition_list: -condition_list bool_op one_condition -{ - matchers_list = g_slist_append(matchers_list, prop); -} -| one_condition -{ - matchers_list = NULL; - matchers_list = g_slist_append(matchers_list, prop); -} -; - -bool_op: -MATCHER_AND -{ - bool_op = MATCHERBOOL_AND; -} -| MATCHER_OR -{ - bool_op = MATCHERBOOL_OR; -} -; - -one_condition: -MATCHER_ALL -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_ALL; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_UNREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_UNREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_UNREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_UNREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NEW -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NEW; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_NEW -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_NEW; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_MARKED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_MARKED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_MARKED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_MARKED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_DELETED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_DELETED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_DELETED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_DELETED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_REPLIED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_REPLIED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_REPLIED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_REPLIED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_FORWARDED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_FORWARDED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_FORWARDED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_FORWARDED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_LOCKED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_LOCKED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_LOCKED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_LOCKED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_SPAM -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_SPAM; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_SPAM -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_SPAM; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_HAS_ATTACHMENT -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_HAS_ATTACHMENT; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_HAS_NO_ATTACHMENT -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_HAS_NO_ATTACHMENT; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_SIGNED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_SIGNED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_SIGNED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_SIGNED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_PARTIAL -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_PARTIAL; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_PARTIAL -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_PARTIAL; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_IGNORE_THREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_IGNORE_THREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_IGNORE_THREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_IGNORE_THREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_WATCH_THREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_WATCH_THREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_WATCH_THREAD -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_WATCH_THREAD; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_SUBJECT match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_SUBJECT; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_SUBJECT match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_SUBJECT; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_FROM match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_FROM; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_FROM match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_FROM; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_TO match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_TO; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_TO match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_TO; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_CC match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_CC; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_CC match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_CC; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_TO_OR_CC match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_TO_OR_CC; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_TO_AND_NOT_CC match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_TO_AND_NOT_CC; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_TAG match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_TAG; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_TAG match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_TAG; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_TAGGED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_TAGGED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_NOT_TAGGED -{ - gint criteria = 0; - - criteria = MATCHCRITERIA_NOT_TAGGED; - prop = matcherprop_new(criteria, NULL, 0, NULL, 0); -} -| MATCHER_AGE_GREATER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_AGE_GREATER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_AGE_LOWER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_AGE_LOWER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_AGE_GREATER_HOURS MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_AGE_GREATER_HOURS; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_AGE_LOWER_HOURS MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_AGE_LOWER_HOURS; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_DATE_AFTER MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - time_t value; - - criteria = MATCHCRITERIA_DATE_AFTER; - expr = $2; - value = procheader_date_parse(NULL, expr, 0); - prop = matcherprop_new(criteria, NULL, 0, expr, value); -} -| MATCHER_DATE_BEFORE MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - time_t value; - - criteria = MATCHCRITERIA_DATE_BEFORE; - expr = $2; - value = procheader_date_parse(NULL, expr, 0); - prop = matcherprop_new(criteria, NULL, 0, expr, value); -} -| MATCHER_NEWSGROUPS match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NEWSGROUPS; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_NEWSGROUPS match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_NEWSGROUPS; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_MESSAGEID match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_MESSAGEID; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_MESSAGEID match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_MESSAGEID; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_INREPLYTO match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_INREPLYTO; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_INREPLYTO match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_INREPLYTO; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_REFERENCES match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_REFERENCES; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_REFERENCES match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_REFERENCES; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_SCORE_GREATER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_SCORE_GREATER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_SCORE_LOWER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_SCORE_LOWER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_SCORE_EQUAL MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - - criteria = MATCHCRITERIA_SCORE_EQUAL; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_SIZE_GREATER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - criteria = MATCHCRITERIA_SIZE_GREATER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_SIZE_SMALLER MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - criteria = MATCHCRITERIA_SIZE_SMALLER; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_SIZE_EQUAL MATCHER_INTEGER -{ - gint criteria = 0; - gint value = 0; - criteria = MATCHCRITERIA_SIZE_EQUAL; - value = strtol($2, NULL, 0); - prop = matcherprop_new(criteria, NULL, 0, NULL, value); -} -| MATCHER_HEADER MATCHER_STRING -{ - header = g_strdup($2); -} match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_HEADER; - expr = $2; - prop = matcherprop_new(criteria, header, match_type, expr, 0); - g_free(header); -} -| MATCHER_NOT_HEADER MATCHER_STRING -{ - header = g_strdup($2); -} match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_HEADER; - expr = $2; - prop = matcherprop_new(criteria, header, match_type, expr, 0); - g_free(header); -} -| MATCHER_HEADERS_PART match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_HEADERS_PART; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_HEADERS_PART match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_HEADERS_PART; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_HEADERS_CONT match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_HEADERS_CONT; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_HEADERS_CONT match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_HEADERS_CONT; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_FOUND_IN_ADDRESSBOOK MATCHER_STRING -{ - header = g_strdup($2); -} MATCHER_IN MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_FOUND_IN_ADDRESSBOOK; - expr = $2; - prop = matcherprop_new(criteria, header, match_type, expr, 0); - g_free(header); -} -| MATCHER_NOT_FOUND_IN_ADDRESSBOOK MATCHER_STRING -{ - header = g_strdup($2); -} MATCHER_IN MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - - criteria = MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK; - expr = $2; - prop = matcherprop_new(criteria, header, match_type, expr, 0); - g_free(header); -} -| MATCHER_MESSAGE match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_MESSAGE; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_MESSAGE match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_MESSAGE; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_BODY_PART match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_BODY_PART; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_NOT_BODY_PART match_type MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_BODY_PART; - expr = $3; - prop = matcherprop_new(criteria, NULL, match_type, expr, 0); -} -| MATCHER_TEST MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_TEST; - expr = $2; - prop = matcherprop_new(criteria, NULL, MATCHTYPE_MATCH, expr, 0); -} -| MATCHER_NOT_TEST MATCHER_STRING -{ - gint criteria = 0; - gchar *expr = NULL; - matcher_is_fast = FALSE; - criteria = MATCHCRITERIA_NOT_TEST; - expr = $2; - prop = matcherprop_new(criteria, NULL, MATCHTYPE_MATCH, expr, 0); -} -; - -filtering_action: -MATCHER_EXECUTE MATCHER_STRING -{ - gchar *cmd = NULL; - gint action_type = 0; - - action_type = MATCHACTION_EXECUTE; - cmd = $2; -} -| MATCHER_MOVE MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - - action_type = MATCHACTION_MOVE; - destination = $2; -} -| MATCHER_SET_TAG MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - - action_type = MATCHACTION_SET_TAG; - destination = $2; -} -| MATCHER_UNSET_TAG MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - - action_type = MATCHACTION_UNSET_TAG; - destination = $2; -} -| MATCHER_CLEAR_TAGS -{ - gint action_type = 0; - - action_type = MATCHACTION_CLEAR_TAGS; -} -| MATCHER_COPY MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - - action_type = MATCHACTION_COPY; - destination = $2; -} -| MATCHER_DELETE -{ - gint action_type = 0; - - action_type = MATCHACTION_DELETE; -} -| MATCHER_MARK -{ - gint action_type = 0; - - action_type = MATCHACTION_MARK; -} -| MATCHER_UNMARK -{ - gint action_type = 0; - - action_type = MATCHACTION_UNMARK; -} -| MATCHER_LOCK -{ - gint action_type = 0; - - action_type = MATCHACTION_LOCK; -} -| MATCHER_UNLOCK -{ - gint action_type = 0; - - action_type = MATCHACTION_UNLOCK; -} -| MATCHER_MARK_AS_READ -{ - gint action_type = 0; - - action_type = MATCHACTION_MARK_AS_READ; -} -| MATCHER_MARK_AS_UNREAD -{ - gint action_type = 0; - - action_type = MATCHACTION_MARK_AS_UNREAD; -} -| MATCHER_MARK_AS_SPAM -{ - gint action_type = 0; - - action_type = MATCHACTION_MARK_AS_SPAM; -} -| MATCHER_MARK_AS_HAM -{ - gint action_type = 0; - - action_type = MATCHACTION_MARK_AS_HAM; -} -| MATCHER_FORWARD MATCHER_INTEGER MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - gint account_id = 0; - - action_type = MATCHACTION_FORWARD; - account_id = strtol($2, NULL, 10); - destination = $3; -} -| MATCHER_FORWARD_AS_ATTACHMENT MATCHER_INTEGER MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - gint account_id = 0; - - action_type = MATCHACTION_FORWARD_AS_ATTACHMENT; - account_id = strtol($2, NULL, 10); - destination = $3; -} -| MATCHER_REDIRECT MATCHER_INTEGER MATCHER_STRING -{ - gchar *destination = NULL; - gint action_type = 0; - gint account_id = 0; - - action_type = MATCHACTION_REDIRECT; - account_id = strtol($2, NULL, 10); - destination = $3; -} -| MATCHER_COLOR MATCHER_INTEGER -{ - gint action_type = 0; - gint color = 0; - - action_type = MATCHACTION_COLOR; - color = strtol($2, NULL, 10); -} -| MATCHER_CHANGE_SCORE MATCHER_INTEGER -{ - gint score = 0; - - score = strtol($2, NULL, 10); -} -/* backward compatibility */ -| MATCHER_SCORE MATCHER_INTEGER -{ - gint score = 0; - - score = strtol($2, NULL, 10); -} -| MATCHER_SET_SCORE MATCHER_INTEGER -{ - gint score = 0; - - score = strtol($2, NULL, 10); -} -| MATCHER_HIDE -{ -} -| MATCHER_IGNORE -{ -} -| MATCHER_WATCH -{ -} -| MATCHER_ADD_TO_ADDRESSBOOK MATCHER_STRING -{ - header = g_strdup($2); -} MATCHER_STRING -{ - gchar *addressbook = NULL; - gint action_type = 0; - - action_type = MATCHACTION_ADD_TO_ADDRESSBOOK; - addressbook = $2; - g_free(header); -} -| MATCHER_STOP -{ -} -; blob - faaa16cb73c1f952387963eb2adfada6825f343f blob + 72d2996dc7b4d7a8afa8ed25919041868a97c139 --- src/messageview.c +++ src/messageview.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include blob - 7706c15bee311470f432bbe62801e3f179c7ea41 blob + 8497a870f195d931ce09c593604eae4fbd027dcd --- src/messageview.h +++ src/messageview.h @@ -34,7 +34,6 @@ #define MESSAGE_VIEW_SHOW_DONE_HOOKLIST "message_view_show_done_hooklist" - struct _MessageView { GtkWidget *vbox; blob - abd39987b3880bbfb3a757f18096b0ae91a4fd13 blob + 19ae4d124ee75182ff042ee1acce73c2a2c853d5 --- src/mh.c +++ src/mh.c @@ -134,7 +134,6 @@ FolderClass *mh_get_class(void) mh_class.type = F_MH; mh_class.idstr = "mh"; mh_class.uistr = "MH"; - mh_class.supports_server_search = FALSE; /* Folder functions */ mh_class.new_folder = mh_folder_new; @@ -162,7 +161,6 @@ FolderClass *mh_get_class(void) mh_class.add_msgs = mh_add_msgs; mh_class.copy_msg = mh_copy_msg; mh_class.copy_msgs = mh_copy_msgs; - mh_class.search_msgs = folder_item_search_msgs_local; mh_class.remove_msg = mh_remove_msg; mh_class.remove_msgs = mh_remove_msgs; mh_class.remove_all_msg = mh_remove_all_msg; blob - 48e43950bb2df95f3eab854c3babb7791079f3ba blob + b65cce8a5bf5df6969bb7f804b8651c6c503bcbd --- src/mimeview.c +++ src/mimeview.c @@ -2624,14 +2624,5 @@ void mimeview_handle_cmd(MimeView *mimeview, const gch } else if (!strcmp(cmd, "cm://menu_attachment") && data != NULL) { mimeview->spec_part = (MimeInfo *)data; part_button_pressed(mimeview, event, (MimeInfo *)data); - } else if (!strncmp(cmd, "cm://search_tags:", strlen("cm://search_tags:"))) { - const gchar *tagname = cmd + strlen("cm://search_tags:"); - gchar *buf = g_strdup_printf("tag matchcase \"%s\"", tagname); - gtk_toggle_button_set_active( - GTK_TOGGLE_BUTTON(mimeview->messageview->mainwin->summaryview->toggle_search), - TRUE); - quicksearch_set(mimeview->messageview->mainwin->summaryview->quicksearch, - ADVANCED_SEARCH_EXTENDED, buf); - g_free(buf); } } blob - b94a016bd3b312b06f9ce241c4772a68abdca613 blob + 7bd124d5ed87ca5192be5cf097fe5fe99541efd4 --- src/noticeview.h +++ src/noticeview.h @@ -1,4 +1,4 @@ -/* +/* * Claws Mail -- a GTK based, lightweight, and fast e-mail client * Copyright (C) 2002-2012 Hiroyuki Yamamoto & The Claws Mail Team * @@ -49,10 +49,10 @@ void noticeview_set_icon (NoticeView *noticeview, StockPixmap icon); void noticeview_set_text (NoticeView *noticeview, const gchar *text); -void noticeview_set_button_text +void noticeview_set_button_text (NoticeView *noticeview, const gchar *text); -void noticeview_set_2ndbutton_text +void noticeview_set_2ndbutton_text (NoticeView *noticeview, const gchar *text); gboolean noticeview_is_visible (NoticeView *noticeview); blob - 196ca1caca4f0ca8710e2d10952880bca9eaac1d blob + 3fca9de6f80714c6be083e43d6f8ec47db245ff3 --- src/oauth2.c +++ src/oauth2.c @@ -22,8 +22,6 @@ #include "claws-features.h" #endif -#ifdef USE_OAUTH2 - #include "defs.h" #include #ifdef ENABLE_NLS @@ -901,5 +899,3 @@ gint oauth2_init (OAUTH2Data *OAUTH2Data) return (0); } - -#endif /* USE_OAUTH2 */ blob - 9d441f57183c68e24f9192706bab97dd80c9e7ef blob + 487a0f84251e2b54ebcf2d2ead7cea60c54f42d6 --- src/oauth2.h +++ src/oauth2.h @@ -14,15 +14,12 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ -#ifdef HAVE_CONFIG_H -#include "claws-features.h" -#endif +#ifndef _OAUTH2_H_ +#define _OAUTH2_H_ -#ifdef USE_OAUTH2 - #include #include "socket.h" @@ -85,4 +82,4 @@ typedef struct _Oauth2Info Oauth2Info; void account_read_oauth2_all (void); -#endif /* USE_OAUTH2 */ +#endif /* _OAUTH2_H_ */ blob - f36f77ab8b322829d5077e63b1d0bf8dfe120649 blob + 2e23e403d81d150fa08339049c5365fc15dc16be --- src/pop.c +++ src/pop.c @@ -39,9 +39,7 @@ #include "file-utils.h" #include "oauth2.h" -#ifdef USE_OAUTH2 #include "defs.h" -#endif typedef enum { POP3_TOTALLY_RECEIVED = 0, @@ -53,10 +51,8 @@ static gint pop3_greeting_recv (Pop3Session *session, const gchar *msg); static gint pop3_getauth_user_send (Pop3Session *session); static gint pop3_getauth_pass_send (Pop3Session *session); -#ifdef USE_GNUTLS static gint pop3_stls_send (Pop3Session *session); static gint pop3_stls_recv (Pop3Session *session); -#endif static gint pop3_getrange_stat_send (Pop3Session *session); static gint pop3_getrange_stat_recv (Pop3Session *session, const gchar *msg); @@ -108,7 +104,6 @@ static gint pop3_greeting_recv(Pop3Session *session, c return PS_SUCCESS; } -#ifdef USE_GNUTLS static gint pop3_stls_send(Pop3Session *session) { session->state = POP3_STLS; @@ -124,7 +119,6 @@ static gint pop3_stls_recv(Pop3Session *session) } return PS_SUCCESS; } -#endif /* USE_GNUTLS */ static gint pop3_getauth_user_send(Pop3Session *session) { @@ -144,7 +138,6 @@ static gint pop3_getauth_pass_send(Pop3Session *sessio return PS_SUCCESS; } -#ifdef USE_OAUTH2 static gint pop3_getauth_oauth2_send_generic(Pop3Session *session) { gchar buf[MESSAGEBUFSIZE], *b64buf, *out; @@ -215,7 +208,6 @@ static gint pop3_getauth_oauth2_send(Pop3Session *sess : pop3_getauth_oauth2_send_generic(session) ); } -#endif static gint pop3_getrange_stat_send(Pop3Session *session) { @@ -516,10 +508,8 @@ static void pop3_gen_send(Pop3Session *session, const if (!g_ascii_strncasecmp(buf, "PASS ", 5)) log_print(LOG_PROTOCOL, "POP> PASS ********\n"); -#ifdef USE_OAUTH2 else if (!g_ascii_strncasecmp(buf, "AUTH XOAUTH2", 12)) log_print(LOG_PROTOCOL, "POP> AUTH XOAUTH2 ********\n"); -#endif else if (length > 128) log_print(LOG_PROTOCOL, "POP> %.128s... (truncated from %d)\n", buf, length); else @@ -548,12 +538,10 @@ Session *pop3_session_new(PrefsAccount *account) SESSION(session)->ssl_cert_auto_accept = TRUE; SESSION(session)->destroy = pop3_session_destroy; -#ifdef USE_GNUTLS if (account->set_gnutls_priority && account->gnutls_priority && strlen(account->gnutls_priority) != 0) SESSION(session)->gnutls_priority = g_strdup(account->gnutls_priority); SESSION(session)->use_tls_sni = account->use_tls_sni; -#endif session->state = POP3_READY; session->ac_prefs = account; @@ -563,7 +551,6 @@ Session *pop3_session_new(PrefsAccount *account) session->error_val = PS_SUCCESS; session->error_msg = NULL; -#ifdef USE_OAUTH2 if(session->ac_prefs->use_pop_auth && session->ac_prefs->pop_auth_type == POPAUTH_OAUTH2){ //Set up for two stage sessions - link provider selected in ac_prefs to the config file GList *oauth2_providers_list = oauth2_providers_get_list(); @@ -573,7 +560,6 @@ Session *pop3_session_new(PrefsAccount *account) debug_print("POP - Oauth2 name: %s Two stage POP: %i\n", oa2->oa2_name, oa2->oa2_two_stage_pop); session->two_stage_pop = oa2->oa2_two_stage_pop; } -#endif return SESSION(session); } @@ -901,12 +887,10 @@ static Pop3ErrorValue pop3_ok(Pop3Session *session, co ok = PS_ERROR; } else { switch (session->state) { -#ifdef USE_GNUTLS case POP3_STLS: log_error(LOG_PROTOCOL, _("couldn't start STARTTLS session\n")); ok = PS_ERROR; break; -#endif case POP3_GETAUTH_USER: case POP3_GETAUTH_PASS: log_error(LOG_PROTOCOL, _("error occurred on authentication\n")); @@ -964,42 +948,30 @@ static gint pop3_session_recv_msg(Session *session, co case POP3_READY: case POP3_GREETING: pop3_greeting_recv(pop3_session, body); -#ifdef USE_GNUTLS if (pop3_session->ac_prefs->ssl_pop == SSL_STARTTLS) val = pop3_stls_send(pop3_session); else -#endif -#ifdef USE_OAUTH2 if (pop3_session->ac_prefs->use_pop_auth && pop3_session->ac_prefs->pop_auth_type == POPAUTH_OAUTH2) val = pop3_getauth_oauth2_send(pop3_session); else -#endif val = pop3_getauth_user_send(pop3_session); break; -#ifdef USE_GNUTLS case POP3_STLS: if (pop3_stls_recv(pop3_session) != PS_SUCCESS) return -1; -#ifdef USE_OAUTH2 else if (pop3_session->ac_prefs->use_pop_auth && pop3_session->ac_prefs->pop_auth_type == POPAUTH_OAUTH2) val = pop3_getauth_oauth2_send(pop3_session); -#endif else val = pop3_getauth_user_send(pop3_session); break; -#endif case POP3_GETAUTH_USER: val = pop3_getauth_pass_send(pop3_session); break; -#ifdef USE_OAUTH2 case POP3_GETAUTH_USER_PHASE2: val = pop3_getauth_oauth2_send_microsoft_2(pop3_session); break; -#endif case POP3_GETAUTH_PASS: -#ifdef USE_OAUTH2 case POP3_GETAUTH_OAUTH2: -#endif if (!pop3_session->pop_before_smtp) val = pop3_getrange_stat_send(pop3_session); else blob - d84cef6ab00ec85bffedc2d2212f82b305789e64 blob + 7b2c0853cbd64e4b9d1386a1941980bd23e1c591 --- src/pop.h +++ src/pop.h @@ -16,13 +16,9 @@ * along with this program. If not, see . */ -#ifndef __POP_H__ -#define __POP_H__ +#ifndef _POP_H_ +#define _POP_H_ -#ifdef HAVE_CONFIG_H -#include "claws-features.h" -#endif - #include #include @@ -46,9 +42,7 @@ typedef struct _MailReceiveData MailReceiveData; typedef enum { POP3_READY, POP3_GREETING, -#ifdef USE_GNUTLS POP3_STLS, -#endif POP3_GETAUTH_USER, POP3_GETAUTH_USER_PHASE2, POP3_GETAUTH_PASS, @@ -130,9 +124,8 @@ struct _Pop3Session gint cur_total_bytes; gint cur_total_recv_bytes; -#ifdef USE_OAUTH2 gint two_stage_pop; -#endif + Pop3MsgInfo *msg; GHashTable *uidl_table; @@ -160,4 +153,4 @@ struct _Pop3Session Session *pop3_session_new (PrefsAccount *account); gint pop3_write_uidl_list (Pop3Session *session); -#endif /* __POP_H__ */ +#endif /* _POP_H_ */ blob - be0645c39396429c38d93e9b8aaa67cdbe84094e blob + e82575f19b9355a780015381c228da6275eca4fb --- src/prefs_account.c +++ src/prefs_account.c @@ -56,22 +56,17 @@ #include "smtp.h" #include "imap.h" #include "pop.h" -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif #include "remotefolder.h" #include "combobox.h" #include "setup.h" -#include "quote_fmt.h" #include "hooks.h" #include "privacy.h" #include "inputdialog.h" -#include "ssl_certificate.h" +#include "common/ssl_certificate.h" #include "passwordstore.h" #include "file-utils.h" -#ifdef USE_GNUTLS #include -#endif static gboolean cancelled; static gboolean new_account; @@ -84,12 +79,10 @@ static GtkWidget *entry_sigpath; static GtkWidget *signature_browse_button; static GtkWidget *signature_edit_button; -#ifdef USE_GNUTLS static GtkWidget *entry_in_cert_file; static GtkWidget *entry_out_cert_file; static GtkWidget *in_ssl_cert_browse_button; static GtkWidget *out_ssl_cert_browse_button; -#endif struct AutocheckWidgets { GtkWidget *autochk_hour_spinbtn; @@ -99,11 +92,9 @@ struct AutocheckWidgets { static GSList *prefs_pages = NULL; -#ifdef USE_OAUTH2 static GTask *oauth2_listener_task; static int oauth2_listener_cancel = 0; static int oauth2_listener_closed = 0; -#endif typedef struct BasicPage { @@ -196,7 +187,6 @@ typedef struct SendPage GtkWidget *pop_auth_minutes_lbl; } SendPage; -#ifdef USE_OAUTH2 typedef struct Oauth2Page { PrefsPage page; @@ -214,7 +204,6 @@ typedef struct Oauth2Page GtkWidget *oauth2_client_id_entry; GtkWidget *oauth2_client_secret_entry; } Oauth2Page; -#endif typedef struct { @@ -332,14 +321,10 @@ typedef struct AdvancedPage static BasicPage basic_page; static ReceivePage receive_page; static SendPage send_page; -#ifdef USE_OAUTH2 static Oauth2Page oauth2_page; -#endif static ComposePage compose_page; static PrivacyPage privacy_page; -#ifdef USE_GNUTLS static SSLPage ssl_page; -#endif static AdvancedPage advanced_page; struct BasicProtocol { @@ -357,14 +342,12 @@ static char *protocol_names[] = { N_("None (SMTP only)") }; -#ifdef USE_OAUTH2 struct Oauth2Listener { int success; Oauth2Service service; OAUTH2Data *OAUTH2Data; gchar *trim_text; }; -#endif static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam); static void prefs_account_protocol_set_optmenu (PrefParam *pparam); @@ -379,7 +362,7 @@ static void prefs_account_smtp_auth_type_set_data_from static void prefs_account_smtp_auth_type_set_optmenu (PrefParam *pparam); static void prefs_account_pop_auth_type_set_data_from_optmenu (PrefParam *pparam); static void prefs_account_pop_auth_type_set_optmenu (PrefParam *pparam); -#ifdef USE_OAUTH2 + static void prefs_account_oauth2_provider_set_data_from_optmenu (PrefParam *pparam); static void prefs_account_oauth2_provider_set_optmenu (PrefParam *pparam); static void prefs_account_oauth2_copy_url (GtkButton *button, gpointer data); @@ -389,7 +372,7 @@ static int prefs_account_oauth2_get_line(int sock, ch static void prefs_account_oauth2_set_sensitivity(void); static void prefs_account_oauth2_set_auth_sensitivity(void); static void prefs_account_oauth2_obtain_tokens(GtkButton *button, gpointer data); -#endif + static void prefs_account_set_autochk_interval_from_widgets(PrefParam *pparam); static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam); @@ -559,7 +542,6 @@ static PrefParam send_param[] = { }; static PrefParam oauth2_param[] = { -#ifdef USE_OAUTH2 {"oauth2_auth_provider", "0", &tmp_ac_prefs.oauth2_provider, P_ENUM, &oauth2_page.oauth2_auth_optmenu, prefs_account_oauth2_provider_set_data_from_optmenu, @@ -576,24 +558,7 @@ static PrefParam oauth2_param[] = { {"oauth2_client_secret", NULL, &tmp_ac_prefs.oauth2_client_secret, P_STRING, &oauth2_page.oauth2_client_secret_entry, prefs_set_data_from_entry, prefs_set_entry}, -#else - {"oauth2_auth_provider", "0", &tmp_ac_prefs.oauth2_provider, P_ENUM, - NULL, NULL, NULL}, - {"oauth2_date", 0, &tmp_ac_prefs.oauth2_date, P_INT, - NULL, NULL, NULL}, - - {"oauth2_authcode", NULL, &tmp_ac_prefs.oauth2_authcode, P_PASSWORD, - NULL, NULL, NULL}, - - {"oauth2_client_id", NULL, &tmp_ac_prefs.oauth2_client_id, P_STRING, - NULL, NULL, NULL}, - - {"oauth2_client_secret", NULL, &tmp_ac_prefs.oauth2_client_secret, P_STRING, - NULL, NULL, NULL}, - -#endif - {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL} }; @@ -683,7 +648,6 @@ static PrefParam privacy_param[] = { }; static PrefParam ssl_param[] = { -#ifdef USE_GNUTLS {"ssl_pop", "1", &tmp_ac_prefs.ssl_pop, P_ENUM, &ssl_page.pop_nossl_radiobtn, prefs_account_enum_set_data_from_radiobtn, @@ -717,32 +681,7 @@ static PrefParam ssl_param[] = { {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD, NULL, NULL, NULL}, -#else - {"ssl_pop", "0", &tmp_ac_prefs.ssl_pop, P_ENUM, - NULL, NULL, NULL}, - {"ssl_imap", "0", &tmp_ac_prefs.ssl_imap, P_ENUM, - NULL, NULL, NULL}, - - {"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM, - NULL, NULL, NULL}, - - {"in_ssl_client_cert_file", "", &tmp_ac_prefs.in_ssl_client_cert_file, P_STRING, - NULL, NULL, NULL}, - - {"in_ssl_client_cert_pass", "", &tmp_ac_prefs.in_ssl_client_cert_pass, P_PASSWORD, - NULL, NULL, NULL}, - - {"out_ssl_client_cert_file", "", &tmp_ac_prefs.out_ssl_client_cert_file, P_STRING, - NULL, NULL, NULL}, - - {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD, - NULL, NULL, NULL}, - - {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL, - NULL, NULL, NULL}, -#endif /* USE_GNUTLS */ - {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL} }; @@ -779,13 +718,11 @@ static PrefParam advanced_param[] = { &advanced_page.domain_entry, prefs_set_data_from_entry, prefs_set_entry}, -#ifdef USE_GNUTLS {"gnutls_set_priority", "FALSE", &tmp_ac_prefs.set_gnutls_priority, P_BOOL, NULL, NULL, NULL}, {"gnutls_priority", NULL, &tmp_ac_prefs.gnutls_priority, P_STRING, NULL, NULL, NULL}, -#endif {"set_tunnelcmd", "FALSE", &tmp_ac_prefs.set_tunnelcmd, P_BOOL, &advanced_page.tunnelcmd_checkbtn, @@ -836,19 +773,15 @@ static void prefs_account_sigfile_radiobtn_cb (GtkWidg static void prefs_account_sigcmd_radiobtn_cb (GtkWidget *widget, gpointer data); static void prefs_account_signature_browse_cb (GtkWidget *widget, gpointer data); -#ifdef USE_GNUTLS static void prefs_account_in_cert_browse_cb (GtkWidget *widget, gpointer data); static void prefs_account_out_cert_browse_cb (GtkWidget *widget, gpointer data); -#endif static void prefs_account_signature_edit_cb (GtkWidget *widget, gpointer data); static void pop_bfr_smtp_tm_set_sens (GtkWidget *widget, gpointer data); -#if (defined USE_GNUTLS) static void auto_configure_cb (GtkWidget *widget, gpointer data); -#endif static void prefs_account_edit_custom_header (void); static void prefs_account_receive_itv_spinbutton_value_changed_cb(GtkWidget *w, gpointer data); @@ -1057,14 +990,12 @@ static void basic_create_widget_func(PrefsPage * _page auto_configure_lbl = gtk_label_new(""); gtk_label_set_justify(GTK_LABEL(auto_configure_lbl), GTK_JUSTIFY_LEFT); gtk_box_pack_start(GTK_BOX (optmenubox), auto_configure_lbl, FALSE, FALSE, 0); -#if (defined USE_GNUTLS) gtk_widget_show(auto_configure_btn); gtk_widget_show(auto_configure_lbl); g_signal_connect (G_OBJECT (auto_configure_btn), "clicked", G_CALLBACK (auto_configure_cb), NULL); g_signal_connect (G_OBJECT (auto_configure_cancel_btn), "clicked", G_CALLBACK (auto_configure_cb), NULL); -#endif no_imap_warn_icon = gtk_image_new_from_icon_name ("dialog-warning-symbolic", GTK_ICON_SIZE_SMALL_TOOLBAR); @@ -1335,9 +1266,6 @@ static void receive_create_widget_func(PrefsPage * _pa COMBOBOX_ADD (menu2, _("Select"), 0); COMBOBOX_ADD (menu2, NULL, 0); COMBOBOX_ADD (menu2, "OAuth2", POPAUTH_OAUTH2); -#ifndef USE_OAUTH2 - gtk_list_store_set(menu2, &iter, COMBOBOX_SENS, FALSE, -1); -#endif SET_TOGGLE_SENSITIVITY (pop_auth_checkbtn, vbox5); @@ -1433,9 +1361,6 @@ static void receive_create_widget_func(PrefsPage * _pa COMBOBOX_ADD (menu, "PLAIN", IMAP_AUTH_PLAIN); COMBOBOX_ADD (menu, "LOGIN", IMAP_AUTH_LOGIN); COMBOBOX_ADD (menu, "OAUTH2", IMAP_AUTH_OAUTH2); -#ifndef USE_OAUTH2 - gtk_list_store_set(menu, &iter, COMBOBOX_SENS, FALSE, -1); -#endif hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); gtk_widget_show (hbox1); @@ -1684,10 +1609,7 @@ static void send_create_widget_func(PrefsPage * _page, COMBOBOX_ADD (menu, "PLAIN", SMTPAUTH_PLAIN); COMBOBOX_ADD (menu, "LOGIN", SMTPAUTH_LOGIN); COMBOBOX_ADD (menu, "OAUTH2", SMTPAUTH_OAUTH2); -#ifndef USE_OAUTH2 gtk_list_store_set(menu, &iter, COMBOBOX_SENS, FALSE, -1); -#endif - gtk_list_store_set(menu, &iter, COMBOBOX_SENS, FALSE, -1); PACK_SPACER(vbox4, vbox_spc, VSPACING_NARROW_2); @@ -1816,7 +1738,6 @@ static void send_create_widget_func(PrefsPage * _page, page->page.widget = vbox1; } -#ifdef USE_OAUTH2 static void oauth2_create_widget_func(PrefsPage * _page, GtkWindow * window, gpointer data) @@ -2033,7 +1954,6 @@ static void oauth2_create_widget_func(PrefsPage * _pag } } } -#endif static void compose_create_widget_func(PrefsPage * _page, GtkWindow * window, @@ -2312,8 +2232,6 @@ static void privacy_create_widget_func(PrefsPage * _pa GINT_TO_POINTER (data)); \ } -#ifdef USE_GNUTLS - #define CREATE_RADIO_BUTTONS(box, \ btn1, btn1_label, btn1_data, \ btn2, btn2_label, btn2_data, \ @@ -2609,7 +2527,6 @@ static void ssl_create_widget_func(PrefsPage * _page, } #undef CREATE_RADIO_BUTTONS -#endif /* USE_GNUTLS */ static void advanced_create_widget_func(PrefsPage * _page, GtkWindow * window, @@ -2901,10 +2818,8 @@ static gint prefs_basic_apply(void) gtk_entry_get_text(GTK_ENTRY(basic_page.pass_entry)), FALSE); -#ifdef USE_OAUTH2 /* Manual password change - reset expiry on OAUTH2 tokens*/ passwd_store_set_account(tmp_ac_prefs.account_id, PWS_ACCOUNT_OAUTH2_EXPIRY, "0", FALSE); -#endif if (protocol == A_IMAP4) { new_id = g_strdup_printf("#imap/%s", tmp_ac_prefs.account_name); @@ -2943,16 +2858,13 @@ static gint prefs_send_apply(void) PWS_ACCOUNT_SEND, gtk_entry_get_text(GTK_ENTRY(send_page.smtp_pass_entry)), FALSE); -#ifdef USE_OAUTH2 /* Manual password change - reset expiry on OAUTH2 tokens*/ if (tmp_ac_prefs.use_smtp_auth && tmp_ac_prefs.smtp_auth_type == SMTPAUTH_OAUTH2) passwd_store_set_account(tmp_ac_prefs.account_id, PWS_ACCOUNT_OAUTH2_EXPIRY, "0", FALSE); -#endif return 0; } -#ifdef USE_OAUTH2 static gint prefs_oauth2_apply(void) { prefs_set_data_from_dialog(oauth2_param); @@ -2965,7 +2877,6 @@ static gint prefs_oauth2_apply(void) return 0; } -#endif static gint prefs_compose_apply(void) { @@ -2979,7 +2890,6 @@ static gint prefs_privacy_apply(void) return 0; } -#ifdef USE_GNUTLS static gint prefs_ssl_apply(void) { prefs_set_data_from_dialog(ssl_param); @@ -2996,7 +2906,6 @@ static gint prefs_ssl_apply(void) return 0; } -#endif static gint prefs_advanced_apply(void) { @@ -3045,7 +2954,6 @@ static void send_destroy_widget_func(PrefsPage *_page) /* SendPage *page = (SendPage *) _page; */ } -#ifdef USE_OAUTH2 static void oauth2_destroy_widget_func(PrefsPage *_page) { /* Oauth2Page *page = (Oauth2Page *) _page; */ @@ -3055,7 +2963,6 @@ static void oauth2_destroy_widget_func(PrefsPage *_pag oauth2_listener_cancel = 1; } } -#endif static void compose_destroy_widget_func(PrefsPage *_page) { @@ -3067,12 +2974,10 @@ static void privacy_destroy_widget_func(PrefsPage *_pa /* PrivacyPage *page = (PrivacyPage *) _page; */ } -#ifdef USE_GNUTLS static void ssl_destroy_widget_func(PrefsPage *_page) { /* SSLPage *page = (SSLPage *) _page; */ } -#endif static void advanced_destroy_widget_func(PrefsPage *_page) { @@ -3109,7 +3014,6 @@ static gboolean send_can_close_func(PrefsPage *_page) return prefs_send_apply() >= 0; } -#ifdef USE_OAUTH2 static gboolean oauth2_can_close_func(PrefsPage *_page) { Oauth2Page *page = (Oauth2Page *) _page; @@ -3119,7 +3023,6 @@ static gboolean oauth2_can_close_func(PrefsPage *_page return prefs_oauth2_apply() >= 0; } -#endif static gboolean compose_can_close_func(PrefsPage *_page) { @@ -3141,7 +3044,6 @@ static gboolean privacy_can_close_func(PrefsPage *_pag return prefs_privacy_apply() >= 0; } -#ifdef USE_GNUTLS static gboolean ssl_can_close_func(PrefsPage *_page) { SSLPage *page = (SSLPage *) _page; @@ -3151,7 +3053,6 @@ static gboolean ssl_can_close_func(PrefsPage *_page) return prefs_ssl_apply() >= 0; } -#endif static gboolean advanced_can_close_func(PrefsPage *_page) { @@ -3196,7 +3097,6 @@ static void send_save_func(PrefsPage *_page) cancelled = FALSE; } -#ifdef USE_OAUTH2 static void oauth2_save_func(PrefsPage *_page) { Oauth2Page *page = (Oauth2Page *) _page; @@ -3207,7 +3107,6 @@ static void oauth2_save_func(PrefsPage *_page) if (prefs_oauth2_apply() >= 0) cancelled = FALSE; } -#endif static void compose_save_func(PrefsPage *_page) { @@ -3231,7 +3130,6 @@ static void privacy_save_func(PrefsPage *_page) cancelled = FALSE; } -#ifdef USE_GNUTLS static void ssl_save_func(PrefsPage *_page) { SSLPage *page = (SSLPage *) _page; @@ -3242,7 +3140,6 @@ static void ssl_save_func(PrefsPage *_page) if (prefs_ssl_apply() >= 0) cancelled = FALSE; } -#endif static void advanced_save_func(PrefsPage *_page) { @@ -3309,7 +3206,6 @@ static void register_send_page(void) prefs_account_register_page((PrefsPage *) &send_page); } -#ifdef USE_OAUTH2 static void register_oauth2_page(void) { static gchar *path[3]; @@ -3327,7 +3223,6 @@ static void register_oauth2_page(void) prefs_account_register_page((PrefsPage *) &oauth2_page); } -#endif static void register_compose_page(void) { @@ -3365,7 +3260,6 @@ static void register_privacy_page(void) prefs_account_register_page((PrefsPage *) &privacy_page); } -#ifdef USE_GNUTLS static void register_ssl_page(void) { static gchar *path[3]; @@ -3447,7 +3341,6 @@ static gboolean sslcert_get_password(gpointer source, return TRUE; } -#endif static void register_advanced_page(void) { @@ -3474,14 +3367,10 @@ void prefs_account_init() register_send_page(); register_compose_page(); register_privacy_page(); -#ifdef USE_GNUTLS register_ssl_page(); hooks_register_hook(SSLCERT_GET_CLIENT_CERT_HOOKLIST, sslcert_get_client_cert_hook, NULL); hooks_register_hook(SSL_CERT_GET_PASSWORD, sslcert_get_password, NULL); -#endif -#ifdef USE_OAUTH2 register_oauth2_page(); -#endif register_advanced_page(); } @@ -3856,7 +3745,6 @@ static void prefs_account_select_folder_cb(GtkWidget * } } -#if (defined USE_GNUTLS) static void auto_configure_cb (GtkWidget *widget, gpointer data) { gchar *address = NULL; @@ -3956,7 +3844,6 @@ static void auto_configure_cb (GtkWidget *widget, gpoi g_free(address); } -#endif static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data) { @@ -3987,7 +3874,6 @@ static void prefs_account_signature_browse_cb(GtkWidge g_free(utf8_filename); } -#ifdef USE_GNUTLS static void prefs_account_in_cert_browse_cb(GtkWidget *widget, gpointer data) { gchar *filename; @@ -4021,7 +3907,6 @@ static void prefs_account_out_cert_browse_cb(GtkWidget gtk_entry_set_text(GTK_ENTRY(entry_out_cert_file), utf8_filename); g_free(utf8_filename); } -#endif static void prefs_account_signature_edit_cb(GtkWidget *widget, gpointer data) { @@ -4181,7 +4066,6 @@ static void prefs_account_pop_auth_type_set_optmenu(Pr combobox_select_by_data(optmenu, type); } -#ifdef USE_OAUTH2 static void prefs_account_oauth2_provider_set_data_from_optmenu(PrefParam *pparam) { *((Oauth2Service *)pparam->data) = @@ -4338,7 +4222,6 @@ static void prefs_account_oauth2_obtain_tokens(GtkButt g_free(trim_text); g_free(OAUTH2Data); } -#endif static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam) { @@ -4511,11 +4394,9 @@ static void prefs_account_protocol_changed(GtkComboBox TRUE); } -#ifdef USE_GNUTLS gtk_widget_hide(ssl_page.pop_frame); gtk_widget_hide(ssl_page.imap_frame); gtk_widget_show(ssl_page.send_frame); -#endif gtk_widget_hide(advanced_page.popport_hbox); gtk_widget_hide(advanced_page.imapport_hbox); gtk_widget_hide(advanced_page.tunnelcmd_checkbtn); @@ -4574,11 +4455,9 @@ static void prefs_account_protocol_changed(GtkComboBox FALSE); } -#ifdef USE_GNUTLS gtk_widget_hide(ssl_page.pop_frame); gtk_widget_show(ssl_page.imap_frame); gtk_widget_show(ssl_page.send_frame); -#endif gtk_widget_hide(advanced_page.popport_hbox); gtk_widget_show(advanced_page.imapport_hbox); gtk_widget_show(advanced_page.tunnelcmd_checkbtn); @@ -4632,11 +4511,9 @@ static void prefs_account_protocol_changed(GtkComboBox gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn), FALSE); -#ifdef USE_GNUTLS gtk_widget_hide(ssl_page.pop_frame); gtk_widget_hide(ssl_page.imap_frame); gtk_widget_show(ssl_page.send_frame); -#endif gtk_widget_hide(advanced_page.popport_hbox); gtk_widget_hide(advanced_page.imapport_hbox); gtk_widget_hide(advanced_page.tunnelcmd_checkbtn); @@ -4695,11 +4572,9 @@ static void prefs_account_protocol_changed(GtkComboBox TRUE); } -#ifdef USE_GNUTLS gtk_widget_show(ssl_page.pop_frame); gtk_widget_hide(ssl_page.imap_frame); gtk_widget_show(ssl_page.send_frame); -#endif gtk_widget_show(advanced_page.popport_hbox); gtk_widget_hide(advanced_page.imapport_hbox); gtk_widget_hide(advanced_page.tunnelcmd_checkbtn); @@ -4790,8 +4665,7 @@ gchar *prefs_account_generate_msgid(PrefsAccount *acco now = (prefs_common.hide_timezone)? g_date_time_new_now_utc() : g_date_time_new_now_local(); tmbuf = g_date_time_format(now, "%Y%m%d%H%M%S"); - buf = g_strdup_printf("%s.%08x%s", - tmbuf, (guint)rand(), addr); + buf = g_strdup_printf("%s.%08x%s", tmbuf, (guint)rand(), addr); g_date_time_unref(now); g_free(tmbuf); g_free(addr); @@ -4850,7 +4724,6 @@ static void prefs_account_receive_itv_spinbutton_value } } -#ifdef USE_OAUTH2 //Automation of the oauth2 authorisation process to receive loopback callback generated by redirect in browser static void prefs_account_oauth2_listener(GTask *task, gpointer source, gpointer task_data, GCancellable *cancellable) { @@ -5041,4 +4914,3 @@ static int prefs_account_oauth2_get_line(int sock, cha return (i); } -#endif blob - 50616c5f01f61e1d49e65f1681c12f53c3c6b928 blob + 8a85530fbd2af8cdc1c8369b273b83b1da62fc18 --- src/prefs_actions.c +++ src/prefs_actions.c @@ -45,7 +45,6 @@ #include "description_window.h" #include "manual.h" #include "menu.h" -#include "matcher_parser.h" #include "prefs_toolbar.h" #include "file-utils.h" blob - ff89c77b4483af717c8ea8ec12c252a1cb2f3a0d blob + 581c9d24dfbf5cf06ea3f44a181c2eca65f91f83 --- src/prefs_compose_writing.c +++ src/prefs_compose_writing.c @@ -40,8 +40,6 @@ #include "manage_window.h" -#include "quote_fmt.h" -#include "prefs_template.h" #include "alertpanel.h" #include "combobox.h" @@ -217,7 +215,6 @@ static void prefs_compose_writing_create_widget(PrefsP PACK_CHECK_BUTTON (vbox2, checkbtn_forward_as_attachment, "Forward as attachment"); text = "Keep the original 'From' header when redirecting"; PACK_CHECK_BUTTON (vbox2, checkbtn_redirect_keep_from, text); - g_free(text); /* dnd insert or attach */ label_dnd_insert_or_attach = gtk_label_new (_("When dropping files into the Write window")); blob - 3f030ebb7e351000152710a2baa7280ce06fe9e8 blob + ddffe246e6ad6f76a934cb6e5c9e8e5f6af27782 --- src/prefs_folder_item.c +++ src/prefs_folder_item.c @@ -44,7 +44,6 @@ #include "gtkutils.h" #include "folder_item_prefs.h" #include "string_match.h" -#include "quote_fmt.h" #include "combobox.h" #include "stock_pixmap.h" #include "file-utils.h" blob - 93415de979725e514b0786263ae465229b52a384 (mode 644) blob + /dev/null --- src/prefs_matcher.c +++ /dev/null @@ -1,2573 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include "defs.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "main.h" -#include "prefs_gtk.h" -#include "prefs_matcher.h" -#include "prefs_common.h" -#include "procheader.h" -#include "mainwindow.h" -#include "foldersel.h" -#include "manage_window.h" -#include "inc.h" -#include "matcher.h" -#include "utils.h" -#include "gtkutils.h" -#include "alertpanel.h" -#include "folder.h" -#include "description_window.h" -#include "combobox.h" - -#include "matcher_parser.h" -#include "addressbook.h" - -static void prefs_matcher_addressbook_select(void); -static void prefs_matcher_test_info(GtkWidget *widget, GtkWidget *parent); - -enum { - PREFS_MATCHER_COND, - PREFS_MATCHER_COND_VALID, - N_PREFS_MATCHER_COLUMNS -}; - -/*! - *\brief UI data for matcher dialog - */ -static struct Matcher { - GtkWidget *window; - - GtkWidget *ok_btn; - - GtkWidget *match_combo; - GtkWidget *header_addr_combo; - GtkWidget *bool_op_combo; - GtkWidget *criteria_label2; - GtkWidget *criteria_combo; - GtkWidget *criteria_combo2; - GtkWidget *match_combo2; - GtkWidget *match_label; - GtkWidget *match_label2; - GtkWidget *headers_combo; - GtkWidget *upper_filler; - GtkWidget *lower_filler; - - GtkWidget *header_entry; - GtkWidget *header_addr_entry; - GtkWidget *string_entry; - GtkWidget *numeric_entry; - GtkWidget *numeric_label; - GtkWidget *addressbook_folder_combo; - GtkWidget *case_checkbtn; - GtkWidget *regexp_checkbtn; - GtkWidget *calendar; - GtkWidget *time_label; - GtkWidget *time_entry; - - GtkWidget *test_btn; - GtkWidget *addressbook_select_btn; - - GtkTreeModel *model_age; - GtkTreeModel *model_date; - GtkTreeModel *model_age_units; - GtkTreeModel *model_contain; - GtkTreeModel *model_found; - GtkTreeModel *model_flags; - GtkTreeModel *model_headers; - GtkTreeModel *model_partial; - GtkTreeModel *model_phrase; - GtkTreeModel *model_score; - GtkTreeModel *model_set; - GtkTreeModel *model_size; - GtkTreeModel *model_size_units; - GtkTreeModel *model_test; - GtkTreeModel *model_thread; - - GtkWidget *cond_list_view; - - gint selected_criteria; /*!< selected criteria in combobox */ -} matcher; - -/*! - *\brief Conditions with a negate counterpart (like unread and ~unread) - * have the same CRITERIA_XXX id). I.e. both unread and ~unread - * have criteria id CRITERIA_UNREAD. This id is passed as the - * first parameter to #matcherprop_new and #matcherprop_unquote_new. - */ -enum { - CRITERIA_ALL = 0, - - CRITERIA_SUBJECT = 1, - CRITERIA_FROM = 2, - CRITERIA_TO = 3, - CRITERIA_CC = 4, - CRITERIA_TO_OR_CC = 5, - CRITERIA_NEWSGROUPS = 6, - CRITERIA_INREPLYTO = 7, - CRITERIA_REFERENCES = 8, - CRITERIA_AGE_GREATER = 9, - CRITERIA_AGE_LOWER = 10, - CRITERIA_HEADER = 11, - CRITERIA_HEADERS_PART = 12, - CRITERIA_BODY_PART = 13, - CRITERIA_MESSAGE = 14, - - CRITERIA_UNREAD = 15, - CRITERIA_NEW = 16, - CRITERIA_MARKED = 17, - CRITERIA_DELETED = 18, - CRITERIA_REPLIED = 19, - CRITERIA_FORWARDED = 20, - CRITERIA_LOCKED = 21, - CRITERIA_SPAM = 22, - CRITERIA_COLORLABEL = 23, - CRITERIA_IGNORE_THREAD = 24, - CRITERIA_WATCH_THREAD = 25, - - CRITERIA_SCORE_GREATER = 26, - CRITERIA_SCORE_LOWER = 27, - CRITERIA_SCORE_EQUAL = 28, - - CRITERIA_TEST = 29, - - CRITERIA_SIZE_GREATER = 30, - CRITERIA_SIZE_SMALLER = 31, - CRITERIA_SIZE_EQUAL = 32, - - CRITERIA_PARTIAL = 33, - - CRITERIA_FOUND_IN_ADDRESSBOOK = 34, - - CRITERIA_TAG = 35, - CRITERIA_TAGGED = 36, - - CRITERIA_HAS_ATTACHMENT = 37, - CRITERIA_SIGNED = 38, - - CRITERIA_AGE_GREATER_HOURS = 39, - CRITERIA_AGE_LOWER_HOURS = 40, - - CRITERIA_MESSAGEID = 41, - CRITERIA_HEADERS_CONT = 42, - - CRITERIA_DATE_AFTER = 43, - CRITERIA_DATE_BEFORE = 44 -}; - -enum { - MATCH_ALL = 0, - MATCH_HEADER = 1, - MATCH_AGE = 2, - MATCH_PHRASE = 3, - MATCH_FLAG = 4, - MATCH_LABEL = 5, - MATCH_THREAD = 6, - MATCH_SCORE = 7, - MATCH_SIZE = 8, - MATCH_PARTIAL = 9, - MATCH_ABOOK = 10, - MATCH_TAGS = 11, - MATCH_TEST = 12, - MATCH_DATE = 13 -}; - -enum { - AGE_HOURS = 0, - AGE_DAYS = 1, - AGE_WEEKS = 2 -}; - -enum { - SIZE_UNIT_BYTES = 0, - SIZE_UNIT_KBYTES = 1, - SIZE_UNIT_MBYTES = 2 -}; - -#define MB_SIZE 0x100000 -#define KB_SIZE 0x000400 - -enum { - THREAD_IGNORED = 0, - THREAD_NOT_IGNORED = 1, - THREAD_WATCHED = 2, - THREAD_NOT_WATCHED = 3 -}; - -/*! - *\brief Contains predicate - */ -enum { - PREDICATE_CONTAINS = 0, - PREDICATE_DOES_NOT_CONTAIN = 1 -}; - -/*! - *\brief Enabled predicate - */ -enum { - PREDICATE_FLAG_ENABLED = 0, - PREDICATE_FLAG_DISABLED = 1 -}; - -/*! - *\brief Hooks - */ -static PrefsMatcherSignal *matchers_callback; - -/* widget creating functions */ -static void prefs_matcher_create (void); - -static void prefs_matcher_set_dialog (MatcherList *matchers); -static void prefs_matcher_list_view_set_row (GtkTreeIter *row, - MatcherProp *prop); - -/* callback functions */ - -static void prefs_matcher_register_cb (void); -static void prefs_matcher_substitute_cb (void); -static void prefs_matcher_delete_cb (void); -static void prefs_matcher_up (void); -static void prefs_matcher_down (void); -static void prefs_matcher_ok (void); -static void prefs_matcher_cancel (void); -static gint prefs_matcher_deleted (GtkWidget *widget, GdkEventAny *event, - gpointer data); -static void prefs_matcher_criteria_select (GtkWidget *widget, - gpointer user_data); -static void prefs_matcher_second_criteria_sel (GtkWidget *widget, - gpointer user_data); -static void prefs_matcher_set_model (GtkWidget *wiget, - GtkTreeModel *model); -static MatcherList *prefs_matcher_get_list (void); - -static GtkListStore* prefs_matcher_create_data_store (void); - -static void prefs_matcher_list_view_insert_matcher (GtkWidget *list_view, - GtkTreeIter *row_iter, - const gchar *matcher, - gboolean is_valid); - -static GtkWidget *prefs_matcher_list_view_create (void); - -static void prefs_matcher_create_list_view_columns (GtkWidget *list_view); - -static gboolean prefs_matcher_selected (GtkTreeSelection *selector, - GtkTreeModel *model, - GtkTreePath *path, - gboolean currently_selected, - gpointer data); - -static int header_name_to_crit(const gchar *header) -{ - if (header == NULL) - return CRITERIA_HEADER; - - if (!strcasecmp(header, "Subject")) - return CRITERIA_SUBJECT; - if (!strcasecmp(header, "From")) - return CRITERIA_FROM; - if (!strcasecmp(header, "To")) - return CRITERIA_TO; - if (!strcasecmp(header, "Cc")) - return CRITERIA_CC; - if (!strcasecmp(header, "To or Cc")) - return CRITERIA_TO_OR_CC; - if (!strcasecmp(header, "Message-ID")) - return CRITERIA_MESSAGEID; - if (!strcasecmp(header, "In-Reply-To")) - return CRITERIA_INREPLYTO; - if (!strcasecmp(header, "References")) - return CRITERIA_REFERENCES; - - return CRITERIA_HEADER; -} - -static void prefs_matcher_models_create(void) -{ - GtkListStore *store; - GtkTreeIter iter; - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("more than"), CRITERIA_AGE_GREATER); - COMBOBOX_ADD(store, _("less than"), CRITERIA_AGE_LOWER); - matcher.model_age = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("hours"), AGE_HOURS); - COMBOBOX_ADD(store, _("days"), AGE_DAYS); - COMBOBOX_ADD(store, _("weeks"), AGE_WEEKS); - matcher.model_age_units = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("after"), CRITERIA_DATE_AFTER); - COMBOBOX_ADD(store, _("before"), CRITERIA_DATE_BEFORE); - matcher.model_date = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("higher than"), CRITERIA_SCORE_GREATER); - COMBOBOX_ADD(store, _("lower than"), CRITERIA_SCORE_LOWER); - COMBOBOX_ADD(store, _("exactly"), CRITERIA_SCORE_EQUAL); - matcher.model_score = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("greater than"), CRITERIA_SIZE_GREATER); - COMBOBOX_ADD(store, _("smaller than"), CRITERIA_SIZE_SMALLER); - COMBOBOX_ADD(store, _("exactly"), CRITERIA_SIZE_EQUAL); - matcher.model_size = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("bytes"), SIZE_UNIT_BYTES); - COMBOBOX_ADD(store, _("kibibytes"), SIZE_UNIT_KBYTES); - COMBOBOX_ADD(store, _("mebibytes"), SIZE_UNIT_MBYTES); - matcher.model_size_units = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("contains"), 0); - COMBOBOX_ADD(store, _("doesn't contain"), 0); - matcher.model_contain = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, "Subject", CRITERIA_SUBJECT); - COMBOBOX_ADD(store, "From", CRITERIA_FROM); - COMBOBOX_ADD(store, "To", CRITERIA_TO); - COMBOBOX_ADD(store, "Cc", CRITERIA_CC); - COMBOBOX_ADD(store, "To or Cc", CRITERIA_TO_OR_CC); - COMBOBOX_ADD(store, "Message-ID", CRITERIA_MESSAGEID); - COMBOBOX_ADD(store, "In-Reply-To", CRITERIA_INREPLYTO); - COMBOBOX_ADD(store, "References", CRITERIA_REFERENCES); - COMBOBOX_ADD(store, "Sender", CRITERIA_HEADER); - COMBOBOX_ADD(store, "X-ML-Name", CRITERIA_HEADER); - COMBOBOX_ADD(store, "X-List", CRITERIA_HEADER); - COMBOBOX_ADD(store, "X-Sequence", CRITERIA_HEADER); - COMBOBOX_ADD(store, "X-Mailer", CRITERIA_HEADER); - COMBOBOX_ADD(store, "X-BeenThere", CRITERIA_HEADER); - COMBOBOX_ADD(store, "List-Post", CRITERIA_HEADER); - COMBOBOX_ADD(store, "List-Id", CRITERIA_HEADER); - matcher.model_headers = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("headers part"), CRITERIA_HEADERS_PART); - COMBOBOX_ADD(store, _("headers values"), CRITERIA_HEADERS_CONT); - COMBOBOX_ADD(store, _("body part"), CRITERIA_BODY_PART); - COMBOBOX_ADD(store, _("whole message"), CRITERIA_MESSAGE); - matcher.model_phrase = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("Unread"), CRITERIA_UNREAD); - COMBOBOX_ADD(store, _("New"), CRITERIA_NEW); - COMBOBOX_ADD(store, _("Marked"), CRITERIA_MARKED); - COMBOBOX_ADD(store, _("Deleted"), CRITERIA_DELETED); - COMBOBOX_ADD(store, _("Replied"), CRITERIA_REPLIED); - COMBOBOX_ADD(store, _("Forwarded"), CRITERIA_FORWARDED); - COMBOBOX_ADD(store, _("Locked"), CRITERIA_LOCKED); - COMBOBOX_ADD(store, _("Spam"), CRITERIA_SPAM); - COMBOBOX_ADD(store, _("Has attachment"), CRITERIA_HAS_ATTACHMENT); - COMBOBOX_ADD(store, _("Signed"), CRITERIA_SIGNED); - matcher.model_flags = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("set"), 0); - COMBOBOX_ADD(store, _("not set"), 1); - matcher.model_set = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("yes"), CRITERIA_PARTIAL); - COMBOBOX_ADD(store, _("no"), CRITERIA_PARTIAL); - matcher.model_partial = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("ignored"), CRITERIA_IGNORE_THREAD); - COMBOBOX_ADD(store, _("not ignored"), CRITERIA_IGNORE_THREAD); - COMBOBOX_ADD(store, _("watched"), CRITERIA_WATCH_THREAD); - COMBOBOX_ADD(store, _("not watched"), CRITERIA_WATCH_THREAD); - matcher.model_thread = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("found"), 0); - COMBOBOX_ADD(store, _("not found"), 1); - matcher.model_found = GTK_TREE_MODEL(store); - - store = gtk_list_store_new(3, G_TYPE_STRING, G_TYPE_INT, G_TYPE_BOOLEAN); - COMBOBOX_ADD(store, _("0 (Passed)"), 0); - COMBOBOX_ADD(store, _("non-0 (Failed)"), 1); - matcher.model_test = GTK_TREE_MODEL(store); -} - -/*! - *\brief Opens the matcher dialog with a list of conditions - * - *\param matchers List of conditions - *\param cb Callback - * - */ -void prefs_matcher_open(MatcherList *matchers, PrefsMatcherSignal *cb) -{ - inc_lock(); - - if (!matcher.window) { - prefs_matcher_models_create(); - prefs_matcher_create(); - } - - manage_window_set_transient(GTK_WINDOW(matcher.window)); - gtk_widget_grab_focus(matcher.ok_btn); - - matchers_callback = cb; - - prefs_matcher_set_dialog(matchers); - - gtk_widget_show(matcher.window); - gtk_window_set_modal(GTK_WINDOW(matcher.window), TRUE); -} - -/*! - *\brief Save Gtk object size to prefs dataset - */ -static void prefs_matcher_size_allocate_cb(GtkWidget *widget, - GtkAllocation *allocation) -{ - cm_return_if_fail(allocation != NULL); - - gtk_window_get_size(GTK_WINDOW(widget), - &prefs_common.matcherwin_width, &prefs_common.matcherwin_height); -} - -/*! - *\brief Create the matcher dialog - */ -static void prefs_matcher_create(void) -{ - GtkWidget *window; - GtkWidget *vbox; - GtkWidget *ok_btn; - GtkWidget *cancel_btn; - GtkWidget *confirm_area; - - GtkWidget *vbox1; - GtkWidget *frame; - GtkWidget *table; - GtkWidget *upper_hbox; - GtkWidget *lower_hbox; - GtkWidget *match_hbox; - GtkWidget *criteria_combo; - GtkWidget *criteria_label; - GtkWidget *match_label; - GtkWidget *criteria_label2; - GtkWidget *headers_combo; - GtkWidget *match_combo2; - GtkWidget *match_label2; - - GtkWidget *hbox; - GtkWidget *upper_filler; - GtkWidget *lower_filler; - - GtkWidget *criteria_combo2; - GtkWidget *header_entry; - GtkWidget *header_addr_combo; - GtkWidget *header_addr_entry; - GtkWidget *string_entry; - GtkWidget *addressbook_folder_combo; - GtkWidget *match_combo; - GtkWidget *bool_op_combo; - GtkWidget *bool_op_label; - - GtkWidget *numeric_hbox; - GtkWidget *numeric_entry; - GtkWidget *numeric_label; - - GtkWidget *regexp_checkbtn; - GtkWidget *case_checkbtn; - - GtkWidget *reg_hbox; - GtkWidget *btn_hbox; - GtkWidget *arrow; - GtkWidget *reg_btn; - GtkWidget *subst_btn; - GtkWidget *del_btn; - - GtkWidget *cond_hbox; - GtkWidget *cond_scrolledwin; - GtkWidget *cond_list_view; - - GtkWidget *btn_vbox; - GtkWidget *up_btn; - GtkWidget *down_btn; - - GtkWidget *test_btn; - GtkWidget *addressbook_select_btn; - GtkWidget *calendar; - GtkWidget *time_label; - GtkWidget *time_entry; - GtkWidget *date_hbox; - GtkWidget *date_vbox; - - static GdkGeometry geometry; - GtkSizeGroup *size_group; - GtkListStore *store; - GtkTreeIter iter; - - debug_print("Creating matcher configuration window...\n"); - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_matcher"); - gtk_container_set_border_width(GTK_CONTAINER(window), 4); - gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 6); - gtk_container_add(GTK_CONTAINER(window), vbox); - - gtkut_stock_button_set_create(&confirm_area, &cancel_btn, NULL, _("_Cancel"), - &ok_btn, NULL, _("_OK"), NULL, NULL, NULL); - gtk_box_pack_end(GTK_BOX(vbox), confirm_area, FALSE, FALSE, 0); - gtk_widget_grab_default(ok_btn); - - gtk_window_set_title(GTK_WINDOW(window), - _("Condition configuration")); - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(prefs_matcher_deleted), NULL); - g_signal_connect(G_OBJECT(window), "size_allocate", - G_CALLBACK(prefs_matcher_size_allocate_cb), NULL); - MANAGE_WINDOW_SIGNALS_CONNECT(window); - g_signal_connect(G_OBJECT(ok_btn), "clicked", - G_CALLBACK(prefs_matcher_ok), NULL); - g_signal_connect(G_OBJECT(cancel_btn), "clicked", - G_CALLBACK(prefs_matcher_cancel), NULL); - - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING); - gtk_box_pack_start(GTK_BOX(vbox), vbox1, TRUE, TRUE, 0); - gtk_container_set_border_width(GTK_CONTAINER (vbox1), 2); - - frame = gtk_frame_new(_("Rule")); - gtk_frame_set_label_align(GTK_FRAME(frame), 0.01, 0.5); - gtk_box_pack_start(GTK_BOX(vbox1), frame, FALSE, FALSE, 0); - - table = gtk_grid_new(); - gtk_container_set_border_width(GTK_CONTAINER(table), VSPACING_NARROW); - gtk_grid_set_row_spacing(GTK_GRID(table), VSPACING_NARROW_2); - gtk_grid_set_column_spacing(GTK_GRID(table), HSPACING_NARROW); - gtk_container_add(GTK_CONTAINER(frame), table); - - upper_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start(GTK_BOX(hbox), upper_hbox, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(""), TRUE, TRUE, 0); - gtk_grid_attach(GTK_GRID(table), hbox, 2, 0, 1, 1); - gtk_widget_set_hexpand(hbox, TRUE); - gtk_widget_set_halign(hbox, GTK_ALIGN_FILL); - - lower_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_start(GTK_BOX(hbox), lower_hbox, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), gtk_label_new(""), TRUE, TRUE, 0); - gtk_grid_attach(GTK_GRID(table), hbox, 2, 1, 1, 1); - gtk_widget_set_hexpand(hbox, TRUE); - gtk_widget_set_halign(hbox, GTK_ALIGN_FILL); - - size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - gtk_size_group_add_widget(size_group, upper_hbox); - gtk_size_group_add_widget(size_group, lower_hbox); - - /* criteria combo box */ - criteria_label = gtk_label_new(_("Match criteria")); - gtk_label_set_xalign(GTK_LABEL(criteria_label), 1.0); - gtk_widget_set_size_request(criteria_label, -1, -1); - gtk_grid_attach(GTK_GRID(table), criteria_label, 0, 0, 1, 1); - - criteria_combo = gtkut_sc_combobox_create(NULL, FALSE); - store = GTK_LIST_STORE(gtk_combo_box_get_model( - GTK_COMBO_BOX(criteria_combo))); - COMBOBOX_ADD(store, _("All messages"), MATCH_ALL); - COMBOBOX_ADD(store, _("Header"), MATCH_HEADER); - COMBOBOX_ADD(store, _("Age"), MATCH_AGE); - COMBOBOX_ADD(store, _("Phrase"), MATCH_PHRASE); - COMBOBOX_ADD(store, _("Flags"), MATCH_FLAG); - COMBOBOX_ADD(store, _("Thread"), MATCH_THREAD); - COMBOBOX_ADD(store, _("Score"), MATCH_SCORE); - COMBOBOX_ADD(store, _("Size"), MATCH_SIZE); - COMBOBOX_ADD(store, _("Partially downloaded"), MATCH_PARTIAL); - COMBOBOX_ADD(store, _("Address book"), MATCH_ABOOK); - COMBOBOX_ADD(store, _("External program test"), MATCH_TEST); - COMBOBOX_ADD(store, _("Date"), MATCH_DATE); - - gtk_widget_set_size_request(criteria_combo, 150, -1); - gtk_combo_box_set_active(GTK_COMBO_BOX(criteria_combo), MATCH_ALL); - gtk_grid_attach(GTK_GRID(table), criteria_combo, 1, 0, 1, 1); - g_signal_connect(G_OBJECT(criteria_combo), "changed", - G_CALLBACK(prefs_matcher_criteria_select), - NULL); - - upper_filler = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(upper_hbox), upper_filler, TRUE, TRUE, 0); - - lower_filler = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(lower_hbox), lower_filler, TRUE, TRUE, 0); - - criteria_label2 = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(upper_hbox), criteria_label2, FALSE, FALSE, 0); - - /* headers combo box entry */ - headers_combo = gtk_combo_box_new_with_model_and_entry(matcher.model_headers); - GtkCellRenderer *cell = gtk_cell_renderer_text_new(); - gtk_cell_renderer_set_alignment(cell, 0.0, 0.5); - gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(headers_combo), cell, TRUE); - gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(headers_combo), 0); - gtk_widget_set_size_request(headers_combo, 100, -1); - gtk_box_pack_start(GTK_BOX(upper_hbox), headers_combo, TRUE, TRUE, 0); - header_entry = gtk_bin_get_child(GTK_BIN((headers_combo))); - CLAWS_SET_TIP(header_entry, _("Use selector on the right to pick " - "the header name. Type the name of the header if not " - "available in the list.")); - - criteria_combo2 = gtkut_sc_combobox_create(NULL, TRUE); - prefs_matcher_set_model(criteria_combo2, matcher.model_phrase); - gtk_box_pack_start(GTK_BOX(upper_hbox), criteria_combo2, TRUE, TRUE, 0); - g_signal_connect(G_OBJECT(criteria_combo2), "changed", - G_CALLBACK(prefs_matcher_second_criteria_sel), - NULL); - - /* book/folder value */ - addressbook_folder_combo = combobox_text_new(TRUE, _("Any"), NULL); - gtk_widget_set_size_request(addressbook_folder_combo, 250, -1); - gtk_box_pack_start(GTK_BOX(upper_hbox), addressbook_folder_combo, TRUE, TRUE, 0); - - addressbook_select_btn = gtk_button_new_with_label(_("Select...")); - gtk_box_pack_start(GTK_BOX(upper_hbox), addressbook_select_btn, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT (addressbook_select_btn), "clicked", - G_CALLBACK(prefs_matcher_addressbook_select), - NULL); - match_label = gtk_label_new(""); - gtk_label_set_xalign(GTK_LABEL(match_label), 1.0); - gtk_grid_attach(GTK_GRID(table), match_label, 0, 1, 1, 1); - - match_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_grid_attach(GTK_GRID(table), match_hbox, 1, 1, 1, 1); - gtk_widget_set_hexpand(match_hbox, TRUE); - gtk_widget_set_halign(match_hbox, GTK_ALIGN_FILL); - - match_combo = gtkut_sc_combobox_create(NULL, TRUE); - gtk_box_pack_start(GTK_BOX(match_hbox), match_combo, TRUE, TRUE, 0); - - /* address header name */ - header_addr_combo = combobox_text_new(TRUE, - C_("Filtering Matcher Menu", "All"), _("Any"), - "From", "To", "Cc", "Reply-To", "Sender", "Resent-From", "Resent-To", NULL); - gtk_box_pack_start(GTK_BOX(match_hbox), header_addr_combo, FALSE, FALSE, 0); - header_addr_entry = gtk_bin_get_child(GTK_BIN((header_addr_combo))); - gtk_widget_set_size_request(header_addr_combo, 150, -1); - - match_label2 = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(lower_hbox), match_label2, FALSE, FALSE, 0); - - /* numeric value */ - numeric_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_box_pack_start(GTK_BOX(lower_hbox), numeric_hbox, FALSE, FALSE, 0); - - numeric_entry = gtk_spin_button_new_with_range(0, 1000, 1); - gtk_spin_button_set_digits(GTK_SPIN_BUTTON(numeric_entry), 0); - gtk_box_pack_start(GTK_BOX(numeric_hbox), numeric_entry, FALSE, FALSE, 0); - - numeric_label = gtk_label_new(""); - gtk_box_pack_start(GTK_BOX(numeric_hbox), numeric_label, FALSE, FALSE, 0); - gtk_box_pack_end(GTK_BOX(numeric_hbox), gtk_label_new(""), TRUE, TRUE, 0); - - match_combo2 = gtkut_sc_combobox_create(NULL, TRUE); - gtk_box_pack_start(GTK_BOX(lower_hbox), match_combo2, TRUE, TRUE, 0); - - /* string value */ - string_entry = gtk_entry_new(); - gtk_box_pack_start(GTK_BOX(lower_hbox), string_entry, TRUE, TRUE, 0); - gtk_widget_set_size_request(string_entry, 300, -1); - - hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_size_group_add_widget(size_group, hbox); - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW); - PACK_CHECK_BUTTON(vbox, case_checkbtn, _("Case sensitive")); - PACK_CHECK_BUTTON(vbox, regexp_checkbtn, _("Use regexp")); - gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); - - gtk_box_pack_end(GTK_BOX(hbox), gtk_label_new(""), TRUE, TRUE, 0); - gtk_grid_attach(GTK_GRID(table), hbox, 2, 2, 1, 1); - gtk_widget_set_hexpand(hbox, TRUE); - gtk_widget_set_halign(hbox, GTK_ALIGN_FILL); - - /* Date widgets */ - date_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING_NARROW); - calendar = gtk_calendar_new(); - gtk_box_pack_start(GTK_BOX(hbox), calendar, TRUE, TRUE, 0); - gtk_box_pack_start(GTK_BOX(lower_hbox), date_vbox, FALSE, FALSE, 0); - - date_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_box_pack_start(GTK_BOX(date_vbox), date_hbox, FALSE, FALSE, 0); - - time_entry = gtkut_time_select_combo_new(); - gtk_box_pack_start(GTK_BOX(date_hbox), time_entry, FALSE, FALSE, 0); - time_label = gtk_label_new(_("on:")); - gtk_label_set_xalign(GTK_LABEL(time_label),0); - gtk_label_set_yalign(GTK_LABEL(time_label),0.5); - gtk_box_pack_start(GTK_BOX(date_hbox), time_label, FALSE, FALSE, 0); - - /* test info button */ - test_btn = gtkut_stock_button("dialog-information", _("_Information")); - gtk_box_pack_start(GTK_BOX(lower_hbox), test_btn, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT (test_btn), "clicked", - G_CALLBACK(prefs_matcher_test_info), - window); - - /* register / substitute / delete */ - reg_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_box_pack_start(GTK_BOX(vbox1), reg_hbox, FALSE, FALSE, 0); - - arrow = gtk_image_new_from_icon_name("pan-down-symbolic", GTK_ICON_SIZE_MENU); - gtk_box_pack_start(GTK_BOX(reg_hbox), arrow, FALSE, FALSE, 0); - gtk_widget_set_size_request(arrow, -1, 16); - - btn_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_box_pack_start(GTK_BOX(reg_hbox), btn_hbox, FALSE, FALSE, 0); - - reg_btn = gtkut_stock_button("list-add", _("_Add")); - gtk_box_pack_start(GTK_BOX(btn_hbox), reg_btn, FALSE, TRUE, 0); - g_signal_connect(G_OBJECT(reg_btn), "clicked", - G_CALLBACK(prefs_matcher_register_cb), NULL); - - subst_btn = gtkut_get_replace_btn(_("_Replace")); - gtk_box_pack_start(GTK_BOX(btn_hbox), subst_btn, FALSE, TRUE, 0); - g_signal_connect(G_OBJECT(subst_btn), "clicked", - G_CALLBACK(prefs_matcher_substitute_cb), - NULL); - - del_btn = gtkut_stock_button("list-remove", _("_Remove")); - gtk_box_pack_start(GTK_BOX(btn_hbox), del_btn, FALSE, TRUE, 0); - g_signal_connect(G_OBJECT(del_btn), "clicked", - G_CALLBACK(prefs_matcher_delete_cb), NULL); - - cond_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, VBOX_BORDER); - gtk_box_pack_start(GTK_BOX(vbox1), cond_hbox, TRUE, TRUE, 0); - - cond_scrolledwin = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_set_size_request(cond_scrolledwin, -1, 150); - gtk_box_pack_start(GTK_BOX(cond_hbox), cond_scrolledwin, - TRUE, TRUE, 0); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cond_scrolledwin), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - - cond_list_view = prefs_matcher_list_view_create(); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(cond_scrolledwin), - GTK_SHADOW_ETCHED_IN); - gtk_container_add(GTK_CONTAINER(cond_scrolledwin), cond_list_view); - - btn_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, VBOX_BORDER); - gtk_box_pack_start(GTK_BOX(cond_hbox), btn_vbox, FALSE, FALSE, 0); - - up_btn = gtkut_stock_button("go-up", _("_Up")); - gtk_box_pack_start(GTK_BOX(btn_vbox), up_btn, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(up_btn), "clicked", - G_CALLBACK(prefs_matcher_up), NULL); - - down_btn = gtkut_stock_button("go-down", _("_Down")); - gtk_box_pack_start(GTK_BOX(btn_vbox), down_btn, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(down_btn), "clicked", - G_CALLBACK(prefs_matcher_down), NULL); - - /* boolean operation */ - GtkWidget *hbox_bool = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, HSPACING_NARROW); - gtk_box_pack_start(GTK_BOX(vbox1), hbox_bool, FALSE, FALSE, 0); - - bool_op_label = gtk_label_new(_("Message must match")); - gtk_box_pack_start(GTK_BOX(hbox_bool), bool_op_label, - FALSE, FALSE, 0); - - bool_op_combo = combobox_text_new(FALSE, _("at least one"), - _("all"), NULL); - gtk_box_pack_start(GTK_BOX(hbox_bool), bool_op_combo, - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox_bool), gtk_label_new(_("of above rules")), - FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox_bool), gtk_label_new(""), - TRUE, TRUE, 0); - - if (!geometry.min_height) { - geometry.min_width = 630; - geometry.min_height = 368; - } - - gtk_window_set_geometry_hints(GTK_WINDOW(window), NULL, &geometry, - GDK_HINT_MIN_SIZE); - gtk_window_set_default_size(GTK_WINDOW(window), prefs_common.matcherwin_width, - prefs_common.matcherwin_height); - - gtk_widget_show_all(window); - - matcher.window = window; - - matcher.ok_btn = ok_btn; - - matcher.criteria_combo = criteria_combo; - matcher.criteria_combo2 = criteria_combo2; - matcher.header_entry = header_entry; - matcher.header_addr_combo = header_addr_combo; - matcher.header_addr_entry = header_addr_entry; - matcher.string_entry = string_entry; - matcher.numeric_entry = numeric_entry; - matcher.numeric_label = numeric_label; - matcher.addressbook_folder_combo = addressbook_folder_combo; - matcher.match_combo = match_combo; - matcher.case_checkbtn = case_checkbtn; - matcher.regexp_checkbtn = regexp_checkbtn; - matcher.bool_op_combo = bool_op_combo; - matcher.test_btn = test_btn; - matcher.calendar = calendar; - matcher.time_label = time_label; - matcher.time_entry = time_entry; - matcher.addressbook_select_btn = addressbook_select_btn; - matcher.match_label = match_label; - matcher.criteria_label2 = criteria_label2; - matcher.headers_combo = headers_combo; - matcher.match_combo2 = match_combo2; - matcher.match_label2 = match_label2; - matcher.upper_filler = upper_filler; - matcher.lower_filler = lower_filler; - - matcher.cond_list_view = cond_list_view; - - matcher.selected_criteria = -1; - prefs_matcher_criteria_select(criteria_combo, NULL); -} - -/*! - *\brief Set the contents of a row - * - *\param row Index of row to set - *\param prop Condition to set - * - *\return gint Row index \a prop has been added - */ -static void prefs_matcher_list_view_set_row(GtkTreeIter *row, MatcherProp *prop) -{ - gchar *matcher_str; - - if (prop == NULL) { - prefs_matcher_list_view_insert_matcher(matcher.cond_list_view, - NULL, _("(New)"), FALSE); - return; - } - - matcher_str = matcherprop_to_string(prop); - if (!row) - prefs_matcher_list_view_insert_matcher(matcher.cond_list_view, - NULL, matcher_str, - TRUE); - else - prefs_matcher_list_view_insert_matcher(matcher.cond_list_view, - row, matcher_str, - TRUE); - g_free(matcher_str); -} - -static gboolean match_combo2_model_set(void) -{ - GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(matcher.match_combo2)); - if (model == matcher.model_age_units || - model == matcher.model_found || - model == matcher.model_partial || - model == matcher.model_phrase || - model == matcher.model_set || - model == matcher.model_size_units || - model == matcher.model_thread) - return TRUE; - else - debug_print("match_combo2 model unset.\n"); - - return FALSE; -} - -static gboolean match_combo_model_set(void) -{ - GtkTreeModel *model = gtk_combo_box_get_model(GTK_COMBO_BOX(matcher.match_combo)); - if (model == matcher.model_age || - model == matcher.model_contain || - model == matcher.model_flags || - model == matcher.model_score || - model == matcher.model_size || - model == matcher.model_test) - return TRUE; - else - debug_print("match_combo model unset.\n"); - - return FALSE; -} - -/*! - *\brief Clears a condition in the list widget - */ -static void prefs_matcher_reset_condition(void) -{ - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo), MATCH_ALL); - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo2), 0); - if (match_combo_model_set()) - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo), 0); - if (match_combo2_model_set()) - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), 0); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), 0); - gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), ""); - gtk_entry_set_text(GTK_ENTRY(matcher.header_addr_entry), ""); - gtk_entry_set_text(GTK_ENTRY(matcher.string_entry), ""); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((matcher.addressbook_folder_combo)))), ""); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), FALSE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), FALSE); - - gtk_calendar_select_today(GTK_CALENDAR(matcher.calendar)); - gtkut_time_select_select_by_time(GTK_COMBO_BOX(matcher.time_entry), 0, 0); -} - -/*! - *\brief Initializes dialog with a set of conditions - * - *\param matchers List of conditions - */ -static void prefs_matcher_set_dialog(MatcherList *matchers) -{ - GSList *cur; - gboolean bool_op = 1; - GtkListStore *store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(matcher.cond_list_view))); - - gtk_list_store_clear(store); - - prefs_matcher_list_view_set_row(NULL, NULL); - if (matchers != NULL) { - for (cur = matchers->matchers; cur != NULL; - cur = g_slist_next(cur)) { - MatcherProp *prop; - prop = (MatcherProp *) cur->data; - prefs_matcher_list_view_set_row(NULL, prop); - } - - bool_op = matchers->bool_and; - } - - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.bool_op_combo), bool_op); - - prefs_matcher_reset_condition(); -} - -/*! - *\brief Converts current conditions in list box in - * a matcher list used by the matcher. - * - *\return MatcherList * List of conditions. - */ -static MatcherList *prefs_matcher_get_list(void) -{ - gchar *matcher_str; - MatcherProp *prop; - gboolean bool_and; - GSList *matcher_list; - MatcherList *matchers; - GtkTreeModel *model; - GtkTreeIter iter; - - model = gtk_tree_view_get_model(GTK_TREE_VIEW(matcher.cond_list_view)); - if (!gtk_tree_model_get_iter_first(model, &iter)) - return NULL; - - matcher_list = NULL; - - do { - gboolean is_valid; - - gtk_tree_model_get(model, &iter, - PREFS_MATCHER_COND, &matcher_str, - PREFS_MATCHER_COND_VALID, &is_valid, - -1); - - if (is_valid) { - /* tmp = matcher_str; */ - prop = matcher_parser_get_prop(matcher_str); - if (prop == NULL) { - g_free(matcher_str); - break; - } - - matcher_list = g_slist_append(matcher_list, prop); - } - g_free(matcher_str); - } while (gtk_tree_model_iter_next(model, &iter)); - - bool_and = gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.bool_op_combo)); - - matchers = matcherlist_new(matcher_list, bool_and); - - return matchers; -} - -/*! - *\brief Maps a keyword id (see #get_matchparser_tab_id) to a - * criteria type (see first parameter of #matcherprop_new - * or #matcherprop_unquote_new) - * - *\param matching_id Id returned by the matcher parser. - * - *\return gint One of the CRITERIA_xxx constants. - */ -static gint prefs_matcher_get_criteria_from_matching(gint matching_id) -{ - switch(matching_id) { - case MATCHCRITERIA_ALL: - return CRITERIA_ALL; - case MATCHCRITERIA_NOT_UNREAD: - case MATCHCRITERIA_UNREAD: - return CRITERIA_UNREAD; - case MATCHCRITERIA_NOT_NEW: - case MATCHCRITERIA_NEW: - return CRITERIA_NEW; - case MATCHCRITERIA_NOT_MARKED: - case MATCHCRITERIA_MARKED: - return CRITERIA_MARKED; - case MATCHCRITERIA_NOT_DELETED: - case MATCHCRITERIA_DELETED: - return CRITERIA_DELETED; - case MATCHCRITERIA_NOT_REPLIED: - case MATCHCRITERIA_REPLIED: - return CRITERIA_REPLIED; - case MATCHCRITERIA_NOT_FORWARDED: - case MATCHCRITERIA_FORWARDED: - return CRITERIA_FORWARDED; - case MATCHCRITERIA_LOCKED: - case MATCHCRITERIA_NOT_LOCKED: - return CRITERIA_LOCKED; - case MATCHCRITERIA_NOT_SPAM: - case MATCHCRITERIA_SPAM: - return CRITERIA_SPAM; - case MATCHCRITERIA_HAS_ATTACHMENT: - case MATCHCRITERIA_HAS_NO_ATTACHMENT: - return CRITERIA_HAS_ATTACHMENT; - case MATCHCRITERIA_SIGNED: - case MATCHCRITERIA_NOT_SIGNED: - return CRITERIA_SIGNED; - case MATCHCRITERIA_PARTIAL: - case MATCHCRITERIA_NOT_PARTIAL: - return CRITERIA_PARTIAL; - case MATCHCRITERIA_IGNORE_THREAD: - case MATCHCRITERIA_NOT_IGNORE_THREAD: - return CRITERIA_IGNORE_THREAD; - case MATCHCRITERIA_WATCH_THREAD: - case MATCHCRITERIA_NOT_WATCH_THREAD: - return CRITERIA_WATCH_THREAD; - case MATCHCRITERIA_NOT_SUBJECT: - case MATCHCRITERIA_SUBJECT: - return CRITERIA_SUBJECT; - case MATCHCRITERIA_NOT_FROM: - case MATCHCRITERIA_FROM: - return CRITERIA_FROM; - case MATCHCRITERIA_NOT_TO: - case MATCHCRITERIA_TO: - return CRITERIA_TO; - case MATCHCRITERIA_NOT_CC: - case MATCHCRITERIA_CC: - return CRITERIA_CC; - case MATCHCRITERIA_NOT_MESSAGEID: - case MATCHCRITERIA_MESSAGEID: - return CRITERIA_MESSAGEID; - case MATCHCRITERIA_NOT_INREPLYTO: - case MATCHCRITERIA_INREPLYTO: - return CRITERIA_INREPLYTO; - case MATCHCRITERIA_NOT_REFERENCES: - case MATCHCRITERIA_REFERENCES: - return CRITERIA_REFERENCES; - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: - case MATCHCRITERIA_TO_OR_CC: - return CRITERIA_TO_OR_CC; - case MATCHCRITERIA_NOT_BODY_PART: - case MATCHCRITERIA_BODY_PART: - return CRITERIA_BODY_PART; - case MATCHCRITERIA_NOT_MESSAGE: - case MATCHCRITERIA_MESSAGE: - return CRITERIA_MESSAGE; - case MATCHCRITERIA_NOT_HEADERS_PART: - case MATCHCRITERIA_HEADERS_PART: - return CRITERIA_HEADERS_PART; - case MATCHCRITERIA_NOT_HEADERS_CONT: - case MATCHCRITERIA_HEADERS_CONT: - return CRITERIA_HEADERS_CONT; - case MATCHCRITERIA_NOT_HEADER: - case MATCHCRITERIA_HEADER: - return CRITERIA_HEADER; - case MATCHCRITERIA_AGE_GREATER_HOURS: - return CRITERIA_AGE_GREATER_HOURS; - case MATCHCRITERIA_AGE_LOWER_HOURS: - return CRITERIA_AGE_LOWER_HOURS; - case MATCHCRITERIA_AGE_GREATER: - return CRITERIA_AGE_GREATER; - case MATCHCRITERIA_AGE_LOWER: - return CRITERIA_AGE_LOWER; - case MATCHCRITERIA_DATE_AFTER: - return CRITERIA_DATE_AFTER; - case MATCHCRITERIA_DATE_BEFORE: - return CRITERIA_DATE_BEFORE; - case MATCHCRITERIA_SCORE_GREATER: - return CRITERIA_SCORE_GREATER; - case MATCHCRITERIA_SCORE_LOWER: - return CRITERIA_SCORE_LOWER; - case MATCHCRITERIA_SCORE_EQUAL: - return CRITERIA_SCORE_EQUAL; - case MATCHCRITERIA_NOT_TEST: - case MATCHCRITERIA_TEST: - return CRITERIA_TEST; - case MATCHCRITERIA_SIZE_GREATER: - return CRITERIA_SIZE_GREATER; - case MATCHCRITERIA_SIZE_SMALLER: - return CRITERIA_SIZE_SMALLER; - case MATCHCRITERIA_SIZE_EQUAL: - return CRITERIA_SIZE_EQUAL; - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - return CRITERIA_FOUND_IN_ADDRESSBOOK; - default: - return -1; - } -} - -/*! - *\brief Returns the matcher keyword id from a criteria id - * - *\param criteria_id Criteria id (should not be the negate - * one) - * - *\return gint A matcher keyword id. See #get_matchparser_tab_id. - */ -static gint prefs_matcher_get_matching_from_criteria(gint criteria_id) -{ - switch (criteria_id) { - case CRITERIA_ALL: - return MATCHCRITERIA_ALL; - case CRITERIA_UNREAD: - return MATCHCRITERIA_UNREAD; - case CRITERIA_NEW: - return MATCHCRITERIA_NEW; - case CRITERIA_MARKED: - return MATCHCRITERIA_MARKED; - case CRITERIA_DELETED: - return MATCHCRITERIA_DELETED; - case CRITERIA_REPLIED: - return MATCHCRITERIA_REPLIED; - case CRITERIA_FORWARDED: - return MATCHCRITERIA_FORWARDED; - case CRITERIA_LOCKED: - return MATCHCRITERIA_LOCKED; - case CRITERIA_SPAM: - return MATCHCRITERIA_SPAM; - case CRITERIA_HAS_ATTACHMENT: - return MATCHCRITERIA_HAS_ATTACHMENT; - case CRITERIA_SIGNED: - return MATCHCRITERIA_SIGNED; - case CRITERIA_PARTIAL: - return MATCHCRITERIA_PARTIAL; - case CRITERIA_IGNORE_THREAD: - return MATCHCRITERIA_IGNORE_THREAD; - case CRITERIA_WATCH_THREAD: - return MATCHCRITERIA_WATCH_THREAD; - case CRITERIA_SUBJECT: - return MATCHCRITERIA_SUBJECT; - case CRITERIA_FROM: - return MATCHCRITERIA_FROM; - case CRITERIA_TO: - return MATCHCRITERIA_TO; - case CRITERIA_CC: - return MATCHCRITERIA_CC; - case CRITERIA_TO_OR_CC: - return MATCHCRITERIA_TO_OR_CC; - case CRITERIA_MESSAGEID: - return MATCHCRITERIA_MESSAGEID; - case CRITERIA_INREPLYTO: - return MATCHCRITERIA_INREPLYTO; - case CRITERIA_REFERENCES: - return MATCHCRITERIA_REFERENCES; - case CRITERIA_AGE_GREATER: - return MATCHCRITERIA_AGE_GREATER; - case CRITERIA_AGE_LOWER: - return MATCHCRITERIA_AGE_LOWER; - case CRITERIA_AGE_GREATER_HOURS: - return MATCHCRITERIA_AGE_GREATER_HOURS; - case CRITERIA_AGE_LOWER_HOURS: - return MATCHCRITERIA_AGE_LOWER_HOURS; - case CRITERIA_DATE_AFTER: - return MATCHCRITERIA_DATE_AFTER; - case CRITERIA_DATE_BEFORE: - return MATCHCRITERIA_DATE_BEFORE; - case CRITERIA_SCORE_GREATER: - return MATCHCRITERIA_SCORE_GREATER; - case CRITERIA_SCORE_LOWER: - return MATCHCRITERIA_SCORE_LOWER; - case CRITERIA_SCORE_EQUAL: - return MATCHCRITERIA_SCORE_EQUAL; - case CRITERIA_HEADER: - return MATCHCRITERIA_HEADER; - case CRITERIA_HEADERS_PART: - return MATCHCRITERIA_HEADERS_PART; - case CRITERIA_HEADERS_CONT: - return MATCHCRITERIA_HEADERS_CONT; - case CRITERIA_BODY_PART: - return MATCHCRITERIA_BODY_PART; - case CRITERIA_MESSAGE: - return MATCHCRITERIA_MESSAGE; - case CRITERIA_TEST: - return MATCHCRITERIA_TEST; - case CRITERIA_SIZE_GREATER: - return MATCHCRITERIA_SIZE_GREATER; - case CRITERIA_SIZE_SMALLER: - return MATCHCRITERIA_SIZE_SMALLER; - case CRITERIA_SIZE_EQUAL: - return MATCHCRITERIA_SIZE_EQUAL; - case CRITERIA_FOUND_IN_ADDRESSBOOK: - return MATCHCRITERIA_FOUND_IN_ADDRESSBOOK; - default: - return -1; - } -} - -/*! - *\brief Returns the negate matcher keyword id from a matcher keyword - * id. - * - *\param matcher_criteria Matcher keyword id. - * - *\return gint A matcher keyword id. See #get_matchparser_tab_id. - */ -static gint prefs_matcher_not_criteria(gint matcher_criteria) -{ - switch(matcher_criteria) { - case MATCHCRITERIA_UNREAD: - return MATCHCRITERIA_NOT_UNREAD; - case MATCHCRITERIA_NEW: - return MATCHCRITERIA_NOT_NEW; - case MATCHCRITERIA_MARKED: - return MATCHCRITERIA_NOT_MARKED; - case MATCHCRITERIA_DELETED: - return MATCHCRITERIA_NOT_DELETED; - case MATCHCRITERIA_REPLIED: - return MATCHCRITERIA_NOT_REPLIED; - case MATCHCRITERIA_FORWARDED: - return MATCHCRITERIA_NOT_FORWARDED; - case MATCHCRITERIA_LOCKED: - return MATCHCRITERIA_NOT_LOCKED; - case MATCHCRITERIA_SPAM: - return MATCHCRITERIA_NOT_SPAM; - case MATCHCRITERIA_HAS_ATTACHMENT: - return MATCHCRITERIA_HAS_NO_ATTACHMENT; - case MATCHCRITERIA_SIGNED: - return MATCHCRITERIA_NOT_SIGNED; - case MATCHCRITERIA_PARTIAL: - return MATCHCRITERIA_NOT_PARTIAL; - case MATCHCRITERIA_IGNORE_THREAD: - return MATCHCRITERIA_NOT_IGNORE_THREAD; - case MATCHCRITERIA_WATCH_THREAD: - return MATCHCRITERIA_NOT_WATCH_THREAD; - case MATCHCRITERIA_SUBJECT: - return MATCHCRITERIA_NOT_SUBJECT; - case MATCHCRITERIA_FROM: - return MATCHCRITERIA_NOT_FROM; - case MATCHCRITERIA_TO: - return MATCHCRITERIA_NOT_TO; - case MATCHCRITERIA_CC: - return MATCHCRITERIA_NOT_CC; - case MATCHCRITERIA_TO_OR_CC: - return MATCHCRITERIA_NOT_TO_AND_NOT_CC; - case MATCHCRITERIA_MESSAGEID: - return MATCHCRITERIA_NOT_MESSAGEID; - case MATCHCRITERIA_INREPLYTO: - return MATCHCRITERIA_NOT_INREPLYTO; - case MATCHCRITERIA_REFERENCES: - return MATCHCRITERIA_NOT_REFERENCES; - case MATCHCRITERIA_HEADER: - return MATCHCRITERIA_NOT_HEADER; - case MATCHCRITERIA_HEADERS_PART: - return MATCHCRITERIA_NOT_HEADERS_PART; - case MATCHCRITERIA_HEADERS_CONT: - return MATCHCRITERIA_NOT_HEADERS_CONT; - case MATCHCRITERIA_MESSAGE: - return MATCHCRITERIA_NOT_MESSAGE; - case MATCHCRITERIA_TEST: - return MATCHCRITERIA_NOT_TEST; - case MATCHCRITERIA_BODY_PART: - return MATCHCRITERIA_NOT_BODY_PART; - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - return MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK; - default: - return matcher_criteria; - } -} - -static gint prefs_matcher_get_criteria(void) -{ - gint match_criteria = gtk_combo_box_get_active(GTK_COMBO_BOX( - matcher.criteria_combo)); - const gchar *header = NULL; - - switch (match_criteria) { - case MATCH_ABOOK: - return CRITERIA_FOUND_IN_ADDRESSBOOK; - case MATCH_ALL: - return CRITERIA_ALL; - case MATCH_AGE: - case MATCH_DATE: - case MATCH_SCORE: - case MATCH_SIZE: - case MATCH_FLAG: - return combobox_get_active_data(GTK_COMBO_BOX( - matcher.match_combo)); - case MATCH_HEADER: - header = gtk_entry_get_text(GTK_ENTRY(matcher.header_entry)); - return header_name_to_crit(header); - case MATCH_PARTIAL: - return CRITERIA_PARTIAL; - case MATCH_TEST: - return CRITERIA_TEST; - case MATCH_PHRASE: - case MATCH_THREAD: - return combobox_get_active_data(GTK_COMBO_BOX( - matcher.criteria_combo2)); - } - - return -1; -} - -static gint prefs_matcher_get_pred(const gint criteria) -{ - switch(criteria) { - case CRITERIA_SUBJECT: - case CRITERIA_FROM: - case CRITERIA_TO: - case CRITERIA_CC: - case CRITERIA_TO_OR_CC: - case CRITERIA_MESSAGEID: - case CRITERIA_INREPLYTO: - case CRITERIA_REFERENCES: - case CRITERIA_HEADER: - case CRITERIA_HEADERS_PART: - case CRITERIA_HEADERS_CONT: - case CRITERIA_BODY_PART: - case CRITERIA_MESSAGE: - case CRITERIA_TEST: - return gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.match_combo)); - case CRITERIA_FOUND_IN_ADDRESSBOOK: - case CRITERIA_UNREAD: - case CRITERIA_NEW: - case CRITERIA_MARKED: - case CRITERIA_DELETED: - case CRITERIA_REPLIED: - case CRITERIA_FORWARDED: - case CRITERIA_LOCKED: - case CRITERIA_SPAM: - case CRITERIA_HAS_ATTACHMENT: - case CRITERIA_SIGNED: - return gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.match_combo2)); - case CRITERIA_WATCH_THREAD: - return gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.criteria_combo2)) - 2; - case CRITERIA_IGNORE_THREAD: - case CRITERIA_PARTIAL: - return gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.criteria_combo2)); - } - - return 0; -} - -/*! - *\brief Converts the text in the selected row to a - * matcher structure - * - *\return MatcherProp * Newly allocated matcher structure. - */ -static MatcherProp *prefs_matcher_dialog_to_matcher(void) -{ - MatcherProp *matcherprop; - gint criteria; - gint matchtype; - gint value_pred; - gint value_criteria = prefs_matcher_get_criteria(); - gboolean use_regexp; - gboolean case_sensitive; - const gchar *header; - const gchar *expr; - gboolean expr_to_free = FALSE; - gint value, sel; - gint year, month, day, hour, minute; - - if (value_criteria == -1) - return NULL; - - use_regexp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn)); - case_sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn)); - - if (use_regexp) { - if (case_sensitive) - matchtype = MATCHTYPE_REGEXP; - else - matchtype = MATCHTYPE_REGEXPCASE; - } - else { - if (case_sensitive) - matchtype = MATCHTYPE_MATCH; - else - matchtype = MATCHTYPE_MATCHCASE; - } - - header = NULL; - expr = NULL; - value = 0; - - switch (value_criteria) { - case CRITERIA_ALL: - case CRITERIA_UNREAD: - case CRITERIA_NEW: - case CRITERIA_MARKED: - case CRITERIA_DELETED: - case CRITERIA_REPLIED: - case CRITERIA_FORWARDED: - case CRITERIA_LOCKED: - case CRITERIA_SPAM: - case CRITERIA_HAS_ATTACHMENT: - case CRITERIA_SIGNED: - case CRITERIA_PARTIAL: - case CRITERIA_IGNORE_THREAD: - case CRITERIA_WATCH_THREAD: - break; - - case CRITERIA_SUBJECT: - case CRITERIA_FROM: - case CRITERIA_TO: - case CRITERIA_CC: - case CRITERIA_TO_OR_CC: - case CRITERIA_MESSAGEID: - case CRITERIA_INREPLYTO: - case CRITERIA_REFERENCES: - case CRITERIA_HEADERS_PART: - case CRITERIA_HEADERS_CONT: - case CRITERIA_BODY_PART: - case CRITERIA_MESSAGE: - expr = gtk_entry_get_text(GTK_ENTRY(matcher.string_entry)); - - if(*expr == '\0') { - alertpanel_error(_("Search pattern is not set.")); - return NULL; - } - break; - - case CRITERIA_DATE_AFTER: - case CRITERIA_DATE_BEFORE: - expr = NULL; - gtk_calendar_get_date(GTK_CALENDAR(matcher.calendar), &year, &month, &day); - if (gtkut_time_select_get_time(GTK_COMBO_BOX(matcher.time_entry), &hour, &minute)) - expr = g_strdup_printf("%4d-%02d-%02d %02d:%02d:00", - year, month + 1, day, hour, minute); - - if (expr == NULL) { - alertpanel_error(_("Invalid hour.")); - return NULL; - } - expr_to_free = TRUE; - break; - - case CRITERIA_TEST: - expr = gtk_entry_get_text(GTK_ENTRY(matcher.string_entry)); - - if(*expr == '\0') { - alertpanel_error(_("Test command is not set.")); - return NULL; - } - break; - - case CRITERIA_AGE_GREATER: - case CRITERIA_AGE_LOWER: - value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON( - matcher.numeric_entry)); - sel = gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.match_combo2)); - if(sel == AGE_WEEKS) - value *= 7; - else if (sel == AGE_HOURS) { - if (value_criteria == CRITERIA_AGE_GREATER) - value_criteria = CRITERIA_AGE_GREATER_HOURS; - else - value_criteria = CRITERIA_AGE_LOWER_HOURS; - } - break; - - case CRITERIA_SCORE_GREATER: - case CRITERIA_SCORE_LOWER: - case CRITERIA_SCORE_EQUAL: - value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON( - matcher.numeric_entry)); - break; - - case CRITERIA_SIZE_GREATER: - case CRITERIA_SIZE_SMALLER: - case CRITERIA_SIZE_EQUAL: - value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON( - matcher.numeric_entry)); - sel = gtk_combo_box_get_active(GTK_COMBO_BOX(matcher.match_combo2)); - if(sel == SIZE_UNIT_MBYTES) - value *= MB_SIZE; - if(sel == SIZE_UNIT_KBYTES) - value *= KB_SIZE; - break; - - case CRITERIA_HEADER: - header = gtk_entry_get_text(GTK_ENTRY(matcher.header_entry)); - expr = gtk_entry_get_text(GTK_ENTRY(matcher.string_entry)); - - if (*header == '\0') { - alertpanel_error(_("Header name is not set.")); - return NULL; - } - - if(*expr == '\0') { - alertpanel_error(_("Search pattern is not set.")); - return NULL; - } - break; - - case CRITERIA_FOUND_IN_ADDRESSBOOK: - header = gtk_entry_get_text(GTK_ENTRY(matcher.header_addr_entry)); - expr = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((matcher.addressbook_folder_combo))))); - - if (*header == '\0') { - alertpanel_error(_("Header name is not set.")); - return NULL; - } - if (*expr == '\0') { - gchar *tmp; - - if (g_utf8_collate(header, C_("Filtering Matcher Menu", "All")) == 0) - tmp = g_strdup(_("all addresses in all headers")); - else - if (g_utf8_collate(header, _("Any")) == 0) - tmp = g_strdup(_("any address in any header")); - else - tmp = g_strdup_printf(_("the address(es) in header '%s'"), header); - alertpanel_error(_("Book/folder path is not set.\n\n" - "If you want to match %s against the whole address book, " - "you have to select '%s' from the book/folder drop-down list."), - tmp, _("Any")); - g_free(tmp); - return NULL; - } - /* store UNtranslated "Any"/"All" in matcher expressions */ - if (g_utf8_collate(header, C_("Filtering Matcher Menu", "All")) == 0) - header = "All"; - else - if (g_utf8_collate(header, _("Any")) == 0) - header = "Any"; - if (g_utf8_collate(expr, _("Any")) == 0) - expr = "Any"; - break; - } - - criteria = prefs_matcher_get_matching_from_criteria(value_criteria); - - value_pred = prefs_matcher_get_pred(value_criteria); - if(value_pred) - criteria = prefs_matcher_not_criteria(criteria); - - matcherprop = matcherprop_new(criteria, header, matchtype, - expr, value); - - if (expr_to_free) - g_free((gchar *)expr); - - return matcherprop; -} - -/*! - *\brief Signal handler for register button - */ -static void prefs_matcher_register_cb(void) -{ - MatcherProp *matcherprop; - - matcherprop = prefs_matcher_dialog_to_matcher(); - if (matcherprop == NULL) - return; - - prefs_matcher_list_view_set_row(NULL, matcherprop); - - matcherprop_free(matcherprop); - - prefs_matcher_reset_condition(); -} - -/*! - *\brief Signal handler for substitute button - */ -static void prefs_matcher_substitute_cb(void) -{ - MatcherProp *matcherprop; - GtkTreeIter row; - GtkTreeSelection *selection; - GtkTreeModel *model; - gboolean is_valid; - - selection = gtk_tree_view_get_selection - (GTK_TREE_VIEW(matcher.cond_list_view)); - - if (!gtk_tree_selection_get_selected(selection, &model, &row)) - return; - - gtk_tree_model_get(model, &row, - PREFS_MATCHER_COND_VALID, &is_valid, - -1); - if (!is_valid) - return; - - matcherprop = prefs_matcher_dialog_to_matcher(); - if (matcherprop == NULL) - return; - - prefs_matcher_list_view_set_row(&row, matcherprop); - - matcherprop_free(matcherprop); -} - -/*! - *\brief Signal handler for delete button - */ -static void prefs_matcher_delete_cb(void) -{ - GtkTreeIter row; - GtkTreeSelection *selection; - GtkTreeModel *model; - gboolean is_valid; - - selection = gtk_tree_view_get_selection - (GTK_TREE_VIEW(matcher.cond_list_view)); - - if (!gtk_tree_selection_get_selected(selection, &model, &row)) - return; - - gtk_tree_model_get(model, &row, - PREFS_MATCHER_COND_VALID, &is_valid, - -1); - - if (!is_valid) - return; - - gtk_list_store_remove(GTK_LIST_STORE(model), &row); - - prefs_matcher_reset_condition(); -} - -/*! - *\brief Signal handler for 'move up' button - */ -static void prefs_matcher_up(void) -{ - GtkTreePath *prev, *sel, *try; - GtkTreeIter isel; - GtkListStore *store = NULL; - GtkTreeModel *model = NULL; - GtkTreeIter iprev; - - if (!gtk_tree_selection_get_selected - (gtk_tree_view_get_selection - (GTK_TREE_VIEW(matcher.cond_list_view)), - &model, - &isel)) - return; - store = (GtkListStore *)model; - sel = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &isel); - if (!sel) - return; - - /* no move if we're at row 0 or 1, looks phony, but other - * solutions are more convoluted... */ - try = gtk_tree_path_copy(sel); - if (!gtk_tree_path_prev(try) || !gtk_tree_path_prev(try)) { - gtk_tree_path_free(try); - gtk_tree_path_free(sel); - return; - } - gtk_tree_path_free(try); - - prev = gtk_tree_path_copy(sel); - if (gtk_tree_path_prev(prev)) { - gtk_tree_model_get_iter(GTK_TREE_MODEL(store), - &iprev, prev); - gtk_list_store_swap(store, &iprev, &isel); - /* XXX: GTK2 select row?? */ - } - - gtk_tree_path_free(sel); - gtk_tree_path_free(prev); -} - -/*! - *\brief Signal handler for 'move down' button - */ -static void prefs_matcher_down(void) -{ - GtkListStore *store = NULL; - GtkTreeModel *model = NULL; - GtkTreeIter next, sel; - GtkTreePath *try; - - if (!gtk_tree_selection_get_selected - (gtk_tree_view_get_selection - (GTK_TREE_VIEW(matcher.cond_list_view)), - &model, - &sel)) - return; - store = (GtkListStore *)model; - try = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &sel); - if (!try) - return; - - /* move when not at row 0 ... */ - if (gtk_tree_path_prev(try)) { - next = sel; - if (gtk_tree_model_iter_next(GTK_TREE_MODEL(store), &next)) - gtk_list_store_swap(store, &next, &sel); - } - - gtk_tree_path_free(try); -} - -static void prefs_matcher_enable_widget(GtkWidget* widget, const gboolean enable) -{ - cm_return_if_fail(widget != NULL); - - if(enable == TRUE) { - gtk_widget_set_sensitive(widget, TRUE); - gtk_widget_show(widget); - } else { - gtk_widget_set_sensitive(widget, FALSE); - gtk_widget_hide(widget); - } -} - -static void prefs_matcher_set_model(GtkWidget *widget, GtkTreeModel *model) -{ - cm_return_if_fail(widget != NULL); - cm_return_if_fail(model != NULL); - - gtk_combo_box_set_model(GTK_COMBO_BOX(widget), model); - gtk_combo_box_set_active(GTK_COMBO_BOX(widget), 0); -} - -static void prefs_matcher_second_criteria_sel(GtkWidget *widget, - gpointer user_data) -{ - gint criteria = gtk_combo_box_get_active(GTK_COMBO_BOX( - matcher.criteria_combo)); - gint criteria2 = combobox_get_active_data(GTK_COMBO_BOX( - matcher.criteria_combo2)); - - if(criteria != MATCH_PHRASE) return; - - if(criteria == MATCH_PHRASE) { - switch(criteria2) { - case CRITERIA_HEADERS_PART: - gtk_label_set_text(GTK_LABEL(matcher.match_label), - _("Headers part")); - break; - case CRITERIA_HEADERS_CONT: - gtk_label_set_text(GTK_LABEL(matcher.match_label), - _("Headers values")); - break; - case CRITERIA_BODY_PART: - gtk_label_set_text(GTK_LABEL(matcher.match_label), - _("Body part")); - break; - case CRITERIA_MESSAGE: - gtk_label_set_text(GTK_LABEL(matcher.match_label), - _("Whole message")); - break; - } - } -} - -#define MATCH_COMBO_IS_ENABLED(x) (x != MATCH_ALL && x != MATCH_ABOOK && \ - x != MATCH_PARTIAL && x != MATCH_THREAD && x != MATCH_LABEL) ? TRUE : FALSE -#define MATCH_CASE_REGEXP(x) (x == MATCH_HEADER || x == MATCH_PHRASE) ? TRUE : FALSE -#define MATCH_NUMERIC(x) (x == MATCH_AGE || x == MATCH_SCORE || \ - x == MATCH_SIZE) ? TRUE : FALSE - -/*! - *\brief Change widgets depending on the selected condition - * - *\param criteria combo widget - *\param user_data Not used - */ -static void prefs_matcher_criteria_select(GtkWidget *widget, - gpointer user_data) -{ - gint value, old_value; - - old_value = matcher.selected_criteria; - matcher.selected_criteria = value = gtk_combo_box_get_active - (GTK_COMBO_BOX(matcher.criteria_combo)); - - if (old_value == matcher.selected_criteria) - return; - - prefs_matcher_enable_widget(matcher.criteria_label2, - (value == MATCH_ABOOK || - value == MATCH_PHRASE || - value == MATCH_HEADER || - value == MATCH_PARTIAL || - value == MATCH_THREAD)); - prefs_matcher_enable_widget(matcher.headers_combo, - (value == MATCH_HEADER)); - prefs_matcher_enable_widget(matcher.criteria_combo2, - (value == MATCH_PHRASE || - value == MATCH_PARTIAL || - value == MATCH_THREAD)); - prefs_matcher_enable_widget(matcher.match_combo2, - (value == MATCH_ABOOK || - value == MATCH_AGE || - value == MATCH_FLAG || - value == MATCH_LABEL || - value == MATCH_SIZE)); - prefs_matcher_enable_widget(matcher.match_label2, - (value == MATCH_ABOOK || - value == MATCH_FLAG || - value == MATCH_LABEL)); - prefs_matcher_enable_widget(matcher.header_addr_combo, - (value == MATCH_ABOOK)); - prefs_matcher_enable_widget(matcher.string_entry, - (MATCH_CASE_REGEXP(value) || - value == MATCH_TEST)); - prefs_matcher_enable_widget(matcher.calendar, - (value == MATCH_DATE)); - prefs_matcher_enable_widget(matcher.time_label, - (value == MATCH_DATE)); - prefs_matcher_enable_widget(matcher.time_entry, - (value == MATCH_DATE)); - prefs_matcher_enable_widget(matcher.numeric_entry, - MATCH_NUMERIC(value)); - prefs_matcher_enable_widget(matcher.numeric_label, - (value == MATCH_SCORE)); - prefs_matcher_enable_widget(matcher.addressbook_folder_combo, - (value == MATCH_ABOOK)); - prefs_matcher_enable_widget(matcher.match_combo, - MATCH_COMBO_IS_ENABLED(value)); - prefs_matcher_enable_widget(matcher.case_checkbtn, - MATCH_CASE_REGEXP(value)); - prefs_matcher_enable_widget(matcher.regexp_checkbtn, - MATCH_CASE_REGEXP(value)); - prefs_matcher_enable_widget(matcher.test_btn, - (value == MATCH_TEST)); - prefs_matcher_enable_widget(matcher.addressbook_select_btn, - (value == MATCH_ABOOK)); - prefs_matcher_enable_widget(matcher.upper_filler, - MATCH_CASE_REGEXP(value)); - prefs_matcher_enable_widget(matcher.lower_filler, - (value == MATCH_ABOOK)); - - gtk_label_set_text(GTK_LABEL(matcher.match_label), ""); - gtk_entry_set_text(GTK_ENTRY(matcher.string_entry), ""); - - switch(value) { - case MATCH_ABOOK: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.header_addr_combo), 0); - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.addressbook_folder_combo), 0); - prefs_matcher_set_model(matcher.match_combo2, matcher.model_found); - gtk_label_set_text(GTK_LABEL(matcher.criteria_label2), _("in")); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Header")); - gtk_label_set_text(GTK_LABEL(matcher.match_label2), _("content is")); - break; - case MATCH_DATE: - prefs_matcher_set_model(matcher.match_combo, matcher.model_date); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Date is")); - gtk_calendar_select_today(GTK_CALENDAR(matcher.calendar)); - gtkut_time_select_select_by_time(GTK_COMBO_BOX(matcher.time_entry), 0, 0); - break; - case MATCH_AGE: - prefs_matcher_set_model(matcher.match_combo, matcher.model_age); - prefs_matcher_set_model(matcher.match_combo2, matcher.model_age_units); - gtk_spin_button_set_range(GTK_SPIN_BUTTON( - matcher.numeric_entry), 0, 10000); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), 0); - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), AGE_DAYS); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Age is")); - break; - case MATCH_FLAG: - prefs_matcher_set_model(matcher.match_combo, matcher.model_flags); - prefs_matcher_set_model(matcher.match_combo2, matcher.model_set); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Flag")); - gtk_label_set_text(GTK_LABEL(matcher.match_label2), _("is")); - break; - case MATCH_HEADER: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.headers_combo), 0); - prefs_matcher_set_model(matcher.match_combo, matcher.model_contain); - gtk_label_set_text(GTK_LABEL(matcher.criteria_label2), _("Name:")); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Header")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), FALSE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), FALSE); - break; - case MATCH_PARTIAL: - prefs_matcher_set_model(matcher.criteria_combo2, matcher.model_partial); - gtk_label_set_text(GTK_LABEL(matcher.criteria_label2), _("Value:")); - break; - case MATCH_PHRASE: - prefs_matcher_set_model(matcher.criteria_combo2, matcher.model_phrase); - prefs_matcher_set_model(matcher.match_combo, matcher.model_contain); - gtk_label_set_text(GTK_LABEL(matcher.criteria_label2), _("in")); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), FALSE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), FALSE); - prefs_matcher_second_criteria_sel(NULL, NULL); - break; - case MATCH_SCORE: - prefs_matcher_set_model(matcher.match_combo, matcher.model_score); - gtk_spin_button_set_range(GTK_SPIN_BUTTON( - matcher.numeric_entry), -1000, 1000); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), 0); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Score is")); - gtk_label_set_text(GTK_LABEL(matcher.numeric_label), _("points")); - break; - case MATCH_SIZE: - prefs_matcher_set_model(matcher.match_combo, matcher.model_size); - prefs_matcher_set_model(matcher.match_combo2, matcher.model_size_units); - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - SIZE_UNIT_KBYTES); - gtk_spin_button_set_range(GTK_SPIN_BUTTON( - matcher.numeric_entry), 0, 100000); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), 0); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Size is")); - break; - case MATCH_THREAD: - prefs_matcher_set_model(matcher.criteria_combo2, matcher.model_thread); - gtk_label_set_text(GTK_LABEL(matcher.criteria_label2), _("type is")); - break; - case MATCH_TEST: - prefs_matcher_set_model(matcher.match_combo, matcher.model_test); - gtk_label_set_text(GTK_LABEL(matcher.match_label), _("Program returns")); - break; - } -} - -/*! - *\brief Cancel matcher dialog - */ -static void prefs_matcher_cancel(void) -{ - gtk_widget_hide(matcher.window); - gtk_window_set_modal(GTK_WINDOW(matcher.window), FALSE); - inc_unlock(); -} - -/*! - *\brief Accept current matchers - */ -static void prefs_matcher_ok(void) -{ - MatcherList *matchers; - MatcherProp *matcherprop; - AlertValue val; - gchar *matcher_str = NULL; - gchar *str = NULL; - gint row = 1; - GtkTreeModel *model; - GtkTreeIter iter; - - matchers = prefs_matcher_get_list(); - - if (matchers != NULL) { - matcherprop = prefs_matcher_dialog_to_matcher(); - if (matcherprop != NULL) { - str = matcherprop_to_string(matcherprop); - matcherprop_free(matcherprop); - if (strcmp(str, "all") != 0) { - model = gtk_tree_view_get_model(GTK_TREE_VIEW - (matcher.cond_list_view)); - - while (gtk_tree_model_iter_nth_child(model, &iter, NULL, row)) { - gtk_tree_model_get(model, &iter, - PREFS_MATCHER_COND, &matcher_str, - -1); - if (matcher_str && strcmp(matcher_str, str) == 0) - break; - row++; - g_free(matcher_str); - matcher_str = NULL; - } - - if (!matcher_str || strcmp(matcher_str, str) != 0) { - val = alertpanel(_("Entry not saved"), - _("The entry was not saved.\nClose anyway?"), - NULL, _("_Close"), - NULL, _("_Continue editing"), - NULL, NULL, - ALERTFOCUS_SECOND); - if (G_ALERTDEFAULT != val) { - g_free(matcher_str); - g_free(str); - matcherlist_free(matchers); - return; - } - } - g_free(matcher_str); - } - } - g_free(str); - gtk_widget_hide(matcher.window); - gtk_window_set_modal(GTK_WINDOW(matcher.window), FALSE); - if (matchers_callback != NULL) - matchers_callback(matchers); - matcherlist_free(matchers); - } - inc_unlock(); -} - -/*! - *\brief Called when closing dialog box - * - *\param widget Dialog widget - *\param event Event info - *\param data User data - * - *\return gint TRUE - */ -static gint prefs_matcher_deleted(GtkWidget *widget, GdkEventAny *event, - gpointer data) -{ - prefs_matcher_cancel(); - return TRUE; -} - -/* - * Strings describing test format strings - * - * When adding new lines, remember to put 2 strings for each line - */ -static gchar *test_desc_strings[] = { - "%%", N_("literal %"), - "%s", N_("Subject"), - "%f", N_("From"), - "%t", N_("To"), - "%c", N_("Cc"), - "%d", N_("Date"), - "%i", N_("Message-ID"), - "%n", N_("Newsgroups"), - "%r", N_("References"), - "%F", N_("filename (should not be modified)"), - "\\n", N_("new line"), - "\\", N_("escape character for quotes"), - "\\\"", N_("quote character"), - NULL, NULL -}; - -static DescriptionWindow test_desc_win = { - NULL, - NULL, - TRUE, - 2, - N_("Match Type: 'Test'"), - N_("'Test' allows you to test a message or message element " - "using an external program or script. The program will " - "return either 0 or 1.\n\n" - "The following symbols can be used:"), - test_desc_strings -}; - - - -/*! - *\brief Show Test action's info - */ -static void prefs_matcher_test_info(GtkWidget *widget, GtkWidget *parent) -{ - test_desc_win.parent = parent; - description_window_create(&test_desc_win); -} - -static void prefs_matcher_addressbook_select(void) -{ - const gchar *folderpath = NULL; - gchar *new_path = NULL; - - folderpath = gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((matcher.addressbook_folder_combo))))); - new_path = addressbook_folder_selection(folderpath); - if (new_path) { - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((matcher.addressbook_folder_combo)))), new_path); - g_free(new_path); - } -} - -/* - * list view - */ - -static GtkListStore* prefs_matcher_create_data_store(void) -{ - return gtk_list_store_new(N_PREFS_MATCHER_COLUMNS, - G_TYPE_STRING, - G_TYPE_BOOLEAN, - -1); -} - -static void prefs_matcher_list_view_insert_matcher(GtkWidget *list_view, - GtkTreeIter *row_iter, - const gchar *matcher, - gboolean is_valid) -{ - GtkTreeIter iter; - GtkListStore *list_store = GTK_LIST_STORE(gtk_tree_view_get_model - (GTK_TREE_VIEW(list_view))); - - if (row_iter == NULL) { - /* append new */ - gtk_list_store_append(list_store, &iter); - } else { - /* change existing */ - iter = *row_iter; - } - - gtk_list_store_set(list_store, &iter, - PREFS_MATCHER_COND, matcher, - PREFS_MATCHER_COND_VALID, is_valid, - -1); -} - -static GtkWidget *prefs_matcher_list_view_create(void) -{ - GtkTreeView *list_view; - GtkTreeSelection *selector; - GtkTreeModel *model; - - model = GTK_TREE_MODEL(prefs_matcher_create_data_store()); - list_view = GTK_TREE_VIEW(gtk_tree_view_new_with_model(model)); - g_object_unref(model); - - gtk_tree_view_set_reorderable(list_view, TRUE); - - selector = gtk_tree_view_get_selection(list_view); - gtk_tree_selection_set_mode(selector, GTK_SELECTION_BROWSE); - gtk_tree_selection_set_select_function(selector, prefs_matcher_selected, - NULL, NULL); - - /* create the columns */ - prefs_matcher_create_list_view_columns(GTK_WIDGET(list_view)); - - return GTK_WIDGET(list_view); -} - -static void prefs_matcher_create_list_view_columns(GtkWidget *list_view) -{ - GtkTreeViewColumn *column; - GtkCellRenderer *renderer; - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes - (_("Current condition rules"), - renderer, - "text", PREFS_MATCHER_COND, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(list_view), column); -} - -static void prefs_matcher_set_criteria(const gint criteria) -{ - gint match_criteria = 0; - - switch (criteria) { - case CRITERIA_FOUND_IN_ADDRESSBOOK: - match_criteria = MATCH_ABOOK; - break; - case CRITERIA_ALL: - match_criteria = MATCH_ALL; - break; - case CRITERIA_AGE_GREATER: - case CRITERIA_AGE_LOWER: - case CRITERIA_AGE_GREATER_HOURS: - case CRITERIA_AGE_LOWER_HOURS: - match_criteria = MATCH_AGE; - break; - case CRITERIA_DATE_AFTER: - case CRITERIA_DATE_BEFORE: - match_criteria = MATCH_DATE; - break; - case CRITERIA_SCORE_GREATER: - case CRITERIA_SCORE_LOWER: - case CRITERIA_SCORE_EQUAL: - match_criteria = MATCH_SCORE; - break; - case CRITERIA_SIZE_GREATER: - case CRITERIA_SIZE_SMALLER: - case CRITERIA_SIZE_EQUAL: - match_criteria = MATCH_SIZE; - break; - case CRITERIA_SUBJECT: - case CRITERIA_FROM: - case CRITERIA_TO: - case CRITERIA_CC: - case CRITERIA_TO_OR_CC: - case CRITERIA_MESSAGEID: - case CRITERIA_INREPLYTO: - case CRITERIA_REFERENCES: - case CRITERIA_HEADER: - match_criteria = MATCH_HEADER; - break; - case CRITERIA_HEADERS_PART: - case CRITERIA_HEADERS_CONT: - case CRITERIA_BODY_PART: - case CRITERIA_MESSAGE: - match_criteria = MATCH_PHRASE; - break; - case CRITERIA_TEST: - match_criteria = MATCH_TEST; - break; - case CRITERIA_UNREAD: - case CRITERIA_NEW: - case CRITERIA_MARKED: - case CRITERIA_DELETED: - case CRITERIA_REPLIED: - case CRITERIA_FORWARDED: - case CRITERIA_LOCKED: - case CRITERIA_SPAM: - case CRITERIA_HAS_ATTACHMENT: - case CRITERIA_SIGNED: - match_criteria = MATCH_FLAG; - break; - case CRITERIA_PARTIAL: - match_criteria = MATCH_PARTIAL; - break; - case CRITERIA_IGNORE_THREAD: - case CRITERIA_WATCH_THREAD: - match_criteria = MATCH_THREAD; - break; - } - - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo), - match_criteria); - - switch(match_criteria) { - case MATCH_HEADER: - if(criteria != CRITERIA_HEADER) - combobox_select_by_data(GTK_COMBO_BOX( - matcher.headers_combo), - criteria); - break; - case MATCH_AGE: - case MATCH_DATE: - case MATCH_SCORE: - case MATCH_SIZE: - case MATCH_FLAG: - combobox_select_by_data(GTK_COMBO_BOX( - matcher.match_combo), criteria); - break; - case MATCH_PHRASE: - combobox_select_by_data(GTK_COMBO_BOX( - matcher.criteria_combo2), criteria); - break; - } -} - -static gboolean prefs_matcher_selected(GtkTreeSelection *selector, - GtkTreeModel *model, - GtkTreePath *path, - gboolean currently_selected, - gpointer data) -{ - gchar *matcher_str; - MatcherProp *prop; - gboolean negative_cond; - gint criteria; - GtkTreeIter iter; - gboolean is_valid; - struct tm lt; - char zone[6]; - - if (currently_selected) - return TRUE; - - if (!gtk_tree_model_get_iter(model, &iter, path)) - return TRUE; - - gtk_tree_model_get(model, &iter, - PREFS_MATCHER_COND_VALID, &is_valid, - PREFS_MATCHER_COND, &matcher_str, - -1); - - if (!is_valid) { - g_free(matcher_str); - prefs_matcher_reset_condition(); - return TRUE; - } - - negative_cond = FALSE; - - prop = matcher_parser_get_prop(matcher_str); - if (prop == NULL) { - g_free(matcher_str); - return TRUE; - } - - criteria = prefs_matcher_get_criteria_from_matching(prop->criteria); - prefs_matcher_set_criteria(criteria); - - switch(prop->criteria) { - case MATCHCRITERIA_NOT_UNREAD: - case MATCHCRITERIA_NOT_NEW: - case MATCHCRITERIA_NOT_MARKED: - case MATCHCRITERIA_NOT_DELETED: - case MATCHCRITERIA_NOT_REPLIED: - case MATCHCRITERIA_NOT_FORWARDED: - case MATCHCRITERIA_NOT_LOCKED: - case MATCHCRITERIA_NOT_SPAM: - case MATCHCRITERIA_HAS_NO_ATTACHMENT: - case MATCHCRITERIA_NOT_SIGNED: - case MATCHCRITERIA_NOT_PARTIAL: - case MATCHCRITERIA_NOT_IGNORE_THREAD: - case MATCHCRITERIA_NOT_WATCH_THREAD: - case MATCHCRITERIA_NOT_SUBJECT: - case MATCHCRITERIA_NOT_FROM: - case MATCHCRITERIA_NOT_TO: - case MATCHCRITERIA_NOT_CC: - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: - case MATCHCRITERIA_NOT_MESSAGEID: - case MATCHCRITERIA_NOT_INREPLYTO: - case MATCHCRITERIA_NOT_REFERENCES: - case MATCHCRITERIA_NOT_HEADER: - case MATCHCRITERIA_NOT_HEADERS_PART: - case MATCHCRITERIA_NOT_HEADERS_CONT: - case MATCHCRITERIA_NOT_MESSAGE: - case MATCHCRITERIA_NOT_BODY_PART: - case MATCHCRITERIA_NOT_TEST: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - negative_cond = TRUE; - break; - } - - switch(prop->criteria) { - case MATCHCRITERIA_ALL: - break; - - case MATCHCRITERIA_NOT_SUBJECT: - case MATCHCRITERIA_NOT_FROM: - case MATCHCRITERIA_NOT_TO: - case MATCHCRITERIA_NOT_CC: - case MATCHCRITERIA_NOT_TO_AND_NOT_CC: - case MATCHCRITERIA_NOT_MESSAGEID: - case MATCHCRITERIA_NOT_INREPLYTO: - case MATCHCRITERIA_NOT_REFERENCES: - case MATCHCRITERIA_NOT_HEADERS_PART: - case MATCHCRITERIA_NOT_HEADERS_CONT: - case MATCHCRITERIA_NOT_BODY_PART: - case MATCHCRITERIA_NOT_MESSAGE: - case MATCHCRITERIA_NOT_TEST: - case MATCHCRITERIA_SUBJECT: - case MATCHCRITERIA_FROM: - case MATCHCRITERIA_TO: - case MATCHCRITERIA_CC: - case MATCHCRITERIA_TO_OR_CC: - case MATCHCRITERIA_MESSAGEID: - case MATCHCRITERIA_INREPLYTO: - case MATCHCRITERIA_REFERENCES: - case MATCHCRITERIA_HEADERS_PART: - case MATCHCRITERIA_HEADERS_CONT: - case MATCHCRITERIA_BODY_PART: - case MATCHCRITERIA_MESSAGE: - case MATCHCRITERIA_TEST: - gtk_entry_set_text(GTK_ENTRY(matcher.string_entry), prop->expr); - break; - - case MATCHCRITERIA_DATE_AFTER: - case MATCHCRITERIA_DATE_BEFORE: - zone[0] = '\0'; - procheader_date_parse_to_tm(prop->expr, <, zone); - gtk_calendar_select_day(GTK_CALENDAR(matcher.calendar), lt.tm_mday); - gtk_calendar_select_month(GTK_CALENDAR(matcher.calendar), lt.tm_mon, lt.tm_year + 1900); - gtkut_time_select_select_by_time(GTK_COMBO_BOX(matcher.time_entry), lt.tm_hour, lt.tm_min); - - break; - - case MATCHCRITERIA_FOUND_IN_ADDRESSBOOK: - case MATCHCRITERIA_NOT_FOUND_IN_ADDRESSBOOK: - { - gchar *header; - gchar *expr; - - /* matcher expressions contain UNtranslated "Any"/"All", - select the relevant translated combo item */ - if (strcasecmp(prop->header, "All") == 0) - header = (gchar*)C_("Filtering Matcher Menu", "All"); - else - if (strcasecmp(prop->header, "Any") == 0) - header = _("Any"); - else - header = prop->header; - if (strcasecmp(prop->expr, "Any") == 0) - expr = _("Any"); - else - expr = prop->expr; - - gtk_entry_set_text(GTK_ENTRY(matcher.header_addr_entry), header); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((matcher.addressbook_folder_combo)))), expr); - break; - } - - case MATCHCRITERIA_AGE_GREATER: - case MATCHCRITERIA_AGE_LOWER: - if(prop->value >= 7 && !(prop->value % 7)) { - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - AGE_WEEKS); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value/7); - } else { - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - AGE_DAYS); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value); - } - break; - - case MATCHCRITERIA_AGE_GREATER_HOURS: - case MATCHCRITERIA_AGE_LOWER_HOURS: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - AGE_HOURS); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value); - break; - - case MATCHCRITERIA_SCORE_GREATER: - case MATCHCRITERIA_SCORE_LOWER: - case MATCHCRITERIA_SCORE_EQUAL: - gtk_spin_button_set_value(GTK_SPIN_BUTTON(matcher.numeric_entry), - prop->value); - break; - - case MATCHCRITERIA_SIZE_GREATER: - case MATCHCRITERIA_SIZE_SMALLER: - case MATCHCRITERIA_SIZE_EQUAL: - if(prop->value >= MB_SIZE && !(prop->value % MB_SIZE)) { - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - SIZE_UNIT_MBYTES); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value/MB_SIZE); - } else if(prop->value >= KB_SIZE && !(prop->value % KB_SIZE)) { - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - SIZE_UNIT_KBYTES); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value/KB_SIZE); - } else { - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - SIZE_UNIT_BYTES); - gtk_spin_button_set_value(GTK_SPIN_BUTTON( - matcher.numeric_entry), prop->value); - } - break; - - case MATCHCRITERIA_NOT_HEADER: - case MATCHCRITERIA_HEADER: - gtk_entry_set_text(GTK_ENTRY(matcher.header_entry), prop->header); - gtk_entry_set_text(GTK_ENTRY(matcher.string_entry), prop->expr); - break; - } - - switch(criteria) { - case CRITERIA_SUBJECT: - case CRITERIA_FROM: - case CRITERIA_TO: - case CRITERIA_CC: - case CRITERIA_TO_OR_CC: - case CRITERIA_MESSAGEID: - case CRITERIA_INREPLYTO: - case CRITERIA_REFERENCES: - case CRITERIA_HEADER: - case CRITERIA_HEADERS_PART: - case CRITERIA_HEADERS_CONT: - case CRITERIA_BODY_PART: - case CRITERIA_MESSAGE: - case CRITERIA_TEST: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo), - negative_cond ? PREDICATE_DOES_NOT_CONTAIN : - PREDICATE_CONTAINS); - break; - case CRITERIA_FOUND_IN_ADDRESSBOOK: - case CRITERIA_UNREAD: - case CRITERIA_NEW: - case CRITERIA_MARKED: - case CRITERIA_DELETED: - case CRITERIA_REPLIED: - case CRITERIA_FORWARDED: - case CRITERIA_LOCKED: - case CRITERIA_SPAM: - case CRITERIA_HAS_ATTACHMENT: - case CRITERIA_SIGNED: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.match_combo2), - negative_cond ? PREDICATE_FLAG_DISABLED : - PREDICATE_FLAG_ENABLED); - break; - case CRITERIA_WATCH_THREAD: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo2), - negative_cond ? THREAD_NOT_WATCHED : - THREAD_WATCHED); - break; - case CRITERIA_IGNORE_THREAD: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo2), - negative_cond ? THREAD_NOT_IGNORED : - THREAD_IGNORED); - break; - case CRITERIA_PARTIAL: - gtk_combo_box_set_active(GTK_COMBO_BOX(matcher.criteria_combo2), - negative_cond ? PREDICATE_FLAG_DISABLED : - PREDICATE_FLAG_ENABLED); - break; - } - - switch(prop->matchtype) { - case MATCHTYPE_MATCH: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), FALSE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), TRUE); - break; - - case MATCHTYPE_MATCHCASE: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), FALSE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), FALSE); - break; - - case MATCHTYPE_REGEXP: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), TRUE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), TRUE); - break; - - case MATCHTYPE_REGEXPCASE: - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.regexp_checkbtn), TRUE); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(matcher.case_checkbtn), FALSE); - break; - } - - g_free(matcher_str); - return TRUE; -} - blob - d8be7e816a4d25a281c1a98b65573edc747689c6 blob + 7c2366c751e1ae01a8f4a0bcd45d10c1dac23cfd --- src/prefs_other.c +++ src/prefs_other.c @@ -35,13 +35,13 @@ #include "prefs_gtk.h" #include "gtk/gtkutils.h" +#include "gtk/manage_window.h" #include "gtk/prefswindow.h" #include "combobox.h" -#include "manage_window.h" -#include "imap-thread.h" +#include "etpan/imap-thread.h" -#include "file-utils.h" +#include "common/file-utils.h" typedef struct _OtherPage { @@ -105,8 +105,6 @@ static void prefs_keybind_preset_changed(GtkComboBox * {"/Menu/Edit/Copy", "C"}, {"/Menu/Edit/SelectAll", "A"}, {"/Menu/Edit/Find", "F"}, - {"/Menu/Edit/SearchFolder", "F"}, - {"/Menu/Edit/QuickSearch", "slash"}, {"/Menu/View/ShowHide/MenuBar", "F12"}, {"/Menu/View/ShowHide/MessageView", "V"}, blob - 7337ce7277fc28969c3f8e5383173ca57800a79f (mode 644) blob + /dev/null --- src/prefs_quote.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2005-2025 The Claws Mail Team and Colin Leroy - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include "defs.h" - -#include -#include - -#include -#include -#include -#include - -#include "prefs_common.h" -#include "prefs_gtk.h" -#include "prefs_template.h" -#include "alertpanel.h" - -#include "gtk/gtkutils.h" -#include "gtk/prefswindow.h" - -#include "manage_window.h" -#include "quote_fmt.h" - -typedef struct _QuotePage -{ - PrefsPage page; - - GtkWidget *window; - - GtkWidget *checkbtn_compose_with_format; - GtkWidget *entry_subject; - GtkWidget *text_format; - GtkWidget *text_quotefmt; - GtkWidget *text_fw_quotefmt; - GtkWidget *btn_quotedesc; -} QuotePage; - -QuotePage *prefs_quote; - -static void prefs_quote_set_default_new_msg_fmt(void) -{ - cm_return_if_fail(prefs_quote->text_format != NULL); - - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_format), - _("Hello,\\n")); -} - -static void prefs_quote_set_default_reply_fmt(void) -{ - cm_return_if_fail(prefs_quote->text_quotefmt != NULL); - - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_quotefmt), - _("On %d\\n%f wrote:\\n\\n%q")); -} - -static void prefs_quote_set_default_forward_fmt(void) -{ - cm_return_if_fail(prefs_quote->text_fw_quotefmt != NULL); - - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_fw_quotefmt), - _("\\n\\nBegin forwarded message:\\n\\n" - "?d{Date: %d\\n}?f{From: %f\\n}?t{To: %t\\n}?c{Cc: %c\\n}" - "?n{Newsgroups: %n\\n}?s{Subject: %s\\n}\\n\\n%M")); -} - -static void prefs_quote_create_widget(PrefsPage *_page, GtkWindow *window, - gpointer data) -{ - QuotePage *prefs_quote = (QuotePage *) _page; - - GtkWidget *vbox; - GtkWidget *vbox2; - GtkWidget *notebook; - - vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show (vbox); - - notebook = gtk_notebook_new(); - gtk_widget_show(notebook); - gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0); - - /* new message */ - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING); - gtk_widget_show (vbox2); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER); - - quotefmt_create_new_msg_fmt_widgets( - window, - vbox2, - &prefs_quote->checkbtn_compose_with_format, - NULL, - &prefs_quote->entry_subject, - &prefs_quote->text_format, - TRUE, prefs_quote_set_default_new_msg_fmt); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(C_("Templates", "New"))); - - /* reply */ - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING); - gtk_widget_show (vbox2); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER); - - quotefmt_create_reply_fmt_widgets( - window, - vbox2, - NULL, - NULL, - &prefs_quote->text_quotefmt, - TRUE, prefs_quote_set_default_reply_fmt); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(C_("Templates", "Reply"))); - - /* forward */ - vbox2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING); - gtk_widget_show (vbox2); - gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER); - - quotefmt_create_forward_fmt_widgets( - window, - vbox2, - NULL, - NULL, - &prefs_quote->text_fw_quotefmt, - TRUE, prefs_quote_set_default_forward_fmt); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(C_("Templates", "Forward"))); - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(prefs_quote->checkbtn_compose_with_format), - prefs_common.compose_with_format); - pref_set_entry_from_pref(GTK_ENTRY(prefs_quote->entry_subject), - prefs_common.compose_subject_format); - if (prefs_common.compose_body_format) - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_format), - prefs_common.compose_body_format); - else - prefs_quote_set_default_new_msg_fmt(); - - if (prefs_common.quotefmt) - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_quotefmt), - prefs_common.quotefmt); - else - prefs_quote_set_default_reply_fmt(); - - if (prefs_common.fw_quotefmt) - pref_set_textview_from_pref(GTK_TEXT_VIEW(prefs_quote->text_fw_quotefmt), - prefs_common.fw_quotefmt); - else - prefs_quote_set_default_forward_fmt(); - - prefs_quote->window = GTK_WIDGET(window); - prefs_quote->page.widget = vbox; -} - -static void prefs_quote_save(PrefsPage *_page) -{ - QuotePage *page = (QuotePage *) _page; - - g_free(prefs_common.compose_subject_format); - prefs_common.compose_subject_format = NULL; - g_free(prefs_common.compose_body_format); - prefs_common.compose_body_format = NULL; - g_free(prefs_common.quotefmt); - prefs_common.quotefmt = NULL; - g_free(prefs_common.fw_quotefmt); - prefs_common.fw_quotefmt = NULL; - - prefs_common.compose_with_format = - gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(page->checkbtn_compose_with_format)); - prefs_common.compose_subject_format = pref_get_pref_from_entry( - GTK_ENTRY(page->entry_subject)); - prefs_common.compose_body_format = pref_get_pref_from_textview( - GTK_TEXT_VIEW(page->text_format)); - quotefmt_check_new_msg_formats(prefs_common.compose_with_format, - NULL, - prefs_common.compose_subject_format, - prefs_common.compose_body_format); - - prefs_common.quotefmt = pref_get_pref_from_textview( - GTK_TEXT_VIEW(page->text_quotefmt)); - quotefmt_check_reply_formats(TRUE, NULL, prefs_common.quotefmt); - - prefs_common.fw_quotefmt = pref_get_pref_from_textview( - GTK_TEXT_VIEW(page->text_fw_quotefmt)); - quotefmt_check_forward_formats(TRUE, NULL, prefs_common.fw_quotefmt); -} - -static void prefs_quote_destroy_widget(PrefsPage *_page) -{ -} - -void prefs_quote_init(void) -{ - QuotePage *page; - static gchar *path[3]; - - path[0] = _("Write"); - path[1] = _("Templates"); - path[2] = NULL; - - page = g_new0(QuotePage, 1); - page->page.path = path; - page->page.create_widget = prefs_quote_create_widget; - page->page.destroy_widget = prefs_quote_destroy_widget; - page->page.save_page = prefs_quote_save; - page->page.weight = 185.0; - prefs_gtk_register_page((PrefsPage *) page); - prefs_quote = page; -} - -void prefs_quote_done(void) -{ - prefs_gtk_unregister_page((PrefsPage *) prefs_quote); - g_free(prefs_quote); -} blob - 8fba512120a755c0fec132f8af1d56f54bd0ccdf (mode 644) blob + /dev/null --- src/prefs_quote.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 2005-2012 Colin Leroy & the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef PREFS_QUOTE_H -#define PREFS_QUOTE_H - -void prefs_quote_init (void); -void prefs_quote_done (void); - -#endif /* PREFS_QUOTE_H */ blob - 56e7ae4bfbfe54f30a5a7c6668544bc763d88e5c blob + 400bf6015e423f4161bdff135f36defac37fca2b --- src/prefs_summaries.c +++ src/prefs_summaries.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - #include "defs.h" #include blob - 928d9a1b812ee74671940e1011d73dacdf8b58f6 (mode 644) blob + /dev/null --- src/prefs_template.c +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Claws Mail templates subsystem - * Copyright (C) 2001 Alexander Barinov - * Copyright (C) 2001-2025 The Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include "config.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "compose.h" -#include "quote_fmt.h" -#include "prefs_common.h" -#include "account.h" - -gboolean prefs_template_string_is_valid(gchar *string, gint *line, gboolean escaped_string, gboolean email) -{ - gboolean result = TRUE; - if (string && *string != '\0') { - gchar *tmp = NULL; - gchar *parsed_buf; - MsgInfo dummyinfo; - PrefsAccount *account = account_get_default(); - - if (escaped_string) { - tmp = malloc(strlen(string)+1); - pref_get_unescaped_pref(tmp, string); - } else { - tmp = g_strdup(string); - } - memset(&dummyinfo, 0, sizeof(MsgInfo)); - /* init dummy fields, so we can test the result of the parse */ - dummyinfo.date="Sat, 30 May 2009 01:23:45 +0200"; - dummyinfo.fromname="John Doe"; - dummyinfo.from="John Doe "; - dummyinfo.to="John Doe "; - dummyinfo.cc="John Doe "; - dummyinfo.msgid="<1234john@example.com>"; - dummyinfo.inreplyto="<1234john@example.com>"; - dummyinfo.subject="subject"; - - quote_fmt_init(&dummyinfo, NULL, NULL, TRUE, account, FALSE); - quote_fmt_scan_string(tmp); - quote_fmt_parse(); - g_free(tmp); - parsed_buf = quote_fmt_get_buffer(); - if (!parsed_buf) { - if (line) - *line = quote_fmt_get_line(); - quote_fmtlex_destroy(); - return FALSE; - } - quote_fmt_reset_vartable(); - quote_fmtlex_destroy(); - } - return result; -} blob - 2ef529bbfa8755c0219c7b5e38ef8a1cc9f6e999 (mode 644) blob + /dev/null --- src/prefs_template.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Claws Mail templates subsystem - * Copyright (C) 2001 Alexander Barinov - * Copyright (C) 2001-2018 The Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef __PREFS_TEMPLATES_H__ -#define __PREFS_TEMPLATES_H__ - -gboolean prefs_template_string_is_valid(gchar *string, gint *line, - gboolean escaped_string, gboolean email); - -#endif /* __PREFS_TEMPLATES_H__ */ blob - 27ff823007e1dd61972678734f753f44c50c299b blob + 3bd3f18d16d9304a0f76fb9a1bf6c126ef59a7ff --- src/prefs_themes.c +++ src/prefs_themes.c @@ -269,20 +269,7 @@ static void prefs_themes_foreach_file(const gchar *dir static gboolean prefs_themes_is_system_theme(const gchar *dirname) { - gint len; - gchar *system_theme_dir; - gboolean is_sys = FALSE; - - cm_return_val_if_fail(dirname != NULL, FALSE); - - system_theme_dir = stock_pixmap_get_system_theme_dir_for_theme(NULL); - len = strlen(system_theme_dir); - if (strlen(dirname) > len && 0 == strncmp(dirname, system_theme_dir, len)) - is_sys = TRUE; - - g_free(system_theme_dir); - - return is_sys; + return FALSE; } static void prefs_themes_set_themes_menu(GtkComboBox *combo, const ThemesData *tdata) blob - 306ddfe3130b6dddc9efb20521cb6b643e798e22 blob + d6a2bfcde3ce2100bc0fe44829e08af52712ba1d --- src/privacy.c +++ src/privacy.c @@ -17,8 +17,6 @@ * */ -#include "config.h" - #include #include blob - 65051dafc8f0c6b128384070754e58b73700c86f blob + afe168ef00edaf09a2fd1e5788aebc6d1d9bfd5c --- src/privacy.h +++ src/privacy.h @@ -109,7 +109,7 @@ struct _PrivacySystem { gboolean can_sign; gboolean (*sign) (MimeInfo *mimeinfo, - PrefsAccount *account, + PrefsAccount *account, const gchar *from_addr); gboolean can_encrypt; blob - f9859013792f4cdaeed2969f1f68060c12237af9 blob + 647a3419e2a95bab60837ca3212f4141200ab6b7 --- src/procmime.c +++ src/procmime.c @@ -1148,18 +1148,12 @@ GList *procmime_get_mime_type_list(void) if (mime_type_list) return mime_type_list; -#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) - if ((fp = g_fopen(DATAROOTDIR "/mime/globs", "rb")) == NULL) -#else if ((fp = g_fopen("/usr/share/mime/globs", "rb")) == NULL) -#endif { fp_is_glob_file = FALSE; if ((fp = g_fopen("/etc/mime.types", "rb")) == NULL) { - if ((fp = g_fopen(SYSCONFDIR "/mime.types", "rb")) - == NULL) { - FILE_OP_ERROR(SYSCONFDIR "/mime.types", - "g_fopen"); + if ((fp = g_fopen("/usr/share/misc/mime.types", "rb")) == NULL) { + FILE_OP_ERROR("/usr/share/misc/mime.types", "g_fopen"); return NULL; } } blob - dfc94fa44f848d71dae52ef665b2a62d66b037a6 blob + c502373fc636957efdb626195ee2ab70b8dbcc37 --- src/procmime.h +++ src/procmime.h @@ -161,12 +161,6 @@ struct _MimeInfo #define IS_BOUNDARY(s, bnd, len) \ (bnd && s[0] == '-' && s[1] == '-' && !strncmp(s + 2, bnd, len)) -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* MimeInfo handling */ - MimeInfo *procmime_mimeinfo_new (void); void procmime_mimeinfo_free_all (MimeInfo **mimeinfo_ptr); @@ -228,7 +222,7 @@ gchar *procmime_get_content_type_str (MimeMediaType void procmime_force_charset (const gchar *str); void procmime_force_encoding (EncodingType encoding); gboolean procmime_msginfo_is_encrypted (MsgInfo *msginfo); -int procmime_write_mime_header (MimeInfo *mimeinfo, +int procmime_write_mime_header (MimeInfo *mimeinfo, FILE *fp); void renderer_read_config(void); @@ -252,8 +246,4 @@ void *procmime_get_part_as_string(MimeInfo *mimeinfo, GInputStream *procmime_get_part_as_inputstream(MimeInfo *mimeinfo); GdkPixbuf *procmime_get_part_as_pixbuf(MimeInfo *mimeinfo, GError **error); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - #endif /* __PROCMIME_H__ */ blob - 3fdb63225d4507c3fb35dd2dd3a3d21b315d8282 blob + 548b88c1b3a75a68a05e113242d9385021083b99 --- src/procmsg.c +++ src/procmsg.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include blob - 027a60392c240c682c4aec2ae41d228430884712 (mode 644) blob + /dev/null --- src/quote_fmt.c +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include -#include -#include -#include - -#include "manage_window.h" -#include "description_window.h" -#include "gtkutils.h" - -#include "prefs_gtk.h" -#include "prefs_common.h" -#include "quote_fmt.h" -#include "alertpanel.h" -#include "prefs_template.h" - - -/* - * Strings describing quote format strings - * - * When adding new lines, remember to put 2 strings for each line - */ -static gchar *quote_desc_strings[] = { - N_("symbols:"), NULL, - "%date_fmt{fmt} (%D{fmt})", N_("customized date format (see 'man strftime')"), /* date expression */ - "%date (%d)", N_("Date"), /* date */ - "%from (%f)", N_("From"), /* from */ - "%email (%A)", N_("email address of sender"), /* email address */ - "%fullname (%N)", N_("full name of sender"), /* full name */ - "%firstname (%F)", N_("first name of sender"), /* first name */ - "%lastname (%L)", N_("last name of sender"), /* last name */ - "%initials (%I)", N_("initials of sender"), /* initial of sender */ - "%subject (%s)", N_("Subject"), /* subject */ - "%to (%t)", N_("To"), /* to */ - "%cc (%c)", N_("Cc"), /* cc */ - "%references (%r)", N_("References"), /* references */ - "%messageid (%i)", N_("Message-ID"), /* message-id */ - "%msg (%M)", N_("message body"), /* message */ - "%quoted_msg (%Q)", N_("quoted message body"), /* quoted message */ - "%msg_no_sig (%m)", N_("message body without signature"), /* message with no signature */ - "%quoted_msg_no_sig (%q)", N_("quoted message body without signature"), /* quoted message with no signature */ - "%tags", N_("message tags"), /* message tags */ - "%cursor (%X)", N_("cursor position"), /* X marks the cursor spot */ - "%account_fullname (%af)", N_("account property: your name"), /* full name in compose account */ - "%account_email (%am)", N_("account property: your email address"), /* mail address in compose account */ - "%account_name (%an)", N_("account property: account name"), /* compose account name itself */ - "%account_org (%ao)", N_("account property: organization"), /* organization in compose account */ - "%account_sig (%as)", N_("account property: signature"), /* signature set in account prefs */ - "%account_sigpath (%asp)", N_("account property: signature path"), /* signature path set in account prefs */ - "%addrbook_cc (%ABc)", N_("address book completion: Cc"), /* completion of 'Cc' from address book */ - "%addrbook_from (%ABf)", N_("address book completion: From"), /* completion of 'From' from address book */ - "%addrbook_to (%ABt)", N_("address book completion: To"), /* completion of 'To' from address book */ - "\\%", N_("literal %"), - "\\\\", N_("literal backslash"), - "\\?", N_("literal question mark"), - "\\!", N_("literal exclamation mark"), - "\\|", N_("literal pipe"), - "\\{", N_("literal opening curly brace"), - "\\}", N_("literal closing curly brace"), - "\\t", N_("tab"), - "\\n", N_("new line"), - "", NULL, - N_("commands:"), NULL, - "?x{expr}\n\n", N_("insert expr if x is set, where x is one of\nthe [dfNFLIstcnriT, ad, af, ao, as, asp, aT, ABc, ABf, ABt]\nsymbols (or their long equivalent)"), - "!x{expr}\n\n", N_("insert expr if x is not set, where x is one of\nthe [dfNFLIstcnriT, ad, af, ao, as, asp, aT, ABc, ABf, ABt]\nsymbols (or their long equivalent)"), - "|file{sub_expr}\n(|f{sub_expr})", N_("insert file:\nsub_expr is evaluated as the path of the file to insert"), /* insert file */ - "|program{sub_expr}\n(|p{sub_expr})\n", N_("insert program output:\nsub_expr is evaluated as a command-line to get\nthe output from"), /* insert program output */ - "|input{sub_expr}\n(|i{sub_expr})\n", N_("insert user input:\nsub_expr is a variable to be replaced by\nuser-entered text"), /* insert user input */ - "|attach{sub_expr}\n(|a{sub_expr})", N_("attach file:\nsub_expr is evaluated as the path of the file to attach"), /* attach file */ - "|attach_program{sub_expr}\n(|A{sub_expr})", N_("attach file:\nsub_expr is evaluated as a command-line to get\nthe filename from"), /* attach file whose name's got from program output */ - "", NULL, - N_("definition of terms:"), NULL, - "expr\n", N_("text that can contain any of the symbols or\ncommands above"), - "sub_expr\n", N_("text that can contain any of the symbols (no\ncommands) above"), - "completion\n\n\n", N_("completion from address book only works with the first\naddress of the header, it outputs the full name\nof the contact if that address matches exactly\none contact in the address book"), - NULL,NULL -}; - -static DescriptionWindow quote_desc_win = { - NULL, - NULL, - TRUE, - 2, - N_("Description of symbols"), - N_("The following symbols and commands can be used:"), - quote_desc_strings -}; - - -void quote_fmt_quote_description(GtkWidget *widget, GtkWidget *pref_window) -{ - quote_desc_win.parent = pref_window; - description_window_create("e_desc_win); -} - -static void quote_fmt_add_buttons(GtkWindow* parent_window, GtkWidget *parent_box, - gboolean add_info_button, void(*set_defaults_func)(void)) { - GtkWidget *hbox_btns; - - if (!add_info_button && !set_defaults_func) - return; - - hbox_btns = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); - gtk_box_pack_end (GTK_BOX(parent_box), hbox_btns, FALSE, TRUE, 0); - - if (add_info_button) - quotefmt_add_info_button(parent_window, hbox_btns); - if (set_defaults_func) - quotefmt_add_defaults_button(parent_window, hbox_btns, set_defaults_func); - - gtk_widget_show(GTK_WIDGET(hbox_btns)); -} - -void quotefmt_create_new_msg_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_compose_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_subject_format, - GtkWidget **edit_body_format, - gboolean add_info_button, - void(*set_defaults_func)(void)) -{ - GtkWidget *checkbtn_use_format = NULL; - GtkWidget *vbox_format; - GtkWidget *hbox_format; - GtkWidget *hbox2_format; - GtkWidget *label_from = NULL; - GtkWidget *entry_from = NULL; - GtkWidget *label_subject; - GtkWidget *entry_subject; - GtkWidget *scrolledwin_format; - GtkWidget *text_format; - GtkSizeGroup *size_group; - - if (add_info_button) - cm_return_if_fail(parent_window != NULL); - cm_return_if_fail(parent_box != NULL); - if (checkbtn_compose_with_format) - cm_return_if_fail(checkbtn_compose_with_format != NULL); - - cm_return_if_fail(edit_subject_format != NULL); - cm_return_if_fail(edit_body_format != NULL); - - size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - if (checkbtn_compose_with_format) - PACK_CHECK_BUTTON (parent_box, checkbtn_use_format, - _("Use template when writing new messages")); - - vbox_format = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); - gtk_widget_show(vbox_format); - gtk_container_add(GTK_CONTAINER (parent_box), vbox_format); - gtk_container_set_border_width (GTK_CONTAINER (vbox_format), 8); - - if (override_from_format) { - hbox2_format = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox2_format); - gtk_box_pack_start (GTK_BOX (vbox_format), hbox2_format, FALSE, FALSE, 0); - - label_from = gtk_label_new ("From"); - gtk_label_set_xalign(GTK_LABEL(label_from), 1.0); - gtk_widget_show (label_from); - gtk_box_pack_start (GTK_BOX (hbox2_format), label_from, FALSE, FALSE, 0); - gtk_size_group_add_widget(size_group, label_from); - - entry_from = gtk_entry_new (); - gtk_widget_show (entry_from); - gtk_box_pack_start (GTK_BOX (hbox2_format), entry_from, TRUE, TRUE, 0); - - CLAWS_SET_TIP(entry_from, - _("Override From header. This doesn't change the account used to compose the new message.")); - } - - hbox_format = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox_format); - gtk_box_pack_start (GTK_BOX (vbox_format), hbox_format, FALSE, FALSE, 0); - - label_subject = gtk_label_new ("Subject"); - gtk_label_set_xalign(GTK_LABEL(label_subject), 1.0); - gtk_widget_show (label_subject); - gtk_box_pack_start (GTK_BOX (hbox_format), label_subject, FALSE, FALSE, 0); - gtk_size_group_add_widget(size_group, label_subject); - - entry_subject = gtk_entry_new (); - gtk_widget_show (entry_subject); - gtk_box_pack_start (GTK_BOX (hbox_format), entry_subject, TRUE, TRUE, 0); - - scrolledwin_format = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (scrolledwin_format); - gtk_box_pack_start (GTK_BOX (vbox_format), scrolledwin_format, - TRUE, TRUE, 0); - gtk_scrolled_window_set_policy - (GTK_SCROLLED_WINDOW (scrolledwin_format), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type - (GTK_SCROLLED_WINDOW (scrolledwin_format), GTK_SHADOW_IN); - gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwin_format), 260); - - text_format = gtk_text_view_new (); - gtk_widget_show(text_format); - gtk_container_add(GTK_CONTAINER(scrolledwin_format), text_format); - gtk_text_view_set_editable (GTK_TEXT_VIEW (text_format), TRUE); - - if (checkbtn_compose_with_format) { - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_subject); - if (override_from_format) { - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from); - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_from); - } - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_subject); - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_format); - } - - quote_fmt_add_buttons(parent_window, vbox_format, - add_info_button, set_defaults_func); - - if (checkbtn_compose_with_format) - *checkbtn_compose_with_format = checkbtn_use_format; - if (override_from_format) - *override_from_format = entry_from; - *edit_subject_format = entry_subject; - *edit_body_format = text_format; - - g_object_unref(G_OBJECT(size_group)); -} - -void quotefmt_create_reply_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_reply_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_reply_format, - gboolean add_info_button, - void(*set_defaults_func)(void)) -{ - GtkWidget *checkbtn_use_format = NULL; - GtkWidget *vbox_quote; - GtkWidget *hbox1; - GtkWidget *hbox2; - GtkWidget *hbox3; - GtkWidget *label_from = NULL; - GtkWidget *entry_from = NULL; - GtkWidget *scrolledwin_quotefmt; - GtkWidget *text_quotefmt; - GtkSizeGroup *size_group; - - if (add_info_button) - cm_return_if_fail(parent_window != NULL); - cm_return_if_fail(parent_box != NULL); - if (checkbtn_reply_with_format) - cm_return_if_fail(checkbtn_reply_with_format != NULL); - - cm_return_if_fail(edit_reply_format != NULL); - - size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - if (checkbtn_reply_with_format) - PACK_CHECK_BUTTON (parent_box, checkbtn_use_format, - _("Use template when replying to messages")); - - vbox_quote = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); - gtk_widget_show(vbox_quote); - gtk_container_add(GTK_CONTAINER (parent_box), vbox_quote); - gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8); - - if (override_from_format) { - hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (vbox_quote), hbox3, FALSE, FALSE, 0); - - label_from = gtk_label_new ("From:"); - gtk_label_set_xalign(GTK_LABEL(label_from), 1.0); - gtk_widget_show (label_from); - gtk_box_pack_start (GTK_BOX (hbox3), label_from, FALSE, FALSE, 0); - gtk_size_group_add_widget(size_group, label_from); - - entry_from = gtk_entry_new (); - gtk_widget_show (entry_from); - gtk_box_pack_start (GTK_BOX (hbox3), entry_from, TRUE, TRUE, 0); - - CLAWS_SET_TIP(entry_from, - _("Override From header. This doesn't change the account used to reply.")); - } - - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 32); - gtk_widget_show (hbox1); - gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0); - - hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox2); - gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0); - - scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (scrolledwin_quotefmt); - gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, - TRUE, TRUE, 0); - gtk_scrolled_window_set_policy - (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type - (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), GTK_SHADOW_IN); - gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwin_quotefmt), 260); - - text_quotefmt = gtk_text_view_new (); - gtk_widget_show(text_quotefmt); - gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), text_quotefmt); - gtk_text_view_set_editable (GTK_TEXT_VIEW (text_quotefmt), TRUE); - - if (checkbtn_reply_with_format) { - if (override_from_format) { - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from); - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_from); - } - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_quotefmt); - } - - quote_fmt_add_buttons(parent_window, vbox_quote, - add_info_button, set_defaults_func); - - if (checkbtn_reply_with_format) - *checkbtn_reply_with_format = checkbtn_use_format; - if (override_from_format) - *override_from_format = entry_from; - *edit_reply_format = text_quotefmt; - - g_object_unref(G_OBJECT(size_group)); -} - -void quotefmt_create_forward_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_forward_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_fw_format, - gboolean add_info_button, - void(*set_defaults_func)(void)) -{ - GtkWidget *checkbtn_use_format = NULL; - GtkWidget *vbox_quote; - GtkWidget *hbox1; - GtkWidget *hbox2; - GtkWidget *hbox3; - GtkWidget *label_from = NULL; - GtkWidget *entry_from = NULL; - GtkWidget *scrolledwin_quotefmt; - GtkWidget *text_fw_quotefmt; - GtkSizeGroup *size_group; - - if (add_info_button) - cm_return_if_fail(parent_window != NULL); - cm_return_if_fail(parent_box != NULL); - if (checkbtn_forward_with_format) { - cm_return_if_fail(checkbtn_forward_with_format != NULL); - } - cm_return_if_fail(edit_fw_format != NULL); - - size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - if (checkbtn_forward_with_format) - PACK_CHECK_BUTTON (parent_box, checkbtn_use_format, - _("Use template when forwarding messages")); - - vbox_quote = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4); - gtk_widget_show(vbox_quote); - gtk_container_add(GTK_CONTAINER (parent_box), vbox_quote); - gtk_container_set_border_width (GTK_CONTAINER (vbox_quote), 8); - - if (override_from_format) { - hbox3 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox3); - gtk_box_pack_start (GTK_BOX (vbox_quote), hbox3, FALSE, FALSE, 0); - - label_from = gtk_label_new ("From:"); - gtk_label_set_xalign(GTK_LABEL(label_from), 1.0); - gtk_widget_show (label_from); - gtk_box_pack_start (GTK_BOX (hbox3), label_from, FALSE, FALSE, 0); - gtk_size_group_add_widget(size_group, label_from); - - entry_from = gtk_entry_new (); - gtk_widget_show (entry_from); - gtk_box_pack_start (GTK_BOX (hbox3), entry_from, TRUE, TRUE, 0); - - CLAWS_SET_TIP(entry_from, - _("Override From header. This doesn't change the account used to forward.")); - } - - hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 32); - gtk_widget_show (hbox1); - gtk_box_pack_start (GTK_BOX (vbox_quote), hbox1, FALSE, FALSE, 0); - - hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (hbox2); - gtk_box_pack_start (GTK_BOX (hbox1), hbox2, FALSE, FALSE, 0); - - scrolledwin_quotefmt = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (scrolledwin_quotefmt); - gtk_box_pack_start (GTK_BOX (vbox_quote), scrolledwin_quotefmt, - TRUE, TRUE, 0); - gtk_scrolled_window_set_policy - (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), - GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type - (GTK_SCROLLED_WINDOW (scrolledwin_quotefmt), GTK_SHADOW_IN); - gtk_scrolled_window_set_min_content_height(GTK_SCROLLED_WINDOW(scrolledwin_quotefmt), 260); - - text_fw_quotefmt = gtk_text_view_new (); - gtk_widget_show(text_fw_quotefmt); - gtk_container_add(GTK_CONTAINER(scrolledwin_quotefmt), - text_fw_quotefmt); - gtk_text_view_set_editable (GTK_TEXT_VIEW (text_fw_quotefmt), TRUE); - - if (checkbtn_forward_with_format) { - if (override_from_format) { - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, entry_from); - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, label_from); - } - SET_TOGGLE_SENSITIVITY(checkbtn_use_format, text_fw_quotefmt); - } - - quote_fmt_add_buttons(parent_window, vbox_quote, - add_info_button, set_defaults_func); - - if (checkbtn_forward_with_format) - *checkbtn_forward_with_format = checkbtn_use_format; - if (override_from_format) - *override_from_format = entry_from; - *edit_fw_format = text_fw_quotefmt; - - g_object_unref(G_OBJECT(size_group)); -} - -void quotefmt_add_info_button(GtkWindow *parent_window, GtkWidget *parent_box) -{ - GtkWidget *btn_formatdesc; - - btn_formatdesc = gtkut_stock_button("dialog-information", _("_Information")); - gtk_widget_show (btn_formatdesc); - gtk_box_pack_start (GTK_BOX (parent_box), btn_formatdesc, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(btn_formatdesc), "clicked", - G_CALLBACK(quote_fmt_quote_description), GTK_WIDGET(parent_window)); -} - -void quotefmt_add_defaults_button(GtkWindow *parent_window, - GtkWidget *parent_box, - void(*set_defaults_func)(void)) -{ - GtkWidget *btn_formatdesc; - - cm_return_if_fail(set_defaults_func != NULL); - - btn_formatdesc = gtk_button_new_with_mnemonic (_("Defaults")); - gtk_button_set_image (GTK_BUTTON(btn_formatdesc), - gtk_image_new_from_icon_name("edit-undo-symbolic", GTK_ICON_SIZE_BUTTON)); - gtk_widget_show (btn_formatdesc); - gtk_box_pack_end (GTK_BOX (parent_box), btn_formatdesc, FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(btn_formatdesc), "clicked", - G_CALLBACK(set_defaults_func), GTK_WIDGET(parent_window)); -} - -void quotefmt_check_new_msg_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *subject_fmt, - gchar *body_fmt) -{ - if (use_format) { - gint line; - - if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE)) - alertpanel_error(_("The \"From\" field of the \"New message\" template contains an invalid email address.")); - - if (!prefs_template_string_is_valid(subject_fmt, NULL, TRUE, FALSE)) - alertpanel_error(_("The \"Subject\" field of the \"New message\" template is invalid.")); - - if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) { - alertpanel_error(_("The body of the \"New message\" template has an error at line %d."), line); - } - } -} - -void quotefmt_check_reply_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *body_fmt) -{ - if (use_format) { - int line; - if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE)) - alertpanel_error(_("The \"From\" field of the \"Reply\" template contains an invalid email address.")); - - if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) { - alertpanel_error(_("The body of the \"Reply\" template has an error at line %d."), line); - } - } -} - -void quotefmt_check_forward_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *body_fmt) -{ - if (use_format) { - int line; - if (override_from_fmt && !prefs_template_string_is_valid(override_from_fmt, NULL, TRUE, TRUE)) - alertpanel_error(_("The \"From\" field of the \"Forward\" template contains an invalid email address.")); - - if (!prefs_template_string_is_valid(body_fmt, &line, TRUE, FALSE)) { - alertpanel_error(_("The body of the \"Forward\" template has an error at line %d."), line); - } - } -} blob - 2900b947b1ccd756811c85a87e0ceba89ecc6fc9 (mode 644) blob + /dev/null --- src/quote_fmt.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef __QUOTE_FMT_H__ - -#define __QUOTE_FMT_H__ - -#define quote_fmt_parse quote_fmtparse - -void quote_fmt_quote_description(GtkWidget *widget, GtkWidget *pref_window); - -gchar *quote_fmt_get_buffer(void); -GList *quote_fmt_get_attachments_list(void); -gint quote_fmt_get_line(void); - -void quote_fmt_init(MsgInfo *info, const gchar *my_quote_str, - const gchar *my_body, gboolean my_dry_run, - PrefsAccount *account, - gboolean escaped_string); -gint quote_fmtparse(void); -int quote_fmtlex_destroy(void); -void quote_fmt_scan_string(const gchar *str); -void quote_fmt_reset_vartable(void); -gint quote_fmt_get_cursor_pos(void); - -void quotefmt_create_new_msg_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_compose_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_subject_format, - GtkWidget **edit_body_format, - gboolean add_info_button, - void(*set_defaults_func)(void)); -void quotefmt_create_reply_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_reply_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_reply_format, - gboolean add_info_button, - void(*set_defaults_func)(void)); -void quotefmt_create_forward_fmt_widgets(GtkWindow *parent_window, - GtkWidget *parent_box, - GtkWidget **checkbtn_forward_with_format, - GtkWidget **override_from_format, - GtkWidget **edit_fw_format, - gboolean add_info_button, - void(*set_defaults_func)(void)); -void quotefmt_add_info_button(GtkWindow *parent_window, GtkWidget *parent_box); -void quotefmt_add_defaults_button(GtkWindow *parent_window, - GtkWidget *parent_box, - void(*set_defaults_func)(void)); - -void quotefmt_check_new_msg_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *subject_fmt, - gchar *body_fmt); -void quotefmt_check_reply_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *body_fmt); -void quotefmt_check_forward_formats(gboolean use_format, - gchar *override_from_fmt, - gchar *body_fmt); - -#endif /* __QUOTE_FMT_H__ */ blob - 6fff24b66470621b42b9c05f1c622aee2ab3ea01 (mode 644) blob + /dev/null --- src/quote_fmt_lex.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2014 Hiroyuki Yamamoto and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -/* The following defines are adapted from GDB sources (cp-name-parser.y): - - Copyright (C) 2003-2014 Free Software Foundation, Inc. - - Parts of the lexer are based on c-exp.y from GDB. - - This file is part of GDB. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc), - as well as gratuitiously global symbol names, so we can have multiple - yacc generated parsers in gdb. Note that these are only the variables - produced by yacc. If other parser generators (bison, byacc, etc) produce - additional global names that conflict at link time, then those parser - generators need to be fixed instead of adding those names to this list. */ - -#define yymaxdepth quote_fmtmaxdepth -#define yyparse quote_fmtparse -#define yylex quote_fmtlex -#define yyerror quote_fmterror -#define yylval quote_fmtlval -#define yychar quote_fmtchar -#define yydebug quote_fmtdebug -#define yypact quote_fmtpact -#define yyr1 quote_fmtr1 -#define yyr2 quote_fmtr2 -#define yydef quote_fmtdef -#define yychk quote_fmtchk -#define yypgo quote_fmtpgo -#define yyact quote_fmtact -#define yyexca quote_fmtexca -#define yyerrflag quote_fmterrflag -#define yynerrs quote_fmtnerrs -#define yyps quote_fmtps -#define yypv quote_fmtpv -#define yys quote_fmts -#define yy_yys quote_fmtyys -#define yystate quote_fmtstate -#define yytmp quote_fmttmp -#define yyv quote_fmtv -#define yy_yyv quote_fmtyyv -#define yyval quote_fmtval -#define yylloc quote_fmtlloc -#define yyreds quote_fmtreds /* With YYDEBUG defined */ -#define yytoks quote_fmttoks /* With YYDEBUG defined */ -#define yylhs quote_fmtyylhs -#define yylen quote_fmtyylen -#define yydefred quote_fmtyydefred -#define yydgoto quote_fmtyydgoto -#define yysindex quote_fmtyysindex -#define yyrindex quote_fmtyyrindex -#define yygindex quote_fmtyygindex -#define yytable quote_fmtyytable -#define yycheck quote_fmtyycheck blob - ddc5e83d5d4065128535dd73976449867c36a4ae (mode 644) blob + /dev/null --- src/quote_fmt_lex.l +++ /dev/null @@ -1,153 +0,0 @@ -%option nounput never-interactive - -%{ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (c) 1999-2007 by Hiroyuki Yamamoto & The Claws Mail Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#include "quote_fmt_lex.h" -#include "quote_fmt_parse.h" - -%} - -%option prefix="quote_fmt" -%option outfile="lex.yy.c" - -%s S_NORMAL S_DATE - -%{ -/* - * see notes below. - */ -int quote_fmt_firsttime = 1; -int line = -1; -int escaped_string = 0; -%} - -%% - -%{ -/* - * NOTES: - * this lex script used to use characters also in use - * by strftime() (which we want to use for custom - * time formats in replies and templates). to circumvent - * this we have to play a little bit with states. - * - * these are the characters we also want to use in the - * %D time customizer: - * - * %a %A %b %B %c %C %d %H %I %j %m %M %p %S %w %x %y %Y %Z - * - * you can use these characters too, but don't forget to - * prepend them with the state. - * - * also there is also work around for resetting the state - * (firsttime variable). this assumes that yylex() will - * always return to S_NORMAL after quote fmt parsing is - * done. - */ -%} - -%{ - if (quote_fmt_firsttime) { - BEGIN S_NORMAL; - quote_fmt_firsttime = 0; - } -%} - -("%X"|"%cursor") /* cursor pos */ return SET_CURSOR_POS; -("%A"|"%email") /* email address */ return SHOW_MAIL_ADDRESS; -("%c"|"%cc") /* cc */ return SHOW_CC; -("%d"|"%date") /* date */ return SHOW_DATE; -("%D"|"%date_fmt") /* date */ { BEGIN S_DATE; return SHOW_DATE_EXPR; } -("%f"|"%from") /* from */ return SHOW_FROM; -("%F"|"%firstname") /* first name */ return SHOW_FIRST_NAME; -("%i"|"%messageid") /* message-id */ return SHOW_MESSAGEID; -("%I"|"%initials") /* initial of sender */ return SHOW_SENDER_INITIAL; -("%m"|"%msg_no_sig") /* message with no signature */ return SHOW_MESSAGE_NO_SIGNATURE; -("%M"|"%msg") /* message */ return SHOW_MESSAGE; -("%N"|"%fullname") /* full name */ return SHOW_FULLNAME; -("%L"|"%lastname") /* last name */ return SHOW_LAST_NAME; -("%r"|"%references") /* references */ return SHOW_REFERENCES; -("%s"|"%subject") /* subject */ return SHOW_SUBJECT; -("%t"|"%to") /* to */ return SHOW_TO; -("%tags") /* tags */ return SHOW_TAGS; -("%Q"|"%quoted_msg") /* quoted message */ return SHOW_QUOTED_MESSAGE; -("%q"|"%quoted_msg_no_sig") /* quoted message with no signature */ return SHOW_QUOTED_MESSAGE_NO_SIGNATURE; -("%af"|"%account_fullname") /* full name in compose account */ return SHOW_ACCOUNT_FULL_NAME; -("%am"|"%account_email") /* mail address in compose account */ return SHOW_ACCOUNT_MAIL_ADDRESS; -("%an"|"%account_name") /* compose account name itself */ return SHOW_ACCOUNT_NAME; -("%ao"|"%account_org") /* organization in compose account */ return SHOW_ACCOUNT_ORGANIZATION; -("%as"|"%account_sig") /* signature in compose account */ return SHOW_ACCOUNT_SIG; -("%asp"|"%account_sigpath") /* signature path in compose account */ return SHOW_ACCOUNT_SIGPATH; -("%ABc"|"%addrbook_cc") /* completion of 'Cc' from the address book */ return SHOW_ADDRESSBOOK_COMPLETION_FOR_CC; -("%ABf"|"%addrbook_from") /* completion of 'From' from the address book */ return SHOW_ADDRESSBOOK_COMPLETION_FOR_FROM; -("%ABt"|"%addrbook_to") /* completion of 'To' from the address book */ return SHOW_ADDRESSBOOK_COMPLETION_FOR_TO; -"\\\%" /* % */ return SHOW_PERCENT; -"\\\\" /* \ */ return SHOW_BACKSLASH; -"\\t"|"\t" /* tab */ return SHOW_TAB; -"\n" /* return */ { line++; return SHOW_EOL; } -"\\n" /* escaped return */ { if (escaped_string) line++; return SHOW_EOL; } -"\\?" /* ? */ return SHOW_QUESTION_MARK; -"\\!" return SHOW_EXCLAMATION_MARK; -"\\|" return SHOW_PIPE; -"\\{" return SHOW_OPARENT; -"\\}" return SHOW_CPARENT; -("?d"|"?date") /* query date */ return QUERY_DATE; -("?f"|"?from") /* query from */ return QUERY_FROM; -("?N"|"?F"|"?L"|"?I"|"?fullname"|"?firstname"|"?lastname"|"?initials") /* query from name */ return QUERY_FULLNAME; -("?s"|"?subject") /* query subject */ return QUERY_SUBJECT; -("?t"|"?to") /* query to */ return QUERY_TO; -("?c"|"?cc") /* query cc */ return QUERY_CC; -("?i"|"?messageid") /* query message-id */ return QUERY_MESSAGEID; -("?r"|"?references") /* query references */ return QUERY_REFERENCES; -("?af"|"?account_fullname") /* query full name in compose account */ return QUERY_ACCOUNT_FULL_NAME; -("?ao"|"?account_org") /* query organization in compose account */ return QUERY_ACCOUNT_ORGANIZATION; -("?as"|"?account_sig") /* query signature */ return QUERY_ACCOUNT_SIG; -("?asp"|"?account_sigpath") /* query signature path */ return QUERY_ACCOUNT_SIGPATH; -("?ABc"|"?addrbook_cc") /* query completion for 'Cc' in address book */ return QUERY_CC_FOUND_IN_ADDRESSBOOK; -("?ABf"|"?addrbook_from") /* query completion for 'From' in address book */ return QUERY_FROM_FOUND_IN_ADDRESSBOOK; -("?ABt"|"?addrbook_to") /* query completion for 'To' in address book */ return QUERY_TO_FOUND_IN_ADDRESSBOOK; -("!d"|"!date") /* query not(date) */ return QUERY_NOT_DATE; -("!f"|"!from") /* query not(from) */ return QUERY_NOT_FROM; -("!N"|"!F"|"!L"|"!I"|"!fullname"|"!firstname"|"!lastname"|"!initials") /* query not(from name) */ return QUERY_NOT_FULLNAME; -("!s"|"!subject") /* query not(subject) */ return QUERY_NOT_SUBJECT; -("!t"|"!to") /* query not(to) */ return QUERY_NOT_TO; -("!c"|"!cc") /* query not(cc) */ return QUERY_NOT_CC; -("!i"|"!messageid") /* query not(message-id) */ return QUERY_NOT_MESSAGEID; -("!r"|"!references") /* query not(references) */ return QUERY_NOT_REFERENCES; -("!af"|"!account_fullname") /* query not(full name in compose account) */ return QUERY_NOT_ACCOUNT_FULL_NAME; -("!ao"|"!account_org") /* query not(organization in compose account) */ return QUERY_NOT_ACCOUNT_ORGANIZATION; -("!as"|"!account_sig") /* query not(signature) */ return QUERY_NOT_ACCOUNT_SIG; -("!asp"|"!account_sigpath") /* query not(signature path) */ return QUERY_NOT_ACCOUNT_SIGPATH; -("!ABc"|"!addrbook_cc") /* query not(completion for 'Cc' in address book) */ return QUERY_NOT_CC_FOUND_IN_ADDRESSBOOK; -("!ABf"|"!addrbook_from") /* query not(completion for 'From' in address book) */ return QUERY_NOT_FROM_FOUND_IN_ADDRESSBOOK; -("!ABt"|"!addrbook_to") /* query not(completion for 'To' in address book) */ return QUERY_NOT_TO_FOUND_IN_ADDRESSBOOK; -("|f"|"|file") /* insert file */ return INSERT_FILE; -("|p"|"|program") /* insert program output */ return INSERT_PROGRAMOUTPUT; -("|i"|"|input") /* insert user input */ return INSERT_USERINPUT; -("|a"|"|attach") /* attach file */ return ATTACH_FILE; -("|A"|"|attach_program") /* file whose name's got from program output */ return ATTACH_PROGRAMOUTPUT; -"{" return OPARENT; -"}" { BEGIN S_NORMAL; return CPARENT; } -"{" return OPARENT; -"}" return CPARENT; -. { yylval.chr = yytext[0]; return CHARACTER; } - -%% blob - e2ffe9eed119b172bbbbe4de04c4958cc64c992d (mode 644) blob + /dev/null --- src/quote_fmt_parse.y +++ /dev/null @@ -1,1237 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2020 The Claws Mail Team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -%{ - -#include "defs.h" - -#include -#include - -#include - -#include "procmsg.h" -#include "procmime.h" -#include "utils.h" -#include "codeconv.h" -#include "procheader.h" -#include "addr_compl.h" -#include "gtk/inputdialog.h" - -#include "quote_fmt.h" -#include "quote_fmt_lex.h" -#include "account.h" -#include "file-utils.h" - -/* decl */ -/* -flex quote_fmt.l -bison -p quote_fmt quote_fmt.y -*/ - -int yylex(void); - -static MsgInfo *msginfo = NULL; -static PrefsAccount *account = NULL; -static gboolean *visible = NULL; -static gboolean dry_run = FALSE; -static gint maxsize = 0; -static gint stacksize = 0; -static GHashTable *var_table = NULL; -static GList *attachments = NULL; - -typedef struct st_buffer -{ - gchar *buffer; - gint bufsize; - gint bufmax; -} st_buffer; - -static struct st_buffer main_expr = { NULL, 0, 0 }; -static struct st_buffer sub_expr = { NULL, 0, 0 }; -static struct st_buffer* current = NULL; - -static const gchar *quote_str = NULL; -static const gchar *body = NULL; -static gint error = 0; - -static gint cursor_pos = -1; - -extern int quote_fmt_firsttime; -extern int line; -extern int escaped_string; - -static void add_visibility(gboolean val) -{ - stacksize++; - if (maxsize < stacksize) { - maxsize += 128; - visible = g_realloc(visible, maxsize * sizeof(gboolean)); - if (visible == NULL) - maxsize = 0; - } - if (visible != NULL) - visible[stacksize - 1] = val; -} - -static void remove_visibility(void) -{ - stacksize--; - if (stacksize < 0) { - g_warning("error: visibility stack underflow"); - stacksize = 0; - } -} - -static void add_buffer(const gchar *s) -{ - gint len; - - if (s == NULL) - return; - - len = strlen(s); - if (current->bufsize + len + 1 > current->bufmax) { - if (current->bufmax == 0) - current->bufmax = 128; - while (current->bufsize + len + 1 > current->bufmax) - current->bufmax *= 2; - current->buffer = g_realloc(current->buffer, current->bufmax); - } - strcpy(current->buffer + current->bufsize, s); - current->bufsize += len; -} - -static void clear_buffer(void) -{ - if (current->buffer) - *current->buffer = '\0'; - else - /* force to an empty string, as buffer should not be left unallocated */ - add_buffer(""); - current->bufsize = 0; -} - -gchar *quote_fmt_get_buffer(void) -{ - if (current != &main_expr) - g_warning("error: parser still in sub-expr mode"); - - if (error != 0) - return NULL; - else - return current->buffer; -} - -GList *quote_fmt_get_attachments_list(void) -{ - return attachments; -} - -gint quote_fmt_get_line(void) -{ - return line; -} - -gint quote_fmt_get_cursor_pos(void) -{ - return cursor_pos; -} - -#define INSERT(buf) \ - if (stacksize != 0 && visible[stacksize - 1])\ - add_buffer(buf); \ - -#define INSERT_CHARACTER(chr) \ - if (stacksize != 0 && visible[stacksize - 1]) { \ - gchar tmp[2]; \ - tmp[0] = (chr); \ - tmp[1] = '\0'; \ - add_buffer(tmp); \ - } - -void quote_fmt_reset_vartable(void) -{ - if (var_table) { - g_hash_table_destroy(var_table); - var_table = NULL; - } - if (attachments) { - GList *cur = attachments; - while (cur) { - g_free(cur->data); - cur = g_list_next(cur); - } - g_list_free(attachments); - attachments = NULL; - } -} - - -void quote_fmt_init(MsgInfo *info, const gchar *my_quote_str, - const gchar *my_body, gboolean my_dry_run, - PrefsAccount *compose_account, - gboolean string_is_escaped) -{ - quote_str = my_quote_str; - body = my_body; - msginfo = info; - account = compose_account; - dry_run = my_dry_run; - stacksize = 0; - add_visibility(TRUE); - main_expr.bufmax = 0; - sub_expr.bufmax = 0; - current = &main_expr; - clear_buffer(); - error = 0; - line = 1; - escaped_string = string_is_escaped; - - if (!var_table) - var_table = g_hash_table_new_full(g_str_hash, g_str_equal, - g_free, g_free); - - /* - * force LEX initialization - */ - quote_fmt_firsttime = 1; - cursor_pos = -1; -} - -void quote_fmterror(char *str) -{ - g_warning("error: %s at line %d", str, line); - error = 1; -} - -int quote_fmtwrap(void) -{ - return 1; -} - -static int isseparator(int ch) -{ - return g_ascii_isspace(ch) || ch == '.' || ch == '-'; -} - -/* - * Search for glibc extended strftime timezone specs within haystack. - * If not found NULL is returned and the integer pointed by tzspeclen is - * not changed. - * If found a pointer to the start of the specification within haystack - * is returned and the integer pointed by tzspeclen is set to the lenght - * of specification. - */ -static const char* strtzspec(const char *haystack, int *tzspeclen) -{ - const char *p = NULL; - const char *q = NULL; - const char *r = NULL; - - p = strstr(haystack, "%"); - while (p != NULL) { - q = p + 1; - if (!*q) return NULL; - r = strchr("_-0^#", *q); /* skip flags */ - if (r != NULL) { - ++q; - if (!*q) return NULL; - } - while (*q >= '0' && *q <= '9') ++q; /* skip width */ - if (!*q) return NULL; - if (*q == 'z' || *q == 'Z') { /* numeric or name */ - *tzspeclen = 1 + (q - p); - return p; - } - p = strstr(q, "%"); - } - return NULL; -} - -static void quote_fmt_show_date(const MsgInfo *msginfo, const gchar *format) -{ - char result[100]; - char *rptr; - char zone[6]; - struct tm lt; - const char *fptr; - const char *zptr; - - if (!msginfo->date) - return; - - /* - * ALF - GNU C's strftime() has a nice format specifier - * for time zone offset (%z). Non-standard however, so - * emulate it. - */ - -#define RLEFT (sizeof result) - (rptr - result) - - zone[0] = 0; - result[0] = '\0'; - - if (procheader_date_parse_to_tm(msginfo->date, <, zone)) { - /* - * break up format string in tiny bits delimited by valid %z's and - * feed it to strftime(). don't forget that '%%z' mean literal '%z'. - */ - for (rptr = result, fptr = format; fptr && *fptr && rptr < &result[sizeof result - 1];) { - int perc, zlen; - const char *p; - char *tmp; - - if (NULL != (zptr = strtzspec(fptr, &zlen))) { - /* - * count nr. of prepended percent chars - */ - for (perc = 0, p = zptr; p && p >= format && *p == '%'; p--, perc++) - ; - /* - * feed to strftime() - */ - tmp = g_strndup(fptr, zptr - fptr + (perc % 2 ? 0 : zlen)); - if (tmp) { - rptr += strftime(rptr, RLEFT, tmp, <); - g_free(tmp); - } - /* - * append time zone offset - */ - if (zone[0] && perc % 2) - rptr += g_snprintf(rptr, RLEFT, "%s", zone); - fptr = zptr + zlen; - } else { - rptr += strftime(rptr, RLEFT, fptr, <); - fptr = NULL; - } - } - - if (g_utf8_validate(result, -1, NULL)) { - INSERT(result); - } else { - gchar *utf = conv_codeset_strdup(result, - conv_get_locale_charset_str_no_utf8(), - CS_INTERNAL); - if (utf == NULL || - !g_utf8_validate(utf, -1, NULL)) { - g_free(utf); - utf = g_malloc(strlen(result)*2+1); - conv_localetodisp(utf, - strlen(result)*2+1, result); - } - if (g_utf8_validate(utf, -1, NULL)) { - INSERT(utf); - } - g_free(utf); - } - } -#undef RLEFT -} - -static void quote_fmt_show_first_name(const MsgInfo *msginfo) -{ - guchar *p; - gchar *str; - - if (!msginfo->fromname) - return; - - p = (guchar*)strchr(msginfo->fromname, ','); - if (p != NULL) { - /* fromname is like "Duck, Donald" */ - p++; - while (*p && isspace(*p)) p++; - str = alloca(strlen((char *)p) + 1); - if (str != NULL) { - strcpy(str, (char *)p); - INSERT(str); - } - } else { - /* fromname is like "Donald Duck" */ - str = alloca(strlen(msginfo->fromname) + 1); - if (str != NULL) { - strcpy(str, msginfo->fromname); - p = (guchar *)str; - while (*p && !isspace(*p)) p++; - *p = '\0'; - INSERT(str); - } - } -} - -static void quote_fmt_show_last_name(const MsgInfo *msginfo) -{ - gchar *p; - gchar *str; - - /* This probably won't work together very well with Middle - names and the like - thth */ - if (!msginfo->fromname) - return; - - str = alloca(strlen(msginfo->fromname) + 1); - if (str != NULL) { - strcpy(str, msginfo->fromname); - p = strchr(str, ','); - if (p != NULL) { - /* fromname is like "Duck, Donald" */ - *p = '\0'; - INSERT(str); - } else { - /* fromname is like "Donald Duck" */ - p = str; - while (*p && !isspace(*p)) p++; - if (*p) { - /* We found a space. Get first - none-space char and insert - rest of string from there. */ - while (*p && isspace(*p)) p++; - if (*p) { - INSERT(p); - } else { - /* If there is no none-space - char, just insert whole - fromname. */ - INSERT(str); - } - } else { - /* If there is no space, just - insert whole fromname. */ - INSERT(str); - } - } - } -} - -static void quote_fmt_show_sender_initial(const MsgInfo *msginfo) -{ -#define MAX_SENDER_INITIAL 20 - gchar tmp[MAX_SENDER_INITIAL]; - guchar *p; - gchar *cur; - gint len = 0; - - if (!msginfo->fromname) - return; - - p = (guchar *)msginfo->fromname; - cur = tmp; - while (*p) { - if (*p && g_utf8_validate((gchar *)p, 1, NULL)) { - *cur = toupper(*p); - cur++; - len++; - if (len >= MAX_SENDER_INITIAL - 1) - break; - } else - break; - while (*p && !isseparator(*p)) p++; - while (*p && isseparator(*p)) p++; - } - *cur = '\0'; - INSERT(tmp); -} - -static void quote_fmt_show_msg(MsgInfo *msginfo, const gchar *body, - gboolean quoted, gboolean signature, - const gchar *quote_str) -{ - gchar buf[BUFFSIZE]; - FILE *fp; - - if (!(msginfo->folder || body)) - return; - - if (body) - fp = str_open_as_stream(body); - else { - if (MSG_IS_ENCRYPTED(msginfo->flags)) - fp = procmime_get_first_encrypted_text_content(msginfo); - else - fp = procmime_get_first_text_content(msginfo); - } - - if (fp == NULL) - g_warning("can't get text part"); - else { - account_sigsep_matchlist_create(); - while (fgets(buf, sizeof(buf), fp) != NULL) { - strcrchomp(buf); - - if (!signature && account_sigsep_matchlist_nchar_found(buf, "%s\n")) - break; - - if (quoted && quote_str) - INSERT(quote_str); - - INSERT(buf); - } - account_sigsep_matchlist_delete(); - fclose(fp); - } -} - -static void quote_fmt_insert_file(const gchar *filename) -{ - FILE *file; - char buffer[PATH_MAX]; - - if ((file = g_fopen(filename, "rb")) != NULL) { - while (fgets(buffer, sizeof(buffer), file)) { - INSERT(buffer); - } - fclose(file); - } - -} - -static void quote_fmt_insert_program_output(const gchar *progname) -{ - FILE *file; - char buffer[BUFFSIZE]; - - if ((file = get_command_output_stream(progname)) != NULL) { - while (fgets(buffer, sizeof(buffer), file)) { - INSERT(buffer); - } - fclose(file); - } -} - -static void quote_fmt_insert_user_input(const gchar *varname) -{ - gchar *buf = NULL; - gchar *text = NULL; - - if (dry_run) - return; - - if ((text = g_hash_table_lookup(var_table, varname)) == NULL) { - buf = g_strdup_printf(_("Enter text to replace '%s'"), varname); - text = input_dialog(_("Enter variable"), buf, ""); - g_free(buf); - if (!text) - return; - g_hash_table_insert(var_table, g_strdup(varname), g_strdup(text)); - } else { - /* don't free the one in hashtable at the end */ - text = g_strdup(text); - } - - if (!text) - return; - INSERT(text); - g_free(text); -} - -static void quote_fmt_attach_file(const gchar *filename) -{ - attachments = g_list_append(attachments, g_strdup(filename)); -} - -static void quote_fmt_attach_file_program_output(const gchar *progname) -{ - FILE *file; - char buffer[BUFFSIZE]; - - if ((file = get_command_output_stream(progname)) != NULL) { - /* get first line only */ - if (fgets(buffer, sizeof(buffer), file)) { - /* trim trailing CR/LF */ - strretchomp(buffer); - attachments = g_list_append(attachments, g_strdup(buffer)); - } - fclose(file); - } -} - -static gchar *quote_fmt_complete_address(const gchar *addr) -{ - gint count; - gchar *res, *tmp, *email_addr; - gchar **split; - - debug_print("quote_fmt_complete_address: %s\n", addr); - if (addr == NULL) - return NULL; - - /* if addr is a list of message, try the 1st element only */ - split = g_strsplit(addr, ",", -1); - if (!split || !split[0] || *split[0] == '\0') { - g_strfreev(split); - return NULL; - } - - Xstrdup_a(email_addr, split[0], { - g_strfreev(split); - return NULL; - }); - extract_address(email_addr); - if (!*email_addr) { - g_strfreev(split); - return NULL; - } - - res = NULL; - start_address_completion(NULL); - if (1 < (count = complete_address(email_addr))) { - tmp = get_complete_address(1); - res = procheader_get_fromname(tmp); - g_free(tmp); - } - end_address_completion(); - g_strfreev(split); - - debug_print("quote_fmt_complete_address: matched %s\n", res); - return res; -} - -%} - -%union { - char chr; - char str[256]; -} - -/* tokens SHOW */ -%token SHOW_NEWSGROUPS -%token SHOW_DATE SHOW_FROM SHOW_FULLNAME SHOW_FIRST_NAME SHOW_LAST_NAME -%token SHOW_SENDER_INITIAL SHOW_SUBJECT SHOW_TO SHOW_MESSAGEID -%token SHOW_PERCENT SHOW_CC SHOW_REFERENCES SHOW_MESSAGE -%token SHOW_QUOTED_MESSAGE SHOW_BACKSLASH SHOW_TAB SHOW_MAIL_ADDRESS -%token SHOW_QUOTED_MESSAGE_NO_SIGNATURE SHOW_MESSAGE_NO_SIGNATURE -%token SHOW_EOL SHOW_QUESTION_MARK SHOW_EXCLAMATION_MARK SHOW_PIPE SHOW_OPARENT SHOW_CPARENT -%token SHOW_ACCOUNT_FULL_NAME SHOW_ACCOUNT_MAIL_ADDRESS SHOW_ACCOUNT_NAME SHOW_ACCOUNT_ORGANIZATION -%token SHOW_ACCOUNT_SIG SHOW_ACCOUNT_SIGPATH -%token SHOW_TAGS -%token SHOW_ADDRESSBOOK_COMPLETION_FOR_CC -%token SHOW_ADDRESSBOOK_COMPLETION_FOR_FROM -%token SHOW_ADDRESSBOOK_COMPLETION_FOR_TO -/* tokens QUERY */ -%token QUERY_DATE QUERY_FROM -%token QUERY_FULLNAME QUERY_SUBJECT QUERY_TO QUERY_NEWSGROUPS -%token QUERY_MESSAGEID QUERY_CC QUERY_REFERENCES -%token QUERY_ACCOUNT_FULL_NAME QUERY_ACCOUNT_ORGANIZATION -%token QUERY_ACCOUNT_SIG QUERY_ACCOUNT_SIGPATH -%token QUERY_CC_FOUND_IN_ADDRESSBOOK -%token QUERY_FROM_FOUND_IN_ADDRESSBOOK -%token QUERY_TO_FOUND_IN_ADDRESSBOOK -/* tokens QUERY_NOT */ -%token QUERY_NOT_DATE QUERY_NOT_FROM -%token QUERY_NOT_FULLNAME QUERY_NOT_SUBJECT QUERY_NOT_TO QUERY_NOT_NEWSGROUPS -%token QUERY_NOT_MESSAGEID QUERY_NOT_CC QUERY_NOT_REFERENCES -%token QUERY_NOT_ACCOUNT_FULL_NAME QUERY_NOT_ACCOUNT_ORGANIZATION -%token QUERY_NOT_ACCOUNT_SIG QUERY_NOT_ACCOUNT_SIGPATH -%token QUERY_NOT_CC_FOUND_IN_ADDRESSBOOK -%token QUERY_NOT_FROM_FOUND_IN_ADDRESSBOOK -%token QUERY_NOT_TO_FOUND_IN_ADDRESSBOOK -/* other tokens */ -%token INSERT_FILE INSERT_PROGRAMOUTPUT INSERT_USERINPUT -%token ATTACH_FILE ATTACH_PROGRAMOUTPUT -%token OPARENT CPARENT -%token CHARACTER -%token SHOW_DATE_EXPR -%token SET_CURSOR_POS - -%start quote_fmt - -%type CHARACTER -%type character -%type string - -%% - -quote_fmt: - character_or_special_or_insert_or_query_list ; - -sub_expr: - character_or_special_list ; - -character_or_special_or_insert_or_query_list: - character_or_special_or_insert_or_query character_or_special_or_insert_or_query_list - | character_or_special_or_insert_or_query ; - -character_or_special_list: - character_or_special character_or_special_list - | character_or_special ; - -character_or_special_or_insert_or_query: - character_or_special - | query - | query_not - | insert - | attach ; - -character_or_special: - special - | character - { - INSERT_CHARACTER($1); - }; - -character: - CHARACTER - ; - -string: - CHARACTER - { - $$[0] = $1; - $$[1] = '\0'; - } - | string CHARACTER - { - size_t len; - - strncpy($$, $1, sizeof($$)); - $$[sizeof($$) - 1] = '\0'; - len = strlen($$); - if (len + 1 < sizeof($$)) { - $$[len + 1] = '\0'; - $$[len] = $2; - } - }; - -special: - SHOW_DATE_EXPR OPARENT string CPARENT - { - quote_fmt_show_date(msginfo, $3); - } - | SHOW_DATE - { - if (msginfo->date) - INSERT(msginfo->date); - } - | SHOW_FROM - { - if (msginfo->from) - INSERT(msginfo->from); - } - | SHOW_MAIL_ADDRESS - { - if (msginfo->from) { - gchar *stripped_address = g_strdup(msginfo->from); - extract_address(stripped_address); - INSERT(stripped_address); - g_free(stripped_address); - } - } - | SHOW_FULLNAME - { - if (msginfo->fromname) - INSERT(msginfo->fromname); - } - | SHOW_FIRST_NAME - { - quote_fmt_show_first_name(msginfo); - } - | SHOW_LAST_NAME - { - quote_fmt_show_last_name(msginfo); - } - | SHOW_SENDER_INITIAL - { - quote_fmt_show_sender_initial(msginfo); - } - | SHOW_SUBJECT - { - if (msginfo->subject) - INSERT(msginfo->subject); - } - | SHOW_TO - { - if (msginfo->to) - INSERT(msginfo->to); - } - | SHOW_MESSAGEID - { - if (msginfo->msgid) - INSERT(msginfo->msgid); - } - | SHOW_PERCENT - { - INSERT("%"); - } - | SHOW_CC - { - if (msginfo->cc) - INSERT(msginfo->cc); - } - | SHOW_REFERENCES - { - GSList *item; - - INSERT(msginfo->inreplyto); - for (item = msginfo->references; item != NULL; item = g_slist_next(item)) - if (item->data) - INSERT(item->data); - } - | SHOW_MESSAGE - { - quote_fmt_show_msg(msginfo, body, FALSE, TRUE, quote_str); - } - | SHOW_QUOTED_MESSAGE - { - quote_fmt_show_msg(msginfo, body, TRUE, TRUE, quote_str); - } - | SHOW_MESSAGE_NO_SIGNATURE - { - quote_fmt_show_msg(msginfo, body, FALSE, FALSE, quote_str); - } - | SHOW_QUOTED_MESSAGE_NO_SIGNATURE - { - quote_fmt_show_msg(msginfo, body, TRUE, FALSE, quote_str); - } - | SHOW_ACCOUNT_FULL_NAME - { - if (account && account->name) - INSERT(account->name); - } - | SHOW_ACCOUNT_MAIL_ADDRESS - { - if (account && account->address) - INSERT(account->address); - } - | SHOW_ACCOUNT_NAME - { - if (account && account->account_name) - INSERT(account->account_name); - } - | SHOW_ACCOUNT_ORGANIZATION - { - if (account && account->organization) - INSERT(account->organization); - } - | SHOW_ACCOUNT_SIG - { - gchar *str = account_get_signature_str(account); - INSERT(str); - g_free(str); - } - | SHOW_ACCOUNT_SIGPATH - { - if (account && account->sig_path) - INSERT(account->sig_path); - } - | SHOW_BACKSLASH - { - INSERT("\\"); - } - | SHOW_TAB - { - INSERT("\t"); - } - | SHOW_EOL - { - INSERT("\n"); - } - | SHOW_QUESTION_MARK - { - INSERT("?"); - } - | SHOW_EXCLAMATION_MARK - { - INSERT("!"); - } - | SHOW_PIPE - { - INSERT("|"); - } - | SHOW_OPARENT - { - INSERT("{"); - } - | SHOW_CPARENT - { - INSERT("}"); - } - | SET_CURSOR_POS - { - if (current->buffer) - cursor_pos = g_utf8_strlen(current->buffer, -1); - else - cursor_pos = 0; - } - | SHOW_ADDRESSBOOK_COMPLETION_FOR_CC - { - gchar *tmp = quote_fmt_complete_address(msginfo->cc); - if (tmp) { - INSERT(tmp); - g_free(tmp); - } - } - | SHOW_ADDRESSBOOK_COMPLETION_FOR_FROM - { - gchar *tmp = quote_fmt_complete_address(msginfo->from); - if (tmp) { - INSERT(tmp); - g_free(tmp); - } - } - | SHOW_ADDRESSBOOK_COMPLETION_FOR_TO - { - gchar *tmp = quote_fmt_complete_address(msginfo->to); - if (tmp) { - INSERT(tmp); - g_free(tmp); - } - }; - -query: - QUERY_DATE - { - add_visibility(msginfo->date != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_FROM - { - add_visibility(msginfo->from != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_FULLNAME - { - add_visibility(msginfo->fromname != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_SUBJECT - { - add_visibility(msginfo->subject != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_TO - { - add_visibility(msginfo->to != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_MESSAGEID - { - add_visibility(msginfo->msgid != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_CC - { - add_visibility(msginfo->cc != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_REFERENCES - { - gboolean found; - GSList *item; - - found = (msginfo->inreplyto != NULL); - for (item = msginfo->references; found == FALSE && item != NULL; item = g_slist_next(item)) - if (item->data) - found = TRUE; - add_visibility(found == TRUE); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_ACCOUNT_FULL_NAME - { - add_visibility(account != NULL && account->name != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_ACCOUNT_ORGANIZATION - { - add_visibility(account != NULL && account->organization != NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_ACCOUNT_SIG - { - gchar *str = account_get_signature_str(account); - add_visibility(str != NULL && * str != '\0'); - g_free(str); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_ACCOUNT_SIGPATH - { - add_visibility(account != NULL && account->sig_path != NULL - && *account->sig_path != '\0'); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_CC_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->cc); - add_visibility(tmp != NULL && *tmp != '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_FROM_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->from); - add_visibility(tmp != NULL && *tmp != '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_TO_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->to); - add_visibility(tmp != NULL && *tmp != '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - }; - -query_not: - QUERY_NOT_DATE - { - add_visibility(msginfo->date == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_FROM - { - add_visibility(msginfo->from == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_FULLNAME - { - add_visibility(msginfo->fromname == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_SUBJECT - { - add_visibility(msginfo->subject == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_TO - { - add_visibility(msginfo->to == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_MESSAGEID - { - add_visibility(msginfo->msgid == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_CC - { - add_visibility(msginfo->cc == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_REFERENCES - { - gboolean found; - GSList *item; - - found = (msginfo->inreplyto != NULL); - for (item = msginfo->references; found == FALSE && item != NULL; item = g_slist_next(item)) - if (item->data) - found = TRUE; - add_visibility(found == FALSE); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_ACCOUNT_FULL_NAME - { - add_visibility(account == NULL || account->name == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_ACCOUNT_ORGANIZATION - { - add_visibility(account == NULL || account->organization == NULL); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_ACCOUNT_SIG - { - gchar *str = account_get_signature_str(account); - add_visibility(str == NULL || *str == '\0'); - g_free(str); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_ACCOUNT_SIGPATH - { - add_visibility(account == NULL || account->sig_path == NULL - || *account->sig_path == '\0'); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_CC_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->cc); - add_visibility(tmp == NULL || *tmp == '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_FROM_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->from); - add_visibility(tmp == NULL || *tmp == '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - } - | QUERY_NOT_TO_FOUND_IN_ADDRESSBOOK - { - gchar *tmp = quote_fmt_complete_address(msginfo->to); - add_visibility(tmp == NULL || *tmp == '\0'); - g_free(tmp); - } - OPARENT quote_fmt CPARENT - { - remove_visibility(); - }; - -insert: - INSERT_FILE - { - current = &sub_expr; - clear_buffer(); - } - OPARENT sub_expr CPARENT - { - current = &main_expr; - if (!dry_run) { - quote_fmt_insert_file(sub_expr.buffer); - } - } - | INSERT_PROGRAMOUTPUT - { - current = &sub_expr; - clear_buffer(); - } - OPARENT sub_expr CPARENT - { - current = &main_expr; - if (!dry_run) { - quote_fmt_insert_program_output(sub_expr.buffer); - } - } - | INSERT_USERINPUT - { - current = &sub_expr; - clear_buffer(); - } - OPARENT sub_expr CPARENT - { - current = &main_expr; - if (!dry_run) { - quote_fmt_insert_user_input(sub_expr.buffer); - } - }; - -attach: - ATTACH_FILE - { - current = &sub_expr; - clear_buffer(); - } - OPARENT sub_expr CPARENT - { - current = &main_expr; - if (!dry_run) { - quote_fmt_attach_file(sub_expr.buffer); - } - } - | ATTACH_PROGRAMOUTPUT - { - current = &sub_expr; - clear_buffer(); - } - OPARENT sub_expr CPARENT - { - current = &main_expr; - if (!dry_run) { - quote_fmt_attach_file_program_output(sub_expr.buffer); - } - }; -; blob - 139bd6dd9c8af68db49e2aaf70c2d1a4f4955e24 blob + 222b026d586c0c974a07cad70c8ea44b542a9864 --- src/send_message.c +++ src/send_message.c @@ -53,9 +53,7 @@ #include "inc.h" #include "log.h" #include "passwordstore.h" -#ifdef USE_OAUTH2 #include "oauth2.h" -#endif typedef struct _SendProgressDialog SendProgressDialog; @@ -263,7 +261,6 @@ gint send_message_smtp_full(PrefsAccount *ac_prefs, GS smtp_session->hostname = NULL; } -#ifdef USE_GNUTLS port = ac_prefs->set_smtpport ? ac_prefs->smtpport : ac_prefs->ssl_smtp == SSL_TUNNEL ? SSMTP_PORT : SMTP_PORT; session->ssl_type = ac_prefs->ssl_smtp; @@ -273,27 +270,8 @@ gint send_message_smtp_full(PrefsAccount *ac_prefs, GS strlen(ac_prefs->gnutls_priority)) session->gnutls_priority = g_strdup(ac_prefs->gnutls_priority); session->use_tls_sni = ac_prefs->use_tls_sni; -#ifdef USE_OAUTH2 if (ac_prefs->use_smtp_auth && ac_prefs->smtp_auth_type == SMTPAUTH_OAUTH2) oauth2_check_passwds(ac_prefs); -#endif -#else - if (ac_prefs->ssl_smtp != SSL_NONE) { - if (alertpanel_full(_("Insecure connection"), - _("This connection is configured to be secured " - "using TLS, but TLS is not available " - "in this build of Claws Mail. \n\n" - "Do you want to continue connecting to this " - "server? The communication would not be " - "secure."), - NULL, _("_Cancel"), NULL, _("Con_tinue connecting"), - NULL, NULL, ALERTFOCUS_FIRST, FALSE, NULL, ALERT_WARNING) != G_ALERTALTERNATE) { - session_destroy(session); - return -1; - } - } - port = ac_prefs->set_smtpport ? ac_prefs->smtpport : SMTP_PORT; -#endif if (ac_prefs->use_smtp_auth) { smtp_session->forced_auth_type = ac_prefs->smtp_auth_type; blob - 926e8eb0d0130928924c4ada9eecc7f12646a28a blob + d66574df0bc87374ac29c91d661d8f32fc2725d1 --- src/send_message.h +++ src/send_message.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . - * + * */ #ifndef __SEND_MESSAGE_H__ @@ -25,9 +25,7 @@ #include "prefs_account.h" #define SMTP_PORT 25 -#ifdef USE_GNUTLS #define SSMTP_PORT 465 -#endif gint send_message (const gchar *file, PrefsAccount *ac_prefs, blob - 5b946afef895470ee6d134e4cf9560c29f6e24a5 blob + d94dd8d83e420a36e2da9576cd27e420a25adee4 --- src/sourcewindow.c +++ src/sourcewindow.c @@ -17,7 +17,6 @@ * */ -#include "config.h" #include "defs.h" #include blob - 67cde88183be4e97a90802f8421298679c298022 blob + 26d17c0cfbaf70b83355a94943312fdc4388ab27 --- src/sourcewindow.h +++ src/sourcewindow.h @@ -32,7 +32,7 @@ struct _SourceWindow GtkWidget *window; GtkWidget *scrolledwin; GtkWidget *text; - + gboolean updating; gboolean deferred_destroy; }; blob - 1f3e722e453b12d890cda5de7cd263f24d2994c0 blob + f0ba1d33447d015b543f34c36900b12172a791da --- src/stock_pixmap.c +++ src/stock_pixmap.c @@ -16,11 +16,6 @@ * along with this program. If not, see . */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#include "claws-features.h" -#endif - #include #include #include @@ -642,17 +637,6 @@ static void stock_pixmap_find_themes_in_dir(GList **li g_dir_close(dp); } -gchar *stock_pixmap_get_system_theme_dir_for_theme(const gchar *theme) -{ - if (theme && *theme) { - return g_strconcat(PACKAGE_DATA_DIR, G_DIR_SEPARATOR_S, - PIXMAP_THEME_DIR, G_DIR_SEPARATOR_S, theme, NULL); - } else { - return g_strconcat(PACKAGE_DATA_DIR, G_DIR_SEPARATOR_S, - PIXMAP_THEME_DIR, NULL); - } -} - GList *stock_pixmap_themes_list_new(void) { gchar *defaulttheme; @@ -661,17 +645,7 @@ GList *stock_pixmap_themes_list_new(void) GList *list = NULL; defaulttheme = g_strdup(DEFAULT_PIXMAP_THEME); - userthemes = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, - PIXMAP_THEME_DIR, NULL); - systemthemes = stock_pixmap_get_system_theme_dir_for_theme(NULL); - - list = g_list_append(list, defaulttheme); - stock_pixmap_find_themes_in_dir(&list, userthemes); - stock_pixmap_find_themes_in_dir(&list, systemthemes); - - g_free(userthemes); - g_free(systemthemes); - return list; + return g_list_append(list, defaulttheme); } void stock_pixmap_themes_list_free(GList *list) blob - 78b1af404cb560b58ccb42e5034f0d6759c9c553 (mode 644) blob + /dev/null --- src/summary_search.c +++ /dev/null @@ -1,1097 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2025 the Claws Mail team and Hiroyuki Yamamoto - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#include "claws-features.h" -#endif - -#include "defs.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "main.h" -#include "summary_search.h" -#include "summaryview.h" -#include "messageview.h" -#include "mainwindow.h" -#include "menu.h" -#include "utils.h" -#include "gtkutils.h" -#include "combobox.h" -#include "prefs_gtk.h" -#include "manage_window.h" -#include "alertpanel.h" -#include "advsearch.h" -#include "matcher.h" -#include "matcher_parser.h" -#include "prefs_matcher.h" -#include "manual.h" -#include "prefs_common.h" -#include "statusbar.h" - -static struct SummarySearchWindow { - GtkWidget *window; - - GtkWidget *bool_optmenu; - - GtkWidget *from_label; - GtkWidget *from_entry; - GtkWidget *to_label; - GtkWidget *to_entry; - GtkWidget *subject_label; - GtkWidget *subject_entry; - GtkWidget *body_label; - GtkWidget *body_entry; - - GtkWidget *adv_condition_label; - GtkWidget *adv_condition_entry; - GtkWidget *adv_condition_btn; - GtkWidget *adv_search_checkbtn; - - GtkWidget *case_checkbtn; - - GtkWidget *clear_btn; - GtkWidget *help_btn; - GtkWidget *all_btn; - GtkWidget *prev_btn; - GtkWidget *next_btn; - GtkWidget *close_btn; - GtkWidget *stop_btn; - - SummaryView *summaryview; - - AdvancedSearch *advsearch; - gboolean is_fast; - gboolean matcher_is_outdated; - gboolean search_in_progress; - GHashTable *matched_msgnums; - - gboolean is_searching; - gboolean from_entry_has_focus; - gboolean to_entry_has_focus; - gboolean subject_entry_has_focus; - gboolean body_entry_has_focus; - gboolean adv_condition_entry_has_focus; -} search_window; - -static gchar* add_history_get(GtkWidget *from, GList **history); - -static void summary_search_create (void); - -static gboolean summary_search_verify_match (MsgInfo *msg); -static gboolean summary_search_prepare_matcher (); -static gboolean summary_search_prereduce_msg_list (); - -static void summary_search_execute (gboolean backward, - gboolean search_all); - -static void summary_search_clear (GtkButton *button, - gpointer data); -static void summary_search_prev_clicked (GtkButton *button, - gpointer data); -static void summary_search_next_clicked (GtkButton *button, - gpointer data); -static void summary_search_all_clicked (GtkButton *button, - gpointer data); -static void summary_search_stop_clicked (GtkButton *button, - gpointer data); -static void adv_condition_btn_clicked (GtkButton *button, - gpointer data); - -static void optmenu_changed (GtkComboBox *widget, gpointer user_data); -static void from_changed (void); -static void to_changed (void); -static void subject_changed (void); -static void body_changed (void); -static void adv_condition_changed (void); -static void case_changed (GtkToggleButton *togglebutton, gpointer user_data); - -static gboolean from_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean from_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean to_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean to_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean subject_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean subject_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean body_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean body_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean adv_condition_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean adv_condition_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data); -static gboolean key_pressed (GtkWidget *widget, - GdkEventKey *event, - gpointer data); - -#define GTK_BUTTON_SET_SENSITIVE(widget,sensitive) { \ - gtk_widget_set_sensitive(widget, sensitive); \ -} - -static gchar* add_history_get(GtkWidget *from, GList **history) -{ - gchar *result; - - result = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(from)); - if (!result) - result = gtk_editable_get_chars(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(from))), 0, -1); - - if (result && result[0] != '\0') { - /* add to history */ - combobox_unset_popdown_strings(GTK_COMBO_BOX_TEXT(from)); - *history = add_history(*history, result); - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(from), *history); - - return result; - } else { - g_free(result); - return NULL; - } -} - -void summary_search(SummaryView *summaryview) -{ - if (!search_window.window) { - summary_search_create(); - } else { - gtk_widget_hide(search_window.window); - } - - search_window.summaryview = summaryview; - - gtk_widget_grab_focus(search_window.next_btn); - gtk_widget_grab_focus(search_window.subject_entry); - gtk_widget_show(search_window.window); -} - -static void summary_show_stop_button(void) -{ - gtk_widget_hide(search_window.close_btn); - gtk_widget_show(search_window.stop_btn); - GTK_BUTTON_SET_SENSITIVE(search_window.clear_btn, FALSE) - GTK_BUTTON_SET_SENSITIVE(search_window.all_btn, FALSE) - GTK_BUTTON_SET_SENSITIVE(search_window.prev_btn, FALSE) - GTK_BUTTON_SET_SENSITIVE(search_window.next_btn, FALSE) - gtk_widget_set_sensitive(search_window.adv_condition_label, FALSE); - gtk_widget_set_sensitive(search_window.adv_condition_entry, FALSE); - gtk_widget_set_sensitive(search_window.adv_condition_btn, FALSE); - gtk_widget_set_sensitive(search_window.to_label, FALSE); - gtk_widget_set_sensitive(search_window.to_entry, FALSE); - gtk_widget_set_sensitive(search_window.from_label, FALSE); - gtk_widget_set_sensitive(search_window.from_entry, FALSE); - gtk_widget_set_sensitive(search_window.subject_label, FALSE); - gtk_widget_set_sensitive(search_window.subject_entry, FALSE); - gtk_widget_set_sensitive(search_window.body_label, FALSE); - gtk_widget_set_sensitive(search_window.body_entry, FALSE); - gtk_widget_set_sensitive(search_window.bool_optmenu, FALSE); - gtk_widget_set_sensitive(search_window.clear_btn, FALSE); - gtk_widget_set_sensitive(search_window.case_checkbtn, FALSE); - gtk_widget_set_sensitive(search_window.adv_search_checkbtn, FALSE); -} - -static void summary_hide_stop_button(void) -{ - GTK_BUTTON_SET_SENSITIVE(search_window.clear_btn, TRUE) - gtk_widget_hide(search_window.stop_btn); - gtk_widget_show(search_window.close_btn); - if (gtk_toggle_button_get_active - (GTK_TOGGLE_BUTTON(search_window.adv_search_checkbtn))) { - gtk_widget_set_sensitive(search_window.adv_condition_label, TRUE); - gtk_widget_set_sensitive(search_window.adv_condition_entry, TRUE); - gtk_widget_set_sensitive(search_window.adv_condition_btn, TRUE); - gtk_widget_set_sensitive(search_window.case_checkbtn, FALSE); - gtk_widget_set_sensitive(search_window.bool_optmenu, FALSE); - } else { - gtk_widget_set_sensitive(search_window.to_label, TRUE); - gtk_widget_set_sensitive(search_window.to_entry, TRUE); - gtk_widget_set_sensitive(search_window.from_label, TRUE); - gtk_widget_set_sensitive(search_window.from_entry, TRUE); - gtk_widget_set_sensitive(search_window.subject_label, TRUE); - gtk_widget_set_sensitive(search_window.subject_entry, TRUE); - gtk_widget_set_sensitive(search_window.body_label, TRUE); - gtk_widget_set_sensitive(search_window.body_entry, TRUE); - gtk_widget_set_sensitive(search_window.case_checkbtn, TRUE); - gtk_widget_set_sensitive(search_window.bool_optmenu, TRUE); - } - gtk_widget_set_sensitive(search_window.clear_btn, TRUE); - gtk_widget_set_sensitive(search_window.all_btn, TRUE); - gtk_widget_set_sensitive(search_window.prev_btn, TRUE); - gtk_widget_set_sensitive(search_window.next_btn, TRUE); - gtk_widget_set_sensitive(search_window.adv_search_checkbtn, TRUE); -} - -static void summary_search_create(void) -{ - GtkWidget *window; - GtkWidget *vbox1; - GtkWidget *bool_hbox; - GtkWidget *bool_optmenu; - GtkListStore *menu; - GtkTreeIter iter; - GtkWidget *clear_btn; - - GtkWidget *table1; - GtkWidget *from_label; - GtkWidget *from_entry; - GtkWidget *to_label; - GtkWidget *to_entry; - GtkWidget *subject_label; - GtkWidget *subject_entry; - GtkWidget *body_label; - GtkWidget *body_entry; - GtkWidget *adv_condition_label; - GtkWidget *adv_condition_entry; - GtkWidget *adv_condition_btn; - - GtkWidget *checkbtn_hbox; - GtkWidget *adv_search_checkbtn; - GtkWidget *case_checkbtn; - - GtkWidget *confirm_area; - GtkWidget *help_btn; - GtkWidget *all_btn; - GtkWidget *prev_btn; - GtkWidget *next_btn; - GtkWidget *close_btn; - GtkWidget *stop_btn; - gboolean is_searching = FALSE; - - window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "summary_search"); - gtk_window_set_title(GTK_WINDOW (window), _("Search messages")); - gtk_window_set_resizable(GTK_WINDOW(window), TRUE); - gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); - gtk_container_set_border_width(GTK_CONTAINER (window), 8); - g_signal_connect(G_OBJECT(window), "delete_event", - G_CALLBACK(gtk_widget_hide_on_delete), NULL); - g_signal_connect(G_OBJECT(window), "key_press_event", - G_CALLBACK(key_pressed), NULL); - MANAGE_WINDOW_SIGNALS_CONNECT(window); - - vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_show (vbox1); - gtk_container_add (GTK_CONTAINER (window), vbox1); - - bool_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4); - gtk_widget_show(bool_hbox); - gtk_box_pack_start(GTK_BOX(vbox1), bool_hbox, FALSE, FALSE, 0); - - bool_optmenu = gtkut_sc_combobox_create(NULL, FALSE); - menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(bool_optmenu))); - gtk_widget_show(bool_optmenu); - gtk_box_pack_start(GTK_BOX(bool_hbox), bool_optmenu, FALSE, FALSE, 0); - - COMBOBOX_ADD(menu, _("Match any of the following"), 0); - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(bool_optmenu), &iter); - COMBOBOX_ADD(menu, _("Match all of the following"), 1); - g_signal_connect(G_OBJECT(bool_optmenu), "changed", - G_CALLBACK(optmenu_changed), NULL); - - clear_btn = gtkut_stock_button("edit-clear", _("C_lear")); - gtk_widget_show(clear_btn); - gtk_box_pack_end(GTK_BOX(bool_hbox), clear_btn, FALSE, FALSE, 0); - - table1 = gtk_grid_new(); - gtk_widget_show (table1); - gtk_box_pack_start (GTK_BOX (vbox1), table1, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (table1), 4); - gtk_grid_set_row_spacing(GTK_GRID(table1), 8); - gtk_grid_set_column_spacing(GTK_GRID(table1), 8); - - from_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(from_entry), -1); - if (prefs_common.summary_search_from_history) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(from_entry), - prefs_common.summary_search_from_history); - gtk_widget_show (from_entry); - gtk_grid_attach(GTK_GRID(table1), from_entry, 1, 0, 1, 1); - gtk_widget_set_hexpand(from_entry, TRUE); - gtk_widget_set_halign(from_entry, GTK_ALIGN_FILL); - - g_signal_connect(G_OBJECT(from_entry), "changed", - G_CALLBACK(from_changed), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((from_entry)))), - "focus_in_event", G_CALLBACK(from_entry_focus_evt_in), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((from_entry)))), - "focus_out_event", G_CALLBACK(from_entry_focus_evt_out), NULL); - - to_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(to_entry), -1); - if (prefs_common.summary_search_to_history) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(to_entry), - prefs_common.summary_search_to_history); - gtk_widget_show (to_entry); - gtk_grid_attach(GTK_GRID(table1), to_entry, 1, 1, 1, 1); - gtk_widget_set_hexpand(to_entry, TRUE); - gtk_widget_set_halign(to_entry, GTK_ALIGN_FILL); - - g_signal_connect(G_OBJECT(to_entry), "changed", - G_CALLBACK(to_changed), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((to_entry)))), - "focus_in_event", G_CALLBACK(to_entry_focus_evt_in), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((to_entry)))), - "focus_out_event", G_CALLBACK(to_entry_focus_evt_out), NULL); - - subject_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(subject_entry), -1); - if (prefs_common.summary_search_subject_history) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(subject_entry), - prefs_common.summary_search_subject_history); - gtk_widget_show (subject_entry); - gtk_grid_attach(GTK_GRID(table1), subject_entry, 1, 2, 1, 1); - gtk_widget_set_hexpand(subject_entry, TRUE); - gtk_widget_set_halign(subject_entry, GTK_ALIGN_FILL); - - g_signal_connect(G_OBJECT(subject_entry), "changed", - G_CALLBACK(subject_changed), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((subject_entry)))), - "focus_in_event", G_CALLBACK(subject_entry_focus_evt_in), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((subject_entry)))), - "focus_out_event", G_CALLBACK(subject_entry_focus_evt_out), NULL); - - body_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(body_entry), -1); - if (prefs_common.summary_search_body_history) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(body_entry), - prefs_common.summary_search_body_history); - gtk_widget_show (body_entry); - gtk_grid_attach(GTK_GRID(table1), body_entry, 1, 3, 1, 1); - gtk_widget_set_hexpand(body_entry, TRUE); - gtk_widget_set_halign(body_entry, GTK_ALIGN_FILL); - - g_signal_connect(G_OBJECT(body_entry), "changed", - G_CALLBACK(body_changed), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((body_entry)))), - "focus_in_event", G_CALLBACK(body_entry_focus_evt_in), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((body_entry)))), - "focus_out_event", G_CALLBACK(body_entry_focus_evt_out), NULL); - - adv_condition_entry = gtk_combo_box_text_new_with_entry (); - gtk_combo_box_set_active(GTK_COMBO_BOX(adv_condition_entry), -1); - if (prefs_common.summary_search_adv_condition_history) - combobox_set_popdown_strings(GTK_COMBO_BOX_TEXT(adv_condition_entry), - prefs_common.summary_search_adv_condition_history); - gtk_widget_show (adv_condition_entry); - gtk_grid_attach(GTK_GRID(table1), adv_condition_entry, 1, 4, 1, 1); - gtk_widget_set_hexpand(adv_condition_entry, TRUE); - gtk_widget_set_halign(adv_condition_entry, GTK_ALIGN_FILL); - - g_signal_connect(G_OBJECT(adv_condition_entry), "changed", - G_CALLBACK(adv_condition_changed), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((adv_condition_entry)))), - "focus_in_event", G_CALLBACK(adv_condition_entry_focus_evt_in), NULL); - g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN((adv_condition_entry)))), - "focus_out_event", G_CALLBACK(adv_condition_entry_focus_evt_out), NULL); - - adv_condition_btn = gtk_button_new_with_label(" ... "); - gtk_widget_show (adv_condition_btn); - gtk_grid_attach(GTK_GRID(table1), adv_condition_btn, 2, 4, 1, 1); - - g_signal_connect(G_OBJECT (adv_condition_btn), "clicked", - G_CALLBACK(adv_condition_btn_clicked), search_window.window); - - CLAWS_SET_TIP(adv_condition_btn, - _("Edit search criteria")); - - from_label = gtk_label_new (_("From:")); - gtk_widget_show (from_label); - gtk_label_set_justify (GTK_LABEL (from_label), GTK_JUSTIFY_RIGHT); - gtk_label_set_xalign (GTK_LABEL (from_label), 1.0); - gtk_grid_attach(GTK_GRID(table1), from_label, 0, 0, 1, 1); - - to_label = gtk_label_new (_("To:")); - gtk_widget_show (to_label); - gtk_label_set_justify (GTK_LABEL (to_label), GTK_JUSTIFY_RIGHT); - gtk_label_set_xalign (GTK_LABEL (to_label), 1.0); - gtk_grid_attach(GTK_GRID(table1), to_label, 0, 1, 1, 1); - - subject_label = gtk_label_new (_("Subject:")); - gtk_widget_show (subject_label); - gtk_label_set_justify (GTK_LABEL (subject_label), GTK_JUSTIFY_RIGHT); - gtk_label_set_xalign (GTK_LABEL (subject_label), 1.0); - gtk_grid_attach(GTK_GRID(table1), subject_label, 0, 2, 1, 1); - - body_label = gtk_label_new (_("Body:")); - gtk_widget_show (body_label); - gtk_label_set_justify (GTK_LABEL (body_label), GTK_JUSTIFY_RIGHT); - gtk_label_set_xalign (GTK_LABEL (body_label), 1.0); - gtk_grid_attach(GTK_GRID(table1), body_label, 0, 3, 1, 1); - - adv_condition_label = gtk_label_new (_("Condition:")); - gtk_widget_show (adv_condition_label); - gtk_label_set_justify (GTK_LABEL (adv_condition_label), GTK_JUSTIFY_RIGHT); - gtk_label_set_xalign (GTK_LABEL (adv_condition_label), 1.0); - gtk_grid_attach(GTK_GRID(table1), adv_condition_label, 0, 4, 1, 1); - - checkbtn_hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); - gtk_widget_show (checkbtn_hbox); - gtk_box_pack_start (GTK_BOX (vbox1), checkbtn_hbox, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (checkbtn_hbox), 8); - - case_checkbtn = gtk_check_button_new_with_label (_("Case sensitive")); - gtk_widget_show (case_checkbtn); - gtk_box_pack_start (GTK_BOX (checkbtn_hbox), case_checkbtn, - FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(case_checkbtn), "changed", - G_CALLBACK(case_changed), NULL); - - adv_search_checkbtn = gtk_check_button_new_with_label (_("Extended Search")); - gtk_widget_show (adv_search_checkbtn); - gtk_box_pack_start (GTK_BOX (checkbtn_hbox), adv_search_checkbtn, - FALSE, FALSE, 0); - g_signal_connect(G_OBJECT(adv_search_checkbtn), "changed", - G_CALLBACK(case_changed), NULL); - - confirm_area = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL); - gtk_widget_show (confirm_area); - gtk_button_box_set_layout(GTK_BUTTON_BOX(confirm_area), - GTK_BUTTONBOX_END); - gtk_box_set_spacing(GTK_BOX(confirm_area), 5); - - gtkut_stock_button_add_help(confirm_area, &help_btn); - - all_btn = gtk_button_new_with_mnemonic(_("Find _all")); - gtk_widget_set_can_default(all_btn, TRUE); - gtk_box_pack_start(GTK_BOX(confirm_area), all_btn, TRUE, TRUE, 0); - gtk_widget_show(all_btn); - - prev_btn = gtkut_stock_button("go-previous", _("_Previous")); - gtk_widget_set_can_default(prev_btn, TRUE); - gtk_box_pack_start(GTK_BOX(confirm_area), prev_btn, TRUE, TRUE, 0); - gtk_widget_show(prev_btn); - - next_btn = gtkut_stock_button("go-next", _("_Next")); - gtk_widget_set_can_default(next_btn, TRUE); - gtk_box_pack_start(GTK_BOX(confirm_area), next_btn, TRUE, TRUE, 0); - gtk_widget_show(next_btn); - - close_btn = gtkut_stock_button("window-close", _("_Close")); - gtk_widget_set_can_default(close_btn, TRUE); - gtk_box_pack_start(GTK_BOX(confirm_area), close_btn, TRUE, TRUE, 0); - gtk_widget_show(close_btn); - - /* stop button hidden */ - stop_btn = gtk_button_new_with_mnemonic(_("_Stop")); - gtk_widget_set_can_default(stop_btn, TRUE); - gtk_box_pack_start(GTK_BOX(confirm_area), stop_btn, TRUE, TRUE, 0); - - gtk_box_pack_start (GTK_BOX (vbox1), confirm_area, FALSE, FALSE, 0); - gtk_widget_grab_default(next_btn); - - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, bool_optmenu) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, from_label) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, from_entry) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, to_label) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, to_entry) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, subject_label) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, subject_entry) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, body_label) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, body_entry) - SET_TOGGLE_SENSITIVITY(adv_search_checkbtn, adv_condition_label) - SET_TOGGLE_SENSITIVITY(adv_search_checkbtn, adv_condition_entry) - SET_TOGGLE_SENSITIVITY(adv_search_checkbtn, adv_condition_btn) - SET_TOGGLE_SENSITIVITY_REVERSE(adv_search_checkbtn, case_checkbtn) - - g_signal_connect(G_OBJECT(help_btn), "clicked", - G_CALLBACK(manual_open_with_anchor_cb), - MANUAL_ANCHOR_SEARCHING); - g_signal_connect(G_OBJECT(clear_btn), "clicked", - G_CALLBACK(summary_search_clear), NULL); - g_signal_connect(G_OBJECT(all_btn), "clicked", - G_CALLBACK(summary_search_all_clicked), NULL); - g_signal_connect(G_OBJECT(prev_btn), "clicked", - G_CALLBACK(summary_search_prev_clicked), NULL); - g_signal_connect(G_OBJECT(next_btn), "clicked", - G_CALLBACK(summary_search_next_clicked), NULL); - g_signal_connect_closure - (G_OBJECT(close_btn), "clicked", - g_cclosure_new_swap(G_CALLBACK(gtk_widget_hide), - window, NULL), FALSE); - g_signal_connect(G_OBJECT(stop_btn), "clicked", - G_CALLBACK(summary_search_stop_clicked), NULL); - - search_window.window = window; - search_window.bool_optmenu = bool_optmenu; - search_window.from_label = from_label; - search_window.from_entry = from_entry; - search_window.to_label = to_label; - search_window.to_entry = to_entry; - search_window.subject_label = subject_label; - search_window.subject_entry = subject_entry; - search_window.body_label = body_label; - search_window.body_entry = body_entry; - search_window.adv_condition_label = adv_condition_label; - search_window.adv_condition_entry = adv_condition_entry; - search_window.adv_condition_btn = adv_condition_btn; - search_window.case_checkbtn = case_checkbtn; - search_window.adv_search_checkbtn = adv_search_checkbtn; - search_window.clear_btn = clear_btn; - search_window.help_btn = help_btn; - search_window.all_btn = all_btn; - search_window.prev_btn = prev_btn; - search_window.next_btn = next_btn; - search_window.close_btn = close_btn; - search_window.stop_btn = stop_btn; - search_window.advsearch = NULL; - search_window.matcher_is_outdated = TRUE; - search_window.search_in_progress = FALSE; - search_window.matched_msgnums = NULL; - search_window.is_searching = is_searching; -} - -static gboolean summary_search_verify_match(MsgInfo *msg) -{ - gpointer msgnum = GUINT_TO_POINTER(msg->msgnum); - - if (g_hash_table_lookup(search_window.matched_msgnums, msgnum) != NULL) - return TRUE; - else - return FALSE; -} - -static gboolean summary_search_progress_cb(gpointer data, guint at, guint matched, guint total) -{ - if (!search_window.is_searching) { - search_window.matcher_is_outdated = TRUE; - return FALSE; - } - - return summaryview_search_root_progress(search_window.summaryview, at, matched, total); -} - -static gboolean summary_search_prepare_matcher() -{ - gboolean adv_search; - gboolean bool_and = FALSE; - gboolean case_sens = FALSE; - gchar *matcher_str; - gint match_type; - gchar *from_str = NULL, *to_str = NULL, *subject_str = NULL; - gchar *body_str = NULL; - GSList *matchers = NULL; - - if (!search_window.matcher_is_outdated) - return TRUE; - - if (search_window.advsearch == NULL) { - search_window.advsearch = advsearch_new(); - advsearch_set_on_error_cb(search_window.advsearch, NULL, NULL); /* TODO */ - advsearch_set_on_progress_cb(search_window.advsearch, - summary_search_progress_cb, NULL); - } - - adv_search = gtk_toggle_button_get_active - (GTK_TOGGLE_BUTTON(search_window.adv_search_checkbtn)); - - if (adv_search) { - matcher_str = add_history_get(search_window.adv_condition_entry, &prefs_common.summary_search_adv_condition_history); - } else { - MatcherList *matcher_list; - bool_and = combobox_get_active_data(GTK_COMBO_BOX(search_window.bool_optmenu)); - case_sens = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(search_window.case_checkbtn)); - - from_str = add_history_get(search_window.from_entry, &prefs_common.summary_search_from_history); - to_str = add_history_get(search_window.to_entry, &prefs_common.summary_search_to_history); - subject_str = add_history_get(search_window.subject_entry, &prefs_common.summary_search_subject_history); - body_str = add_history_get(search_window.body_entry, &prefs_common.summary_search_body_history); - - if (!from_str && !to_str && !subject_str && !body_str) { - /* TODO: warn if no search criteria? (or make buttons enabled only when - * at least one search criteria has been set */ - return FALSE; - } - - match_type = case_sens ? MATCHTYPE_MATCH : MATCHTYPE_MATCHCASE; - - if (from_str) { - MatcherProp *prop = matcherprop_new(MATCHCRITERIA_FROM, NULL, match_type, from_str, 0); - matchers = g_slist_append(matchers, prop); - } - if (to_str) { - MatcherProp *prop = matcherprop_new(MATCHCRITERIA_TO, NULL, match_type, to_str, 0); - matchers = g_slist_append(matchers, prop); - } - if (subject_str) { - MatcherProp *prop = matcherprop_new(MATCHCRITERIA_SUBJECT, NULL, match_type, subject_str, 0); - matchers = g_slist_append(matchers, prop); - } - if (body_str) { - MatcherProp *prop = matcherprop_new(MATCHCRITERIA_BODY_PART, NULL, match_type, body_str, 0); - matchers = g_slist_append(matchers, prop); - } - g_free(from_str); - g_free(to_str); - g_free(subject_str); - g_free(body_str); - - matcher_list = matcherlist_new(matchers, bool_and); - if (!matcher_list) - return FALSE; - - matcher_str = matcherlist_to_string(matcher_list); - matcherlist_free(matcher_list); - } - if (!matcher_str) - return FALSE; - - advsearch_set(search_window.advsearch, ADVANCED_SEARCH_EXTENDED, - matcher_str); - - debug_print("Advsearch set: %s\n", matcher_str); - g_free(matcher_str); - - if (!advsearch_has_proper_predicate(search_window.advsearch)) - return FALSE; - - search_window.matcher_is_outdated = FALSE; - - return TRUE; -} - -static gboolean summary_search_prereduce_msg_list() -{ - MsgInfoList *msglist = NULL; - MsgNumberList *msgnums = NULL; - MsgNumberList *cur; - SummaryView *summaryview = search_window.summaryview; - gboolean result; - FolderItem *item = summaryview->folder_item; - static GdkCursor *watch_cursor = NULL; - if (!watch_cursor) - watch_cursor = gdk_cursor_new_for_display( - gtk_widget_get_display(summaryview->scrolledwin), GDK_WATCH); - - if (search_window.matcher_is_outdated && !summary_search_prepare_matcher()) - return FALSE; - - main_window_cursor_wait(mainwindow_get_mainwindow()); - gdk_window_set_cursor(gtk_widget_get_window(search_window.window), watch_cursor); - statusbar_print_all(_("Searching in %s... \n"), - item->path ? item->path : "(null)"); - - result = advsearch_search_msgs_in_folders(search_window.advsearch, - &msglist, item, FALSE); - statusbar_pop_all(); - statusbar_progress_all(0, 0, 0); - gdk_window_set_cursor(gtk_widget_get_window(search_window.window), NULL); - main_window_cursor_normal(mainwindow_get_mainwindow()); - - if (!result) - return FALSE; - - msgnums = procmsg_get_number_list_for_msgs(msglist); - procmsg_msg_list_free(msglist); - - if (search_window.matched_msgnums == NULL) - search_window.matched_msgnums = g_hash_table_new(g_direct_hash, NULL); - - g_hash_table_remove_all(search_window.matched_msgnums); - - for (cur = msgnums; cur != NULL; cur = cur->next) - g_hash_table_insert(search_window.matched_msgnums, cur->data, GINT_TO_POINTER(1)); - - g_slist_free(msgnums); - - return TRUE; -} - -static void summary_search_execute(gboolean backward, gboolean search_all) -{ - SummaryView *summaryview = search_window.summaryview; - GtkCMCTree *ctree = GTK_CMCTREE(summaryview->ctree); - GtkCMCTreeNode *node; - MsgInfo *msginfo; - gboolean all_searched = FALSE; - gboolean matched = FALSE; - gint i = 0; - - if (summary_is_locked(summaryview)) - return; - - summary_lock(summaryview); - - search_window.is_searching = TRUE; - main_window_cursor_wait(summaryview->mainwin); - summary_show_stop_button(); - - if (search_window.matcher_is_outdated && !summary_search_prereduce_msg_list()) - goto exit; - - if (search_all) { - summary_freeze(summaryview); - summary_unselect_all(summaryview); - node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); - backward = FALSE; - } else if (!summaryview->selected) { - /* no selection, search from from list start */ - if (backward) - node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list_end); - else - node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); - - if (!node) { - search_window.is_searching = FALSE; - summary_hide_stop_button(); - main_window_cursor_normal(summaryview->mainwin); - summary_unlock(summaryview); - return; - } - } else { - /* search from current selection */ - if (backward) - node = gtkut_ctree_node_prev(ctree, summaryview->selected); - else - node = gtkut_ctree_node_next(ctree, summaryview->selected); - } - - for (; search_window.is_searching; i++) { - if (!node) { - gchar *str; - AlertValue val; - - if (search_all) - break; - - if (all_searched) { - alertpanel_full(_("Search failed"), - _("Search string not found."), - "window-close-symbolic", _("_Close"), NULL, NULL, - NULL, NULL, ALERTFOCUS_FIRST, - FALSE, NULL, ALERT_WARNING); - break; - } - - if (backward) - str = _("Beginning of list reached; continue from end?"); - else - str = _("End of list reached; continue from beginning?"); - - val = alertpanel(_("Search finished"), str, - NULL, _("_No"), NULL, _("_Yes"), NULL, NULL, - ALERTFOCUS_SECOND); - if (G_ALERTALTERNATE == val) { - if (backward) { - node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list_end); - } else { - node = GTK_CMCTREE_NODE(GTK_CMCLIST(ctree)->row_list); - } - - all_searched = TRUE; - - manage_window_focus_in(search_window.window, NULL, NULL); - } else - break; - } - - msginfo = gtk_cmctree_node_get_row_data(ctree, node); - - if (msginfo) - matched = summary_search_verify_match(msginfo); - else - matched = FALSE; - - if (matched) { - if (search_all) { - gtk_cmctree_select(ctree, node); - } else { - summary_unlock(summaryview); - summary_select_node(summaryview, node, - OPEN_SELECTED_ON_SEARCH_RESULTS); - summary_lock(summaryview); - break; - } - } - - if (i % (search_window.is_fast ? 1000 : 100) == 0) - GTK_EVENTS_FLUSH(); - - node = backward ? gtkut_ctree_node_prev(ctree, node) - : gtkut_ctree_node_next(ctree, node); - } - -exit: - search_window.is_searching = FALSE; - summary_hide_stop_button(); - main_window_cursor_normal(summaryview->mainwin); - if (search_all) - summary_thaw_with_status(summaryview); - summary_unlock(summaryview); -} - -static void summary_search_clear(GtkButton *button, gpointer data) -{ - if (gtk_toggle_button_get_active - (GTK_TOGGLE_BUTTON(search_window.adv_search_checkbtn))) { - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.adv_condition_entry)))), ""); - } else { - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.from_entry)))), ""); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.to_entry)))), ""); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.subject_entry)))), ""); - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.body_entry)))), ""); - } - /* stop searching */ - if (search_window.is_searching) { - search_window.is_searching = FALSE; - } - search_window.matcher_is_outdated = TRUE; -} - -static void summary_search_prev_clicked(GtkButton *button, gpointer data) -{ - summary_search_execute(TRUE, FALSE); -} - -static void summary_search_next_clicked(GtkButton *button, gpointer data) -{ - summary_search_execute(FALSE, FALSE); -} - -static void summary_search_all_clicked(GtkButton *button, gpointer data) -{ - summary_search_execute(FALSE, TRUE); -} - -static void adv_condition_btn_done(MatcherList * matchers) -{ - gchar *str; - - cm_return_if_fail( - mainwindow_get_mainwindow()->summaryview->quicksearch != NULL); - - if (matchers == NULL) { - return; - } - - str = matcherlist_to_string(matchers); - search_window.matcher_is_outdated = TRUE; - - if (str != NULL) { - gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN((search_window.adv_condition_entry)))), str); - g_free(str); - } -} - -static void summary_search_stop_clicked(GtkButton *button, gpointer data) -{ - search_window.is_searching = FALSE; -} - -static void adv_condition_btn_clicked(GtkButton *button, gpointer data) -{ - const gchar * cond_str; - MatcherList * matchers = NULL; - - cm_return_if_fail( search_window.window != NULL ); - - /* re-use the current search value if it's a condition expression, - otherwise ignore it silently */ - cond_str = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(search_window.adv_condition_entry)); - if (cond_str && *cond_str != '\0') { - matchers = matcher_parser_get_cond((gchar*)cond_str, NULL); - } - - prefs_matcher_open(matchers, adv_condition_btn_done); - - if (matchers != NULL) { - matcherlist_free(matchers); - } -}; - -static void optmenu_changed(GtkComboBox *widget, gpointer user_data) -{ - search_window.matcher_is_outdated = TRUE; -} - -static void from_changed(void) -{ - if (!search_window.from_entry_has_focus) - gtk_widget_grab_focus(search_window.from_entry); - search_window.matcher_is_outdated = TRUE; -} - -static void to_changed(void) -{ - if (!search_window.to_entry_has_focus) - gtk_widget_grab_focus(search_window.to_entry); - search_window.matcher_is_outdated = TRUE; -} - -static void subject_changed(void) -{ - if (!search_window.subject_entry_has_focus) - gtk_widget_grab_focus(search_window.subject_entry); - search_window.matcher_is_outdated = TRUE; -} - -static void body_changed(void) -{ - if (!search_window.body_entry_has_focus) - gtk_widget_grab_focus(search_window.body_entry); - search_window.matcher_is_outdated = TRUE; -} - -static void adv_condition_changed(void) -{ - if (!search_window.adv_condition_entry_has_focus) - gtk_widget_grab_focus(search_window.adv_condition_entry); - search_window.matcher_is_outdated = TRUE; -} - -static void case_changed(GtkToggleButton *togglebutton, gpointer user_data) -{ - search_window.matcher_is_outdated = TRUE; -} - -static gboolean from_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.from_entry_has_focus = TRUE; - return FALSE; -} - -static gboolean from_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.from_entry_has_focus = FALSE; - return FALSE; -} - -static gboolean to_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.to_entry_has_focus = TRUE; - return FALSE; -} - -static gboolean to_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.to_entry_has_focus = FALSE; - return FALSE; -} - -static gboolean subject_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.subject_entry_has_focus = TRUE; - return FALSE; -} - -static gboolean subject_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.subject_entry_has_focus = FALSE; - return FALSE; -} - -static gboolean body_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.body_entry_has_focus = TRUE; - return FALSE; -} - -static gboolean body_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.body_entry_has_focus = FALSE; - return FALSE; -} - -static gboolean adv_condition_entry_focus_evt_in(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.adv_condition_entry_has_focus = TRUE; - return FALSE; -} - -static gboolean adv_condition_entry_focus_evt_out(GtkWidget *widget, GdkEventFocus *event, - gpointer data) -{ - search_window.adv_condition_entry_has_focus = FALSE; - return FALSE; -} - -static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event, - gpointer data) -{ - if (event && (event->keyval == GDK_KEY_Escape)) { - /* ESC key will: - - stop a running search - - close the search window if no search is running - */ - if (!search_window.is_searching) { - gtk_widget_hide(search_window.window); - } else { - search_window.is_searching = FALSE; - } - } - - if (event && (event->keyval == GDK_KEY_Return || event->keyval == GDK_KEY_KP_Enter)) { - if (!search_window.is_searching) { - summary_search_execute(FALSE, FALSE); - } - } - - if (event && (event->keyval == GDK_KEY_Down || event->keyval == GDK_KEY_Up)) { - if (search_window.from_entry_has_focus) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(search_window.from_entry), - event->keyval); - return TRUE; - } - if (search_window.to_entry_has_focus) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(search_window.to_entry), - event->keyval); - return TRUE; - } - if (search_window.subject_entry_has_focus) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(search_window.subject_entry), - event->keyval); - return TRUE; - } - if (search_window.body_entry_has_focus) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(search_window.body_entry), - event->keyval); - return TRUE; - } - if (search_window.adv_condition_entry_has_focus) { - combobox_set_value_from_arrow_key( - GTK_COMBO_BOX(search_window.adv_condition_entry), - event->keyval); - return TRUE; - } - } - - return FALSE; -} blob - 18f6dc7cb342da2aae3742a0f8c04f6d551fd2e2 (mode 644) blob + /dev/null --- src/summary_search.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Claws Mail -- a GTK based, lightweight, and fast e-mail client - * Copyright (C) 1999-2012 Hiroyuki Yamamoto and the Claws Mail team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -#ifndef __SUMMARY_SEARCH_H__ -#define __SUMMARY_SEARCH_H__ - -#include - -#include "summaryview.h" - -void summary_search (SummaryView *summaryview); - -#endif /* __SUMMARY_SEARCH_H__ */ blob - 9fbe2ea191b0c4d312454c00afdaf92c19fb0543 blob + 93b101bf84c5be0d2b0d135d00b4b45b1e067396 --- src/summaryview.c +++ src/summaryview.c @@ -16,7 +16,6 @@ * along with this program. If not, see . */ -#include "config.h" #include "defs.h" #include @@ -65,7 +64,6 @@ #include "hooks.h" #include "description_window.h" #include "folderutils.h" -#include "quicksearch.h" #include "log.h" #include "manual.h" #include "manage_window.h" @@ -346,12 +344,6 @@ static gint summary_cmp_by_locked (GtkCMCList *clist gconstpointer ptr1, gconstpointer ptr2); -static void quicksearch_execute_cb (QuickSearch *quicksearch, - gpointer data); - -static void tog_searchbar_cb (GtkWidget *w, - gpointer data); - static void summary_find_answers (SummaryView *summaryview, MsgInfo *msg); @@ -491,8 +483,6 @@ SummaryView *summary_create(MainWindow *mainwin) GtkWidget *hbox_spc; GtkWidget *toggle_eventbox; GtkWidget *toggle_arrow; - GtkWidget *toggle_search; - QuickSearch *quicksearch; debug_print("Creating summary view...\n"); summaryview = g_new0(SummaryView, 1); @@ -514,16 +504,6 @@ SummaryView *summary_create(MainWindow *mainwin) stat_box2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); gtk_widget_show(stat_box2); - toggle_search = gtk_toggle_button_new(); - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle_search), - prefs_common.show_searchbar); - gtk_widget_set_can_focus(toggle_search, FALSE); - gtk_widget_show(toggle_search); - - CLAWS_SET_TIP(toggle_search, _("Toggle quick search bar")); - - gtk_box_pack_start(GTK_BOX(hbox), toggle_search, FALSE, FALSE, HSPACING_NARROW_2); - gtk_box_pack_start(GTK_BOX(hbox), stat_vbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(stat_vbox), stat_box, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(stat_vbox), stat_box2, TRUE, TRUE, 0); @@ -586,14 +566,6 @@ SummaryView *summary_create(MainWindow *mainwin) gtk_widget_show_all(stat_vbox); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - quicksearch = quicksearch_new(); - gtk_box_pack_start(GTK_BOX(vbox), quicksearch_get_widget(quicksearch), FALSE, FALSE, 0); - - quicksearch_set_execute_callback(quicksearch, quicksearch_execute_cb, summaryview); - - g_signal_connect (G_OBJECT(toggle_search), "toggled", - G_CALLBACK(tog_searchbar_cb), summaryview); - /* create popup menu */ gtk_action_group_add_actions(mainwin->action_group, @@ -687,7 +659,6 @@ SummaryView *summary_create(MainWindow *mainwin) summaryview->statlabel_msgs = statlabel_msgs; summaryview->toggle_eventbox = toggle_eventbox; summaryview->toggle_arrow = toggle_arrow; - summaryview->toggle_search = toggle_search; summaryview->lock_count = 0; summaryview->msginfo_update_callback_id = hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, summary_update_msg, (gpointer) summaryview); @@ -702,8 +673,6 @@ SummaryView *summary_create(MainWindow *mainwin) summaryview->target_list = gtk_target_list_new(summary_drag_types, 3); - summaryview->quicksearch = quicksearch; - /* CLAWS: need this to get the SummaryView * from * the CList */ g_object_set_data(G_OBJECT(ctree), "summaryview", (gpointer)summaryview); @@ -711,11 +680,6 @@ SummaryView *summary_create(MainWindow *mainwin) gtk_widget_show_all(vbox); gtk_widget_show(vbox); - - if (prefs_common.show_searchbar) - quicksearch_show(quicksearch); - else - quicksearch_hide(quicksearch); return summaryview; } @@ -756,11 +720,6 @@ void summary_relayout(SummaryView *summaryview) g_object_unref(summaryview->hbox_l); g_object_unref(summaryview->statlabel_msgs); - quicksearch_relayout(summaryview->quicksearch); - if (prefs_common.show_searchbar) - quicksearch_show(summaryview->quicksearch); - else - quicksearch_hide(summaryview->quicksearch); } static void summary_set_folder_pixmap(SummaryView *summaryview, StockPixmap icon) @@ -811,11 +770,6 @@ void summary_init(SummaryView *summaryview) summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN); - pixmap = stock_pixmap_widget(STOCK_PIXMAP_QUICKSEARCH); - gtk_container_add (GTK_CONTAINER(summaryview->toggle_search), pixmap); - gtk_widget_show(pixmap); - summaryview->quick_search_pixmap = pixmap; - /* Init summaryview prefs */ summaryview->sort_key = SORT_BY_NONE; summaryview->sort_type = SORT_ASCENDING; @@ -910,89 +864,6 @@ static void summaryview_reset_recursive_folder_match(S summaryview->search_root_folder = NULL; } -static gboolean summaryview_quicksearch_recursive_progress(gpointer data, guint at, guint matched, guint total) -{ - QuickSearch *search = (QuickSearch*) data; - gint interval = quicksearch_is_fast(search) ? 5000 : 100; - - statusbar_progress_all(at, total, interval); - if (at % interval == 0) - GTK_EVENTS_FLUSH(); - - if (matched > 0) - return FALSE; - - return TRUE; -} - -static void summaryview_quicksearch_recurse_step(SummaryView *summaryview, FolderItem *item) -{ - MsgInfoList *msgs = NULL; - gboolean result = TRUE; - - statusbar_print_all(_("Searching in %s... \n"), - item->path ? item->path : "(null)"); - folder_item_update_freeze(); - - quicksearch_set_on_progress_cb(summaryview->quicksearch, summaryview_quicksearch_recursive_progress, summaryview->quicksearch); - if (!quicksearch_run_on_folder(summaryview->quicksearch, item, &msgs)) - result = FALSE; - - result = result && msgs != NULL; - - if (msgs != NULL) - procmsg_msg_list_free(msgs); - - folder_item_update_thaw(); - statusbar_progress_all(0, 0, 0); - statusbar_pop_all(); - - if (result) { - summaryview->recursive_matched_folders = g_slist_prepend( - summaryview->recursive_matched_folders, item); - - folderview_update_search_icon(item, TRUE); - } -} - -static void summaryview_quicksearch_search_subfolders(SummaryView *summaryview, FolderItem *folder_item) -{ - FolderItem *cur = NULL; - GNode *node = folder_item->node->children; - - if (!prefs_common.summary_quicksearch_recurse - || !quicksearch_has_sat_predicate(summaryview->quicksearch) - || quicksearch_is_in_typing(summaryview->quicksearch)) - return; - - for (; node != NULL; node = node->next) { - if (!quicksearch_has_sat_predicate(summaryview->quicksearch)) - return; - - cur = FOLDER_ITEM(node->data); - summaryview_quicksearch_recurse_step(summaryview, cur); - if (cur->node->children) - summaryview_quicksearch_search_subfolders(summaryview, cur); - } -} - -static void summaryview_quicksearch_recurse(SummaryView *summaryview) -{ - if (!prefs_common.summary_quicksearch_recurse - || !quicksearch_has_sat_predicate(summaryview->quicksearch) - || summaryview->folder_item == NULL) { - return; - } - main_window_cursor_wait(summaryview->mainwin); - - summaryview_reset_recursive_folder_match(summaryview); - summaryview->search_root_folder = summaryview->folder_item; - - summaryview_quicksearch_search_subfolders(summaryview, summaryview->folder_item); - - main_window_cursor_normal(summaryview->mainwin); -} - static gboolean summary_check_consistency(FolderItem *item, GSList *mlist) { int u = 0, n = 0, m = 0, t = 0, r = 0, f = 0, l = 0, i = 0, w = 0; @@ -1037,10 +908,8 @@ static gboolean summary_check_consistency(FolderItem * gboolean summaryview_search_root_progress(gpointer data, guint at, guint matched, guint total) { - SummaryView *summaryview = (SummaryView*) data; + gint interval = 100; - gint interval = quicksearch_is_fast(summaryview->quicksearch) ? 5000 : 100; - statusbar_progress_all(at, total, interval); if (at % interval == 0) @@ -1083,19 +952,7 @@ gboolean summary_show(SummaryView *summaryview, Folder if (!is_refresh) { main_create_mailing_list_menu (summaryview->mainwin, NULL); - } - if (!prefs_common.summary_quicksearch_sticky - && (!prefs_common.summary_quicksearch_recurse - || !quicksearch_has_sat_predicate(summaryview->quicksearch) - || (item && !folder_is_child_of(item, summaryview->search_root_folder))) - && !quicksearch_is_running(summaryview->quicksearch) - && !is_refresh) { - quicksearch_set(summaryview->quicksearch, prefs_common.summary_quicksearch_type, ""); - } - - /* STATUSBAR_POP(summaryview->mainwin); */ - - if (is_refresh) { + } else { selected_msgnum = summary_get_msgnum(summaryview, summaryview->selected); displayed_msgnum = summary_get_msgnum(summaryview, @@ -1125,7 +982,7 @@ gboolean summary_show(SummaryView *summaryview, Folder inc_unlock(); return FALSE; } - if (changed || !quicksearch_has_sat_predicate(summaryview->quicksearch)) + if (changed) folder_update_op_count(); } @@ -1174,40 +1031,9 @@ gboolean summary_show(SummaryView *summaryview, Folder mlist = folder_item_get_msg_list(item); } - if (quicksearch_has_sat_predicate(summaryview->quicksearch)) { - procmsg_msg_list_free(mlist); - mlist = NULL; - - - statusbar_print_all(_("Searching in %s... \n"), - summaryview->folder_item->path ? - summaryview->folder_item->path : "(null)"); - - folder_item_update_freeze(); - - quicksearch_set_on_progress_cb(summaryview->quicksearch, summaryview_search_root_progress, summaryview); - quicksearch_run_on_folder(summaryview->quicksearch, summaryview->folder_item, &mlist); - - folder_item_update_thaw(); - statusbar_progress_all(0, 0, 0); - statusbar_pop_all(); - - if (!quicksearch_has_sat_predicate(summaryview->quicksearch)) { - debug_print("search cancelled!\n"); - summary_thaw(summaryview); - STATUSBAR_POP(summaryview->mainwin); - main_window_cursor_normal(summaryview->mainwin); - summary_unlock(summaryview); - inc_unlock(); - summary_show(summaryview, summaryview->folder_item, FALSE); - return FALSE; - } - } - if ((summaryview->folder_item->hide_read_msgs || summaryview->folder_item->hide_del_msgs - || summaryview->folder_item->hide_read_threads) && - quicksearch_has_sat_predicate(summaryview->quicksearch) == FALSE) { + || summaryview->folder_item->hide_read_threads)) { GSList *not_killed; summary_set_hide_menu(summaryview, "/Menu/View/HideReadMessages", @@ -1275,51 +1101,31 @@ gboolean summary_show(SummaryView *summaryview, Folder g_slist_free(mlist); if (is_refresh) { - if (!quicksearch_is_in_typing(summaryview->quicksearch)) { - summaryview->displayed = - summary_find_msg_by_msgnum(summaryview, - displayed_msgnum); - if (!summaryview->displayed) - messageview_clear(summaryview->messageview); - summary_unlock(summaryview); + summaryview->displayed = + summary_find_msg_by_msgnum(summaryview, + displayed_msgnum); + if (!summaryview->displayed) + messageview_clear(summaryview->messageview); + summary_unlock(summaryview); - if (quicksearch_is_running(summaryview->quicksearch)) - summary_select_by_msgnum(summaryview, selected_msgnum, - OPEN_SELECTED_ON_SEARCH_RESULTS); - else - summary_select_by_msgnum(summaryview, selected_msgnum, - FALSE); + summary_select_by_msgnum(summaryview, selected_msgnum, FALSE); - summary_lock(summaryview); - if (!summaryview->selected) { - /* no selected message - select first unread - message, but do not display it */ - node = summary_find_next_flagged_msg(summaryview, NULL, - MSG_UNREAD, FALSE); - if (node == NULL && GTK_CMCLIST(ctree)->row_list != NULL) - node = gtk_cmctree_node_nth - (ctree, - item->sort_type == SORT_DESCENDING - ? 0 : GTK_CMCLIST(ctree)->rows - 1); - summary_unlock(summaryview); - - if (quicksearch_is_running(summaryview->quicksearch)) - summary_select_node(summaryview, node, - OPEN_SELECTED_ON_SEARCH_RESULTS); - else - summary_select_node(summaryview, node, - OPEN_SELECTED_ON_FOLDER_OPEN); - - summary_lock(summaryview); - } - } else { - /* just select first/last */ - if (GTK_CMCLIST(ctree)->row_list != NULL) + summary_lock(summaryview); + if (!summaryview->selected) { + /* no selected message - select first unread + message, but do not display it */ + node = summary_find_next_flagged_msg(summaryview, NULL, + MSG_UNREAD, FALSE); + if (node == NULL && GTK_CMCLIST(ctree)->row_list != NULL) node = gtk_cmctree_node_nth (ctree, item->sort_type == SORT_DESCENDING ? 0 : GTK_CMCLIST(ctree)->rows - 1); - summary_select_node(summaryview, node, OPEN_SELECTED_ON_SEARCH_RESULTS); + summary_unlock(summaryview); + + summary_select_node(summaryview, node, OPEN_SELECTED_ON_FOLDER_OPEN); + + summary_lock(summaryview); } } else { /* backward compat */ @@ -2081,11 +1887,6 @@ void summary_select_node(SummaryView *summaryview, Gtk GTK_EVENTS_FLUSH(); summary_unlock(summaryview); - /* If quicksearch has focus, let's keep it there. */ - if (!quicksearch_has_focus(summaryview->quicksearch) || - quicksearch_is_running(summaryview->quicksearch)) - summary_grab_focus(summaryview); - gtkut_ctree_node_move_if_on_the_edge(ctree, node, -1); if (display_msg && summaryview->displayed == node) @@ -2412,8 +2213,7 @@ static void summary_status_show(SummaryView *summaryvi if (summaryview->folder_item->hide_read_msgs || summaryview->folder_item->hide_del_msgs - || summaryview->folder_item->hide_read_threads - || quicksearch_has_sat_predicate(summaryview->quicksearch)) { + || summaryview->folder_item->hide_read_threads) { rowlist = GTK_CMCLIST(summaryview->ctree)->row_list; for (cur = rowlist; cur != NULL && cur->data != NULL; cur = cur->next) { msginfo = gtk_cmctree_node_get_row_data @@ -2492,7 +2292,6 @@ static void summary_status_show(SummaryView *summaryvi static void summary_set_column_titles(SummaryView *summaryview) { GtkCMCList *clist = GTK_CMCLIST(summaryview->ctree); - FolderItem *item = summaryview->folder_item; GtkWidget *hbox; GtkWidget *label; GtkWidget *arrow; @@ -5613,9 +5412,6 @@ static gboolean summary_key_pressed(GtkWidget *widget, if (!event) return TRUE; - if (quicksearch_has_focus(summaryview->quicksearch)) - return FALSE; - mod_pressed = ((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0); @@ -5739,44 +5535,6 @@ static gboolean summary_key_pressed(GtkWidget *widget, } #undef CELL_SPACING -static void quicksearch_execute_cb(QuickSearch *quicksearch, gpointer data) -{ - SummaryView *summaryview = data; - - summaryview_reset_recursive_folder_match(summaryview); - if (summary_show(summaryview, summaryview->folder_item, FALSE)) - summaryview_quicksearch_recurse(summaryview); - else - summaryview_reset_recursive_folder_match(summaryview); -} - -static void tog_searchbar_cb(GtkWidget *w, gpointer data) -{ - SummaryView *summaryview = (SummaryView *)data; - - if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) { - prefs_common.show_searchbar = TRUE; - quicksearch_show(summaryview->quicksearch); - } else { - prefs_common.show_searchbar = FALSE; - quicksearch_hide(summaryview->quicksearch); - } -} - -void summaryview_activate_quicksearch(SummaryView *summaryview, gboolean show) -{ - prefs_common.show_searchbar = show; - gtk_toggle_button_set_active( - GTK_TOGGLE_BUTTON(summaryview->toggle_search), - show); - if (show) { - quicksearch_show(summaryview->quicksearch); - } else { - quicksearch_hide(summaryview->quicksearch); - summary_grab_focus(summaryview); - } -} - void summary_open_row(GtkSCTree *sctree, SummaryView *summaryview) { if (FOLDER_SHOWS_TO_HDR(summaryview->folder_item)) @@ -5888,9 +5646,6 @@ static void summary_selected(GtkCMCTree *ctree, GtkCMC } else if (!MSG_IS_REPLIED(msginfo->flags) && !MSG_IS_FORWARDED(msginfo->flags)) { marked_unread = TRUE; - } else if (MSG_IS_REPLIED(msginfo->flags)) { - summary_find_answers(summaryview, msginfo); - return; } break; case S_COL_LOCKED: @@ -6729,8 +6484,6 @@ static void summary_set_hide_menu (SummaryView *summar void summary_reflect_prefs_pixmap_theme(SummaryView *summaryview) { - GtkWidget *pixmap; - stock_pixbuf_gdk(STOCK_PIXMAP_MARK, &markxpm); stock_pixbuf_gdk(STOCK_PIXMAP_DELETED, &deletedxpm); stock_pixbuf_gdk(STOCK_PIXMAP_NEW, &newxpm); @@ -6753,13 +6506,6 @@ void summary_reflect_prefs_pixmap_theme(SummaryView *s summary_set_folder_pixmap(summaryview, STOCK_PIXMAP_DIR_OPEN); - pixmap = stock_pixmap_widget(STOCK_PIXMAP_QUICKSEARCH); - gtk_container_remove (GTK_CONTAINER(summaryview->toggle_search), - summaryview->quick_search_pixmap); - gtk_container_add(GTK_CONTAINER(summaryview->toggle_search), pixmap); - gtk_widget_show(pixmap); - summaryview->quick_search_pixmap = pixmap; - folderview_unselect(summaryview->folderview); folderview_select(summaryview->folderview, summaryview->folder_item); summary_set_column_titles(summaryview); @@ -6919,44 +6665,6 @@ static gboolean summary_update_folder_hook(gpointer so return FALSE; } -/*! - *\brief change summaryview to display your answer(s) to a message - * - *\param summaryview The SummaryView ;) - *\param msginfo The message for which answers are searched - * - */ -static void summary_find_answers (SummaryView *summaryview, MsgInfo *msg) -{ - FolderItem *sent_folder = NULL; - PrefsAccount *account = NULL; - GtkCMCTreeNode *node = NULL; - char *buf = NULL; - if (msg == NULL || msg->msgid == NULL) - return; - - account = account_get_reply_account(msg, prefs_common.reply_account_autosel); - if (account == NULL) - return; - sent_folder = account_get_special_folder - (account, F_OUTBOX); - - buf = g_strdup_printf("inreplyto matchcase \"%s\"", msg->msgid); - - if (sent_folder != summaryview->folder_item) { - folderview_select(summaryview->mainwin->folderview, sent_folder); - } - - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(summaryview->toggle_search), TRUE); - - quicksearch_set(summaryview->quicksearch, ADVANCED_SEARCH_EXTENDED, buf); - g_free(buf); - - node = gtk_cmctree_node_nth(GTK_CMCTREE(summaryview->ctree), 0); - if (node) - summary_select_node(summaryview, node, OPEN_SELECTED_ON_SEARCH_RESULTS); -} - gint summaryview_export_mbox_list(SummaryView *summaryview) /* return values: -2 skipped, -1 error, 0 OK */ { blob - aaba1409f76f847d7fee73040af35f9ba195b07e blob + fe141d0ae1637095ad074e5a1b7a74ae55b016df --- src/summaryview.h +++ src/summaryview.h @@ -67,8 +67,7 @@ typedef enum #include "mainwindow.h" #include "compose.h" #include "folder.h" -#include "gtksctree.h" -#include "quicksearch.h" +#include "gtk/gtksctree.h" extern GtkTargetEntry summary_drag_types[3]; @@ -97,7 +96,6 @@ struct _SummaryView GtkWidget *toggle_eventbox; GtkWidget *toggle_arrow; GtkWidget *toggle_search; - GtkWidget *quick_search_pixmap; GtkWidget *popupmenu; GtkWidget *headerpopupmenu; GtkWidget *tags_menu; @@ -120,7 +118,6 @@ struct _SummaryView FolderView *folderview; MessageView *messageview; MessageView *ext_messageview; - QuickSearch *quicksearch; FolderItem *folder_item; @@ -309,7 +306,6 @@ void summary_set_prefs_from_folderitem void summary_save_prefs_to_folderitem (SummaryView *summaryview, FolderItem *item); gint summaryview_export_mbox_list (SummaryView *summaryview); -void summaryview_activate_quicksearch(SummaryView *summaryview, gboolean show); void summary_set_menu_sensitive (SummaryView *summaryview); void summary_relayout(SummaryView *summaryview); void summary_update_unread(SummaryView *summaryview, FolderItem *removed_item); blob - b0a256e2a266e724bab6187521018fa45be7be77 (mode 644) blob + /dev/null --- src/tests/Makefile.am +++ /dev/null @@ -1,17 +0,0 @@ -include $(top_srcdir)/tests.mk - -common_ldadd = \ - $(GLIB_LIBS) - -AM_CPPFLAGS = \ - $(GLIB_CFLAGS) \ - -I$(top_srcdir)/src \ - -I$(top_srcdir)/src/common - -TEST_PROGS += entity_test -entity_test_SOURCES = entity_test.c -entity_test_LDADD = $(common_ldadd) ../entity.o - -noinst_PROGRAMS = $(TEST_PROGS) - -.PHONY: test blob - 00c0cd06217a288f2ff7c27b4f37f7a86d88b5df blob + fc163c23838c4cde9501470d8b8ab2bc9cb7a199 --- src/textview.h +++ src/textview.h @@ -19,10 +19,6 @@ #ifndef __TEXTVIEW_H__ #define __TEXTVIEW_H__ -#ifdef HAVE_CONFIG_H -#include "claws-features.h" -#endif - #include #include blob - f64011d3faceadb829544d40c44e1e50131fe023 blob + c02b5486692b06c557480e905ffd6f85d953befb --- src/undo.h +++ src/undo.h @@ -33,7 +33,7 @@ typedef enum UNDO_ACTION_REPLACE_DELETE } UndoAction; -typedef enum +typedef enum { UNDO_STATE_TRUE, UNDO_STATE_FALSE, @@ -49,7 +49,7 @@ typedef void (*UndoChangeStateFunc) (UndoMain *undostr gint redo_state, gpointer data); -struct _UndoMain +struct _UndoMain { GtkTextView *textview; @@ -74,12 +74,12 @@ void undo_set_change_state_func (UndoMain *undostruct UndoChangeStateFunc func, gpointer data); -void undo_undo (UndoMain *undostruct); -void undo_redo (UndoMain *undostruct); +void undo_undo (UndoMain *undostruct); +void undo_redo (UndoMain *undostruct); void undo_block (UndoMain *undostruct); void undo_unblock (UndoMain *undostruct); -void undo_wrapping (UndoMain *undostruct, +void undo_wrapping (UndoMain *undostruct, gboolean wrap); -void undo_paste_clipboard (GtkTextView *textview, +void undo_paste_clipboard (GtkTextView *textview, UndoMain *undostruct); #endif /* __UNDO_H__ */ blob - aa5a2810a61733f948eb2c5cbc1b6fd4ce84fae8 (mode 644) blob + /dev/null --- tests.mk +++ /dev/null @@ -1,67 +0,0 @@ -GTESTER = gtester -GTESTER_REPORT = gtester-report - -# initialize variables for unconditional += appending -TEST_PROGS = - -### testing rules - -# test: run all tests in cwd and subdirs -test: test-cwd test-recurse -# test-cwd: run tests in cwd -test-cwd: ${TEST_PROGS} - @[ -z "$(TEST_PROGS)" ] || { set -e; $(TESTS_ENVIRONMENT) ${GTESTER} --verbose ${TEST_PROGS}; } - -# test-recurse: run tests in subdirs -test-recurse: - @ for subdir in $(SUBDIRS) ; do \ - test "$$subdir" = "." \ - -o "$$subdir" = "config" \ - -o "$$subdir" = "doc" \ - -o "$$subdir" = "manual" \ - -o "$$subdir" = "m4" \ - -o "$$subdir" = "po" \ - -o "$$subdir" = "tools" \ - || \ - ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) test ) || exit $? ; \ - done -# test-report: run tests in subdirs and generate report -# perf-report: run tests in subdirs with -m perf and generate report -# full-report: like test-report: with -m perf and -m slow -test-report perf-report full-report: ${TEST_PROGS} - @ ignore_logdir=true ; \ - if test -z "$$GTESTER_LOGDIR" ; then \ - GTESTER_LOGDIR=`mktemp -d "\`pwd\`/.testlogs-XXXXXX"`; export GTESTER_LOGDIR ; \ - ignore_logdir=false ; \ - fi ; \ - for subdir in $(SUBDIRS) ; do \ - test "$$subdir" = "." -o "$$subdir" = "po" -o "$$subdir" = "po-properties" || \ - ( cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $@ ) || exit $? ; \ - done ; \ - test -z "${TEST_PROGS}" || { \ - case $@ in \ - test-report) test_options="-k";; \ - perf-report) test_options="-k -m=perf";; \ - full-report) test_options="-k -m=perf -m=slow";; \ - esac ; \ - set -e; \ - if test -z "$$GTESTER_LOGDIR" ; then \ - ${GTESTER} --verbose $$test_options -o test-report.xml ${TEST_PROGS} ; \ - elif test -n "${TEST_PROGS}" ; then \ - ${GTESTER} --verbose $$test_options -o `mktemp "$$GTESTER_LOGDIR/log-XXXXXX"` ${TEST_PROGS} ; \ - fi ; \ - }; \ - $$ignore_logdir || { \ - echo '' > $@.xml ; \ - echo '' >> $@.xml ; \ - for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \ - sed '1,1s/^?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \ - done ; \ - echo >> $@.xml ; \ - echo '' >> $@.xml ; \ - rm -rf "$$GTESTER_LOGDIR"/ ; \ - ${GTESTER_REPORT} --version 2>/dev/null 1>&2 ; test "$$?" != 0 || ${GTESTER_REPORT} $@.xml >$@.html ; \ - } -.PHONY: test test-cwd test-recurse test-report perf-report full-report -# run make test-cwd as part of make check -check-local: test-cwd