commit - e4802dc8e436eb2cd46f072685db270a35d8e0c1
commit + a779100e89f76b46207774de124576ca9f5530df
blob - 08e81c7ec7cd417867a39d64a9e34a0ba8f0ea3f
blob + 91a54e50843f940e900dd835f2d56fd7b9f08552
--- .gitignore
+++ .gitignore
*.loT
*.o
*.swp
-Makefile
-Makefile.in
/ChangeLog
/*.tar.gz
/*.tar.bz2
/TAGS
/version
.zig-cache
+zig-out
src/fence/zig-out/
-*~
blob - eb55d180458d4be11143984ace1d3ef4c5db4047 (mode 644)
blob + /dev/null
--- Makefile.am
+++ /dev/null
-# 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
-#!/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
-#undef USE_GNUTLS
blob - d4b3f0a129b8cfde47c6c5ab033a3a9f2e5b39a0 (mode 644)
blob + /dev/null
--- config/Makefile.am
+++ /dev/null
-
-.PHONY: test
blob - 3f1bef34a0f0d57a0561e71fc215e64905d9950c (mode 644)
blob + /dev/null
--- config/config.rpath
+++ /dev/null
-#! /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 <gord@gnu.ai.mit.edu>, 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 <kc5tja@dolphin.openprojects.net> 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=/' <<EOF
-
-# How to pass a linker flag through the compiler.
-wl="$escaped_wl"
-
-# Static library suffix (normally "a").
-libext="$libext"
-
-# Shared library suffix (normally "so").
-shlibext="$shlibext"
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec="$escaped_hardcode_libdir_flag_spec"
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator="$hardcode_libdir_separator"
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct="$hardcode_direct"
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L="$hardcode_minus_L"
-
-EOF
blob - 6fbe5e117629c75a723710efc4b2e0341c17c895 (mode 644)
blob + /dev/null
--- config/mkinstalldirs
+++ /dev/null
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-
-scriptversion=2004-02-15.20
-
-# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain.
-#
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-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 <bug-automake@gnu.org>."
-
-# 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
-#! /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 <http://www.gnu.org/licenses/>.
-
-# 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 <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-# 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 <<END
-Usage:
- test-driver --test-name=NAME --log-file=PATH --trs-file=PATH
- [--expect-failure={yes|no}] [--color-tests={yes|no}]
- [--enable-hard-errors={yes|no}] [--]
- TEST-SCRIPT [TEST-SCRIPT-ARGUMENTS]
-The '--test-name', '--log-file' and '--trs-file' options are mandatory.
-END
-}
-
-test_name= # Used for reporting.
-log_file= # Where to save the output of the test script.
-trs_file= # Where to save the metadata of the test run.
-expect_failure=no
-color_tests=no
-enable_hard_errors=yes
-while test $# -gt 0; do
- case $1 in
- --help) print_usage; exit $?;;
- --version) echo "test-driver $scriptversion"; exit $?;;
- --test-name) test_name=$2; shift;;
- --log-file) log_file=$2; shift;;
- --trs-file) trs_file=$2; shift;;
- --color-tests) color_tests=$2; shift;;
- --expect-failure) expect_failure=$2; shift;;
- --enable-hard-errors) enable_hard_errors=$2; shift;;
- --) shift; break;;
- -*) usage_error "invalid option: '$1'";;
- *) break;;
- esac
- shift
-done
-
-missing_opts=
-test x"$test_name" = x && missing_opts="$missing_opts --test-name"
-test x"$log_file" = x && missing_opts="$missing_opts --log-file"
-test x"$trs_file" = x && missing_opts="$missing_opts --trs-file"
-if test x"$missing_opts" != x; then
- usage_error "the following mandatory options are missing:$missing_opts"
-fi
-
-if test $# -eq 0; then
- usage_error "missing argument"
-fi
-
-if test $color_tests = yes; then
- # Keep this in sync with 'lib/am/check.am:$(am__tty_colors)'.
- red='[0;31m' # Red.
- grn='[0;32m' # Green.
- lgn='[1;32m' # Light green.
- blu='[1;34m' # Blue.
- mgn='[0;35m' # Magenta.
- std='[m' # No color.
-else
- red= grn= lgn= blu= mgn= std=
-fi
-
-do_exit='rm -f $log_file $trs_file; (exit $st); exit $st'
-trap "st=129; $do_exit" 1
-trap "st=130; $do_exit" 2
-trap "st=141; $do_exit" 13
-trap "st=143; $do_exit" 15
-
-# Test script is run here.
-"$@" >$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
-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 <stdio.h>]], [[#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
-#!/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
-# 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
#include "hooks.h"
#include "passwordstore.h"
#include "file-utils.h"
-#ifdef USE_OAUTH2
#include "oauth2.h"
-#endif
enum {
ACCOUNT_IS_DEFAULT,
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)" :
"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
#include "procmsg.h"
#include "msgcache.h"
#include "textview.h"
-#include "matcher_parser.h" /* CLAWS */
#include "procheader.h"
typedef struct _Children Children;
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
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
#include "defs.h"
#include <glib.h>
blob - a056db6fa0283bfb88d85028a4880fc6596de068
blob + e1b0b7cbd1aadb1d6e64e591f0912073c34d4219
--- src/addr_compl.h
+++ src/addr_compl.h
/*
* 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
* Functions to maintain address cache.
*/
-#include "config.h"
-
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
blob - c6be90b275453fe7dcd26cc1b36369f21bad13cc
blob + 97193484230691929c8c7c9d57c378e74235f739
--- src/addrcache.h
+++ src/addrcache.h
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
*
*/
-#include "config.h"
-
#include <stdio.h>
#include <glib.h>
#include <glib/gi18n.h>
blob - c2d9f0a25df63058dc885a66d533163b80a8edbe
blob + 87abaa45c22e560dab7212003883a21427b73806
--- src/addressbook.h
+++ src/addressbook.h
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
* General primitive address item objects.
*/
-#include "config.h"
-
#include <glib.h>
#include <stdio.h>
#include <string.h>
blob - 7a30f42865926c098256d878128c70fc56c413a9
blob + 6f0c6968f9947d55ac6176d1b611103552411419
--- src/addrquery.c
+++ src/addrquery.c
* Functions to define an address query (a request).
*/
-#include "config.h"
-
#include <stdio.h>
#include <string.h>
#include <glib.h>
blob - ad4549b0d7e25182dbbdd090b63f69669916b20f
blob + ae8634ac19a7f8bff0e5e579ae7919c0a4592cb0
--- src/addrselect.c
+++ src/addrselect.c
* Address list item selection objects.
*/
-#include "config.h"
-
#include <stdio.h>
#include <glib.h>
blob - 2d563e43cf1381863dab4e9745dd21a9debbac58 (mode 644)
blob + /dev/null
--- src/advsearch.c
+++ /dev/null
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-# include "claws-features.h"
-#endif
-
-#include "advsearch.h"
-
-#include <glib.h>
-#include <ctype.h>
-
-#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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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
+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
+.{
+ // This is the default name used by packages depending on this one. For
+ // example, when a user runs `zig fetch --save <url>`, 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 <url>` 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
-# 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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <stdlib.h>
#include <locale.h>
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 () );
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
blob - b26aba294e09007db4649e9805c0c95023fa3445
blob + 8cb893eaf9445dc05be81c929724fcf1d404d6fb
--- src/common/defs.h
+++ src/common/defs.h
#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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <sys/wait.h>
blob - 33172c9c6d02b17b3034ebad4742ba1f4a4f8f94
blob + ddca061c9a85c654df8c77c2f34d3304512d2d85
--- src/common/hooks.c
+++ src/common/hooks.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include "utils.h"
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;
}
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);
{
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
blob - ffab44f1ba64a872af24bf4a2391304c02999c01
blob + d0e54254e5b70ed66449b9122d2f2d78570525ff
--- src/common/mgutils.c
+++ src/common/mgutils.c
* Definitions for generic functions.
*/
-#include "config.h"
-
#include <glib.h>
#include <stdio.h>
#include <string.h>
blob - 4a6fa714db7b7be31b5498589643fc1c15154023
blob + 6f83fe50f3bc287a203e5d46d31b0e16d36bb323
--- src/common/pkcs5_pbkdf2.c
+++ src/common/pkcs5_pbkdf2.c
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#include "config.h"
-
#include <glib.h>
#include <sys/types.h>
blob - f2fb971389289cb8b6307846cb759fee7e1ebb13
blob + a9693e2fd6d59568343ab983d0102efcc3ae2788
--- src/common/prefs.c
+++ src/common/prefs.c
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <stdio.h>
#include "defs.h"
blob - 066b2b6800844a04d301ae89a7bcf9c34df0f2d5
blob + aa4750f14829fe975ae0d3daa18055adee39bec0
--- src/common/progressindicator.c
+++ src/common/progressindicator.c
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#include "config.h"
-
#include <glib.h>
#include "hooks.h"
blob - ea223613b8cfaf678f16aa7aa1decfba7c5f5907
blob + 016bcdcc22a4a6cf08952aaa852eac588dd064b0
--- src/common/quoted-printable.c
+++ src/common/quoted-printable.c
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#include "config.h"
-
#include <glib.h>
#include <ctype.h>
blob - 27c8ef31d65613d80e372d9be34afe36ca51195b
blob + fc978ef17282eeb94bc19090a4da579f2894885f
--- src/common/session.c
+++ src/common/session.c
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
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);
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;
return -1;
}
}
-#endif
/* we could have gotten a timeout while waiting for user input in
* an SSL certificate dialog */
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);
return 0;
}
-#ifdef USE_GNUTLS
gint session_start_tls(Session *session)
{
gboolean nb_mode;
return 0;
}
-#endif
gint session_send_msg(Session *session, const gchar *msg)
{
blob - f3b028415b965a828068ca32d497e096991516f4
blob + 2d8ccb012c2dfb2ab48f43d9ecff1616083eaa41
--- src/common/session.h
+++ src/common/session.h
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,
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#ifdef ENABLE_NLS
#include <glib/gi18n.h>
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);
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;
&&
(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;
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;
return SM_ERROR;
}
-#ifdef USE_GNUTLS
static gint smtp_starttls(SMTPSession *session)
{
session->state = SMTP_STARTTLS;
return SM_OK;
}
-#endif
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;
return SM_OK;
}
-#endif
static gint smtp_auth_login(SMTPSession *session)
{
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;
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);
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;
}
smtp_session->tls_init_done = TRUE;
ret = smtp_ehlo(smtp_session);
-#endif
break;
case SMTP_AUTH:
ret = smtp_auth_recv(smtp_session, msg);
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
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#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
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);
NULL,
NULL
};
-#endif
static gint sock_connect_with_timeout (gint sock,
const struct sockaddr *serv_addr,
}
-#ifdef USE_GNUTLS
static gboolean ssl_sock_prepare(GSource *source, gint *timeout)
{
*timeout = 1;
return sock->callback(sock, sock->condition, sock->data);
}
-#endif
static gboolean sock_watch_cb(GIOChannel *source, GIOCondition condition,
gpointer data)
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;
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);
}
return read(fd, buf, len);
}
-#if USE_GNUTLS
static gint ssl_read(gnutls_session_t ssl, gchar *buf, gint len)
{
gint r;
}
}
-#endif
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)
return write(fd, buf, len);
}
-#if USE_GNUTLS
static gint ssl_write(gnutls_session_t ssl, const gchar *buf, gint len)
{
gint ret;
}
}
-#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)
return wrlen;
}
-#ifdef USE_GNUTLS
static gint ssl_write_all(gnutls_session_t ssl, const gchar *buf, gint len)
{
gint n, wrlen = 0;
return wrlen;
}
-#endif
gint sock_write_all(SockInfo *sock, const gchar *buf, gint len)
{
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)
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
typedef struct _SockInfo SockInfo;
-#ifdef USE_GNUTLS
-# include "ssl.h"
-#endif
+#include "ssl.h"
typedef enum
{
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#ifdef USE_GNUTLS
#include "defs.h"
#include <stdlib.h>
#include "ssl_certificate.h"
#include "hooks.h"
-#if GNUTLS_VERSION_NUMBER <= 0x020b00
-#include <gcrypt.h>
-GCRY_THREAD_OPTION_PTHREAD_IMPL;
-#endif
-
#include <libetpan/mailstream_ssl.h>
#include <pthread.h>
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,
return 0;
}
-#endif /* GNUTLS_VERSION_NUMBER < 0x030000 */
const gchar *claws_ssl_get_cert_file(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();
}
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);
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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __SSL_H__
SSL_STARTTLS
} SSLType;
-#ifdef USE_GNUTLS
#include <glib.h>
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>
-#if GNUTLS_VERSION_NUMBER >= 0x030000
#include <gnutls/abstract.h>
-#endif
#include "socket.h"
};
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#ifdef USE_GNUTLS
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>
#include <gnutls/pkcs12.h>
return ret;
}
-#if USE_GNUTLS
static gnutls_x509_crt_t x509_crt_copy(gnutls_x509_crt_t src)
{
int ret;
free(tmp.data);
return dest;
}
-#endif
static SSLCertificate *ssl_certificate_new(gnutls_x509_crt_t x509_cert, const gchar *host, gushort port)
{
return g_strdup(subject_cn);
}
-
-#endif /* USE_GNUTLS */
blob - f853a3fc569969b080f70e169d9af0c6caeb78b7
blob + 6f33cd5ef02c75afdf9982368ff11274a31fb5f2
--- src/common/ssl_certificate.h
+++ src/common/ssl_certificate.h
/*
* Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
+ * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
* and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __SSL_CERTIFICATE_H__
#include "claws-features.h"
#endif
-#ifdef USE_GNUTLS
#include <gnutls/gnutls.h>
#include <gnutls/x509.h>
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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#ifdef ENABLE_NLS
#include <glib/gi18n.h>
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;
buflen - 1);
buf[buflen - 1] = 0x00;
}
- return buf;
+ return buf;
}
return txt;
}
blob - 5a4a3251b8370edfcab37771e6aee636f0eb5188
blob + f974b90aef415621004d8c1d21d204d30edabb31
--- src/common/stringtable.c
+++ src/common/stringtable.c
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#include "config.h"
-
#include <glib.h>
#include <string.h>
#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
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
/*
- * Claws Mail templates subsystem
+ * Claws Mail templates subsystem
* Copyright (C) 2001 Alexander Barinov
* Copyright (C) 2001-2021 The Claws Mail team
*
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
tmpl->subject = NULL;
tmpl->from = NULL;
tmpl->to = NULL;
- tmpl->cc = NULL;
+ tmpl->cc = NULL;
tmpl->bcc = NULL;
tmpl->replyto = NULL;
tmpl->value = NULL;
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));
}
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);
}
else
if (filenum1 > filenum2)
ret = 1;
-
+
return ret;
}
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
-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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <string.h>
#include <ctype.h>
g_string_append(outbuf, p);
break;
}
-
+
quote_p = p;
while ((quote_p = strchr(quote_p, '"')) != NULL) {
if (quote_p && quote_p < eword_begin_p) {
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
* ?h=glib-2-30&id=9eb65dd3ed5e1a9638595cbe10699c7606376511
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
{
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
-
#include <ctype.h>
#define UUDECODE(c) (c=='`' ? 0 : c - ' ')
blob - d649c4ee484598bbb1d032a386a0b47cd92c64ce
blob + 5212692802e915ab7c545240fd22e8ffe2d8c084
--- src/common/xml.c
+++ src/common/xml.c
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <stdio.h>
#include <string.h>
blob - 75a1e50aaddaa611c2b759e4e9310de89e56bbff
blob + 18771428ffd4a769a492b41e72020fdccd777f6a
--- src/common/xmlprops.c
+++ src/common/xmlprops.c
* ***********************************************************************
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <stdio.h>
#include <string.h>
blob - ac045ca5e3a790284df1d44f516da523325967e8
blob + a6e4db599f826dd67ad9744c6e2dec9bb32b97c9
--- src/compose.c
+++ src/compose.c
#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"
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,
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;
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) {
* 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;
}
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);
}
"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);
(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);
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);
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
*/
/* 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 */
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;
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;
{
Compose *compose = (Compose *)data;
GList *file_list;
- gint files_inserted = 0;
file_list = filesel_select_multiple_files_open(_("Select file"), NULL);
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);
static void attach_uri_list(Compose *compose, GtkSelectionData *data)
{
GList *list, *tmp;
- int att = 0;
gchar *warn_files = NULL;
list = uri_list_extract_filenames(
utf8_filename);
g_free(warn_files);
warn_files = tmp_f;
- att++;
compose_attach_append
(compose, (const gchar *)tmp->data,
utf8_filename, NULL, NULL);
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);
}
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
-# 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
/*
* Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
+ * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
* and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#ifdef USE_GNUTLS
#include <libetpan/libetpan.h>
#include <libetpan/libetpan_version.h>
#include <gnutls/gnutls.h>
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);
#endif /* LIBETPAN_API_CURRENT >= 23 */
}
-
-#endif /* USE_GNUTLS */
blob - 4a862d8638aaa12002a7496b1c717f73f3fff7f0
blob + 4a285f7376bfd2c338cbcdebafd18c26054af9c3
--- src/etpan/etpan-ssl.h
+++ src/etpan/etpan-ssl.h
/*
* Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
+ * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
* and the Claws Mail team
*
* This program is free software; you can redistribute it and/or modify
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __ETPAN_SSL_H__
#include "claws-features.h"
#endif
-#ifdef USE_GNUTLS
-
#include <libetpan/libetpan.h>
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "etpan-thread-manager.h"
#include <glib.h>
blob - e5590f47c4ae734cb1a6f9e8461c5fffd42e1335
blob + a6f33bc49d03910d5620491f6df35516239cace8
--- src/etpan/imap-thread.c
+++ src/etpan/imap-thread.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include "imap-thread.h"
return result.error;
}
-#ifdef USE_GNUTLS
+
static void connect_ssl_run(struct etpan_thread_op * op)
{
int r;
return result.error;
}
-#endif
+
struct capa_param {
mailimap * imap;
};
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,
return result.error;
}
-#ifdef USE_GNUTLS
struct starttls_result {
int error;
};
}
return result.error;
}
-#endif
struct create_param {
mailimap * imap;
blob - f987326d639cdc02943f93229f20670c0c832090 (mode 644)
blob + /dev/null
--- src/fence/Makefile
+++ /dev/null
-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
folder_persist_prefs_free(pptable);
- prefs_matcher_read_config();
-
folder_write_list();
}
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);
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;
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
* 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
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 <tt>*msgs != NULL</tt>, 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
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,
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
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;
*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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
blob - d15f62336d67bfc15c132b150edf423e80be335d
blob + 3d04e1885c1d8758464be6462a0e039ee08103da
--- src/folderutils.c
+++ src/folderutils.c
*
*/
-#include "config.h"
-
#include <glib.h>
#include "utils.h"
blob - 46ac7693cd6b9c0f53511f61e9d74f96d17543ec
blob + 5b807c82b3cb5c7e37fa5144cbdcabe11a348d0b
--- src/folderview.c
+++ src/folderview.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
#include "mainwindow.h"
#include "folderview.h"
#include "summaryview.h"
-#include "summary_search.h"
#include "inputdialog.h"
#include "manage_window.h"
#include "alertpanel.h"
#include "hooks.h"
#include "folderutils.h"
#include "prefs_folder_column.h"
-#include "quicksearch.h"
#include "manual.h"
#include "log.h"
#include "gtkcmctree.h"
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);
{"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) },
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;
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)
(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) {
if (!event) return FALSE;
- if (quicksearch_has_focus(folderview->summaryview->quicksearch))
- return FALSE;
-
switch (event->keyval) {
case GDK_KEY_Right:
if (folderview->selected) {
}
}
-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
-# 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <glib.h>
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,
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);
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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
GtkWidget *combo;
va_list args;
gchar *string;
-
+
if(text == NULL)
return NULL;
-
+
if (with_entry)
combo = gtk_combo_box_text_new_with_entry();
else
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;
}
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:
GtkTreeModel *model;
GtkTreeIter iter, child;
guint i;
-
+
if((model = gtk_combo_box_get_model(combobox)) == NULL)
return;
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
blob - 41b9f89f795791be33ee31dbbeecb148c746c9d3
blob + 8ae4c16c3f7cf9d1401a82f3d3ed845a6a42d30f
--- src/gtk/filesel.c
+++ src/gtk/filesel.c
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
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);
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,
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);
*(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))
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';
list = g_list_append(list, slist->data);
slist = slist->next;
}
-
+
if (slist_orig)
g_slist_free(slist_orig);
-
+
return list;
}
/**
* 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
*
*/
-#include "config.h"
-#include "defs.h"
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
blob - 6aff7c088429708ce9b5960b3e1e62505d6bb196
blob + c77f4fb773f9152c1bca57745b6b874af1f55a01
--- src/gtk/gtkcmclist.c
+++ src/gtk/gtkcmclist.c
/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald,
- * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald,
+ * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* 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 <config.h>
-
#include <stdlib.h>
#include <string.h>
(((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))
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,
/* returns the total width of the list */
static inline gint
-LIST_WIDTH (GtkCMCList * clist)
+LIST_WIDTH (GtkCMCList * clist)
{
gint last_column;
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,
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,
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,
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;
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 */
"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,
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,
"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,
"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,
"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,
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,
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;
}
{
return gtk_cmclist_new_with_titles (columns, NULL);
}
-
+
GtkWidget*
gtk_cmclist_new_with_titles (gint columns,
gchar *titles[])
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)
if (clist->vadjustment == adjustment)
return;
-
+
old_adjustment = clist->vadjustment;
if (clist->vadjustment)
}
}
-void
+void
gtk_cmclist_column_titles_hide (GtkCMCList *clist)
{
cm_return_if_fail (GTK_IS_CMCLIST (clist));
else
gtk_widget_hide (clist->column[column].button);
}
-
+
gtk_widget_queue_resize (GTK_WIDGET(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);
}
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 &&
{
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);
}
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
}
static gint
-list_requisition_width (GtkCMCList *clist)
+list_requisition_width (GtkCMCList *clist)
{
GtkRequisition requisition;
gint width = CELL_SPACING;
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;
}
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:
* gtk_cmclist_get_pixtext
* gtk_cmclist_set_shift
*/
-GtkCMCellType
+GtkCMCellType
gtk_cmclist_get_cell_type (GtkCMCList *clist,
gint row,
gint column)
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);
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);
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);
GtkStyle *style;
GtkCMCell *cell;
gchar *text;
-
+
get_cell_style (clist, clist_row, GTK_STATE_NORMAL, column, &style);
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;
}
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
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);
requisition->width += width;
requisition->height = MAX (requisition->height, height);
break;
-
+
default:
break;
}
gtk_cmclist_clear (GtkCMCList *clist)
{
cm_return_if_fail (GTK_IS_CMCLIST (clist));
-
+
GTK_CMCLIST_GET_CLASS (clist)->clear (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 &&
}
}
}
-
+
/* 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,
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)
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);
if (clist_row->destroy)
clist_row->destroy (clist_row->data);
-
+
clist_row->data = data;
clist_row->destroy = destroy;
}
return -1;
}
-void
+void
gtk_cmclist_swap_rows (GtkCMCList *clist,
- gint row1,
+ gint row1,
gint row2)
{
gint first, last;
gtk_cmclist_row_move (clist, last, first);
gtk_cmclist_row_move (clist, first + 1, last);
-
+
gtk_cmclist_thaw (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,
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);
}
g_signal_emit (G_OBJECT (clist), clist_signals[UNSELECT_ROW], 0,
row, -1, NULL);
- }
+ }
}
gboolean
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,
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
{
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;
if (row_selected)
return;
-
+
default:
break;
}
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);
{
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);
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)
{
GList *list;
gint i;
-
+
cm_return_if_fail (GTK_IS_CMCLIST (clist));
if (clist_has_grab (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;
}
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;
gint undo_anchor)
{
cm_return_if_fail (GTK_IS_CMCLIST (clist));
-
+
if (clist->selection_mode != GTK_SELECTION_MULTIPLE || clist->anchor >= 0)
return;
}
}
}
- }
+ }
if (clist->anchor < clist->drag_pos)
{
}
}
}
-
+
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,
d = 1;
else
d = -1;
-
+
if (clist->focus_row >= row)
{
if (d > 0 || clist->focus_row > row)
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;
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);
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);
!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)
{
row, column, event);
break;
}
-
+
if (event->state & GDK_CONTROL_MASK)
{
if (event->state & GDK_SHIFT_MASK)
return TRUE;
}
-
+
return FALSE;
}
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)
{
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;
break;
}
}
-
+
if (ROW_TOP_YPIXEL(clist, row) < 0)
move_vertical (clist, row, 0);
else if (ROW_TOP_YPIXEL(clist, row) + clist->row_height >
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 =
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,
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,
clist->column_title_area.width,
clist->column_title_area.height);
}
-
+
/* column button allocation */
size_allocate_columns (clist, FALSE);
size_allocate_title_buttons (clist);
return;
clist = GTK_CMCLIST (container);
-
+
/* callback for the column buttons */
for (i = 0; i < clist->columns; i++)
if (clist->column[i].button)
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);
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;
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--)
;
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;
/* calculate real width for column justification */
-
+
layout = _gtk_cmclist_create_cell_layout (clist, clist_row, i);
if (layout)
{
}
}
-static void
+static void
draw_xor_line (GtkCMCList *clist)
{
cairo_t *cr;
clist_refresh (GtkCMCList *clist)
{
cm_return_if_fail (GTK_IS_CMCLIST (clist));
-
+
if (CLIST_UNFROZEN (clist))
- {
+ {
adjust_adjustments (clist, FALSE);
draw_rows (clist, NULL);
}
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)
}
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);
* vadjustment_changed
* hadjustment_changed
* vadjustment_value_changed
- * hadjustment_value_changed
+ * hadjustment_value_changed
* check_exposures
*/
static void
{
gdk_window_scroll (clist->clist_window, 0, dy);
}
-
+
return;
}
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);
}
}
scroll_data.window = ALLOCATION_WINDOW (widget);
else
scroll_data.window = NULL;
-
+
scroll_data.dx = dx;
-
+
adjust_allocation_recurse (widget, &scroll_data);
}
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))
{
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);
cairo_destroy(cr);
}
-/* PRIVATE
+/* PRIVATE
* Memory Allocation/Distruction Routines for GtkCMCList stuctures
*
* functions:
for (i = 0; i < clist->columns; i++)
g_free (clist->column[i].title);
-
+
g_free (clist->column);
}
if (clist->focus_row < 0)
{
clist->focus_row = 0;
-
+
if ((clist->selection_mode == GTK_SELECTION_BROWSE ||
clist->selection_mode == GTK_SELECTION_MULTIPLE) &&
!clist->selection)
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:
if (title_focus_in (clist, direction))
return TRUE;
}
-
+
if (!is_current_focus && clist->rows)
{
gtk_cmclist_focus_content_area (clist);
if (title_focus_in (clist, direction))
return TRUE;
}
-
+
if (!is_current_focus && !focus_child && clist->rows)
{
gtk_cmclist_focus_content_area (clist);
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);
}
GtkCMCList *clist = GTK_CMCLIST (widget);
gtk_cmclist_undraw_focus (widget);
-
+
GTK_CMCLIST_GET_CLASS (widget)->resync_selection (clist, (GdkEvent *) event);
return FALSE;
focus_column (GtkCMCList *clist, gint column, gint dir)
{
GtkWidget *child = clist->column[column].button;
-
+
if (gtk_widget_child_focus (child, dir))
{
return TRUE;
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))
{
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))
return TRUE;
}
}
-
+
return FALSE;
}
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)
{
clist->clist_window_width)
{
gint last_column;
-
+
for (last_column = clist->columns - 1;
last_column >= 0 && !clist->column[last_column].visible; last_column--);
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;
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;
default:
break;
}
- /* fallback is intentional */
+ /* fallback is intentional */
default:
if (old_focus_row != clist->focus_row &&
!(clist->selection_mode == GTK_SELECTION_MULTIPLE &&
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);
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)
}
}
-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;
}
default:
break;
}
-
+
switch (row2->cell[clist->sort_column].type)
{
case GTK_CMCELL_TEXT:
clist->undo_selection = NULL;
clist->undo_unselection = NULL;
}
-
+
clist->row_list = gtk_cmclist_mergesort (clist, clist->row_list, clist->rows);
work = clist->selection;
work->data = GINT_TO_POINTER (i);
work = work->next;
}
-
+
if (i == clist->rows - 1)
clist->row_list_end = list;
}
}
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);
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;
clist = GTK_CMCLIST (widget);
dest_info = g_dataset_get_data (context, "gtk-clist-drag-dest");
-
+
if (dest_info)
{
if (dest_info->cell.row >= 0 &&
}
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))
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;
}
}
-static void
+static void
gtk_cmclist_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
GtkSelectionData *selection_data,
}
void
-gtk_cmclist_set_reorderable (GtkCMCList *clist,
+gtk_cmclist_set_reorderable (GtkCMCList *clist,
gboolean reorderable)
{
GtkWidget *widget;
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
/* GTK - The GIMP Toolkit
- * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald,
- * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
+ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball, Josh MacDonald,
+ * Copyright (C) 1997-1998 Jay Painter <jpaint@serv.net><jpaint@gimp.org>
*
* GtkCMCTree widget for GTK+
* Copyright (C) 1998 Lars Hamann and Stefan Jeske
* 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 <config.h>
#include <stdlib.h>
#include <gtk/gtk.h>
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,
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,
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,
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,
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,
if (klass->type == PANGO_ATTR_FOREGROUND)
return TRUE;
- return FALSE;
+ return FALSE;
}
static PangoLayout *
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) ?
pango_attr_list_unref(rem);
}
}
-
+
return layout;
-
+
default:
return NULL;
}
GtkCMCTree *ctree;
GdkRectangle *crect;
GdkRectangle row_rectangle;
- GdkRectangle cell_rectangle;
+ GdkRectangle cell_rectangle;
GdkRectangle clip_rectangle;
GdkRectangle intersect_rectangle;
gint last_column;
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;
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
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--)
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);
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);
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);
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,
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
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 ||
return TRUE;
}
}
-
+
return GTK_WIDGET_CLASS (parent_class)->button_press_event (widget, event);
}
GtkCMCTreeNode *node)
{
GtkCMCTreeNode *work;
-
+
if (!node)
return NULL;
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);
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;
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;
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;
}
}
- 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)
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;
}
static void
-gtk_cmctree_unlink (GtkCMCTree *ctree,
+gtk_cmctree_unlink (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gboolean update_focus_row)
{
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;
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);
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;
if (source_row < dest_row)
{
- GtkCMCTreeNode *work;
+ GtkCMCTreeNode *work;
dest_row++;
work = GTK_CMCTREE_ROW (node)->children;
static void
real_tree_move (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
- GtkCMCTreeNode *new_parent,
+ GtkCMCTreeNode *new_parent,
GtkCMCTreeNode *new_sibling)
{
GtkCMCList *clist;
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)
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;
{
if (new_parent == GTK_CMCTREE_ROW (node)->parent)
return;
-
+
if (new_parent)
new_sibling = GTK_CMCTREE_ROW (new_parent)->children;
else
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;
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))
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))
}
}
-static void
+static void
real_tree_expand (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
return;
clist = GTK_CMCLIST (ctree);
-
+
GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
GTK_CMCTREE_ROW (node)->expanded = TRUE;
(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;
}
/* 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);
}
gint tmp = 0;
gint row;
gint i;
-
+
if (visible && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist))
{
cell_width = g_new0 (gint, clist->columns);
requisition.width);
}
-static void
+static void
real_tree_collapse (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
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;
(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;
}
/* 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);
}
/* resize tree_column if needed */
column_auto_resize (clist, >K_CMCTREE_ROW (node)->row, ctree->tree_column,
requisition.width);
-
+
}
static void
requisition->width = logical_rect.width;
requisition->height = logical_rect.height;
-
+
g_object_unref (G_OBJECT (layout));
}
else
}
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 *
case GTK_CMCELL_WIDGET:
/* unimplemented */
break;
-
+
default:
break;
}
default:
break;
}
-
+
if (visible && clist->column[column].auto_resize &&
!GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist))
column_auto_resize (clist, clist_row, column, requisition.width);
g_object_unref (old_pixbuf);
}
-static void
+static void
set_node_info (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
const gchar *text,
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);
}
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));
}
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 &&
}
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)
}
static void
-tree_expand (GtkCMCTree *ctree,
- GtkCMCTreeNode *node,
+tree_expand (GtkCMCTree *ctree,
+ GtkCMCTreeNode *node,
gpointer data)
{
if (node && !GTK_CMCTREE_ROW (node)->expanded)
}
static void
-tree_collapse (GtkCMCTree *ctree,
- GtkCMCTreeNode *node,
+tree_collapse (GtkCMCTree *ctree,
+ GtkCMCTreeNode *node,
gpointer data)
{
if (node && GTK_CMCTREE_ROW (node)->expanded)
}
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)
ctree_row->children = NULL;
ctree_row->pixbuf_closed = NULL;
ctree_row->pixbuf_opened = NULL;
-
+
return ctree_row;
}
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,
}
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))
{
sel_row = list->data;
list = list->next;
-
+
if (node == sel_row)
node_selected = TRUE;
else
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);
}
{
GtkCMCTree *ctree;
GtkCMCTreeNode *node;
-
+
cm_return_if_fail (GTK_IS_CMCTREE (clist));
ctree = GTK_CMCTREE (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;
GtkCMCTree *ctree;
GtkCMCTreeNode *node;
GList *list;
-
+
cm_return_if_fail (GTK_IS_CMCTREE (clist));
-
+
ctree = GTK_CMCTREE (clist);
switch (clist->selection_mode)
}
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;
(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
}
GtkWidget*
-gtk_cmctree_new_with_titles (gint columns,
+gtk_cmctree_new_with_titles (gint columns,
gint tree_column,
gchar *titles[])
{
}
GtkWidget *
-gtk_cmctree_new (gint columns,
+gtk_cmctree_new (gint columns,
gint tree_column)
{
return gtk_cmctree_new_with_titles (columns, tree_column, NULL);
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,
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)
work, func, data);
if (new_child)
child = new_child;
- }
-
+ }
+
gtk_cmclist_thaw (clist);
return cnode;
gnode = g_node_new (NULL);
depth = g_node_depth (parent) + 1;
-
+
if (!func (ctree, depth, gnode, node, data))
{
g_node_destroy (gnode);
return gnode;
}
-
+
static void
real_remove_row (GtkCMCList *clist,
gint row)
}
void
-gtk_cmctree_remove_node (GtkCMCTree *ctree,
+gtk_cmctree_remove_node (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
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);
void
-gtk_cmctree_post_recursive (GtkCMCTree *ctree,
+gtk_cmctree_post_recursive (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
GtkCMCTreeFunc func,
gpointer data)
}
void
-gtk_cmctree_post_recursive_to_depth (GtkCMCTree *ctree,
+gtk_cmctree_post_recursive_to_depth (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint depth,
GtkCMCTreeFunc func,
}
void
-gtk_cmctree_pre_recursive (GtkCMCTree *ctree,
+gtk_cmctree_pre_recursive (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
GtkCMCTreeFunc func,
gpointer data)
}
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)
{
}
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);
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;
}
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
while (GTK_CMCTREE_ROW (node) != ctree_row)
node = GTK_CMCTREE_ROW (node)->sibling;
-
+
return node;
}
if ((row >= GTK_CMCLIST(ctree)->rows))
return NULL;
-
+
return GTK_CMCTREE_NODE (g_list_nth (GTK_CMCLIST (ctree)->row_list, row));
}
while (node)
{
- if (node == child)
+ if (node == child)
return TRUE;
if (GTK_CMCTREE_ROW (node)->children)
{
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;
}
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))
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);
}
{
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)
{
gtk_cmclist_thaw (clist);
}
-void
+void
gtk_cmctree_expand_to_depth (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint depth)
{
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)
{
gtk_cmclist_thaw (clist);
}
-void
+void
gtk_cmctree_collapse_to_depth (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint depth)
{
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)
{
gboolean thaw = FALSE;
cm_return_if_fail (GTK_IS_CMCTREE (ctree));
-
+
if (node && GTK_CMCTREE_ROW (node)->is_leaf)
return;
gtk_cmclist_freeze (clist);
thaw = TRUE;
}
-
+
gtk_cmctree_post_recursive (ctree, node,
GTK_CMCTREE_FUNC (tree_toggle_expansion), NULL);
}
void
-gtk_cmctree_select (GtkCMCTree *ctree,
+gtk_cmctree_select (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
cm_return_if_fail (GTK_IS_CMCTREE (ctree));
}
void
-gtk_cmctree_unselect (GtkCMCTree *ctree,
+gtk_cmctree_unselect (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
cm_return_if_fail (GTK_IS_CMCTREE (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;
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))
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;
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);
}
***********************************************************/
-void
+void
gtk_cmctree_node_set_text (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint column,
if (column < 0 || column >= GTK_CMCLIST (ctree)->columns)
return;
-
+
clist = GTK_CMCLIST (ctree);
GTK_CMCLIST_GET_CLASS (clist)->set_cell_contents
tree_draw_node (ctree, node);
}
-void
+void
gtk_cmctree_node_set_pixbuf (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint column,
tree_draw_node (ctree, node);
}
-void
+void
gtk_cmctree_node_set_pixtext (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint column,
tree_draw_node (ctree, node);
}
-void
+void
gtk_cmctree_set_node_info (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
const gchar *text,
{
gboolean old_leaf;
gboolean old_expanded;
-
+
cm_return_if_fail (GTK_IS_CMCTREE (ctree));
cm_return_if_fail (node != NULL);
{
GtkCMCTreeNode *work;
GtkCMCTreeNode *ptr;
-
+
work = GTK_CMCTREE_ROW (node)->children;
while (work)
{
}
GTK_CMCTREE_ROW (node)->expanded = (is_leaf) ? FALSE : expanded;
-
+
tree_draw_node (ctree, node);
}
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));
GTK_CMCLIST_GET_CLASS (clist)->resync_selection (clist, NULL);
}
gtk_cmctree_unselect (ctree, node);
- }
+ }
}
gboolean
return GTK_CMCTREE_ROW (node)->row.selectable;
}
-GtkCMCellType
+GtkCMCellType
gtk_cmctree_node_get_cell_type (GtkCMCTree *ctree,
GtkCMCTreeNode *node,
gint column)
{
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;
}
{
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;
*is_leaf = GTK_CMCTREE_ROW (node)->is_leaf;
if (expanded)
*expanded = GTK_CMCTREE_ROW (node)->expanded;
-
+
return TRUE;
}
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,
if (GTK_CMCTREE_ROW (node)->row.style == style)
return;
-
+
visible = gtk_cmctree_is_viewable (ctree, node);
if (visible && !GTK_CMCLIST_AUTO_RESIZE_BLOCKED (clist))
{
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,
{
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;
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);
}
***********************************************************/
void
-gtk_cmctree_set_indent (GtkCMCTree *ctree,
+gtk_cmctree_set_indent (GtkCMCTree *ctree,
gint indent)
{
GtkCMCList *clist;
}
void
-gtk_cmctree_set_spacing (GtkCMCTree *ctree,
+gtk_cmctree_set_spacing (GtkCMCTree *ctree,
gint spacing)
{
GtkCMCList *clist;
}
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));
}
}
-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;
{
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;
}
}
void
-gtk_cmctree_sort_recursive (GtkCMCTree *ctree,
+gtk_cmctree_sort_recursive (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
GtkCMCList *clist;
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;
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)
}
void
-gtk_cmctree_sort_node (GtkCMCTree *ctree,
+gtk_cmctree_sort_node (GtkCMCTree *ctree,
GtkCMCTreeNode *node)
{
GtkCMCList *clist;
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;
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)
return;
ctree = GTK_CMCTREE (clist);
-
+
clist->freeze_count++;
i = MIN (clist->anchor, clist->drag_pos);
{
node = list->data;
list = list->next;
-
+
unselect = TRUE;
if (gtk_cmctree_is_viewable (ctree, node))
node);
}
}
- }
+ }
if (clist->anchor < clist->drag_pos)
{
}
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;
}
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);
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)
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;
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,
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;
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
*
*/
-#include "config.h"
-
#include <stdlib.h>
#include "gtksctree.h"
blob - 79b4f2fa68fdf58072f9b8c16447bbd5d550da50
blob + 0d285b7c4b3e5aa40ba6496390b08d61e2f2e460
--- src/gtk/gtksctree.h
+++ src/gtk/gtksctree.h
#define __GTK_SCTREE_H__
#include <gtk/gtk.h>
-#include "gtk/gtkcmctree.h"
+#include "gtkcmctree.h"
/* This code is based on "gtkflist.{h,c}" from mc-4.5.42 .*/
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);
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);
* 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
* <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
-#include "claws-features.h"
-
#include "gtkunit.h"
#include <string.h>
blob - d66619c8914e396d3de0f25834feda26d8778fb5
blob + 03ef284e24ba5d1a2166b1501e0c4a52bd65b87a
--- src/gtk/gtkutils.c
+++ src/gtk/gtkutils.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdk.h>
#include <gtk/gtk.h>
-#include "gtk/gtksctree.h"
+#include "gtksctree.h"
#include <stdlib.h>
#include <stdarg.h>
#include <sys/stat.h>
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;
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
} \
}
-#if defined USE_GNUTLS
typedef struct _AutoConfigureData {
const gchar *ssl_service;
const gchar *tls_service;
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
* 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/.
*/
/*
* Modified by the Sylpheed Team and others 2003
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <gtk/gtk.h>
#include "utils.h"
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;
scrollbutton->timer = 0;
}
break;
-
+
default:
break;
-
+
}
if (new_value != value) {
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 {
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
blob - e30e4a77cd4453c2b397066752a26b336fb44da2
blob + 358476b305bf279649a0a6daf28b4818173e60ee
--- src/gtk/logwindow.c
+++ src/gtk/logwindow.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gdk/gdkkeysyms.h>
blob - 6dc8e1e72612ed87d7c02ee6015a6c3b14793fbb
blob + 7045166a436332dccd2be4ef7e4f4b386eda7fff
--- src/gtk/manage_window.c
+++ src/gtk/manage_window.c
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#include "config.h"
-
#include <glib.h>
#include <gtk/gtk.h>
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
*
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
blob - 39a49744c7da5e37f175989c294240648f762895
blob + 69efd83e92ecdf58bfc87d45e5fab249af88674c
--- src/gtk/prefswindow.c
+++ src/gtk/prefswindow.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <string.h>
blob - ae8f1ab0ab9a54c87996c26d3dcf20e0788cdc2b
blob + d3472b90d35422837c15fd757bc10003ab8061cc
--- src/gtk/progressdialog.c
+++ src/gtk/progressdialog.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
}
/*!
- *\return gint Row where data were set
+ *\return gint Row where data were set
*/
gint progress_dialog_list_set(ProgressDialog *progress,
gint row,
{
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);
* 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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include <defs.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <ctype.h>
-
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#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
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2012 Colin Leroy <colin@colino.net>
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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
#include <ctype.h>
#include <time.h>
#include <errno.h>
-#if HAVE_ICONV
-# include <iconv.h>
-#endif
+#include <iconv.h>
-#ifdef USE_GNUTLS
-# include "ssl.h"
-#endif
+#include "ssl.h"
#include "folder.h"
#include "session.h"
#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;
#define IMAP4_PORT 143
-#ifdef USE_GNUTLS
#define IMAPS_PORT 993
-#endif
#define IMAP_CMD_LIMIT 1000
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);
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,
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;
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;
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)
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;
"\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"),
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"))
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)
"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: "
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;
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) {
session->folder = folder;
IMAP_FOLDER(session->folder)->last_seen_separator = 0;
-#ifdef USE_GNUTLS
if (account->ssl_imap == SSL_STARTTLS) {
gint ok;
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");
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,
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)
{
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) {
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;
return MAILIMAP_NO_ERROR;
}
-#ifdef USE_GNUTLS
static gint imap_cmd_starttls(IMAPSession *session)
{
int r;
}
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <fcntl.h>
#include "hooks.h"
#include "logwindow.h"
#include "passwordstore.h"
-#ifdef USE_OAUTH2
#include "oauth2.h"
-#endif
static GList *inc_dialog_list = NULL;
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)
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,
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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __INC_H__
#include <glib.h>
#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
*
*/
-#include "config.h"
-
#include <glib.h>
#include "folder.h"
blob - 731f5f65a2fb8bf2309241cef64564d1f34ccd8d
blob + 41a8cb9425926796583bc46093dfc1925c44ce7e
--- src/main.c
+++ src/main.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
+#include "common/defs.h"
-#include "defs.h"
-
#include <glib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#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"
#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"
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
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);
}
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);
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);
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);
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();
}
main_window_destroy_all();
- matcher_done();
prefs_toolbar_done();
avatars_done();
prefs_ext_prog_done();
prefs_wrapping_done();
prefs_compose_writing_done();
- prefs_quote_done();
prefs_summaries_done();
prefs_message_done();
prefs_other_done();
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"
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]);
} 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
#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"
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);
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);
{"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..."), "<control>F", NULL, G_CALLBACK(search_cb) },
- {"Edit/SearchFolder", NULL, N_("_Search folder..."), "<shift><control>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 },
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();
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)
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);
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));
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
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
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);
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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <ctype.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <pthread.h>
-
-#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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef MATCHER_H
#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;
#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);
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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef MATCHER_PARSER_H
-#define MATCHER_PARSER_H
-
-#include <glib.h>
-
-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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-/* 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 <http://www.gnu.org/licenses/>.
-*/
-
-/* 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
-%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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string.h>
-#include <glib.h>
-
-#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;
- }
-<string>\" {
- /* 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;
- }
-<string>\\. {
- /* take care of quoted characters */
- add_char(yytext[1]);
- }
-<string>. {
- 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
-%{
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-#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 <str> MATCHER_STRING
-%token <str> MATCHER_SECTION
-%token <str> 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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
blob - 7706c15bee311470f432bbe62801e3f179c7ea41
blob + 8497a870f195d931ce09c593604eae4fbd027dcd
--- src/messageview.h
+++ src/messageview.h
#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
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;
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
} 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
-/*
+/*
* Claws Mail -- a GTK based, lightweight, and fast e-mail client
* Copyright (C) 2002-2012 Hiroyuki Yamamoto & The Claws Mail Team
*
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
#include "claws-features.h"
#endif
-#ifdef USE_OAUTH2
-
#include "defs.h"
#include <glib.h>
#ifdef ENABLE_NLS
return (0);
}
-
-#endif /* USE_OAUTH2 */
blob - 9d441f57183c68e24f9192706bab97dd80c9e7ef
blob + 487a0f84251e2b54ebcf2d2ead7cea60c54f42d6
--- src/oauth2.h
+++ src/oauth2.h
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
-#ifdef HAVE_CONFIG_H
-#include "claws-features.h"
-#endif
+#ifndef _OAUTH2_H_
+#define _OAUTH2_H_
-#ifdef USE_OAUTH2
-
#include <glib.h>
#include "socket.h"
void account_read_oauth2_all (void);
-#endif /* USE_OAUTH2 */
+#endif /* _OAUTH2_H_ */
blob - f36f77ab8b322829d5077e63b1d0bf8dfe120649
blob + 2e23e403d81d150fa08339049c5365fc15dc16be
--- src/pop.c
+++ src/pop.c
#include "file-utils.h"
#include "oauth2.h"
-#ifdef USE_OAUTH2
#include "defs.h"
-#endif
typedef enum {
POP3_TOTALLY_RECEIVED = 0,
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);
return PS_SUCCESS;
}
-#ifdef USE_GNUTLS
static gint pop3_stls_send(Pop3Session *session)
{
session->state = POP3_STLS;
}
return PS_SUCCESS;
}
-#endif /* USE_GNUTLS */
static gint pop3_getauth_user_send(Pop3Session *session)
{
return PS_SUCCESS;
}
-#ifdef USE_OAUTH2
static gint pop3_getauth_oauth2_send_generic(Pop3Session *session)
{
gchar buf[MESSAGEBUFSIZE], *b64buf, *out;
: pop3_getauth_oauth2_send_generic(session)
);
}
-#endif
static gint pop3_getrange_stat_send(Pop3Session *session)
{
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
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;
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();
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);
}
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"));
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef __POP_H__
-#define __POP_H__
+#ifndef _POP_H_
+#define _POP_H_
-#ifdef HAVE_CONFIG_H
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <time.h>
typedef enum {
POP3_READY,
POP3_GREETING,
-#ifdef USE_GNUTLS
POP3_STLS,
-#endif
POP3_GETAUTH_USER,
POP3_GETAUTH_USER_PHASE2,
POP3_GETAUTH_PASS,
gint cur_total_bytes;
gint cur_total_recv_bytes;
-#ifdef USE_OAUTH2
gint two_stage_pop;
-#endif
+
Pop3MsgInfo *msg;
GHashTable *uidl_table;
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
#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 <gnutls/gnutls.h>
-#endif
static gboolean cancelled;
static gboolean new_account;
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;
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
{
GtkWidget *pop_auth_minutes_lbl;
} SendPage;
-#ifdef USE_OAUTH2
typedef struct Oauth2Page
{
PrefsPage page;
GtkWidget *oauth2_client_id_entry;
GtkWidget *oauth2_client_secret_entry;
} Oauth2Page;
-#endif
typedef struct
{
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 {
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);
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);
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);
};
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,
{"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}
};
};
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,
{"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}
};
&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,
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);
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);
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);
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);
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);
page->page.widget = vbox1;
}
-#ifdef USE_OAUTH2
static void oauth2_create_widget_func(PrefsPage * _page,
GtkWindow * window,
gpointer data)
}
}
}
-#endif
static void compose_create_widget_func(PrefsPage * _page,
GtkWindow * window,
GINT_TO_POINTER (data)); \
}
-#ifdef USE_GNUTLS
-
#define CREATE_RADIO_BUTTONS(box, \
btn1, btn1_label, btn1_data, \
btn2, btn2_label, btn2_data, \
}
#undef CREATE_RADIO_BUTTONS
-#endif /* USE_GNUTLS */
static void advanced_create_widget_func(PrefsPage * _page,
GtkWindow * window,
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);
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);
return 0;
}
-#endif
static gint prefs_compose_apply(void)
{
return 0;
}
-#ifdef USE_GNUTLS
static gint prefs_ssl_apply(void)
{
prefs_set_data_from_dialog(ssl_param);
return 0;
}
-#endif
static gint prefs_advanced_apply(void)
{
/* SendPage *page = (SendPage *) _page; */
}
-#ifdef USE_OAUTH2
static void oauth2_destroy_widget_func(PrefsPage *_page)
{
/* Oauth2Page *page = (Oauth2Page *) _page; */
oauth2_listener_cancel = 1;
}
}
-#endif
static void compose_destroy_widget_func(PrefsPage *_page)
{
/* 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)
{
return prefs_send_apply() >= 0;
}
-#ifdef USE_OAUTH2
static gboolean oauth2_can_close_func(PrefsPage *_page)
{
Oauth2Page *page = (Oauth2Page *) _page;
return prefs_oauth2_apply() >= 0;
}
-#endif
static gboolean compose_can_close_func(PrefsPage *_page)
{
return prefs_privacy_apply() >= 0;
}
-#ifdef USE_GNUTLS
static gboolean ssl_can_close_func(PrefsPage *_page)
{
SSLPage *page = (SSLPage *) _page;
return prefs_ssl_apply() >= 0;
}
-#endif
static gboolean advanced_can_close_func(PrefsPage *_page)
{
cancelled = FALSE;
}
-#ifdef USE_OAUTH2
static void oauth2_save_func(PrefsPage *_page)
{
Oauth2Page *page = (Oauth2Page *) _page;
if (prefs_oauth2_apply() >= 0)
cancelled = FALSE;
}
-#endif
static void compose_save_func(PrefsPage *_page)
{
cancelled = FALSE;
}
-#ifdef USE_GNUTLS
static void ssl_save_func(PrefsPage *_page)
{
SSLPage *page = (SSLPage *) _page;
if (prefs_ssl_apply() >= 0)
cancelled = FALSE;
}
-#endif
static void advanced_save_func(PrefsPage *_page)
{
prefs_account_register_page((PrefsPage *) &send_page);
}
-#ifdef USE_OAUTH2
static void register_oauth2_page(void)
{
static gchar *path[3];
prefs_account_register_page((PrefsPage *) &oauth2_page);
}
-#endif
static void register_compose_page(void)
{
prefs_account_register_page((PrefsPage *) &privacy_page);
}
-#ifdef USE_GNUTLS
static void register_ssl_page(void)
{
static gchar *path[3];
return TRUE;
}
-#endif
static void register_advanced_page(void)
{
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();
}
}
}
-#if (defined USE_GNUTLS)
static void auto_configure_cb (GtkWidget *widget, gpointer data)
{
gchar *address = NULL;
g_free(address);
}
-#endif
static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
{
g_free(utf8_filename);
}
-#ifdef USE_GNUTLS
static void prefs_account_in_cert_browse_cb(GtkWidget *widget, gpointer data)
{
gchar *filename;
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)
{
combobox_select_by_data(optmenu, type);
}
-#ifdef USE_OAUTH2
static void prefs_account_oauth2_provider_set_data_from_optmenu(PrefParam *pparam)
{
*((Oauth2Service *)pparam->data) =
g_free(trim_text);
g_free(OAUTH2Data);
}
-#endif
static void prefs_account_set_autochk_interval_to_widgets(PrefParam *pparam)
{
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);
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);
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);
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);
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);
}
}
-#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)
{
return (i);
}
-#endif
blob - 50616c5f01f61e1d49e65f1681c12f53c3c6b928
blob + 8a85530fbd2af8cdc1c8369b273b83b1da62fc18
--- src/prefs_actions.c
+++ src/prefs_actions.c
#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
#include "manage_window.h"
-#include "quote_fmt.h"
-#include "prefs_template.h"
#include "alertpanel.h"
#include "combobox.h"
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
#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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#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
#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
{
{"<Actions>/Menu/Edit/Copy", "<control>C"},
{"<Actions>/Menu/Edit/SelectAll", "<control>A"},
{"<Actions>/Menu/Edit/Find", "<control>F"},
- {"<Actions>/Menu/Edit/SearchFolder", "<shift><control>F"},
- {"<Actions>/Menu/Edit/QuickSearch", "slash"},
{"<Actions>/Menu/View/ShowHide/MenuBar", "<control>F12"},
{"<Actions>/Menu/View/ShowHide/MessageView", "V"},
blob - 7337ce7277fc28969c3f8e5383173ca57800a79f (mode 644)
blob + /dev/null
--- src/prefs_quote.c
+++ /dev/null
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include "defs.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#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
-/*
- * Claws Mail -- a GTK based, lightweight, and fast e-mail client
- * Copyright (C) 2005-2012 Colin Leroy <colin@colino.net> & 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
#include "defs.h"
#include <stdio.h>
blob - 928d9a1b812ee74671940e1011d73dacdf8b58f6 (mode 644)
blob + /dev/null
--- src/prefs_template.c
+++ /dev/null
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#include "config.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/stat.h>
-
-#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 <john@example.com>";
- dummyinfo.to="John Doe <john@example.com>";
- dummyinfo.cc="John Doe <john@example.com>";
- 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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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
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
*
*/
-#include "config.h"
-
#include <glib.h>
#include <glib/gi18n.h>
blob - 65051dafc8f0c6b128384070754e58b73700c86f
blob + afe168ef00edaf09a2fd1e5788aebc6d1d9bfd5c
--- src/privacy.h
+++ src/privacy.h
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
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
#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);
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);
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
blob - 027a60392c240c682c4aec2ae41d228430884712 (mode 644)
blob + /dev/null
--- src/quote_fmt.c
+++ /dev/null
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#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_("<span weight=\"bold\">symbols:</span>"), NULL,
- "%date_fmt{<span style=\"oblique\">fmt</span>} (%D{<span style=\"oblique\">fmt</span>})", 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 <span style=\"oblique\">completion</span>: Cc"), /* completion of 'Cc' from address book */
- "%addrbook_from (%ABf)", N_("address book <span style=\"oblique\">completion</span>: From"), /* completion of 'From' from address book */
- "%addrbook_to (%ABt)", N_("address book <span style=\"oblique\">completion</span>: 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_("<span weight=\"bold\">commands:</span>"), NULL,
- "?x{<span style=\"oblique\">expr</span>}\n\n", N_("insert <span style=\"oblique\">expr</span> 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{<span style=\"oblique\">expr</span>}\n\n", N_("insert <span style=\"oblique\">expr</span> 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{<span style=\"oblique\">sub_expr</span>}\n(|f{<span style=\"oblique\">sub_expr</span>})", N_("insert file:\n<span style=\"oblique\">sub_expr</span> is evaluated as the path of the file to insert"), /* insert file */
- "|program{<span style=\"oblique\">sub_expr</span>}\n(|p{<span style=\"oblique\">sub_expr</span>})\n", N_("insert program output:\n<span style=\"oblique\">sub_expr</span> is evaluated as a command-line to get\nthe output from"), /* insert program output */
- "|input{<span style=\"oblique\">sub_expr</span>}\n(|i{<span style=\"oblique\">sub_expr</span>})\n", N_("insert user input:\n<span style=\"oblique\">sub_expr</span> is a variable to be replaced by\nuser-entered text"), /* insert user input */
- "|attach{<span style=\"oblique\">sub_expr</span>}\n(|a{<span style=\"oblique\">sub_expr</span>})", N_("attach file:\n<span style=\"oblique\">sub_expr</span> is evaluated as the path of the file to attach"), /* attach file */
- "|attach_program{<span style=\"oblique\">sub_expr</span>}\n(|A{<span style=\"oblique\">sub_expr</span>})", N_("attach file:\n<span style=\"oblique\">sub_expr</span> is evaluated as a command-line to get\nthe filename from"), /* attach file whose name's got from program output */
- "", NULL,
- N_("<span weight=\"bold\">definition of terms:</span>"), NULL,
- "<span style=\"oblique\">expr</span>\n", N_("text that can contain any of the symbols or\ncommands above"),
- "<span style=\"oblique\">sub_expr</span>\n", N_("text that can contain any of the symbols (no\ncommands) above"),
- "<span style=\"oblique\">completion</span>\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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-/* 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 <http://www.gnu.org/licenses/>.
-*/
-
-/* 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
-%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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#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 <S_NORMAL> 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;
- }
-%}
-
-<S_NORMAL>("%X"|"%cursor") /* cursor pos */ return SET_CURSOR_POS;
-<S_NORMAL>("%A"|"%email") /* email address */ return SHOW_MAIL_ADDRESS;
-<S_NORMAL>("%c"|"%cc") /* cc */ return SHOW_CC;
-<S_NORMAL>("%d"|"%date") /* date */ return SHOW_DATE;
-<S_NORMAL>("%D"|"%date_fmt") /* date */ { BEGIN S_DATE; return SHOW_DATE_EXPR; }
-<S_NORMAL>("%f"|"%from") /* from */ return SHOW_FROM;
-<S_NORMAL>("%F"|"%firstname") /* first name */ return SHOW_FIRST_NAME;
-<S_NORMAL>("%i"|"%messageid") /* message-id */ return SHOW_MESSAGEID;
-<S_NORMAL>("%I"|"%initials") /* initial of sender */ return SHOW_SENDER_INITIAL;
-<S_NORMAL>("%m"|"%msg_no_sig") /* message with no signature */ return SHOW_MESSAGE_NO_SIGNATURE;
-<S_NORMAL>("%M"|"%msg") /* message */ return SHOW_MESSAGE;
-<S_NORMAL>("%N"|"%fullname") /* full name */ return SHOW_FULLNAME;
-<S_NORMAL>("%L"|"%lastname") /* last name */ return SHOW_LAST_NAME;
-<S_NORMAL>("%r"|"%references") /* references */ return SHOW_REFERENCES;
-<S_NORMAL>("%s"|"%subject") /* subject */ return SHOW_SUBJECT;
-<S_NORMAL>("%t"|"%to") /* to */ return SHOW_TO;
-<S_NORMAL>("%tags") /* tags */ return SHOW_TAGS;
-<S_NORMAL>("%Q"|"%quoted_msg") /* quoted message */ return SHOW_QUOTED_MESSAGE;
-<S_NORMAL>("%q"|"%quoted_msg_no_sig") /* quoted message with no signature */ return SHOW_QUOTED_MESSAGE_NO_SIGNATURE;
-<S_NORMAL>("%af"|"%account_fullname") /* full name in compose account */ return SHOW_ACCOUNT_FULL_NAME;
-<S_NORMAL>("%am"|"%account_email") /* mail address in compose account */ return SHOW_ACCOUNT_MAIL_ADDRESS;
-<S_NORMAL>("%an"|"%account_name") /* compose account name itself */ return SHOW_ACCOUNT_NAME;
-<S_NORMAL>("%ao"|"%account_org") /* organization in compose account */ return SHOW_ACCOUNT_ORGANIZATION;
-<S_NORMAL>("%as"|"%account_sig") /* signature in compose account */ return SHOW_ACCOUNT_SIG;
-<S_NORMAL>("%asp"|"%account_sigpath") /* signature path in compose account */ return SHOW_ACCOUNT_SIGPATH;
-<S_NORMAL>("%ABc"|"%addrbook_cc") /* completion of 'Cc' from the address book */ return SHOW_ADDRESSBOOK_COMPLETION_FOR_CC;
-<S_NORMAL>("%ABf"|"%addrbook_from") /* completion of 'From' from the address book */ return SHOW_ADDRESSBOOK_COMPLETION_FOR_FROM;
-<S_NORMAL>("%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;
-<S_DATE>"{" return OPARENT;
-<S_DATE>"}" { BEGIN S_NORMAL; return CPARENT; }
-<S_NORMAL>"{" return OPARENT;
-<S_NORMAL>"}" return CPARENT;
-. { yylval.chr = yytext[0]; return CHARACTER; }
-
-%%
blob - e2ffe9eed119b172bbbbe4de04c4958cc64c992d (mode 644)
blob + /dev/null
--- src/quote_fmt_parse.y
+++ /dev/null
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-%{
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-
-#include <ctype.h>
-
-#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 <chr> CHARACTER
-%type <chr> character
-%type <str> 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
#include "inc.h"
#include "log.h"
#include "passwordstore.h"
-#ifdef USE_OAUTH2
#include "oauth2.h"
-#endif
typedef struct _SendProgressDialog SendProgressDialog;
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;
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
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
#ifndef __SEND_MESSAGE_H__
#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
*
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
blob - 67cde88183be4e97a90802f8421298679c298022
blob + 26d17c0cfbaf70b83355a94943312fdc4388ab27
--- src/sourcewindow.h
+++ src/sourcewindow.h
GtkWidget *window;
GtkWidget *scrolledwin;
GtkWidget *text;
-
+
gboolean updating;
gboolean deferred_destroy;
};
blob - 1f3e722e453b12d890cda5de7cd263f24d2994c0
blob + f0ba1d33447d015b543f34c36900b12172a791da
--- src/stock_pixmap.c
+++ src/stock_pixmap.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <gtk/gtk.h>
#include <string.h>
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;
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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#include "claws-features.h"
-#endif
-
-#include "defs.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#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
-/*
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef __SUMMARY_SEARCH_H__
-#define __SUMMARY_SEARCH_H__
-
-#include <glib.h>
-
-#include "summaryview.h"
-
-void summary_search (SummaryView *summaryview);
-
-#endif /* __SUMMARY_SEARCH_H__ */
blob - 9fbe2ea191b0c4d312454c00afdaf92c19fb0543
blob + 93b101bf84c5be0d2b0d135d00b4b45b1e067396
--- src/summaryview.c
+++ src/summaryview.c
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "config.h"
#include "defs.h"
#include <glib.h>
#include "hooks.h"
#include "description_window.h"
#include "folderutils.h"
-#include "quicksearch.h"
#include "log.h"
#include "manual.h"
#include "manage_window.h"
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);
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);
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);
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,
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);
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);
gtk_widget_show_all(vbox);
gtk_widget_show(vbox);
-
- if (prefs_common.show_searchbar)
- quicksearch_show(quicksearch);
- else
- quicksearch_hide(quicksearch);
return 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)
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;
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;
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)
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,
inc_unlock();
return FALSE;
}
- if (changed || !quicksearch_has_sat_predicate(summaryview->quicksearch))
+ if (changed)
folder_update_op_count();
}
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",
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 */
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)
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
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;
if (!event)
return TRUE;
- if (quicksearch_has_focus(summaryview->quicksearch))
- return FALSE;
-
mod_pressed =
((event->state & (GDK_SHIFT_MASK|GDK_MOD1_MASK)) != 0);
}
#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))
} 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:
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);
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);
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
#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];
GtkWidget *toggle_eventbox;
GtkWidget *toggle_arrow;
GtkWidget *toggle_search;
- GtkWidget *quick_search_pixmap;
GtkWidget *popupmenu;
GtkWidget *headerpopupmenu;
GtkWidget *tags_menu;
FolderView *folderview;
MessageView *messageview;
MessageView *ext_messageview;
- QuickSearch *quicksearch;
FolderItem *folder_item;
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
-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
#ifndef __TEXTVIEW_H__
#define __TEXTVIEW_H__
-#ifdef HAVE_CONFIG_H
-#include "claws-features.h"
-#endif
-
#include <glib.h>
#include <gtk/gtk.h>
blob - f64011d3faceadb829544d40c44e1e50131fe023
blob + c02b5486692b06c557480e905ffd6f85d953befb
--- src/undo.h
+++ src/undo.h
UNDO_ACTION_REPLACE_DELETE
} UndoAction;
-typedef enum
+typedef enum
{
UNDO_STATE_TRUE,
UNDO_STATE_FALSE,
gint redo_state,
gpointer data);
-struct _UndoMain
+struct _UndoMain
{
GtkTextView *textview;
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
-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 version="1.0"?>' > $@.xml ; \
- echo '<report-collection>' >> $@.xml ; \
- for lf in `ls -L "$$GTESTER_LOGDIR"/.` ; do \
- sed '1,1s/^<?xml\b[^>?]*?>//' <"$$GTESTER_LOGDIR"/"$$lf" >> $@.xml ; \
- done ; \
- echo >> $@.xml ; \
- echo '</report-collection>' >> $@.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