prefs_account.c 148 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586
  1. /*
  2. * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
  3. * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 3 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. *
  18. */
  19. #ifdef HAVE_CONFIG_H
  20. # include "config.h"
  21. #endif
  22. #include "defs.h"
  23. #include <glib.h>
  24. #include <glib/gi18n.h>
  25. #include <gtk/gtk.h>
  26. #include <gdk/gdkkeysyms.h>
  27. #include <gtk/filesel.h>
  28. #include <stdio.h>
  29. #include <sys/types.h>
  30. #include <sys/stat.h>
  31. #include <string.h>
  32. #include <stdlib.h>
  33. #include <ctype.h>
  34. #include "gtkcmoptionmenu.h"
  35. #include "main.h"
  36. #include "prefs_gtk.h"
  37. #include "prefs_account.h"
  38. #include "prefs_common.h"
  39. #include "prefs_customheader.h"
  40. #include "account.h"
  41. #include "mainwindow.h"
  42. #include "manage_window.h"
  43. #include "foldersel.h"
  44. #include "inc.h"
  45. #include "menu.h"
  46. #include "gtkutils.h"
  47. #include "utils.h"
  48. #include "alertpanel.h"
  49. #include "colorlabel.h"
  50. #include "smtp.h"
  51. #include "imap.h"
  52. #include "remotefolder.h"
  53. #include "base64.h"
  54. #include "combobox.h"
  55. #include "setup.h"
  56. #include "quote_fmt.h"
  57. #include "hooks.h"
  58. #include "inputdialog.h"
  59. #include "ssl_certificate.h"
  60. static gboolean cancelled;
  61. static gboolean new_account;
  62. static PrefsAccount tmp_ac_prefs;
  63. static GtkWidget *sigfile_radiobtn;
  64. static GtkWidget *sigcmd_radiobtn;
  65. static GtkWidget *entry_sigpath;
  66. static GtkWidget *signature_browse_button;
  67. static GtkWidget *signature_edit_button;
  68. #ifdef USE_GNUTLS
  69. static GtkWidget *entry_in_cert_file;
  70. static GtkWidget *entry_out_cert_file;
  71. static GtkWidget *in_ssl_cert_browse_button;
  72. static GtkWidget *out_ssl_cert_browse_button;
  73. #endif
  74. static GSList *prefs_pages = NULL;
  75. typedef struct BasicPage
  76. {
  77. PrefsPage page;
  78. GtkWidget *vbox;
  79. GtkWidget *acname_entry;
  80. GtkWidget *default_checkbtn;
  81. GtkWidget *name_entry;
  82. GtkWidget *addr_entry;
  83. GtkWidget *org_entry;
  84. GtkWidget *serv_frame;
  85. GtkWidget *serv_table;
  86. gpointer *protocol_optmenu;
  87. GtkWidget *recvserv_label;
  88. GtkWidget *smtpserv_label;
  89. GtkWidget *nntpserv_label;
  90. GtkWidget *localmbox_label;
  91. GtkWidget *mailcmd_label;
  92. GtkWidget *recvserv_entry;
  93. GtkWidget *smtpserv_entry;
  94. GtkWidget *nntpserv_entry;
  95. GtkWidget *nntpauth_checkbtn;
  96. GtkWidget *nntpauth_onconnect_checkbtn;
  97. GtkWidget *localmbox_entry;
  98. GtkWidget *mailcmd_checkbtn;
  99. GtkWidget *mailcmd_entry;
  100. GtkWidget *uid_label;
  101. GtkWidget *pass_label;
  102. GtkWidget *uid_entry;
  103. GtkWidget *pass_entry;
  104. } BasicPage;
  105. typedef struct ReceivePage
  106. {
  107. PrefsPage page;
  108. GtkWidget *vbox;
  109. GtkWidget *pop3_frame;
  110. GtkWidget *use_apop_checkbtn;
  111. GtkWidget *rmmail_checkbtn;
  112. GtkWidget *leave_time_spinbtn;
  113. GtkWidget *leave_hour_spinbtn;
  114. GtkWidget *size_limit_checkbtn;
  115. GtkWidget *size_limit_spinbtn;
  116. GtkWidget *inbox_label;
  117. GtkWidget *inbox_entry;
  118. GtkWidget *inbox_btn;
  119. GtkWidget *local_frame;
  120. GtkWidget *local_inbox_label;
  121. GtkWidget *local_inbox_entry;
  122. GtkWidget *local_inbox_btn;
  123. GtkWidget *filter_on_recv_checkbtn;
  124. GtkWidget *filterhook_on_recv_checkbtn;
  125. GtkWidget *recvatgetall_checkbtn;
  126. GtkWidget *imap_frame;
  127. GtkWidget *imap_auth_type_optmenu;
  128. GtkWidget *imapdir_label;
  129. GtkWidget *imapdir_entry;
  130. GtkWidget *subsonly_checkbtn;
  131. GtkWidget *low_bandwidth_checkbtn;
  132. GtkWidget *imap_use_trash_checkbtn;
  133. GtkWidget *frame_maxarticle;
  134. GtkWidget *maxarticle_label;
  135. GtkWidget *maxarticle_spinbtn;
  136. GtkObject *maxarticle_spinbtn_adj;
  137. } ReceivePage;
  138. typedef struct SendPage
  139. {
  140. PrefsPage page;
  141. GtkWidget *vbox;
  142. GtkWidget *msgid_checkbtn;
  143. GtkWidget *customhdr_checkbtn;
  144. GtkWidget *smtp_auth_checkbtn;
  145. GtkWidget *smtp_auth_type_optmenu;
  146. GtkWidget *smtp_uid_entry;
  147. GtkWidget *smtp_pass_entry;
  148. GtkWidget *pop_bfr_smtp_checkbtn;
  149. GtkWidget *pop_bfr_smtp_tm_spinbtn;
  150. GtkWidget *pop_auth_timeout_lbl;
  151. GtkWidget *pop_auth_minutes_lbl;
  152. } SendPage;
  153. typedef struct ComposePage
  154. {
  155. PrefsPage page;
  156. GtkWidget *vbox;
  157. GtkWidget *sigfile_radiobtn;
  158. GtkWidget *entry_sigpath;
  159. GtkWidget *checkbtn_autosig;
  160. GtkWidget *entry_sigsep;
  161. GtkWidget *autocc_checkbtn;
  162. GtkWidget *autocc_entry;
  163. GtkWidget *autobcc_checkbtn;
  164. GtkWidget *autobcc_entry;
  165. GtkWidget *autoreplyto_checkbtn;
  166. GtkWidget *autoreplyto_entry;
  167. #if USE_ENCHANT
  168. GtkWidget *checkbtn_enable_default_dictionary;
  169. GtkWidget *combo_default_dictionary;
  170. GtkWidget *checkbtn_enable_default_alt_dictionary;
  171. GtkWidget *combo_default_alt_dictionary;
  172. #endif
  173. } ComposePage;
  174. typedef struct TemplatesPage
  175. {
  176. PrefsPage page;
  177. GtkWidget *vbox;
  178. GtkWidget *checkbtn_compose_with_format;
  179. GtkWidget *compose_subject_format;
  180. GtkWidget *compose_body_format;
  181. GtkWidget *checkbtn_reply_with_format;
  182. GtkWidget *reply_quotemark;
  183. GtkWidget *reply_body_format;
  184. GtkWidget *checkbtn_forward_with_format;
  185. GtkWidget *forward_quotemark;
  186. GtkWidget *forward_body_format;
  187. } TemplatesPage;
  188. typedef struct PrivacyPage
  189. {
  190. PrefsPage page;
  191. GtkWidget *vbox;
  192. GtkWidget *default_privacy_system;
  193. GtkWidget *default_encrypt_checkbtn;
  194. GtkWidget *default_encrypt_reply_checkbtn;
  195. GtkWidget *default_sign_checkbtn;
  196. GtkWidget *default_sign_reply_checkbtn;
  197. GtkWidget *save_clear_text_checkbtn;
  198. GtkWidget *encrypt_to_self_checkbtn;
  199. } PrivacyPage;
  200. typedef struct SSLPage
  201. {
  202. PrefsPage page;
  203. GtkWidget *vbox;
  204. GtkWidget *pop_frame;
  205. GtkWidget *pop_nossl_radiobtn;
  206. GtkWidget *pop_ssltunnel_radiobtn;
  207. GtkWidget *pop_starttls_radiobtn;
  208. GtkWidget *imap_frame;
  209. GtkWidget *imap_nossl_radiobtn;
  210. GtkWidget *imap_ssltunnel_radiobtn;
  211. GtkWidget *imap_starttls_radiobtn;
  212. GtkWidget *nntp_frame;
  213. GtkWidget *nntp_nossl_radiobtn;
  214. GtkWidget *nntp_ssltunnel_radiobtn;
  215. GtkWidget *send_frame;
  216. GtkWidget *smtp_nossl_radiobtn;
  217. GtkWidget *smtp_ssltunnel_radiobtn;
  218. GtkWidget *smtp_starttls_radiobtn;
  219. GtkWidget *entry_in_cert_file;
  220. GtkWidget *entry_in_cert_pass;
  221. GtkWidget *entry_out_cert_file;
  222. GtkWidget *entry_out_cert_pass;
  223. GtkWidget *use_nonblocking_ssl_checkbtn;
  224. } SSLPage;
  225. typedef struct AdvancedPage
  226. {
  227. PrefsPage page;
  228. GtkWidget *vbox;
  229. GtkWidget *smtpport_checkbtn;
  230. GtkWidget *smtpport_spinbtn;
  231. GtkWidget *popport_hbox;
  232. GtkWidget *popport_checkbtn;
  233. GtkWidget *popport_spinbtn;
  234. GtkWidget *imapport_hbox;
  235. GtkWidget *imapport_checkbtn;
  236. GtkWidget *imapport_spinbtn;
  237. GtkWidget *nntpport_hbox;
  238. GtkWidget *nntpport_checkbtn;
  239. GtkWidget *nntpport_spinbtn;
  240. GtkWidget *domain_checkbtn;
  241. GtkWidget *domain_entry;
  242. GtkWidget *msgid_with_addr_checkbtn;
  243. GtkWidget *crosspost_checkbtn;
  244. GtkWidget *crosspost_colormenu;
  245. #ifndef G_OS_WIN32
  246. GtkWidget *tunnelcmd_checkbtn;
  247. GtkWidget *tunnelcmd_entry;
  248. #endif
  249. GtkWidget *sent_folder_checkbtn;
  250. GtkWidget *sent_folder_entry;
  251. GtkWidget *queue_folder_checkbtn;
  252. GtkWidget *queue_folder_entry;
  253. GtkWidget *draft_folder_checkbtn;
  254. GtkWidget *draft_folder_entry;
  255. GtkWidget *trash_folder_checkbtn;
  256. GtkWidget *trash_folder_entry;
  257. } AdvancedPage;
  258. static BasicPage basic_page;
  259. static ReceivePage receive_page;
  260. static SendPage send_page;
  261. static ComposePage compose_page;
  262. static TemplatesPage templates_page;
  263. static PrivacyPage privacy_page;
  264. #ifdef USE_GNUTLS
  265. static SSLPage ssl_page;
  266. #endif
  267. static AdvancedPage advanced_page;
  268. struct BasicProtocol {
  269. GtkWidget *combobox;
  270. GtkWidget *label;
  271. GtkWidget *descrlabel;
  272. GtkWidget *no_imap_warn_icon;
  273. GtkWidget *no_imap_warn_label;
  274. };
  275. static char *protocol_names[] = {
  276. N_("POP3"),
  277. NULL, /* APOP, deprecated */
  278. NULL, /* RPOP, deprecated */
  279. N_("IMAP4"),
  280. N_("News (NNTP)"),
  281. N_("Local mbox file"),
  282. N_("None (SMTP only)")
  283. };
  284. static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam);
  285. static void prefs_account_protocol_set_optmenu (PrefParam *pparam);
  286. static void prefs_account_protocol_changed (GtkComboBox *combobox,
  287. gpointer data);
  288. static void prefs_account_set_string_from_combobox (PrefParam *pparam);
  289. static void prefs_account_set_privacy_combobox_from_string (PrefParam *pparam);
  290. static void prefs_account_imap_auth_type_set_data_from_optmenu
  291. (PrefParam *pparam);
  292. static void prefs_account_imap_auth_type_set_optmenu (PrefParam *pparam);
  293. static void prefs_account_smtp_auth_type_set_data_from_optmenu
  294. (PrefParam *pparam);
  295. static void prefs_account_smtp_auth_type_set_optmenu (PrefParam *pparam);
  296. static void prefs_account_enum_set_data_from_radiobtn (PrefParam *pparam);
  297. static void prefs_account_enum_set_radiobtn (PrefParam *pparam);
  298. static void crosspost_color_toggled(void);
  299. static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam);
  300. static void prefs_account_crosspost_set_colormenu(PrefParam *pparam);
  301. static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
  302. gpointer user_data);
  303. static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
  304. gpointer user_data);
  305. static void prefs_account_filter_on_recv_toggled(GtkToggleButton *button,
  306. gpointer user_data);
  307. #if USE_ENCHANT
  308. static void prefs_account_compose_default_dictionary_set_string_from_optmenu
  309. (PrefParam *pparam);
  310. static void prefs_account_compose_default_dictionary_set_optmenu_from_string
  311. (PrefParam *pparam);
  312. #endif
  313. static gchar *privacy_prefs;
  314. static PrefParam basic_param[] = {
  315. {"account_name", NULL, &tmp_ac_prefs.account_name, P_STRING,
  316. &basic_page.acname_entry, prefs_set_data_from_entry, prefs_set_entry},
  317. {"is_default", "FALSE", &tmp_ac_prefs.is_default, P_BOOL,
  318. &basic_page.default_checkbtn,
  319. prefs_set_data_from_toggle, prefs_set_toggle},
  320. {"name", NULL, &tmp_ac_prefs.name, P_STRING,
  321. &basic_page.name_entry, prefs_set_data_from_entry, prefs_set_entry},
  322. {"address", NULL, &tmp_ac_prefs.address, P_STRING,
  323. &basic_page.addr_entry, prefs_set_data_from_entry, prefs_set_entry},
  324. {"organization", NULL, &tmp_ac_prefs.organization, P_STRING,
  325. &basic_page.org_entry, prefs_set_data_from_entry, prefs_set_entry},
  326. {"protocol", NULL, &tmp_ac_prefs.protocol, P_ENUM,
  327. (GtkWidget **)&basic_page.protocol_optmenu,
  328. prefs_account_protocol_set_data_from_optmenu,
  329. prefs_account_protocol_set_optmenu},
  330. {"receive_server", NULL, &tmp_ac_prefs.recv_server, P_STRING,
  331. &basic_page.recvserv_entry, prefs_set_data_from_entry, prefs_set_entry},
  332. {"smtp_server", NULL, &tmp_ac_prefs.smtp_server, P_STRING,
  333. &basic_page.smtpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
  334. {"nntp_server", NULL, &tmp_ac_prefs.nntp_server, P_STRING,
  335. &basic_page.nntpserv_entry, prefs_set_data_from_entry, prefs_set_entry},
  336. {"local_mbox", "/var/mail", &tmp_ac_prefs.local_mbox, P_STRING,
  337. &basic_page.localmbox_entry, prefs_set_data_from_entry, prefs_set_entry},
  338. {"use_mail_command", "FALSE", &tmp_ac_prefs.use_mail_command, P_BOOL,
  339. &basic_page.mailcmd_checkbtn, prefs_set_data_from_toggle, prefs_set_toggle},
  340. {"mail_command", DEFAULT_SENDMAIL_CMD, &tmp_ac_prefs.mail_command, P_STRING,
  341. &basic_page.mailcmd_entry, prefs_set_data_from_entry, prefs_set_entry},
  342. {"use_nntp_auth", "FALSE", &tmp_ac_prefs.use_nntp_auth, P_BOOL,
  343. &basic_page.nntpauth_checkbtn,
  344. prefs_set_data_from_toggle, prefs_set_toggle},
  345. {"use_nntp_auth_onconnect", "FALSE", &tmp_ac_prefs.use_nntp_auth_onconnect, P_BOOL,
  346. &basic_page.nntpauth_onconnect_checkbtn,
  347. prefs_set_data_from_toggle, prefs_set_toggle},
  348. {"user_id", "ENV_USER", &tmp_ac_prefs.userid, P_STRING,
  349. &basic_page.uid_entry, prefs_set_data_from_entry, prefs_set_entry},
  350. {"password", NULL, &tmp_ac_prefs.passwd, P_PASSWORD,
  351. &basic_page.pass_entry, prefs_set_data_from_entry, prefs_set_entry},
  352. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  353. };
  354. static PrefParam receive_param[] = {
  355. {"use_apop_auth", "FALSE", &tmp_ac_prefs.use_apop_auth, P_BOOL,
  356. &receive_page.use_apop_checkbtn,
  357. prefs_set_data_from_toggle, prefs_set_toggle},
  358. {"remove_mail", "TRUE", &tmp_ac_prefs.rmmail, P_BOOL,
  359. &receive_page.rmmail_checkbtn,
  360. prefs_set_data_from_toggle, prefs_set_toggle},
  361. #ifndef GENERIC_UMPC
  362. {"message_leave_time", "7", &tmp_ac_prefs.msg_leave_time, P_INT,
  363. &receive_page.leave_time_spinbtn,
  364. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  365. #else
  366. {"message_leave_time", "30", &tmp_ac_prefs.msg_leave_time, P_INT,
  367. &receive_page.leave_time_spinbtn,
  368. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  369. #endif
  370. {"message_leave_hour", "0", &tmp_ac_prefs.msg_leave_hour, P_INT,
  371. &receive_page.leave_hour_spinbtn,
  372. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  373. {"enable_size_limit", "FALSE", &tmp_ac_prefs.enable_size_limit, P_BOOL,
  374. &receive_page.size_limit_checkbtn,
  375. prefs_set_data_from_toggle, prefs_set_toggle},
  376. {"size_limit", "1024", &tmp_ac_prefs.size_limit, P_INT,
  377. &receive_page.size_limit_spinbtn,
  378. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  379. {"filter_on_receive", "TRUE", &tmp_ac_prefs.filter_on_recv, P_BOOL,
  380. &receive_page.filter_on_recv_checkbtn,
  381. prefs_set_data_from_toggle, prefs_set_toggle},
  382. {"filterhook_on_receive", "TRUE", &tmp_ac_prefs.filterhook_on_recv, P_BOOL,
  383. &receive_page.filterhook_on_recv_checkbtn,
  384. prefs_set_data_from_toggle, prefs_set_toggle},
  385. {"imap_auth_method", "0", &tmp_ac_prefs.imap_auth_type, P_ENUM,
  386. &receive_page.imap_auth_type_optmenu,
  387. prefs_account_imap_auth_type_set_data_from_optmenu,
  388. prefs_account_imap_auth_type_set_optmenu},
  389. {"receive_at_get_all", "TRUE", &tmp_ac_prefs.recv_at_getall, P_BOOL,
  390. &receive_page.recvatgetall_checkbtn,
  391. prefs_set_data_from_toggle, prefs_set_toggle},
  392. {"max_news_articles", "300", &tmp_ac_prefs.max_articles, P_INT,
  393. &receive_page.maxarticle_spinbtn,
  394. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  395. {"inbox", "#mh/Mailbox/inbox", &tmp_ac_prefs.inbox, P_STRING,
  396. &receive_page.inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
  397. {"local_inbox", "#mh/Mailbox/inbox", &tmp_ac_prefs.local_inbox, P_STRING,
  398. &receive_page.local_inbox_entry, prefs_set_data_from_entry, prefs_set_entry},
  399. {"imap_directory", NULL, &tmp_ac_prefs.imap_dir, P_STRING,
  400. &receive_page.imapdir_entry, prefs_set_data_from_entry, prefs_set_entry},
  401. {"imap_subsonly", "TRUE", &tmp_ac_prefs.imap_subsonly, P_BOOL,
  402. &receive_page.subsonly_checkbtn,
  403. prefs_set_data_from_toggle, prefs_set_toggle},
  404. {"low_bandwidth", "FALSE", &tmp_ac_prefs.low_bandwidth, P_BOOL,
  405. &receive_page.low_bandwidth_checkbtn,
  406. prefs_set_data_from_toggle, prefs_set_toggle},
  407. {"imap_use_trash", "TRUE", &tmp_ac_prefs.imap_use_trash, P_BOOL,
  408. &receive_page.imap_use_trash_checkbtn,
  409. prefs_set_data_from_toggle, prefs_set_toggle},
  410. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  411. };
  412. static PrefParam send_param[] = {
  413. {"generate_msgid", "TRUE", &tmp_ac_prefs.gen_msgid, P_BOOL,
  414. &send_page.msgid_checkbtn,
  415. prefs_set_data_from_toggle, prefs_set_toggle},
  416. {"add_custom_header", "FALSE", &tmp_ac_prefs.add_customhdr, P_BOOL,
  417. &send_page.customhdr_checkbtn,
  418. prefs_set_data_from_toggle, prefs_set_toggle},
  419. {"use_smtp_auth", "FALSE", &tmp_ac_prefs.use_smtp_auth, P_BOOL,
  420. &send_page.smtp_auth_checkbtn,
  421. prefs_set_data_from_toggle, prefs_set_toggle},
  422. {"smtp_auth_method", "0", &tmp_ac_prefs.smtp_auth_type, P_ENUM,
  423. &send_page.smtp_auth_type_optmenu,
  424. prefs_account_smtp_auth_type_set_data_from_optmenu,
  425. prefs_account_smtp_auth_type_set_optmenu},
  426. {"smtp_user_id", NULL, &tmp_ac_prefs.smtp_userid, P_STRING,
  427. &send_page.smtp_uid_entry, prefs_set_data_from_entry, prefs_set_entry},
  428. {"smtp_password", NULL, &tmp_ac_prefs.smtp_passwd, P_PASSWORD,
  429. &send_page.smtp_pass_entry, prefs_set_data_from_entry, prefs_set_entry},
  430. {"pop_before_smtp", "FALSE", &tmp_ac_prefs.pop_before_smtp, P_BOOL,
  431. &send_page.pop_bfr_smtp_checkbtn,
  432. prefs_set_data_from_toggle, prefs_set_toggle},
  433. {"pop_before_smtp_timeout", "5", &tmp_ac_prefs.pop_before_smtp_timeout, P_INT,
  434. &send_page.pop_bfr_smtp_tm_spinbtn,
  435. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  436. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  437. };
  438. static PrefParam compose_param[] = {
  439. {"signature_type", "0", &tmp_ac_prefs.sig_type, P_ENUM,
  440. &compose_page.sigfile_radiobtn,
  441. prefs_account_enum_set_data_from_radiobtn,
  442. prefs_account_enum_set_radiobtn},
  443. {"signature_path", "~" G_DIR_SEPARATOR_S DEFAULT_SIGNATURE,
  444. &tmp_ac_prefs.sig_path, P_STRING, &compose_page.entry_sigpath,
  445. prefs_set_data_from_entry, prefs_set_entry},
  446. {"auto_signature", "TRUE", &tmp_ac_prefs.auto_sig, P_BOOL,
  447. &compose_page.checkbtn_autosig,
  448. prefs_set_data_from_toggle, prefs_set_toggle},
  449. {"signature_separator", "-- ", &tmp_ac_prefs.sig_sep, P_STRING,
  450. &compose_page.entry_sigsep,
  451. prefs_set_data_from_entry, prefs_set_entry},
  452. {"set_autocc", "FALSE", &tmp_ac_prefs.set_autocc, P_BOOL,
  453. &compose_page.autocc_checkbtn,
  454. prefs_set_data_from_toggle, prefs_set_toggle},
  455. {"auto_cc", NULL, &tmp_ac_prefs.auto_cc, P_STRING,
  456. &compose_page.autocc_entry,
  457. prefs_set_data_from_entry, prefs_set_entry},
  458. {"set_autobcc", "FALSE", &tmp_ac_prefs.set_autobcc, P_BOOL,
  459. &compose_page.autobcc_checkbtn,
  460. prefs_set_data_from_toggle, prefs_set_toggle},
  461. {"auto_bcc", NULL, &tmp_ac_prefs.auto_bcc, P_STRING,
  462. &compose_page.autobcc_entry,
  463. prefs_set_data_from_entry, prefs_set_entry},
  464. {"set_autoreplyto", "FALSE", &tmp_ac_prefs.set_autoreplyto, P_BOOL,
  465. &compose_page.autoreplyto_checkbtn,
  466. prefs_set_data_from_toggle, prefs_set_toggle},
  467. {"auto_replyto", NULL, &tmp_ac_prefs.auto_replyto, P_STRING,
  468. &compose_page.autoreplyto_entry,
  469. prefs_set_data_from_entry, prefs_set_entry},
  470. #if USE_ENCHANT
  471. {"enable_default_dictionary", "", &tmp_ac_prefs.enable_default_dictionary, P_BOOL,
  472. &compose_page.checkbtn_enable_default_dictionary,
  473. prefs_set_data_from_toggle, prefs_set_toggle},
  474. {"default_dictionary", NULL, &tmp_ac_prefs.default_dictionary, P_STRING,
  475. &compose_page.combo_default_dictionary,
  476. prefs_account_compose_default_dictionary_set_string_from_optmenu,
  477. prefs_account_compose_default_dictionary_set_optmenu_from_string},
  478. {"enable_default_alt_dictionary", "", &tmp_ac_prefs.enable_default_alt_dictionary, P_BOOL,
  479. &compose_page.checkbtn_enable_default_alt_dictionary,
  480. prefs_set_data_from_toggle, prefs_set_toggle},
  481. {"default_alt_dictionary", NULL, &tmp_ac_prefs.default_alt_dictionary, P_STRING,
  482. &compose_page.combo_default_alt_dictionary,
  483. prefs_account_compose_default_dictionary_set_string_from_optmenu,
  484. prefs_account_compose_default_dictionary_set_optmenu_from_string},
  485. #else
  486. {"enable_default_dictionary", "", &tmp_ac_prefs.enable_default_dictionary, P_BOOL,
  487. NULL, NULL, NULL},
  488. {"default_dictionary", NULL, &tmp_ac_prefs.default_dictionary, P_STRING,
  489. NULL, NULL, NULL},
  490. {"enable_default_alt_dictionary", "", &tmp_ac_prefs.enable_default_alt_dictionary, P_BOOL,
  491. NULL, NULL, NULL},
  492. {"default_alt_dictionary", NULL, &tmp_ac_prefs.default_alt_dictionary, P_STRING,
  493. NULL, NULL, NULL},
  494. #endif
  495. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  496. };
  497. static PrefParam templates_param[] = {
  498. {"compose_with_format", "FALSE", &tmp_ac_prefs.compose_with_format, P_BOOL,
  499. &templates_page.checkbtn_compose_with_format,
  500. prefs_set_data_from_toggle, prefs_set_toggle},
  501. {"compose_subject_format", NULL, &tmp_ac_prefs.compose_subject_format, P_STRING,
  502. &templates_page.compose_subject_format,
  503. prefs_set_escaped_data_from_entry, prefs_set_entry_from_escaped},
  504. {"compose_body_format", NULL, &tmp_ac_prefs.compose_body_format, P_STRING,
  505. &templates_page.compose_body_format,
  506. prefs_set_escaped_data_from_text, prefs_set_text_from_escaped},
  507. {"reply_with_format", "FALSE", &tmp_ac_prefs.reply_with_format, P_BOOL,
  508. &templates_page.checkbtn_reply_with_format,
  509. prefs_set_data_from_toggle, prefs_set_toggle},
  510. {"reply_quotemark", NULL, &tmp_ac_prefs.reply_quotemark, P_STRING,
  511. &templates_page.reply_quotemark,
  512. prefs_set_data_from_entry, prefs_set_entry_from_escaped},
  513. {"reply_body_format", NULL, &tmp_ac_prefs.reply_body_format, P_STRING,
  514. &templates_page.reply_body_format,
  515. prefs_set_escaped_data_from_text, prefs_set_text_from_escaped},
  516. {"forward_with_format", "FALSE", &tmp_ac_prefs.forward_with_format, P_BOOL,
  517. &templates_page.checkbtn_forward_with_format,
  518. prefs_set_data_from_toggle, prefs_set_toggle},
  519. {"forward_quotemark", NULL, &tmp_ac_prefs.forward_quotemark, P_STRING,
  520. &templates_page.forward_quotemark,
  521. prefs_set_data_from_entry, prefs_set_entry_from_escaped},
  522. {"forward_body_format", NULL, &tmp_ac_prefs.forward_body_format, P_STRING,
  523. &templates_page.forward_body_format,
  524. prefs_set_escaped_data_from_text, prefs_set_text_from_escaped},
  525. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  526. };
  527. static PrefParam privacy_param[] = {
  528. {"default_privacy_system", "", &tmp_ac_prefs.default_privacy_system, P_STRING,
  529. &privacy_page.default_privacy_system,
  530. prefs_account_set_string_from_combobox,
  531. prefs_account_set_privacy_combobox_from_string},
  532. {"default_encrypt", "FALSE", &tmp_ac_prefs.default_encrypt, P_BOOL,
  533. &privacy_page.default_encrypt_checkbtn,
  534. prefs_set_data_from_toggle, prefs_set_toggle},
  535. {"default_encrypt_reply", "TRUE", &tmp_ac_prefs.default_encrypt_reply, P_BOOL,
  536. &privacy_page.default_encrypt_reply_checkbtn,
  537. prefs_set_data_from_toggle, prefs_set_toggle},
  538. {"default_sign", "FALSE", &tmp_ac_prefs.default_sign, P_BOOL,
  539. &privacy_page.default_sign_checkbtn,
  540. prefs_set_data_from_toggle, prefs_set_toggle},
  541. {"default_sign_reply", "TRUE", &tmp_ac_prefs.default_sign_reply, P_BOOL,
  542. &privacy_page.default_sign_reply_checkbtn,
  543. prefs_set_data_from_toggle, prefs_set_toggle},
  544. {"save_clear_text", "FALSE", &tmp_ac_prefs.save_encrypted_as_clear_text, P_BOOL,
  545. &privacy_page.save_clear_text_checkbtn,
  546. prefs_set_data_from_toggle, prefs_set_toggle},
  547. {"encrypt_to_self", "FALSE", &tmp_ac_prefs.encrypt_to_self, P_BOOL,
  548. &privacy_page.encrypt_to_self_checkbtn,
  549. prefs_set_data_from_toggle, prefs_set_toggle},
  550. {"privacy_prefs", "", &privacy_prefs, P_STRING,
  551. NULL, NULL, NULL},
  552. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  553. };
  554. static PrefParam ssl_param[] = {
  555. #ifdef USE_GNUTLS
  556. {"ssl_pop", "0", &tmp_ac_prefs.ssl_pop, P_ENUM,
  557. &ssl_page.pop_nossl_radiobtn,
  558. prefs_account_enum_set_data_from_radiobtn,
  559. prefs_account_enum_set_radiobtn},
  560. {"ssl_imap", "0", &tmp_ac_prefs.ssl_imap, P_ENUM,
  561. &ssl_page.imap_nossl_radiobtn,
  562. prefs_account_enum_set_data_from_radiobtn,
  563. prefs_account_enum_set_radiobtn},
  564. {"ssl_nntp", "0", &tmp_ac_prefs.ssl_nntp, P_ENUM,
  565. &ssl_page.nntp_nossl_radiobtn,
  566. prefs_account_enum_set_data_from_radiobtn,
  567. prefs_account_enum_set_radiobtn},
  568. {"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM,
  569. &ssl_page.smtp_nossl_radiobtn,
  570. prefs_account_enum_set_data_from_radiobtn,
  571. prefs_account_enum_set_radiobtn},
  572. {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL,
  573. &ssl_page.use_nonblocking_ssl_checkbtn,
  574. prefs_set_data_from_toggle, prefs_set_toggle},
  575. {"in_ssl_client_cert_file", "", &tmp_ac_prefs.in_ssl_client_cert_file, P_STRING,
  576. &ssl_page.entry_in_cert_file, prefs_set_data_from_entry, prefs_set_entry},
  577. {"in_ssl_client_cert_pass", "", &tmp_ac_prefs.in_ssl_client_cert_pass, P_PASSWORD,
  578. &ssl_page.entry_in_cert_pass, prefs_set_data_from_entry, prefs_set_entry},
  579. {"out_ssl_client_cert_file", "", &tmp_ac_prefs.out_ssl_client_cert_file, P_STRING,
  580. &ssl_page.entry_out_cert_file, prefs_set_data_from_entry, prefs_set_entry},
  581. {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD,
  582. &ssl_page.entry_out_cert_pass, prefs_set_data_from_entry, prefs_set_entry},
  583. #else
  584. {"ssl_pop", "0", &tmp_ac_prefs.ssl_pop, P_ENUM,
  585. NULL, NULL, NULL},
  586. {"ssl_imap", "0", &tmp_ac_prefs.ssl_imap, P_ENUM,
  587. NULL, NULL, NULL},
  588. {"ssl_nntp", "0", &tmp_ac_prefs.ssl_nntp, P_ENUM,
  589. NULL, NULL, NULL},
  590. {"ssl_smtp", "0", &tmp_ac_prefs.ssl_smtp, P_ENUM,
  591. NULL, NULL, NULL},
  592. {"in_ssl_client_cert_file", "", &tmp_ac_prefs.in_ssl_client_cert_file, P_STRING,
  593. NULL, NULL, NULL},
  594. {"in_ssl_client_cert_pass", "", &tmp_ac_prefs.in_ssl_client_cert_pass, P_PASSWORD,
  595. NULL, NULL, NULL},
  596. {"out_ssl_client_cert_file", "", &tmp_ac_prefs.out_ssl_client_cert_file, P_STRING,
  597. NULL, NULL, NULL},
  598. {"out_ssl_client_cert_pass", "", &tmp_ac_prefs.out_ssl_client_cert_pass, P_PASSWORD,
  599. NULL, NULL, NULL},
  600. {"use_nonblocking_ssl", "1", &tmp_ac_prefs.use_nonblocking_ssl, P_BOOL,
  601. NULL, NULL, NULL},
  602. #endif /* USE_GNUTLS */
  603. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  604. };
  605. static PrefParam advanced_param[] = {
  606. {"set_smtpport", "FALSE", &tmp_ac_prefs.set_smtpport, P_BOOL,
  607. &advanced_page.smtpport_checkbtn,
  608. prefs_set_data_from_toggle, prefs_set_toggle},
  609. {"smtp_port", "25", &tmp_ac_prefs.smtpport, P_USHORT,
  610. &advanced_page.smtpport_spinbtn,
  611. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  612. {"set_popport", "FALSE", &tmp_ac_prefs.set_popport, P_BOOL,
  613. &advanced_page.popport_checkbtn,
  614. prefs_set_data_from_toggle, prefs_set_toggle},
  615. {"pop_port", "110", &tmp_ac_prefs.popport, P_USHORT,
  616. &advanced_page.popport_spinbtn,
  617. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  618. {"set_imapport", "FALSE", &tmp_ac_prefs.set_imapport, P_BOOL,
  619. &advanced_page.imapport_checkbtn,
  620. prefs_set_data_from_toggle, prefs_set_toggle},
  621. {"imap_port", "143", &tmp_ac_prefs.imapport, P_USHORT,
  622. &advanced_page.imapport_spinbtn,
  623. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  624. {"set_nntpport", "FALSE", &tmp_ac_prefs.set_nntpport, P_BOOL,
  625. &advanced_page.nntpport_checkbtn,
  626. prefs_set_data_from_toggle, prefs_set_toggle},
  627. {"nntp_port", "119", &tmp_ac_prefs.nntpport, P_USHORT,
  628. &advanced_page.nntpport_spinbtn,
  629. prefs_set_data_from_spinbtn, prefs_set_spinbtn},
  630. {"set_domain", "FALSE", &tmp_ac_prefs.set_domain, P_BOOL,
  631. &advanced_page.domain_checkbtn,
  632. prefs_set_data_from_toggle, prefs_set_toggle},
  633. {"domain", NULL, &tmp_ac_prefs.domain, P_STRING,
  634. &advanced_page.domain_entry,
  635. prefs_set_data_from_entry, prefs_set_entry},
  636. {"msgid_with_addr", "FALSE", &tmp_ac_prefs.msgid_with_addr, P_BOOL,
  637. &advanced_page.msgid_with_addr_checkbtn,
  638. prefs_set_data_from_toggle, prefs_set_toggle},
  639. #ifndef G_OS_WIN32
  640. {"set_tunnelcmd", "FALSE", &tmp_ac_prefs.set_tunnelcmd, P_BOOL,
  641. &advanced_page.tunnelcmd_checkbtn,
  642. prefs_set_data_from_toggle, prefs_set_toggle},
  643. {"tunnelcmd", NULL, &tmp_ac_prefs.tunnelcmd, P_STRING,
  644. &advanced_page.tunnelcmd_entry,
  645. prefs_set_data_from_entry, prefs_set_entry},
  646. #endif
  647. {"mark_crosspost_read", "FALSE", &tmp_ac_prefs.mark_crosspost_read, P_BOOL,
  648. &advanced_page.crosspost_checkbtn,
  649. prefs_set_data_from_toggle, prefs_set_toggle},
  650. {"crosspost_color", NULL, &tmp_ac_prefs.crosspost_col, P_ENUM,
  651. &advanced_page.crosspost_colormenu,
  652. prefs_account_crosspost_set_data_from_colormenu,
  653. prefs_account_crosspost_set_colormenu},
  654. {"set_sent_folder", "FALSE", &tmp_ac_prefs.set_sent_folder, P_BOOL,
  655. &advanced_page.sent_folder_checkbtn,
  656. prefs_set_data_from_toggle, prefs_set_toggle},
  657. {"sent_folder", NULL, &tmp_ac_prefs.sent_folder, P_STRING,
  658. &advanced_page.sent_folder_entry,
  659. prefs_set_data_from_entry, prefs_set_entry},
  660. {"set_queue_folder", "FALSE", &tmp_ac_prefs.set_queue_folder, P_BOOL,
  661. &advanced_page.queue_folder_checkbtn,
  662. prefs_set_data_from_toggle, prefs_set_toggle},
  663. {"queue_folder", NULL, &tmp_ac_prefs.queue_folder, P_STRING,
  664. &advanced_page.queue_folder_entry,
  665. prefs_set_data_from_entry, prefs_set_entry},
  666. {"set_draft_folder", "FALSE", &tmp_ac_prefs.set_draft_folder, P_BOOL,
  667. &advanced_page.draft_folder_checkbtn,
  668. prefs_set_data_from_toggle, prefs_set_toggle},
  669. {"draft_folder", NULL, &tmp_ac_prefs.draft_folder, P_STRING,
  670. &advanced_page.draft_folder_entry,
  671. prefs_set_data_from_entry, prefs_set_entry},
  672. {"set_trash_folder", "FALSE", &tmp_ac_prefs.set_trash_folder, P_BOOL,
  673. &advanced_page.trash_folder_checkbtn,
  674. prefs_set_data_from_toggle, prefs_set_toggle},
  675. {"trash_folder", NULL, &tmp_ac_prefs.trash_folder, P_STRING,
  676. &advanced_page.trash_folder_entry,
  677. prefs_set_data_from_entry, prefs_set_entry},
  678. {NULL, NULL, NULL, P_OTHER, NULL, NULL, NULL}
  679. };
  680. static gint prefs_account_get_new_id (void);
  681. static void prefs_account_select_folder_cb (GtkWidget *widget,
  682. gpointer data);
  683. static void prefs_account_sigfile_radiobtn_cb (GtkWidget *widget,
  684. gpointer data);
  685. static void prefs_account_sigcmd_radiobtn_cb (GtkWidget *widget,
  686. gpointer data);
  687. static void prefs_account_signature_browse_cb (GtkWidget *widget,
  688. gpointer data);
  689. #ifdef USE_GNUTLS
  690. static void prefs_account_in_cert_browse_cb (GtkWidget *widget,
  691. gpointer data);
  692. static void prefs_account_out_cert_browse_cb (GtkWidget *widget,
  693. gpointer data);
  694. #endif
  695. static void prefs_account_signature_edit_cb (GtkWidget *widget,
  696. gpointer data);
  697. static void pop_bfr_smtp_tm_set_sens (GtkWidget *widget,
  698. gpointer data);
  699. static void prefs_account_edit_custom_header (void);
  700. #define COMBOBOX_PRIVACY_PLUGIN_ID 3
  701. /* Enable/disable necessary preference widgets based on current privacy
  702. * system choice. */
  703. static void privacy_system_activated(GtkWidget *combobox)
  704. {
  705. const gchar *system_id;
  706. gboolean privacy_enabled = FALSE;
  707. gint privacy_enabled_int;
  708. GtkTreeIter iter;
  709. GtkListStore *menu = GTK_LIST_STORE(gtk_combo_box_get_model(
  710. GTK_COMBO_BOX(combobox)));
  711. gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combobox), &iter);
  712. gtk_tree_model_get(GTK_TREE_MODEL(menu), &iter,
  713. COMBOBOX_PRIVACY_PLUGIN_ID, &system_id,
  714. COMBOBOX_DATA, &privacy_enabled_int,
  715. -1);
  716. privacy_enabled = strcmp(system_id, "");
  717. if( privacy_enabled_int == 0 )
  718. privacy_enabled = FALSE;
  719. gtk_widget_set_sensitive (privacy_page.save_clear_text_checkbtn,
  720. !gtk_toggle_button_get_active(
  721. GTK_TOGGLE_BUTTON(privacy_page.encrypt_to_self_checkbtn)));
  722. }
  723. /* Populate the privacy system choice combobox with valid choices */
  724. static void update_privacy_system_menu() {
  725. GtkListStore *menu;
  726. GtkTreeIter iter;
  727. GSList *system_ids, *cur;
  728. menu = GTK_LIST_STORE(gtk_combo_box_get_model(
  729. GTK_COMBO_BOX(privacy_page.default_privacy_system)));
  730. /* First add "None", as that one is always available. :) */
  731. gtk_list_store_append(menu, &iter);
  732. gtk_list_store_set(menu, &iter,
  733. COMBOBOX_TEXT, _("None"),
  734. COMBOBOX_DATA, 0,
  735. COMBOBOX_SENS, TRUE,
  736. COMBOBOX_PRIVACY_PLUGIN_ID, "",
  737. -1);
  738. /* Now go through list of available privacy systems and add an entry
  739. * for each. */
  740. system_ids = privacy_get_system_ids();
  741. for (cur = system_ids; cur != NULL; cur = g_slist_next(cur)) {
  742. gchar *id = (gchar *) cur->data;
  743. const gchar *name;
  744. name = privacy_system_get_name(id);
  745. gtk_list_store_append(menu, &iter);
  746. gtk_list_store_set(menu, &iter,
  747. COMBOBOX_TEXT, name,
  748. COMBOBOX_DATA, 1,
  749. COMBOBOX_SENS, TRUE,
  750. COMBOBOX_PRIVACY_PLUGIN_ID, id,
  751. -1);
  752. }
  753. }
  754. #define TABLE_YPAD 2
  755. static void basic_create_widget_func(PrefsPage * _page,
  756. GtkWindow * window,
  757. gpointer data)
  758. {
  759. BasicPage *page = (BasicPage *) _page;
  760. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  761. GtkWidget *vbox1;
  762. GtkWidget *hbox;
  763. GtkWidget *label;
  764. GtkWidget *acname_entry;
  765. GtkWidget *default_checkbtn;
  766. GtkWidget *frame1;
  767. GtkWidget *table1;
  768. GtkWidget *name_entry;
  769. GtkWidget *addr_entry;
  770. GtkWidget *org_entry;
  771. GtkWidget *serv_frame;
  772. GtkWidget *vbox2;
  773. GtkWidget *optmenubox;
  774. GtkWidget *optmenu;
  775. GtkWidget *optlabel;
  776. GtkWidget *no_imap_warn_icon;
  777. GtkWidget *no_imap_warn_label;
  778. GtkWidget *serv_table;
  779. GtkWidget *recvserv_label;
  780. GtkWidget *smtpserv_label;
  781. GtkWidget *nntpserv_label;
  782. GtkWidget *localmbox_label;
  783. GtkWidget *mailcmd_label;
  784. GtkWidget *recvserv_entry;
  785. GtkWidget *smtpserv_entry;
  786. GtkWidget *nntpserv_entry;
  787. GtkWidget *nntpauth_checkbtn;
  788. GtkWidget *nntpauth_onconnect_checkbtn;
  789. GtkWidget *localmbox_entry;
  790. GtkWidget *mailcmd_checkbtn;
  791. GtkWidget *mailcmd_entry;
  792. GtkWidget *uid_label;
  793. GtkWidget *pass_label;
  794. GtkWidget *uid_entry;
  795. GtkWidget *pass_entry;
  796. GtkListStore *menu;
  797. GtkTreeIter iter;
  798. struct BasicProtocol *protocol_optmenu;
  799. gint i;
  800. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  801. gtk_widget_show (vbox1);
  802. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  803. hbox = gtk_hbox_new (FALSE, 8);
  804. gtk_widget_show (hbox);
  805. gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 0);
  806. label = gtk_label_new (_("Name of account"));
  807. gtk_widget_show (label);
  808. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  809. acname_entry = gtk_entry_new ();
  810. gtk_widget_show (acname_entry);
  811. gtk_widget_set_size_request (acname_entry, DEFAULT_ENTRY_WIDTH, -1);
  812. gtk_box_pack_start (GTK_BOX (hbox), acname_entry, TRUE, TRUE, 0);
  813. default_checkbtn = gtk_check_button_new_with_label (_("Set as default"));
  814. gtk_widget_show (default_checkbtn);
  815. #ifndef GENERIC_UMPC
  816. gtk_box_pack_end (GTK_BOX (hbox), default_checkbtn, TRUE, FALSE, 0);
  817. #else
  818. gtk_box_pack_start (GTK_BOX (vbox1), default_checkbtn, FALSE, FALSE, 0);
  819. #endif
  820. PACK_FRAME (vbox1, frame1, _("Personal information"));
  821. table1 = gtk_table_new (3, 2, FALSE);
  822. gtk_widget_show (table1);
  823. gtk_container_add (GTK_CONTAINER (frame1), table1);
  824. gtk_container_set_border_width (GTK_CONTAINER (table1), 8);
  825. gtk_table_set_row_spacings (GTK_TABLE (table1), VSPACING_NARROW);
  826. gtk_table_set_col_spacings (GTK_TABLE (table1), 8);
  827. label = gtk_label_new (_("Full name"));
  828. gtk_widget_show (label);
  829. gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 0, 1,
  830. GTK_FILL, 0, 0, 0);
  831. gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
  832. label = gtk_label_new (_("Mail address"));
  833. gtk_widget_show (label);
  834. gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 1, 2,
  835. GTK_FILL, 0, 0, 0);
  836. gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
  837. label = gtk_label_new (_("Organization"));
  838. gtk_widget_show (label);
  839. gtk_table_attach (GTK_TABLE (table1), label, 0, 1, 2, 3,
  840. GTK_FILL, 0, 0, 0);
  841. gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5);
  842. name_entry = gtk_entry_new ();
  843. gtk_widget_show (name_entry);
  844. gtk_table_attach (GTK_TABLE (table1), name_entry, 1, 2, 0, 1,
  845. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  846. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  847. addr_entry = gtk_entry_new ();
  848. gtk_widget_show (addr_entry);
  849. gtk_table_attach (GTK_TABLE (table1), addr_entry, 1, 2, 1, 2,
  850. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  851. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  852. org_entry = gtk_entry_new ();
  853. gtk_widget_show (org_entry);
  854. gtk_table_attach (GTK_TABLE (table1), org_entry, 1, 2, 2, 3,
  855. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  856. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  857. vbox2 = gtkut_get_options_frame(vbox1, &serv_frame, _("Server information"));
  858. hbox = gtk_hbox_new (FALSE, 8);
  859. gtk_widget_show (hbox);
  860. gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
  861. label = gtk_label_new (_("Protocol"));
  862. gtk_widget_show (label);
  863. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  864. /* Create GtkHBox for protocol combobox and label */
  865. optmenubox = gtk_hbox_new(FALSE, 20);
  866. gtk_widget_show(optmenubox);
  867. gtk_box_pack_start (GTK_BOX (hbox), optmenubox, FALSE, FALSE, 0);
  868. /* Create and populate the combobox */
  869. optmenu = gtkut_sc_combobox_create(NULL, FALSE);
  870. gtk_box_pack_start(GTK_BOX (optmenubox), optmenu, FALSE, FALSE, 0);
  871. menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
  872. for( i = 0; i < NUM_RECV_PROTOCOLS; i++ )
  873. if( protocol_names[i] != NULL )
  874. COMBOBOX_ADD (menu, _(protocol_names[i]), i);
  875. g_signal_connect(G_OBJECT(optmenu), "changed",
  876. G_CALLBACK(prefs_account_protocol_changed), NULL);
  877. /* Create protocol label, empty for now */
  878. optlabel = gtk_label_new("");
  879. gtk_label_set_use_markup(GTK_LABEL(optlabel), TRUE);
  880. gtk_label_set_justify(GTK_LABEL(optlabel), GTK_JUSTIFY_CENTER);
  881. gtk_box_pack_start(GTK_BOX (optmenubox), optlabel, FALSE, FALSE, 0);
  882. no_imap_warn_icon = gtk_image_new_from_stock
  883. (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR);
  884. no_imap_warn_label = gtk_label_new(_("<span weight=\"bold\">Warning: this version of Claws Mail\n"
  885. "has been built without IMAP and News support.</span>"));
  886. gtk_label_set_use_markup(GTK_LABEL(no_imap_warn_label), TRUE);
  887. gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_icon, FALSE, FALSE, 0);
  888. gtk_box_pack_start(GTK_BOX (optmenubox), no_imap_warn_label, FALSE, FALSE, 0);
  889. /* Set up a struct to store pointers to necessary widgets */
  890. protocol_optmenu = g_new(struct BasicProtocol, 1);
  891. protocol_optmenu->combobox = optmenu;
  892. protocol_optmenu->label = optlabel;
  893. protocol_optmenu->descrlabel = label;
  894. protocol_optmenu->no_imap_warn_icon = no_imap_warn_icon;
  895. protocol_optmenu->no_imap_warn_label = no_imap_warn_label;
  896. serv_table = gtk_table_new (6, 4, FALSE);
  897. gtk_widget_show (serv_table);
  898. gtk_box_pack_start (GTK_BOX (vbox2), serv_table, FALSE, FALSE, 0);
  899. gtk_table_set_row_spacings (GTK_TABLE (serv_table), VSPACING_NARROW);
  900. gtk_table_set_row_spacing (GTK_TABLE (serv_table), 3, 0);
  901. gtk_table_set_col_spacings (GTK_TABLE (serv_table), 8);
  902. nntpserv_entry = gtk_entry_new ();
  903. gtk_widget_show (nntpserv_entry);
  904. gtk_table_attach (GTK_TABLE (serv_table), nntpserv_entry, 1, 4, 0, 1,
  905. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  906. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  907. /* gtk_table_set_row_spacing (GTK_TABLE (serv_table), 0, 0); */
  908. nntpauth_checkbtn = gtk_check_button_new_with_label
  909. (_("This server requires authentication"));
  910. gtk_widget_show (nntpauth_checkbtn);
  911. gtk_table_attach (GTK_TABLE (serv_table), nntpauth_checkbtn, 0, 2, 6, 7,
  912. GTK_FILL, 0, 0, 0);
  913. nntpauth_onconnect_checkbtn = gtk_check_button_new_with_label
  914. (_("Authenticate on connect"));
  915. gtk_widget_show (nntpauth_onconnect_checkbtn);
  916. gtk_table_attach (GTK_TABLE (serv_table), nntpauth_onconnect_checkbtn, 2, 4, 6, 7,
  917. GTK_FILL, 0, 0, 0);
  918. recvserv_entry = gtk_entry_new ();
  919. gtk_widget_show (recvserv_entry);
  920. gtk_table_attach (GTK_TABLE (serv_table), recvserv_entry, 1, 4, 2, 3,
  921. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  922. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  923. localmbox_entry = gtk_entry_new ();
  924. gtk_widget_show (localmbox_entry);
  925. gtk_table_attach (GTK_TABLE (serv_table), localmbox_entry, 1, 4, 3, 4,
  926. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  927. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  928. smtpserv_entry = gtk_entry_new ();
  929. gtk_widget_show (smtpserv_entry);
  930. gtk_table_attach (GTK_TABLE (serv_table), smtpserv_entry, 1, 4, 4, 5,
  931. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  932. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  933. mailcmd_entry = gtk_entry_new ();
  934. gtk_widget_show (mailcmd_entry);
  935. gtk_table_attach (GTK_TABLE (serv_table), mailcmd_entry, 1, 4, 6, 7,
  936. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  937. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  938. uid_entry = gtk_entry_new ();
  939. gtk_widget_show (uid_entry);
  940. gtk_widget_set_size_request (uid_entry, DEFAULT_ENTRY_WIDTH, -1);
  941. pass_entry = gtk_entry_new ();
  942. gtk_widget_show (pass_entry);
  943. gtk_widget_set_size_request (pass_entry, DEFAULT_ENTRY_WIDTH, -1);
  944. #ifndef GENERIC_UMPC
  945. gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 2, 7, 8,
  946. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  947. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  948. gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 3, 4, 7, 8,
  949. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  950. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  951. #else
  952. gtk_table_attach (GTK_TABLE (serv_table), uid_entry, 1, 4, 7, 8,
  953. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  954. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  955. gtk_table_attach (GTK_TABLE (serv_table), pass_entry, 1, 4, 8, 9,
  956. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  957. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  958. #endif
  959. gtk_entry_set_visibility (GTK_ENTRY (pass_entry), FALSE);
  960. #ifdef MAEMO
  961. hildon_gtk_entry_set_input_mode(GTK_ENTRY(pass_entry),
  962. HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
  963. #endif
  964. nntpserv_label = gtk_label_new (_("News server"));
  965. gtk_widget_show (nntpserv_label);
  966. gtk_table_attach (GTK_TABLE (serv_table), nntpserv_label, 0, 1, 0, 1,
  967. GTK_FILL, 0, 0, 0);
  968. gtk_misc_set_alignment (GTK_MISC (nntpserv_label), 1, 0.5);
  969. recvserv_label = gtk_label_new (_("Server for receiving"));
  970. gtk_widget_show (recvserv_label);
  971. gtk_table_attach (GTK_TABLE (serv_table), recvserv_label, 0, 1, 2, 3,
  972. GTK_FILL, 0, 0, 0);
  973. gtk_misc_set_alignment (GTK_MISC (recvserv_label), 1, 0.5);
  974. localmbox_label = gtk_label_new (_("Local mailbox"));
  975. gtk_widget_show (localmbox_label);
  976. gtk_table_attach (GTK_TABLE (serv_table), localmbox_label, 0, 1, 3, 4,
  977. GTK_FILL, 0, 0, 0);
  978. gtk_misc_set_alignment (GTK_MISC (localmbox_label), 1, 0.5);
  979. /* gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
  980. smtpserv_label = gtk_label_new (_("SMTP server (send)"));
  981. gtk_widget_show (smtpserv_label);
  982. gtk_table_attach (GTK_TABLE (serv_table), smtpserv_label, 0, 1, 4, 5,
  983. GTK_FILL, 0, 0, 0);
  984. gtk_misc_set_alignment (GTK_MISC (smtpserv_label), 1, 0.5);
  985. /* gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
  986. mailcmd_checkbtn = gtk_check_button_new_with_label
  987. (_("Use mail command rather than SMTP server"));
  988. gtk_widget_show (mailcmd_checkbtn);
  989. gtk_table_attach (GTK_TABLE (serv_table), mailcmd_checkbtn, 0, 4, 5, 6,
  990. GTK_EXPAND | GTK_FILL,
  991. 0, 0, TABLE_YPAD);
  992. g_signal_connect(G_OBJECT(mailcmd_checkbtn), "toggled",
  993. G_CALLBACK(prefs_account_mailcmd_toggled),
  994. NULL);
  995. mailcmd_label = gtk_label_new (_("command to send mails"));
  996. gtk_widget_show (mailcmd_label);
  997. gtk_table_attach (GTK_TABLE (serv_table), mailcmd_label, 0, 1, 6, 7,
  998. GTK_FILL, 0, 0, 0);
  999. gtk_misc_set_alignment (GTK_MISC (mailcmd_label), 1, 0.5);
  1000. /* gtk_table_set_row_spacing (GTK_TABLE (serv_table), 2, 0); */
  1001. uid_label = gtk_label_new (_("User ID"));
  1002. gtk_widget_show (uid_label);
  1003. gtk_table_attach (GTK_TABLE (serv_table), uid_label, 0, 1, 7, 8,
  1004. GTK_FILL, 0, 0, 0);
  1005. gtk_misc_set_alignment (GTK_MISC (uid_label), 1, 0.5);
  1006. pass_label = gtk_label_new (_("Password"));
  1007. gtk_widget_show (pass_label);
  1008. #ifndef GENERIC_UMPC
  1009. gtk_table_attach (GTK_TABLE (serv_table), pass_label, 2, 3, 7, 8,
  1010. 0, 0, 0, 0);
  1011. #else
  1012. gtk_misc_set_alignment (GTK_MISC (pass_label), 1, 0.5);
  1013. gtk_table_attach (GTK_TABLE (serv_table), pass_label, 0, 1, 8, 9,
  1014. GTK_FILL, 0, 0, 0);
  1015. #endif
  1016. SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, uid_label);
  1017. SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, pass_label);
  1018. SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, uid_entry);
  1019. SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, pass_entry);
  1020. SET_TOGGLE_SENSITIVITY (nntpauth_checkbtn, nntpauth_onconnect_checkbtn);
  1021. page->acname_entry = acname_entry;
  1022. page->default_checkbtn = default_checkbtn;
  1023. page->name_entry = name_entry;
  1024. page->addr_entry = addr_entry;
  1025. page->org_entry = org_entry;
  1026. page->serv_frame = serv_frame;
  1027. page->serv_table = serv_table;
  1028. page->protocol_optmenu = (gpointer)protocol_optmenu;
  1029. page->recvserv_label = recvserv_label;
  1030. page->recvserv_entry = recvserv_entry;
  1031. page->smtpserv_label = smtpserv_label;
  1032. page->smtpserv_entry = smtpserv_entry;
  1033. page->nntpserv_label = nntpserv_label;
  1034. page->nntpserv_entry = nntpserv_entry;
  1035. page->nntpauth_checkbtn = nntpauth_checkbtn;
  1036. page->nntpauth_onconnect_checkbtn = nntpauth_onconnect_checkbtn;
  1037. page->localmbox_label = localmbox_label;
  1038. page->localmbox_entry = localmbox_entry;
  1039. page->mailcmd_checkbtn = mailcmd_checkbtn;
  1040. page->mailcmd_label = mailcmd_label;
  1041. page->mailcmd_entry = mailcmd_entry;
  1042. page->uid_label = uid_label;
  1043. page->pass_label = pass_label;
  1044. page->uid_entry = uid_entry;
  1045. page->pass_entry = pass_entry;
  1046. if (new_account) {
  1047. PrefsAccount *def_ac;
  1048. gchar *buf;
  1049. prefs_set_dialog_to_default(basic_param);
  1050. buf = g_strdup_printf(_("Account%d"), ac_prefs->account_id);
  1051. gtk_entry_set_text(GTK_ENTRY(basic_page.acname_entry), buf);
  1052. g_free(buf);
  1053. def_ac = account_get_default();
  1054. if (def_ac) {
  1055. FolderItem *item = folder_get_default_inbox_for_class(F_MH);
  1056. gtk_entry_set_text(GTK_ENTRY(basic_page.name_entry),
  1057. def_ac->name ? def_ac->name : "");
  1058. gtk_entry_set_text(GTK_ENTRY(basic_page.addr_entry),
  1059. def_ac->address ? def_ac->address : "");
  1060. gtk_entry_set_text(GTK_ENTRY(basic_page.org_entry),
  1061. def_ac->organization ? def_ac->organization : "");
  1062. if (!item) {
  1063. item = folder_get_default_inbox();
  1064. }
  1065. if (item) {
  1066. gchar *id = folder_item_get_identifier(item);
  1067. gtk_entry_set_text(GTK_ENTRY(receive_page.inbox_entry),
  1068. id);
  1069. gtk_entry_set_text(GTK_ENTRY(receive_page.local_inbox_entry),
  1070. id);
  1071. g_free(id);
  1072. }
  1073. }
  1074. } else
  1075. prefs_set_dialog(basic_param);
  1076. page->vbox = vbox1;
  1077. page->page.widget = vbox1;
  1078. }
  1079. static void receive_create_widget_func(PrefsPage * _page,
  1080. GtkWindow * window,
  1081. gpointer data)
  1082. {
  1083. ReceivePage *page = (ReceivePage *) _page;
  1084. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1085. GtkWidget *vbox1;
  1086. GtkWidget *frame1;
  1087. GtkWidget *vbox2;
  1088. GtkWidget *use_apop_checkbtn;
  1089. GtkWidget *rmmail_checkbtn;
  1090. GtkWidget *hbox_spc;
  1091. GtkWidget *leave_time_label;
  1092. GtkWidget *leave_time_spinbtn;
  1093. GtkWidget *leave_hour_label;
  1094. GtkWidget *leave_hour_spinbtn;
  1095. GtkWidget *hbox1;
  1096. GtkWidget *size_limit_checkbtn;
  1097. GtkWidget *size_limit_spinbtn;
  1098. GtkWidget *label;
  1099. GtkWidget *filter_on_recv_checkbtn;
  1100. GtkWidget *filterhook_on_recv_checkbtn;
  1101. GtkWidget *vbox3;
  1102. GtkWidget *inbox_label;
  1103. GtkWidget *inbox_entry;
  1104. GtkWidget *inbox_btn;
  1105. GtkWidget *imap_frame;
  1106. GtkWidget *imapdir_label;
  1107. GtkWidget *imapdir_entry;
  1108. GtkWidget *subsonly_checkbtn;
  1109. GtkWidget *low_bandwidth_checkbtn;
  1110. GtkWidget *imap_use_trash_checkbtn;
  1111. GtkWidget *local_frame;
  1112. GtkWidget *local_vbox;
  1113. GtkWidget *local_hbox;
  1114. GtkWidget *local_inbox_label;
  1115. GtkWidget *local_inbox_entry;
  1116. GtkWidget *local_inbox_btn;
  1117. GtkWidget *optmenu;
  1118. GtkListStore *menu;
  1119. GtkTreeIter iter;
  1120. GtkWidget *recvatgetall_checkbtn;
  1121. GtkWidget *hbox2;
  1122. GtkWidget *frame2;
  1123. GtkWidget *maxarticle_label;
  1124. GtkWidget *maxarticle_spinbtn;
  1125. GtkObject *maxarticle_spinbtn_adj;
  1126. CLAWS_TIP_DECL();
  1127. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  1128. gtk_widget_show (vbox1);
  1129. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  1130. local_vbox = gtkut_get_options_frame(vbox1, &local_frame, _("Local"));
  1131. local_hbox = gtk_hbox_new (FALSE, 8);
  1132. gtk_widget_show (local_hbox);
  1133. gtk_box_pack_start (GTK_BOX (local_vbox), local_hbox, FALSE, FALSE, 0);
  1134. local_inbox_label = gtk_label_new (_("Default Inbox"));
  1135. gtk_widget_show (local_inbox_label);
  1136. gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_label, FALSE, FALSE, 0);
  1137. local_inbox_entry = gtk_entry_new ();
  1138. gtk_widget_show (local_inbox_entry);
  1139. CLAWS_SET_TIP(local_inbox_entry,
  1140. _("Unfiltered messages will be stored in this folder"));
  1141. gtk_widget_set_size_request (local_inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
  1142. gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_entry, TRUE, TRUE, 0);
  1143. local_inbox_btn = gtkut_get_browse_file_btn(_("Bro_wse"));
  1144. gtk_widget_show (local_inbox_btn);
  1145. CLAWS_SET_TIP(local_inbox_btn,
  1146. _("Unfiltered messages will be stored in this folder"));
  1147. gtk_box_pack_start (GTK_BOX (local_hbox), local_inbox_btn, FALSE, FALSE, 0);
  1148. g_signal_connect (G_OBJECT (local_inbox_btn), "clicked",
  1149. G_CALLBACK (prefs_account_select_folder_cb),
  1150. local_inbox_entry);
  1151. vbox2 = gtkut_get_options_frame(vbox1, &frame1, _("POP3"));
  1152. PACK_CHECK_BUTTON (vbox2, use_apop_checkbtn,
  1153. _("Use secure authentication (APOP)"));
  1154. PACK_CHECK_BUTTON (vbox2, rmmail_checkbtn,
  1155. _("Remove messages on server when received"));
  1156. hbox1 = gtk_hbox_new (FALSE, 8);
  1157. gtk_widget_show (hbox1);
  1158. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
  1159. hbox_spc = gtk_hbox_new (FALSE, 0);
  1160. gtk_widget_show (hbox_spc);
  1161. gtk_box_pack_start (GTK_BOX (hbox1), hbox_spc, FALSE, FALSE, 0);
  1162. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1163. leave_time_label = gtk_label_new (_("Remove after"));
  1164. gtk_widget_show (leave_time_label);
  1165. gtk_box_pack_start (GTK_BOX (hbox1), leave_time_label, FALSE, FALSE, 0);
  1166. leave_time_spinbtn = gtk_spin_button_new_with_range(0, 365, 1);
  1167. gtk_widget_show (leave_time_spinbtn);
  1168. CLAWS_SET_TIP(leave_time_spinbtn,
  1169. _("0 days and 0 hours : remove immediately"));
  1170. gtk_box_pack_start (GTK_BOX (hbox1), leave_time_spinbtn, FALSE, FALSE, 0);
  1171. leave_time_label = gtk_label_new (_("days"));
  1172. gtk_widget_show (leave_time_label);
  1173. gtk_box_pack_start (GTK_BOX (hbox1), leave_time_label, FALSE, FALSE, 0);
  1174. leave_hour_spinbtn = gtk_spin_button_new_with_range(0, 23, 1);
  1175. gtk_widget_show (leave_hour_spinbtn);
  1176. CLAWS_SET_TIP(leave_hour_spinbtn,
  1177. _("0 days and 0 hours : remove immediately"));
  1178. gtk_box_pack_start (GTK_BOX (hbox1), leave_hour_spinbtn, FALSE, FALSE, 0);
  1179. leave_hour_label = gtk_label_new (_("hours"));
  1180. gtk_widget_show (leave_hour_label);
  1181. gtk_box_pack_start (GTK_BOX (hbox1), leave_hour_label, FALSE, FALSE, 0);
  1182. SET_TOGGLE_SENSITIVITY (rmmail_checkbtn, hbox1);
  1183. hbox1 = gtk_hbox_new (FALSE, 8);
  1184. gtk_widget_show (hbox1);
  1185. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
  1186. PACK_CHECK_BUTTON (hbox1, size_limit_checkbtn, _("Receive size limit"));
  1187. CLAWS_SET_TIP(size_limit_checkbtn,
  1188. _("Messages over this limit will be partially retrieved. "
  1189. "When selecting them you will be able to download them fully "
  1190. "or delete them."));
  1191. size_limit_spinbtn = gtk_spin_button_new_with_range(0, 100000, 1);
  1192. gtk_widget_show (size_limit_spinbtn);
  1193. gtk_box_pack_start (GTK_BOX (hbox1), size_limit_spinbtn, FALSE, FALSE, 0);
  1194. label = gtk_label_new (_("KB"));
  1195. gtk_widget_show (label);
  1196. gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
  1197. SET_TOGGLE_SENSITIVITY (size_limit_checkbtn, size_limit_spinbtn);
  1198. PACK_VSPACER(vbox2, vbox3, VSPACING_NARROW_2);
  1199. hbox1 = gtk_hbox_new (FALSE, 8);
  1200. gtk_widget_show (hbox1);
  1201. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
  1202. inbox_label = gtk_label_new (_("Default Inbox"));
  1203. gtk_widget_show (inbox_label);
  1204. gtk_box_pack_start (GTK_BOX (hbox1), inbox_label, FALSE, FALSE, 0);
  1205. inbox_entry = gtk_entry_new ();
  1206. gtk_widget_show (inbox_entry);
  1207. CLAWS_SET_TIP(inbox_entry,
  1208. _("Unfiltered messages will be stored in this folder"));
  1209. gtk_widget_set_size_request (inbox_entry, DEFAULT_ENTRY_WIDTH, -1);
  1210. gtk_box_pack_start (GTK_BOX (hbox1), inbox_entry, TRUE, TRUE, 0);
  1211. inbox_btn = gtkut_get_browse_file_btn(_("Bro_wse"));
  1212. gtk_widget_show (inbox_btn);
  1213. CLAWS_SET_TIP(inbox_btn,
  1214. _("Unfiltered messages will be stored in this folder"));
  1215. gtk_box_pack_start (GTK_BOX (hbox1), inbox_btn, FALSE, FALSE, 0);
  1216. g_signal_connect (G_OBJECT (inbox_btn), "clicked",
  1217. G_CALLBACK (prefs_account_select_folder_cb),
  1218. inbox_entry);
  1219. vbox2 = gtkut_get_options_frame(vbox1, &frame2, _("NNTP"));
  1220. hbox2 = gtk_hbox_new (FALSE, 8);
  1221. gtk_widget_show (hbox2);
  1222. gtk_box_pack_start (GTK_BOX (vbox2), hbox2, FALSE, FALSE, 0);
  1223. maxarticle_label = gtk_label_new
  1224. (_("Maximum number of articles to download"));
  1225. gtk_widget_show (maxarticle_label);
  1226. gtk_box_pack_start (GTK_BOX (hbox2), maxarticle_label, FALSE, FALSE, 0);
  1227. maxarticle_spinbtn_adj =
  1228. gtk_adjustment_new (300, 0, 10000, 10, 100, 0);
  1229. maxarticle_spinbtn = gtk_spin_button_new
  1230. (GTK_ADJUSTMENT (maxarticle_spinbtn_adj), 10, 0);
  1231. gtk_widget_show (maxarticle_spinbtn);
  1232. CLAWS_SET_TIP(maxarticle_spinbtn,
  1233. _("unlimited if 0 is specified"));
  1234. gtk_box_pack_start (GTK_BOX (hbox2), maxarticle_spinbtn,
  1235. FALSE, FALSE, 0);
  1236. gtk_widget_set_size_request (maxarticle_spinbtn, 64, -1);
  1237. gtk_spin_button_set_numeric
  1238. (GTK_SPIN_BUTTON (maxarticle_spinbtn), TRUE);
  1239. vbox2 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
  1240. hbox1 = gtk_hbox_new (FALSE, 8);
  1241. gtk_widget_show (hbox1);
  1242. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
  1243. label = gtk_label_new (_("Authentication method"));
  1244. gtk_widget_show (label);
  1245. gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
  1246. optmenu = gtkut_sc_combobox_create(NULL, FALSE);
  1247. menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
  1248. gtk_widget_show (optmenu);
  1249. gtk_box_pack_start (GTK_BOX (hbox1), optmenu, FALSE, FALSE, 0);
  1250. COMBOBOX_ADD (menu, _("Automatic"), 0);
  1251. COMBOBOX_ADD (menu, "LOGIN", IMAP_AUTH_LOGIN);
  1252. COMBOBOX_ADD (menu, "CRAM-MD5", IMAP_AUTH_CRAM_MD5);
  1253. COMBOBOX_ADD (menu, "ANONYMOUS", IMAP_AUTH_ANON);
  1254. COMBOBOX_ADD (menu, "GSSAPI", IMAP_AUTH_GSSAPI);
  1255. COMBOBOX_ADD (menu, "DIGEST-MD5", IMAP_AUTH_DIGEST_MD5);
  1256. hbox1 = gtk_hbox_new (FALSE, 8);
  1257. gtk_widget_show (hbox1);
  1258. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
  1259. imapdir_label = gtk_label_new (_("IMAP server directory"));
  1260. gtk_widget_show (imapdir_label);
  1261. gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
  1262. imapdir_label = gtk_label_new(_("(usually empty)"));
  1263. gtk_widget_show (imapdir_label);
  1264. gtkut_widget_set_small_font_size (imapdir_label);
  1265. gtk_box_pack_start (GTK_BOX (hbox1), imapdir_label, FALSE, FALSE, 0);
  1266. imapdir_entry = gtk_entry_new();
  1267. gtk_widget_show (imapdir_entry);
  1268. gtk_box_pack_start (GTK_BOX (hbox1), imapdir_entry, FALSE, FALSE, 0);
  1269. hbox1 = gtk_hbox_new (FALSE, 8);
  1270. gtk_widget_show (hbox1);
  1271. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
  1272. PACK_CHECK_BUTTON (hbox1, subsonly_checkbtn,
  1273. _("Show subscribed folders only"));
  1274. hbox1 = gtk_hbox_new (FALSE, 8);
  1275. gtk_widget_show (hbox1);
  1276. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
  1277. PACK_CHECK_BUTTON (hbox1, low_bandwidth_checkbtn,
  1278. _("Bandwidth-efficient mode (prevents retrieving remote tags)"));
  1279. CLAWS_SET_TIP(low_bandwidth_checkbtn,
  1280. _("This mode uses less bandwidth, but can be slower with some servers."));
  1281. hbox1 = gtk_hbox_new (FALSE, 8);
  1282. gtk_widget_show (hbox1);
  1283. gtk_box_pack_start (GTK_BOX (vbox2), hbox1, FALSE, FALSE, 4);
  1284. PACK_CHECK_BUTTON (hbox1, imap_use_trash_checkbtn,
  1285. _("Move deleted mails to trash and expunge immediately"));
  1286. CLAWS_SET_TIP(imap_use_trash_checkbtn,
  1287. _("Moves deleted mails to trash instead of using the \\Deleted flag without expunging."));
  1288. PACK_CHECK_BUTTON (vbox1, filter_on_recv_checkbtn,
  1289. _("Filter messages on receiving"));
  1290. g_signal_connect(G_OBJECT(filter_on_recv_checkbtn), "toggled",
  1291. G_CALLBACK(prefs_account_filter_on_recv_toggled),
  1292. NULL);
  1293. PACK_CHECK_BUTTON (vbox1, filterhook_on_recv_checkbtn,
  1294. _("Allow filtering using plugins on receiving"));
  1295. PACK_CHECK_BUTTON
  1296. (vbox1, recvatgetall_checkbtn,
  1297. _("'Get Mail' checks for new messages on this account"));
  1298. page->pop3_frame = frame1;
  1299. page->use_apop_checkbtn = use_apop_checkbtn;
  1300. page->rmmail_checkbtn = rmmail_checkbtn;
  1301. page->leave_time_spinbtn = leave_time_spinbtn;
  1302. page->leave_hour_spinbtn = leave_hour_spinbtn;
  1303. page->size_limit_checkbtn = size_limit_checkbtn;
  1304. page->size_limit_spinbtn = size_limit_spinbtn;
  1305. page->filter_on_recv_checkbtn = filter_on_recv_checkbtn;
  1306. page->filterhook_on_recv_checkbtn = filterhook_on_recv_checkbtn;
  1307. page->inbox_label = inbox_label;
  1308. page->inbox_entry = inbox_entry;
  1309. page->inbox_btn = inbox_btn;
  1310. page->imap_frame = imap_frame;
  1311. page->imap_auth_type_optmenu = optmenu;
  1312. page->imapdir_label = imapdir_label;
  1313. page->imapdir_entry = imapdir_entry;
  1314. page->subsonly_checkbtn = subsonly_checkbtn;
  1315. page->low_bandwidth_checkbtn = low_bandwidth_checkbtn;
  1316. page->imap_use_trash_checkbtn = imap_use_trash_checkbtn;
  1317. page->local_frame = local_frame;
  1318. page->local_inbox_label = local_inbox_label;
  1319. page->local_inbox_entry = local_inbox_entry;
  1320. page->local_inbox_btn = local_inbox_btn;
  1321. page->recvatgetall_checkbtn = recvatgetall_checkbtn;
  1322. page->frame_maxarticle = frame2;
  1323. page->maxarticle_spinbtn = maxarticle_spinbtn;
  1324. page->maxarticle_spinbtn_adj = maxarticle_spinbtn_adj;
  1325. tmp_ac_prefs = *ac_prefs;
  1326. if (new_account) {
  1327. prefs_set_dialog_to_default(receive_param);
  1328. } else
  1329. prefs_set_dialog(receive_param);
  1330. page->vbox = vbox1;
  1331. page->page.widget = vbox1;
  1332. }
  1333. static void send_create_widget_func(PrefsPage * _page,
  1334. GtkWindow * window,
  1335. gpointer data)
  1336. {
  1337. SendPage *page = (SendPage *) _page;
  1338. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1339. GtkWidget *vbox1;
  1340. GtkWidget *vbox2;
  1341. GtkWidget *frame;
  1342. GtkWidget *msgid_checkbtn;
  1343. GtkWidget *hbox;
  1344. GtkWidget *customhdr_checkbtn;
  1345. GtkWidget *customhdr_edit_btn;
  1346. GtkWidget *vbox3;
  1347. GtkWidget *smtp_auth_checkbtn;
  1348. GtkWidget *optmenu;
  1349. GtkListStore *menu;
  1350. GtkTreeIter iter;
  1351. GtkWidget *vbox4;
  1352. GtkWidget *hbox_spc;
  1353. GtkWidget *label;
  1354. GtkWidget *smtp_uid_entry;
  1355. GtkWidget *smtp_pass_entry;
  1356. GtkWidget *vbox_spc;
  1357. GtkWidget *pop_bfr_smtp_checkbtn;
  1358. GtkWidget *pop_bfr_smtp_tm_spinbtn;
  1359. GtkWidget *pop_auth_timeout_lbl;
  1360. GtkWidget *pop_auth_minutes_lbl;
  1361. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  1362. gtk_widget_show (vbox1);
  1363. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  1364. vbox2 = gtkut_get_options_frame(vbox1, &frame, _("Header"));
  1365. PACK_CHECK_BUTTON (vbox2, msgid_checkbtn, _("Generate Message-ID"));
  1366. hbox = gtk_hbox_new (FALSE, 12);
  1367. gtk_widget_show (hbox);
  1368. gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
  1369. PACK_CHECK_BUTTON (hbox, customhdr_checkbtn,
  1370. _("Add user-defined header"));
  1371. customhdr_edit_btn = gtk_button_new_from_stock (GTK_STOCK_EDIT);
  1372. gtk_widget_show (customhdr_edit_btn);
  1373. gtk_box_pack_start (GTK_BOX (hbox), customhdr_edit_btn,
  1374. FALSE, FALSE, 0);
  1375. g_signal_connect (G_OBJECT (customhdr_edit_btn), "clicked",
  1376. G_CALLBACK (prefs_account_edit_custom_header),
  1377. NULL);
  1378. SET_TOGGLE_SENSITIVITY (customhdr_checkbtn, customhdr_edit_btn);
  1379. vbox3 = gtkut_get_options_frame(vbox1, &frame, _("Authentication"));
  1380. PACK_CHECK_BUTTON (vbox3, smtp_auth_checkbtn,
  1381. _("SMTP Authentication (SMTP AUTH)"));
  1382. vbox4 = gtk_vbox_new (FALSE, 0);
  1383. gtk_widget_show (vbox4);
  1384. gtk_box_pack_start (GTK_BOX (vbox3), vbox4, FALSE, FALSE, 0);
  1385. hbox = gtk_hbox_new (FALSE, 8);
  1386. gtk_widget_show (hbox);
  1387. gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
  1388. hbox_spc = gtk_hbox_new (FALSE, 0);
  1389. gtk_widget_show (hbox_spc);
  1390. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  1391. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1392. label = gtk_label_new (_("Authentication method"));
  1393. gtk_widget_show (label);
  1394. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  1395. optmenu = gtkut_sc_combobox_create(NULL, FALSE);
  1396. menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu)));
  1397. gtk_widget_show (optmenu);
  1398. gtk_box_pack_start (GTK_BOX (hbox), optmenu, FALSE, FALSE, 0);
  1399. COMBOBOX_ADD (menu, _("Automatic"), 0);
  1400. COMBOBOX_ADD (menu, "PLAIN", SMTPAUTH_PLAIN);
  1401. COMBOBOX_ADD (menu, "LOGIN", SMTPAUTH_LOGIN);
  1402. COMBOBOX_ADD (menu, "CRAM-MD5", SMTPAUTH_CRAM_MD5);
  1403. COMBOBOX_ADD (menu, "DIGEST-MD5", SMTPAUTH_DIGEST_MD5);
  1404. gtk_list_store_set(menu, &iter, COMBOBOX_SENS, FALSE, -1);
  1405. PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
  1406. hbox = gtk_hbox_new (FALSE, 8);
  1407. gtk_widget_show (hbox);
  1408. gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
  1409. hbox_spc = gtk_hbox_new (FALSE, 0);
  1410. gtk_widget_show (hbox_spc);
  1411. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  1412. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1413. label = gtk_label_new (_("User ID"));
  1414. gtk_widget_show (label);
  1415. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  1416. smtp_uid_entry = gtk_entry_new ();
  1417. gtk_widget_show (smtp_uid_entry);
  1418. gtk_widget_set_size_request (smtp_uid_entry, DEFAULT_ENTRY_WIDTH, -1);
  1419. gtk_box_pack_start (GTK_BOX (hbox), smtp_uid_entry, TRUE, TRUE, 0);
  1420. #ifdef GENERIC_UMPC
  1421. PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
  1422. hbox = gtk_hbox_new (FALSE, 8);
  1423. gtk_widget_show (hbox);
  1424. gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
  1425. hbox_spc = gtk_hbox_new (FALSE, 0);
  1426. gtk_widget_show (hbox_spc);
  1427. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  1428. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1429. #endif
  1430. label = gtk_label_new (_("Password"));
  1431. gtk_widget_show (label);
  1432. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  1433. smtp_pass_entry = gtk_entry_new ();
  1434. gtk_widget_show (smtp_pass_entry);
  1435. gtk_widget_set_size_request (smtp_pass_entry, DEFAULT_ENTRY_WIDTH, -1);
  1436. gtk_box_pack_start (GTK_BOX (hbox), smtp_pass_entry, TRUE, TRUE, 0);
  1437. gtk_entry_set_visibility (GTK_ENTRY (smtp_pass_entry), FALSE);
  1438. #ifdef MAEMO
  1439. hildon_gtk_entry_set_input_mode(GTK_ENTRY(smtp_pass_entry),
  1440. HILDON_GTK_INPUT_MODE_FULL | HILDON_GTK_INPUT_MODE_INVISIBLE);
  1441. #endif
  1442. PACK_VSPACER(vbox4, vbox_spc, VSPACING_NARROW_2);
  1443. hbox = gtk_hbox_new (FALSE, 8);
  1444. gtk_widget_show (hbox);
  1445. gtk_box_pack_start (GTK_BOX (vbox4), hbox, FALSE, FALSE, 0);
  1446. hbox_spc = gtk_hbox_new (FALSE, 0);
  1447. gtk_widget_show (hbox_spc);
  1448. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  1449. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1450. label = gtk_label_new
  1451. (_("If you leave these entries empty, the same "
  1452. "user ID and password as receiving will be used."));
  1453. gtk_widget_show (label);
  1454. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  1455. gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
  1456. gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
  1457. gtkut_widget_set_small_font_size (label);
  1458. SET_TOGGLE_SENSITIVITY (smtp_auth_checkbtn, vbox4);
  1459. PACK_CHECK_BUTTON (vbox3, pop_bfr_smtp_checkbtn,
  1460. _("Authenticate with POP3 before sending"));
  1461. g_signal_connect (G_OBJECT (pop_bfr_smtp_checkbtn), "clicked",
  1462. G_CALLBACK (pop_bfr_smtp_tm_set_sens),
  1463. NULL);
  1464. hbox = gtk_hbox_new (FALSE, 8);
  1465. gtk_widget_show (hbox);
  1466. gtk_box_pack_start (GTK_BOX (vbox3), hbox, FALSE, FALSE, 0);
  1467. hbox_spc = gtk_hbox_new (FALSE, 0);
  1468. gtk_widget_show (hbox_spc);
  1469. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  1470. gtk_widget_set_size_request (hbox_spc, 12, -1);
  1471. pop_auth_timeout_lbl = gtk_label_new(_("POP authentication timeout: "));
  1472. gtk_widget_show (pop_auth_timeout_lbl);
  1473. gtk_box_pack_start (GTK_BOX (hbox), pop_auth_timeout_lbl, FALSE, FALSE, 0);
  1474. pop_bfr_smtp_tm_spinbtn = gtk_spin_button_new_with_range(0, 1440, 1);
  1475. gtk_widget_show (pop_bfr_smtp_tm_spinbtn);
  1476. gtk_box_pack_start (GTK_BOX (hbox), pop_bfr_smtp_tm_spinbtn, FALSE, FALSE, 0);
  1477. pop_auth_minutes_lbl = gtk_label_new(_("minutes"));
  1478. gtk_widget_show (pop_auth_minutes_lbl);
  1479. gtk_box_pack_start (GTK_BOX (hbox), pop_auth_minutes_lbl, FALSE, FALSE, 0);
  1480. page->msgid_checkbtn = msgid_checkbtn;
  1481. page->customhdr_checkbtn = customhdr_checkbtn;
  1482. page->smtp_auth_checkbtn = smtp_auth_checkbtn;
  1483. page->smtp_auth_type_optmenu = optmenu;
  1484. page->smtp_uid_entry = smtp_uid_entry;
  1485. page->smtp_pass_entry = smtp_pass_entry;
  1486. page->pop_bfr_smtp_checkbtn = pop_bfr_smtp_checkbtn;
  1487. page->pop_bfr_smtp_tm_spinbtn = pop_bfr_smtp_tm_spinbtn;
  1488. page->pop_auth_timeout_lbl = pop_auth_timeout_lbl;
  1489. page->pop_auth_minutes_lbl = pop_auth_minutes_lbl;
  1490. tmp_ac_prefs = *ac_prefs;
  1491. if (new_account) {
  1492. prefs_set_dialog_to_default(send_param);
  1493. } else
  1494. prefs_set_dialog(send_param);
  1495. pop_bfr_smtp_tm_set_sens (NULL, NULL);
  1496. page->vbox = vbox1;
  1497. page->page.widget = vbox1;
  1498. }
  1499. static void compose_create_widget_func(PrefsPage * _page,
  1500. GtkWindow * window,
  1501. gpointer data)
  1502. {
  1503. ComposePage *page = (ComposePage *) _page;
  1504. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1505. GtkWidget *vbox1;
  1506. GtkWidget *sig_hbox;
  1507. GtkWidget *hbox1;
  1508. GtkWidget *hbox2;
  1509. GtkWidget *frame_sig;
  1510. GtkWidget *vbox_sig;
  1511. GtkWidget *label_sigpath;
  1512. GtkWidget *checkbtn_autosig;
  1513. GtkWidget *label_sigsep;
  1514. GtkWidget *entry_sigsep;
  1515. GtkWidget *frame;
  1516. GtkWidget *table;
  1517. GtkWidget *autocc_checkbtn;
  1518. GtkWidget *autocc_entry;
  1519. GtkWidget *autobcc_checkbtn;
  1520. GtkWidget *autobcc_entry;
  1521. GtkWidget *autoreplyto_checkbtn;
  1522. GtkWidget *autoreplyto_entry;
  1523. #if USE_ENCHANT
  1524. GtkWidget *frame_dict;
  1525. GtkWidget *table_dict;
  1526. GtkWidget *checkbtn_enable_default_dictionary = NULL;
  1527. GtkWidget *combo_default_dictionary = NULL;
  1528. GtkWidget *checkbtn_enable_default_alt_dictionary = NULL;
  1529. GtkWidget *combo_default_alt_dictionary = NULL;
  1530. #endif
  1531. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  1532. gtk_widget_show (vbox1);
  1533. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  1534. vbox_sig = gtkut_get_options_frame(vbox1, &frame_sig, _("Signature"));
  1535. PACK_CHECK_BUTTON (vbox_sig, checkbtn_autosig,
  1536. _("Automatically insert signature"));
  1537. hbox1 = gtk_hbox_new (FALSE, 8);
  1538. gtk_widget_show (hbox1);
  1539. gtk_box_pack_start (GTK_BOX (vbox_sig), hbox1, TRUE, TRUE, 0);
  1540. label_sigsep = gtk_label_new (_("Signature separator"));
  1541. gtk_widget_show (label_sigsep);
  1542. gtk_box_pack_start (GTK_BOX (hbox1), label_sigsep, FALSE, FALSE, 0);
  1543. entry_sigsep = gtk_entry_new ();
  1544. gtk_widget_show (entry_sigsep);
  1545. gtk_box_pack_start (GTK_BOX (hbox1), entry_sigsep, FALSE, FALSE, 0);
  1546. gtk_widget_set_size_request (entry_sigsep, 64, -1);
  1547. sig_hbox = gtk_hbox_new (FALSE, 8);
  1548. gtk_widget_show (sig_hbox);
  1549. gtk_box_pack_start (GTK_BOX (vbox_sig), sig_hbox, FALSE, FALSE, 0);
  1550. sigfile_radiobtn = gtk_radio_button_new_with_label (NULL, _("File"));
  1551. gtk_widget_show (sigfile_radiobtn);
  1552. gtk_box_pack_start (GTK_BOX (sig_hbox), sigfile_radiobtn,
  1553. FALSE, FALSE, 0);
  1554. g_object_set_data (G_OBJECT (sigfile_radiobtn),
  1555. MENU_VAL_ID,
  1556. GINT_TO_POINTER (SIG_FILE));
  1557. g_signal_connect(G_OBJECT(sigfile_radiobtn), "clicked",
  1558. G_CALLBACK(prefs_account_sigfile_radiobtn_cb), NULL);
  1559. sigcmd_radiobtn = gtk_radio_button_new_with_label_from_widget
  1560. (GTK_RADIO_BUTTON(sigfile_radiobtn), _("Command output"));
  1561. gtk_widget_show (sigcmd_radiobtn);
  1562. gtk_box_pack_start (GTK_BOX (sig_hbox), sigcmd_radiobtn,
  1563. FALSE, FALSE, 0);
  1564. g_object_set_data (G_OBJECT (sigcmd_radiobtn),
  1565. MENU_VAL_ID,
  1566. GINT_TO_POINTER (SIG_COMMAND));
  1567. g_signal_connect(G_OBJECT(sigcmd_radiobtn), "clicked",
  1568. G_CALLBACK(prefs_account_sigcmd_radiobtn_cb), NULL);
  1569. hbox2 = gtk_hbox_new (FALSE, 8);
  1570. gtk_widget_show (hbox2);
  1571. gtk_box_pack_start (GTK_BOX (vbox_sig), hbox2, TRUE, TRUE, 0);
  1572. label_sigpath = gtk_label_new (_("Signature"));
  1573. gtk_widget_show (label_sigpath);
  1574. gtk_box_pack_start (GTK_BOX (hbox2), label_sigpath, FALSE, FALSE, 0);
  1575. entry_sigpath = gtk_entry_new ();
  1576. gtk_widget_show (entry_sigpath);
  1577. gtk_box_pack_start (GTK_BOX (hbox2), entry_sigpath, TRUE, TRUE, 0);
  1578. signature_browse_button = gtkut_get_browse_file_btn(_("Bro_wse"));
  1579. gtk_widget_show (signature_browse_button);
  1580. gtk_box_pack_start (GTK_BOX (hbox2), signature_browse_button, FALSE, FALSE, 0);
  1581. g_signal_connect(G_OBJECT(signature_browse_button), "clicked",
  1582. G_CALLBACK(prefs_account_signature_browse_cb), NULL);
  1583. signature_edit_button = gtk_button_new_from_stock (GTK_STOCK_EDIT);
  1584. gtk_widget_show (signature_edit_button);
  1585. gtk_box_pack_start (GTK_BOX (hbox2), signature_edit_button, FALSE, FALSE, 0);
  1586. g_signal_connect(G_OBJECT(signature_edit_button), "clicked",
  1587. G_CALLBACK(prefs_account_signature_edit_cb), entry_sigpath);
  1588. PACK_FRAME (vbox1, frame, _("Automatically set the following addresses"));
  1589. table = gtk_table_new (3, 2, FALSE);
  1590. gtk_widget_show (table);
  1591. gtk_container_add (GTK_CONTAINER (frame), table);
  1592. gtk_container_set_border_width (GTK_CONTAINER (table), 8);
  1593. gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW_2);
  1594. gtk_table_set_col_spacings (GTK_TABLE (table), 8);
  1595. autocc_checkbtn = gtk_check_button_new_with_label (_("Cc"));
  1596. gtk_widget_show (autocc_checkbtn);
  1597. gtk_table_attach (GTK_TABLE (table), autocc_checkbtn, 0, 1, 0, 1,
  1598. GTK_FILL, 0, 0, 0);
  1599. autocc_entry = gtk_entry_new ();
  1600. gtk_widget_show (autocc_entry);
  1601. gtk_table_attach (GTK_TABLE (table), autocc_entry, 1, 2, 0, 1,
  1602. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  1603. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  1604. SET_TOGGLE_SENSITIVITY (autocc_checkbtn, autocc_entry);
  1605. autobcc_checkbtn = gtk_check_button_new_with_label (_("Bcc"));
  1606. gtk_widget_show (autobcc_checkbtn);
  1607. gtk_table_attach (GTK_TABLE (table), autobcc_checkbtn, 0, 1, 1, 2,
  1608. GTK_FILL, 0, 0, 0);
  1609. autobcc_entry = gtk_entry_new ();
  1610. gtk_widget_show (autobcc_entry);
  1611. gtk_table_attach (GTK_TABLE (table), autobcc_entry, 1, 2, 1, 2,
  1612. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  1613. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  1614. SET_TOGGLE_SENSITIVITY (autobcc_checkbtn, autobcc_entry);
  1615. autoreplyto_checkbtn = gtk_check_button_new_with_label (_("Reply-To"));
  1616. gtk_widget_show (autoreplyto_checkbtn);
  1617. gtk_table_attach (GTK_TABLE (table), autoreplyto_checkbtn, 0, 1, 2, 3,
  1618. GTK_FILL, 0, 0, 0);
  1619. autoreplyto_entry = gtk_entry_new ();
  1620. gtk_widget_show (autoreplyto_entry);
  1621. gtk_table_attach (GTK_TABLE (table), autoreplyto_entry, 1, 2, 2, 3,
  1622. GTK_EXPAND | GTK_SHRINK | GTK_FILL,
  1623. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
  1624. SET_TOGGLE_SENSITIVITY (autoreplyto_checkbtn, autoreplyto_entry);
  1625. #if USE_ENCHANT
  1626. PACK_FRAME (vbox1, frame_dict, _("Spell check dictionaries"));
  1627. table_dict = gtk_table_new (2, 2, FALSE);
  1628. gtk_widget_show (table_dict);
  1629. gtk_container_add (GTK_CONTAINER (frame_dict), table_dict);
  1630. gtk_container_set_border_width (GTK_CONTAINER (table_dict), 8);
  1631. gtk_table_set_row_spacings (GTK_TABLE (table_dict), VSPACING_NARROW_2);
  1632. gtk_table_set_col_spacings (GTK_TABLE (table_dict), 8);
  1633. /* Default dictionary */
  1634. checkbtn_enable_default_dictionary = gtk_check_button_new_with_label(_("Default dictionary"));
  1635. gtk_table_attach(GTK_TABLE(table_dict), checkbtn_enable_default_dictionary, 0, 1,
  1636. 0, 1, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
  1637. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_dictionary),
  1638. tmp_ac_prefs.enable_default_dictionary);
  1639. combo_default_dictionary = gtkaspell_dictionary_combo_new(TRUE);
  1640. gtk_table_attach(GTK_TABLE(table_dict), combo_default_dictionary, 1, 2,
  1641. 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
  1642. SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_dictionary, combo_default_dictionary);
  1643. /* Default dictionary */
  1644. checkbtn_enable_default_alt_dictionary = gtk_check_button_new_with_label(_("Default alternate dictionary"));
  1645. gtk_table_attach(GTK_TABLE(table_dict), checkbtn_enable_default_alt_dictionary, 0, 1,
  1646. 1, 2, GTK_SHRINK | GTK_FILL, GTK_SHRINK, 0, 0);
  1647. gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_enable_default_alt_dictionary),
  1648. tmp_ac_prefs.enable_default_alt_dictionary);
  1649. combo_default_alt_dictionary = gtkaspell_dictionary_combo_new(FALSE);
  1650. gtk_table_attach(GTK_TABLE(table_dict), combo_default_alt_dictionary, 1, 2,
  1651. 1, 2, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
  1652. SET_TOGGLE_SENSITIVITY(checkbtn_enable_default_alt_dictionary, combo_default_alt_dictionary);
  1653. gtk_widget_show_all(table_dict);
  1654. #endif
  1655. page->sigfile_radiobtn = sigfile_radiobtn;
  1656. page->entry_sigpath = entry_sigpath;
  1657. page->checkbtn_autosig = checkbtn_autosig;
  1658. page->entry_sigsep = entry_sigsep;
  1659. page->autocc_checkbtn = autocc_checkbtn;
  1660. page->autocc_entry = autocc_entry;
  1661. page->autobcc_checkbtn = autobcc_checkbtn;
  1662. page->autobcc_entry = autobcc_entry;
  1663. page->autoreplyto_checkbtn = autoreplyto_checkbtn;
  1664. page->autoreplyto_entry = autoreplyto_entry;
  1665. #ifdef USE_ENCHANT
  1666. page->checkbtn_enable_default_dictionary = checkbtn_enable_default_dictionary;
  1667. page->combo_default_dictionary = combo_default_dictionary;
  1668. page->checkbtn_enable_default_alt_dictionary = checkbtn_enable_default_alt_dictionary;
  1669. page->combo_default_alt_dictionary = combo_default_alt_dictionary;
  1670. #endif
  1671. #ifdef USE_ENCHANT
  1672. /* reset gtkaspell menus */
  1673. if (compose_page.combo_default_dictionary != NULL) {
  1674. gtk_combo_box_set_model(GTK_COMBO_BOX(compose_page.combo_default_dictionary),
  1675. gtkaspell_dictionary_store_new());
  1676. gtk_combo_box_set_model(GTK_COMBO_BOX(compose_page.combo_default_alt_dictionary),
  1677. gtkaspell_dictionary_store_new_with_refresh(
  1678. FALSE));
  1679. }
  1680. #endif
  1681. tmp_ac_prefs = *ac_prefs;
  1682. if (new_account) {
  1683. prefs_set_dialog_to_default(compose_param);
  1684. } else
  1685. prefs_set_dialog(compose_param);
  1686. page->vbox = vbox1;
  1687. page->page.widget = vbox1;
  1688. }
  1689. static void templates_create_widget_func(PrefsPage * _page,
  1690. GtkWindow * window,
  1691. gpointer data)
  1692. {
  1693. TemplatesPage *page = (TemplatesPage *) _page;
  1694. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1695. GtkWidget *vbox;
  1696. GtkWidget *vbox2;
  1697. GtkWidget *notebook;
  1698. vbox = gtk_vbox_new(FALSE, 0);
  1699. gtk_widget_show(vbox);
  1700. notebook = gtk_notebook_new();
  1701. gtk_widget_show(notebook);
  1702. gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
  1703. /* compose format */
  1704. vbox2 = gtk_vbox_new (FALSE, VSPACING);
  1705. gtk_widget_show (vbox2);
  1706. gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
  1707. quotefmt_create_new_msg_fmt_widgets(
  1708. window,
  1709. vbox2,
  1710. &page->checkbtn_compose_with_format,
  1711. NULL,
  1712. &page->compose_subject_format,
  1713. &page->compose_body_format,
  1714. FALSE, NULL);
  1715. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(_("Compose")));
  1716. /* reply format */
  1717. vbox2 = gtk_vbox_new (FALSE, VSPACING);
  1718. gtk_widget_show (vbox2);
  1719. gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
  1720. quotefmt_create_reply_fmt_widgets(
  1721. window,
  1722. vbox2,
  1723. &page->checkbtn_reply_with_format,
  1724. NULL,
  1725. &page->reply_quotemark,
  1726. &page->reply_body_format,
  1727. FALSE, NULL);
  1728. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(_("Reply")));
  1729. /* forward format */
  1730. vbox2 = gtk_vbox_new (FALSE, VSPACING);
  1731. gtk_widget_show (vbox2);
  1732. gtk_container_set_border_width (GTK_CONTAINER (vbox2), VBOX_BORDER);
  1733. quotefmt_create_forward_fmt_widgets(
  1734. window,
  1735. vbox2,
  1736. &page->checkbtn_forward_with_format,
  1737. NULL,
  1738. &page->forward_quotemark,
  1739. &page->forward_body_format,
  1740. FALSE, NULL);
  1741. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox2, gtk_label_new(_("Forward")));
  1742. quotefmt_add_info_button(window, vbox);
  1743. tmp_ac_prefs = *ac_prefs;
  1744. if (new_account) {
  1745. prefs_set_dialog_to_default(templates_param);
  1746. } else
  1747. prefs_set_dialog(templates_param);
  1748. page->vbox = vbox;
  1749. page->page.widget = vbox;
  1750. }
  1751. static void privacy_create_widget_func(PrefsPage * _page,
  1752. GtkWindow * window,
  1753. gpointer data)
  1754. {
  1755. PrivacyPage *page = (PrivacyPage *) _page;
  1756. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1757. GtkWidget *vbox1;
  1758. GtkWidget *vbox2;
  1759. GtkWidget *hbox1;
  1760. GtkWidget *label;
  1761. GtkWidget *default_privacy_system;
  1762. GtkListStore *menu;
  1763. GtkCellRenderer *rend;
  1764. GtkWidget *default_encrypt_checkbtn;
  1765. GtkWidget *default_encrypt_reply_checkbtn;
  1766. GtkWidget *default_sign_checkbtn;
  1767. GtkWidget *default_sign_reply_checkbtn;
  1768. GtkWidget *save_clear_text_checkbtn;
  1769. GtkWidget *encrypt_to_self_checkbtn;
  1770. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  1771. gtk_widget_show (vbox1);
  1772. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  1773. vbox2 = gtk_vbox_new (FALSE, 0);
  1774. gtk_widget_show (vbox2);
  1775. gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
  1776. hbox1 = gtk_hbox_new(FALSE, 8);
  1777. gtk_widget_show (hbox1);
  1778. gtk_container_add (GTK_CONTAINER(vbox2), hbox1);
  1779. label = gtk_label_new(_("Default privacy system"));
  1780. gtk_widget_show(label);
  1781. gtk_box_pack_start (GTK_BOX (hbox1), label, FALSE, FALSE, 0);
  1782. /* Can't use gtkut_sc_combobox_create() here, because model for this
  1783. * combobox needs an extra string column to store privacy plugin id. */
  1784. menu = gtk_list_store_new(4,
  1785. G_TYPE_STRING,
  1786. G_TYPE_INT,
  1787. G_TYPE_BOOLEAN,
  1788. G_TYPE_STRING); /* This is where we store the privacy plugin id. */
  1789. default_privacy_system = gtk_combo_box_new_with_model(GTK_TREE_MODEL(menu));
  1790. rend = gtk_cell_renderer_text_new();
  1791. gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(default_privacy_system), rend, TRUE);
  1792. gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(default_privacy_system), rend,
  1793. "text", COMBOBOX_TEXT,
  1794. "sensitive", COMBOBOX_SENS,
  1795. NULL);
  1796. gtk_combo_box_set_focus_on_click(GTK_COMBO_BOX(default_privacy_system), FALSE);
  1797. gtk_widget_show (default_privacy_system);
  1798. gtk_box_pack_start (GTK_BOX(hbox1), default_privacy_system, FALSE, TRUE, 0);
  1799. g_signal_connect(G_OBJECT(default_privacy_system), "changed",
  1800. G_CALLBACK(privacy_system_activated),
  1801. NULL);
  1802. PACK_CHECK_BUTTON (vbox2, default_sign_checkbtn,
  1803. _("Always sign messages"));
  1804. PACK_CHECK_BUTTON (vbox2, default_encrypt_checkbtn,
  1805. _("Always encrypt messages"));
  1806. PACK_CHECK_BUTTON (vbox2, default_sign_reply_checkbtn,
  1807. _("Always sign messages when replying to a "
  1808. "signed message"));
  1809. PACK_CHECK_BUTTON (vbox2, default_encrypt_reply_checkbtn,
  1810. _("Always encrypt messages when replying to an "
  1811. "encrypted message"));
  1812. PACK_CHECK_BUTTON (vbox2, encrypt_to_self_checkbtn,
  1813. _("Encrypt sent messages with your own key in addition to recipient's"));
  1814. PACK_CHECK_BUTTON (vbox2, save_clear_text_checkbtn,
  1815. _("Save sent encrypted messages as clear text"));
  1816. SET_TOGGLE_SENSITIVITY_REVERSE(encrypt_to_self_checkbtn, save_clear_text_checkbtn);
  1817. SET_TOGGLE_SENSITIVITY_REVERSE(save_clear_text_checkbtn, encrypt_to_self_checkbtn);
  1818. page->default_privacy_system = default_privacy_system;
  1819. page->default_encrypt_checkbtn = default_encrypt_checkbtn;
  1820. page->default_encrypt_reply_checkbtn = default_encrypt_reply_checkbtn;
  1821. page->default_sign_reply_checkbtn = default_sign_reply_checkbtn;
  1822. page->default_sign_checkbtn = default_sign_checkbtn;
  1823. page->save_clear_text_checkbtn = save_clear_text_checkbtn;
  1824. page->encrypt_to_self_checkbtn = encrypt_to_self_checkbtn;
  1825. update_privacy_system_menu();
  1826. tmp_ac_prefs = *ac_prefs;
  1827. if (new_account) {
  1828. prefs_set_dialog_to_default(privacy_param);
  1829. } else
  1830. prefs_set_dialog(privacy_param);
  1831. page->vbox = vbox1;
  1832. page->page.widget = vbox1;
  1833. }
  1834. #ifdef USE_GNUTLS
  1835. #define CREATE_RADIO_BUTTON(box, btn, btn_p, label, data) \
  1836. { \
  1837. btn = gtk_radio_button_new_with_label_from_widget \
  1838. (GTK_RADIO_BUTTON (btn_p), label); \
  1839. gtk_widget_show (btn); \
  1840. gtk_box_pack_start (GTK_BOX (box), btn, FALSE, FALSE, 0); \
  1841. g_object_set_data (G_OBJECT (btn), \
  1842. MENU_VAL_ID, \
  1843. GINT_TO_POINTER (data)); \
  1844. }
  1845. #define CREATE_RADIO_BUTTONS(box, \
  1846. btn1, btn1_label, btn1_data, \
  1847. btn2, btn2_label, btn2_data, \
  1848. btn3, btn3_label, btn3_data) \
  1849. { \
  1850. btn1 = gtk_radio_button_new_with_label(NULL, btn1_label); \
  1851. gtk_widget_show (btn1); \
  1852. gtk_box_pack_start (GTK_BOX (box), btn1, FALSE, FALSE, 0); \
  1853. g_object_set_data (G_OBJECT (btn1), \
  1854. MENU_VAL_ID, \
  1855. GINT_TO_POINTER (btn1_data)); \
  1856. \
  1857. CREATE_RADIO_BUTTON(box, btn2, btn1, btn2_label, btn2_data); \
  1858. CREATE_RADIO_BUTTON(box, btn3, btn1, btn3_label, btn3_data); \
  1859. }
  1860. static void ssl_create_widget_func(PrefsPage * _page,
  1861. GtkWindow * window,
  1862. gpointer data)
  1863. {
  1864. SSLPage *page = (SSLPage *) _page;
  1865. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  1866. GtkWidget *vbox1;
  1867. GtkWidget *pop_frame;
  1868. GtkWidget *vbox2;
  1869. GtkWidget *pop_nossl_radiobtn;
  1870. GtkWidget *pop_ssltunnel_radiobtn;
  1871. GtkWidget *pop_starttls_radiobtn;
  1872. GtkWidget *imap_frame;
  1873. GtkWidget *vbox3;
  1874. GtkWidget *imap_nossl_radiobtn;
  1875. GtkWidget *imap_ssltunnel_radiobtn;
  1876. GtkWidget *imap_starttls_radiobtn;
  1877. GtkWidget *nntp_frame;
  1878. GtkWidget *vbox4;
  1879. GtkWidget *nntp_nossl_radiobtn;
  1880. GtkWidget *nntp_ssltunnel_radiobtn;
  1881. GtkWidget *send_frame;
  1882. GtkWidget *vbox5;
  1883. GtkWidget *smtp_nossl_radiobtn;
  1884. GtkWidget *smtp_ssltunnel_radiobtn;
  1885. GtkWidget *smtp_starttls_radiobtn;
  1886. GtkWidget *cert_frame;
  1887. GtkWidget *cert_table;
  1888. GtkWidget *entry_in_cert_pass;
  1889. GtkWidget *entry_out_cert_pass;
  1890. GtkWidget *vbox7;
  1891. GtkWidget *use_nonblocking_ssl_checkbtn;
  1892. GtkWidget *hbox;
  1893. GtkWidget *hbox_spc;
  1894. GtkWidget *label;
  1895. CLAWS_TIP_DECL();
  1896. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  1897. gtk_widget_show (vbox1);
  1898. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  1899. vbox2 = gtkut_get_options_frame(vbox1, &pop_frame, _("POP3"));
  1900. CREATE_RADIO_BUTTONS(vbox2,
  1901. pop_nossl_radiobtn,
  1902. _("Don't use SSL"),
  1903. SSL_NONE,
  1904. pop_ssltunnel_radiobtn,
  1905. _("Use SSL for POP3 connection"),
  1906. SSL_TUNNEL,
  1907. pop_starttls_radiobtn,
  1908. _("Use STARTTLS command to start SSL session"),
  1909. SSL_STARTTLS);
  1910. vbox3 = gtkut_get_options_frame(vbox1, &imap_frame, _("IMAP4"));
  1911. CREATE_RADIO_BUTTONS(vbox3,
  1912. imap_nossl_radiobtn,
  1913. _("Don't use SSL"),
  1914. SSL_NONE,
  1915. imap_ssltunnel_radiobtn,
  1916. _("Use SSL for IMAP4 connection"),
  1917. SSL_TUNNEL,
  1918. imap_starttls_radiobtn,
  1919. _("Use STARTTLS command to start SSL session"),
  1920. SSL_STARTTLS);
  1921. vbox4 = gtkut_get_options_frame(vbox1, &nntp_frame, _("NNTP"));
  1922. nntp_nossl_radiobtn =
  1923. gtk_radio_button_new_with_label (NULL, _("Don't use SSL"));
  1924. gtk_widget_show (nntp_nossl_radiobtn);
  1925. gtk_box_pack_start (GTK_BOX (vbox4), nntp_nossl_radiobtn,
  1926. FALSE, FALSE, 0);
  1927. g_object_set_data (G_OBJECT (nntp_nossl_radiobtn),
  1928. MENU_VAL_ID,
  1929. GINT_TO_POINTER (SSL_NONE));
  1930. CREATE_RADIO_BUTTON(vbox4, nntp_ssltunnel_radiobtn, nntp_nossl_radiobtn,
  1931. _("Use SSL for NNTP connection"), SSL_TUNNEL);
  1932. vbox5 = gtkut_get_options_frame(vbox1, &send_frame, _("Send (SMTP)"));
  1933. CREATE_RADIO_BUTTONS(vbox5,
  1934. smtp_nossl_radiobtn,
  1935. _("Don't use SSL (but, if necessary, use STARTTLS)"),
  1936. SSL_NONE,
  1937. smtp_ssltunnel_radiobtn,
  1938. _("Use SSL for SMTP connection"),
  1939. SSL_TUNNEL,
  1940. smtp_starttls_radiobtn,
  1941. _("Use STARTTLS command to start SSL session"),
  1942. SSL_STARTTLS);
  1943. PACK_FRAME(vbox1, cert_frame, _("Client certificates"));
  1944. cert_table = gtk_table_new(4,3, FALSE);
  1945. gtk_container_add(GTK_CONTAINER(cert_frame), cert_table);
  1946. gtk_container_set_border_width(GTK_CONTAINER(cert_table), 8);
  1947. gtk_table_set_row_spacings(GTK_TABLE(cert_table), VSPACING_NARROW_2);
  1948. gtk_table_set_col_spacings(GTK_TABLE(cert_table), 8);
  1949. label = gtk_label_new(_("Certificate for receiving"));
  1950. gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
  1951. entry_in_cert_file = gtk_entry_new();
  1952. in_ssl_cert_browse_button = gtkut_get_browse_file_btn(_("Browse"));
  1953. CLAWS_SET_TIP(label,
  1954. _("Client certificate file as a PKCS12 or PEM file"));
  1955. CLAWS_SET_TIP(entry_in_cert_file,
  1956. _("Client certificate file as a PKCS12 or PEM file"));
  1957. gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 0, 1, GTK_FILL, 0, 0, 0);
  1958. gtk_table_attach(GTK_TABLE(cert_table), entry_in_cert_file, 1, 2, 0, 1,
  1959. GTK_EXPAND|GTK_FILL, 0, 0, 0);
  1960. gtk_table_attach(GTK_TABLE(cert_table), in_ssl_cert_browse_button, 2, 3, 0, 1,
  1961. GTK_FILL, 0, 0, 0);
  1962. label = gtk_label_new(_("Password"));
  1963. gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
  1964. entry_in_cert_pass = gtk_entry_new();
  1965. gtk_entry_set_visibility(GTK_ENTRY(entry_in_cert_pass), FALSE);
  1966. gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 1, 2, GTK_FILL, 0, 0, 0);
  1967. gtk_table_attach(GTK_TABLE(cert_table), entry_in_cert_pass, 1, 2, 1, 2,
  1968. GTK_FILL, 0, 0, 0);
  1969. label = gtk_label_new(_("Certificate for sending"));
  1970. gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
  1971. entry_out_cert_file = gtk_entry_new();
  1972. out_ssl_cert_browse_button = gtkut_get_browse_file_btn(_("Browse"));
  1973. CLAWS_SET_TIP(label,
  1974. _("Client certificate file as a PKCS12 or PEM file"));
  1975. CLAWS_SET_TIP(entry_out_cert_file,
  1976. _("Client certificate file as a PKCS12 or PEM file"));
  1977. gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 2, 3, GTK_FILL, 0, 0, 0);
  1978. gtk_table_attach(GTK_TABLE(cert_table), entry_out_cert_file, 1, 2, 2, 3,
  1979. GTK_EXPAND|GTK_FILL, 0, 0, 0);
  1980. gtk_table_attach(GTK_TABLE(cert_table), out_ssl_cert_browse_button, 2, 3, 2, 3,
  1981. GTK_FILL, 0, 0, 0);
  1982. label = gtk_label_new(_("Password"));
  1983. gtk_misc_set_alignment(GTK_MISC(label), 1, 0.5);
  1984. entry_out_cert_pass = gtk_entry_new();
  1985. gtk_entry_set_visibility(GTK_ENTRY(entry_out_cert_pass), FALSE);
  1986. gtk_table_attach(GTK_TABLE(cert_table), label, 0, 1, 3, 4, GTK_FILL, 0, 0, 0);
  1987. gtk_table_attach(GTK_TABLE(cert_table), entry_out_cert_pass, 1, 2, 3, 4,
  1988. GTK_FILL, 0, 0, 0);
  1989. gtk_widget_show_all(cert_table);
  1990. g_signal_connect(G_OBJECT(in_ssl_cert_browse_button), "clicked",
  1991. G_CALLBACK(prefs_account_in_cert_browse_cb), NULL);
  1992. g_signal_connect(G_OBJECT(out_ssl_cert_browse_button), "clicked",
  1993. G_CALLBACK(prefs_account_out_cert_browse_cb), NULL);
  1994. vbox7 = gtk_vbox_new (FALSE, 0);
  1995. gtk_widget_show (vbox7);
  1996. gtk_box_pack_start (GTK_BOX (vbox1), vbox7, FALSE, FALSE, 0);
  1997. PACK_CHECK_BUTTON(vbox7, use_nonblocking_ssl_checkbtn,
  1998. _("Use non-blocking SSL"));
  1999. hbox = gtk_hbox_new (FALSE, 0);
  2000. gtk_widget_show (hbox);
  2001. gtk_box_pack_start (GTK_BOX (vbox7), hbox, FALSE, FALSE, 0);
  2002. hbox_spc = gtk_hbox_new (FALSE, 0);
  2003. gtk_widget_show (hbox_spc);
  2004. gtk_box_pack_start (GTK_BOX (hbox), hbox_spc, FALSE, FALSE, 0);
  2005. gtk_widget_set_size_request (hbox_spc, 16, -1);
  2006. label = gtk_label_new
  2007. (_("Turn this off if you have SSL connection problems"));
  2008. gtk_widget_show (label);
  2009. gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
  2010. gtkut_widget_set_small_font_size (label);
  2011. page->pop_frame = pop_frame;
  2012. page->pop_nossl_radiobtn = pop_nossl_radiobtn;
  2013. page->pop_ssltunnel_radiobtn = pop_ssltunnel_radiobtn;
  2014. page->pop_starttls_radiobtn = pop_starttls_radiobtn;
  2015. page->imap_frame = imap_frame;
  2016. page->imap_nossl_radiobtn = imap_nossl_radiobtn;
  2017. page->imap_ssltunnel_radiobtn = imap_ssltunnel_radiobtn;
  2018. page->imap_starttls_radiobtn = imap_starttls_radiobtn;
  2019. page->nntp_frame = nntp_frame;
  2020. page->nntp_nossl_radiobtn = nntp_nossl_radiobtn;
  2021. page->nntp_ssltunnel_radiobtn = nntp_ssltunnel_radiobtn;
  2022. page->send_frame = send_frame;
  2023. page->smtp_nossl_radiobtn = smtp_nossl_radiobtn;
  2024. page->smtp_ssltunnel_radiobtn = smtp_ssltunnel_radiobtn;
  2025. page->smtp_starttls_radiobtn = smtp_starttls_radiobtn;
  2026. page->entry_in_cert_file = entry_in_cert_file;
  2027. page->entry_in_cert_pass = entry_in_cert_pass;
  2028. page->entry_out_cert_file = entry_out_cert_file;
  2029. page->entry_out_cert_pass = entry_out_cert_pass;
  2030. page->use_nonblocking_ssl_checkbtn = use_nonblocking_ssl_checkbtn;
  2031. tmp_ac_prefs = *ac_prefs;
  2032. if (new_account) {
  2033. prefs_set_dialog_to_default(ssl_param);
  2034. } else
  2035. prefs_set_dialog(ssl_param);
  2036. page->vbox = vbox1;
  2037. page->page.widget = vbox1;
  2038. }
  2039. #undef CREATE_RADIO_BUTTONS
  2040. #undef CREATE_RADIO_BUTTON
  2041. #endif /* USE_GNUTLS */
  2042. static void advanced_create_widget_func(PrefsPage * _page,
  2043. GtkWindow * window,
  2044. gpointer data)
  2045. {
  2046. AdvancedPage *page = (AdvancedPage *) _page;
  2047. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  2048. GtkWidget *vbox1;
  2049. GtkWidget *vbox2;
  2050. GtkWidget *hbox1;
  2051. GtkWidget *checkbtn_smtpport;
  2052. GtkWidget *spinbtn_smtpport;
  2053. GtkWidget *hbox_popport;
  2054. GtkWidget *checkbtn_popport;
  2055. GtkWidget *spinbtn_popport;
  2056. GtkWidget *hbox_imapport;
  2057. GtkWidget *checkbtn_imapport;
  2058. GtkWidget *spinbtn_imapport;
  2059. GtkWidget *hbox_nntpport;
  2060. GtkWidget *checkbtn_nntpport;
  2061. GtkWidget *spinbtn_nntpport;
  2062. GtkWidget *checkbtn_domain;
  2063. GtkWidget *entry_domain;
  2064. gchar *tip_domain;
  2065. GtkWidget *checkbtn_msgid_with_addr;
  2066. GtkWidget *checkbtn_crosspost;
  2067. GtkWidget *colormenu_crosspost;
  2068. GtkWidget *menu;
  2069. #ifndef G_OS_WIN32
  2070. GtkWidget *checkbtn_tunnelcmd;
  2071. GtkWidget *entry_tunnelcmd;
  2072. #endif
  2073. GtkWidget *folder_frame;
  2074. GtkWidget *vbox3;
  2075. GtkWidget *table;
  2076. GtkWidget *sent_folder_checkbtn;
  2077. GtkWidget *sent_folder_entry;
  2078. GtkWidget *queue_folder_checkbtn;
  2079. GtkWidget *queue_folder_entry;
  2080. GtkWidget *draft_folder_checkbtn;
  2081. GtkWidget *draft_folder_entry;
  2082. GtkWidget *trash_folder_checkbtn;
  2083. GtkWidget *trash_folder_entry;
  2084. CLAWS_TIP_DECL();
  2085. GtkSizeGroup *size_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
  2086. #define PACK_HBOX(hbox) \
  2087. { \
  2088. hbox = gtk_hbox_new (FALSE, 8); \
  2089. gtk_widget_show (hbox); \
  2090. gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0); \
  2091. }
  2092. #define PACK_PORT_SPINBTN(box, spinbtn) \
  2093. { \
  2094. spinbtn = gtk_spin_button_new_with_range(0, 65535, 1); \
  2095. gtk_widget_show (spinbtn); \
  2096. gtk_box_pack_start (GTK_BOX (box), spinbtn, FALSE, FALSE, 0); \
  2097. }
  2098. vbox1 = gtk_vbox_new (FALSE, VSPACING);
  2099. gtk_widget_show (vbox1);
  2100. gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
  2101. vbox2 = gtk_vbox_new (FALSE, VSPACING_NARROW_2);
  2102. gtk_widget_show (vbox2);
  2103. gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, FALSE, 0);
  2104. PACK_HBOX (hbox1);
  2105. PACK_CHECK_BUTTON (hbox1, checkbtn_smtpport, _("SMTP port"));
  2106. PACK_PORT_SPINBTN (hbox1, spinbtn_smtpport);
  2107. SET_TOGGLE_SENSITIVITY (checkbtn_smtpport, spinbtn_smtpport);
  2108. gtk_size_group_add_widget(size_group, checkbtn_smtpport);
  2109. PACK_HBOX (hbox_popport);
  2110. PACK_CHECK_BUTTON (hbox_popport, checkbtn_popport,
  2111. _("POP3 port"));
  2112. PACK_PORT_SPINBTN (hbox_popport, spinbtn_popport);
  2113. SET_TOGGLE_SENSITIVITY (checkbtn_popport, spinbtn_popport);
  2114. gtk_size_group_add_widget(size_group, checkbtn_popport);
  2115. PACK_HBOX (hbox_imapport);
  2116. PACK_CHECK_BUTTON (hbox_imapport, checkbtn_imapport,
  2117. _("IMAP4 port"));
  2118. PACK_PORT_SPINBTN (hbox_imapport, spinbtn_imapport);
  2119. SET_TOGGLE_SENSITIVITY (checkbtn_imapport, spinbtn_imapport);
  2120. gtk_size_group_add_widget(size_group, checkbtn_imapport);
  2121. PACK_HBOX (hbox_nntpport);
  2122. PACK_CHECK_BUTTON (hbox_nntpport, checkbtn_nntpport,
  2123. _("NNTP port"));
  2124. PACK_PORT_SPINBTN (hbox_nntpport, spinbtn_nntpport);
  2125. SET_TOGGLE_SENSITIVITY (checkbtn_nntpport, spinbtn_nntpport);
  2126. gtk_size_group_add_widget(size_group, checkbtn_nntpport);
  2127. PACK_HBOX (hbox1);
  2128. PACK_CHECK_BUTTON (hbox1, checkbtn_domain, _("Domain name"));
  2129. gtk_size_group_add_widget(size_group, checkbtn_domain);
  2130. tip_domain = _("The domain name will be used in the generated "
  2131. "Message-ID, and when connecting to SMTP servers.");
  2132. CLAWS_SET_TIP(checkbtn_domain, tip_domain);
  2133. entry_domain = gtk_entry_new ();
  2134. gtk_widget_show (entry_domain);
  2135. gtk_box_pack_start (GTK_BOX (hbox1), entry_domain, TRUE, TRUE, 0);
  2136. SET_TOGGLE_SENSITIVITY (checkbtn_domain, entry_domain);
  2137. CLAWS_SET_TIP(entry_domain, tip_domain);
  2138. PACK_HBOX (hbox1);
  2139. PACK_CHECK_BUTTON (hbox1, checkbtn_msgid_with_addr,
  2140. _("Send account mail address in Message-ID"));
  2141. #ifndef G_OS_WIN32
  2142. PACK_HBOX (hbox1);
  2143. PACK_CHECK_BUTTON (hbox1, checkbtn_tunnelcmd,
  2144. _("Use command to communicate with server"));
  2145. entry_tunnelcmd = gtk_entry_new ();
  2146. gtk_widget_show (entry_tunnelcmd);
  2147. gtk_box_pack_start (GTK_BOX (hbox1), entry_tunnelcmd, TRUE, TRUE, 0);
  2148. SET_TOGGLE_SENSITIVITY (checkbtn_tunnelcmd, entry_tunnelcmd);
  2149. #endif
  2150. PACK_HBOX (hbox1);
  2151. PACK_CHECK_BUTTON (hbox1, checkbtn_crosspost,
  2152. _("Mark cross-posted messages as read and color:"));
  2153. g_signal_connect (G_OBJECT (checkbtn_crosspost), "toggled",
  2154. G_CALLBACK (crosspost_color_toggled),
  2155. NULL);
  2156. colormenu_crosspost = gtk_cmoption_menu_new();
  2157. gtk_widget_show (colormenu_crosspost);
  2158. gtk_box_pack_start (GTK_BOX (hbox1), colormenu_crosspost, FALSE, FALSE, 0);
  2159. menu = colorlabel_create_color_menu();
  2160. gtk_cmoption_menu_set_menu (GTK_CMOPTION_MENU(colormenu_crosspost), menu);
  2161. SET_TOGGLE_SENSITIVITY(checkbtn_crosspost, colormenu_crosspost);
  2162. PACK_HBOX (hbox1);
  2163. #undef PACK_HBOX
  2164. #undef PACK_PORT_SPINBTN
  2165. /* special folder setting (maybe these options are redundant) */
  2166. vbox3 = gtkut_get_options_frame(vbox1, &folder_frame, _("Folder"));
  2167. table = gtk_table_new (4, 3, FALSE);
  2168. gtk_widget_show (table);
  2169. gtk_container_add (GTK_CONTAINER (vbox3), table);
  2170. gtk_table_set_row_spacings (GTK_TABLE (table), VSPACING_NARROW_2);
  2171. gtk_table_set_col_spacings (GTK_TABLE (table), 4);
  2172. #define SET_CHECK_BTN_AND_ENTRY(label, checkbtn, entry, n) \
  2173. { \
  2174. GtkWidget *button; \
  2175. \
  2176. checkbtn = gtk_check_button_new_with_label (label); \
  2177. gtk_widget_show (checkbtn); \
  2178. gtk_table_attach (GTK_TABLE (table), checkbtn, \
  2179. 0, 1, n, n + 1, GTK_FILL, 0, 0, 0); \
  2180. \
  2181. entry = gtk_entry_new (); \
  2182. gtk_widget_show (entry); \
  2183. gtk_table_attach (GTK_TABLE (table), entry, 1, 2, n, n + 1, \
  2184. GTK_EXPAND | GTK_SHRINK | GTK_FILL, \
  2185. GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0); \
  2186. \
  2187. button = gtkut_get_browse_file_btn(_("Browse")); \
  2188. gtk_widget_show (button); \
  2189. gtk_table_attach (GTK_TABLE (table), button, \
  2190. 2, 3, n, n + 1, GTK_FILL, 0, 0, 0); \
  2191. g_signal_connect \
  2192. (G_OBJECT (button), "clicked", \
  2193. G_CALLBACK (prefs_account_select_folder_cb), \
  2194. entry); \
  2195. \
  2196. SET_TOGGLE_SENSITIVITY (checkbtn, entry); \
  2197. SET_TOGGLE_SENSITIVITY (checkbtn, button); \
  2198. }
  2199. SET_CHECK_BTN_AND_ENTRY(_("Put sent messages in"),
  2200. sent_folder_checkbtn, sent_folder_entry, 0);
  2201. SET_CHECK_BTN_AND_ENTRY(_("Put queued messages in"),
  2202. queue_folder_checkbtn, queue_folder_entry, 1);
  2203. SET_CHECK_BTN_AND_ENTRY(_("Put draft messages in"),
  2204. draft_folder_checkbtn, draft_folder_entry, 2);
  2205. SET_CHECK_BTN_AND_ENTRY(_("Put deleted messages in"),
  2206. trash_folder_checkbtn, trash_folder_entry, 3);
  2207. page->smtpport_checkbtn = checkbtn_smtpport;
  2208. page->smtpport_spinbtn = spinbtn_smtpport;
  2209. page->popport_hbox = hbox_popport;
  2210. page->popport_checkbtn = checkbtn_popport;
  2211. page->popport_spinbtn = spinbtn_popport;
  2212. page->imapport_hbox = hbox_imapport;
  2213. page->imapport_checkbtn = checkbtn_imapport;
  2214. page->imapport_spinbtn = spinbtn_imapport;
  2215. page->nntpport_hbox = hbox_nntpport;
  2216. page->nntpport_checkbtn = checkbtn_nntpport;
  2217. page->nntpport_spinbtn = spinbtn_nntpport;
  2218. page->domain_checkbtn = checkbtn_domain;
  2219. page->domain_entry = entry_domain;
  2220. page->msgid_with_addr_checkbtn = checkbtn_msgid_with_addr;
  2221. page->crosspost_checkbtn = checkbtn_crosspost;
  2222. page->crosspost_colormenu = colormenu_crosspost;
  2223. #ifndef G_OS_WIN32
  2224. page->tunnelcmd_checkbtn = checkbtn_tunnelcmd;
  2225. page->tunnelcmd_entry = entry_tunnelcmd;
  2226. #endif
  2227. page->sent_folder_checkbtn = sent_folder_checkbtn;
  2228. page->sent_folder_entry = sent_folder_entry;
  2229. page->queue_folder_checkbtn = queue_folder_checkbtn;
  2230. page->queue_folder_entry = queue_folder_entry;
  2231. page->draft_folder_checkbtn = draft_folder_checkbtn;
  2232. page->draft_folder_entry = draft_folder_entry;
  2233. page->trash_folder_checkbtn = trash_folder_checkbtn;
  2234. page->trash_folder_entry = trash_folder_entry;
  2235. tmp_ac_prefs = *ac_prefs;
  2236. if (new_account) {
  2237. prefs_set_dialog_to_default(advanced_param);
  2238. } else
  2239. prefs_set_dialog(advanced_param);
  2240. page->vbox = vbox1;
  2241. page->page.widget = vbox1;
  2242. }
  2243. static gint prefs_basic_apply(void)
  2244. {
  2245. RecvProtocol protocol;
  2246. gchar *old_id = NULL;
  2247. gchar *new_id = NULL;
  2248. struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *) basic_page.protocol_optmenu;
  2249. GtkWidget *optmenu = protocol_optmenu->combobox;
  2250. protocol = combobox_get_active_data(GTK_COMBO_BOX(optmenu));
  2251. if (*gtk_entry_get_text(GTK_ENTRY(basic_page.acname_entry)) == '\0') {
  2252. alertpanel_error(_("Account name is not entered."));
  2253. return -1;
  2254. }
  2255. if (*gtk_entry_get_text(GTK_ENTRY(basic_page.addr_entry)) == '\0') {
  2256. alertpanel_error(_("Mail address is not entered."));
  2257. return -1;
  2258. }
  2259. if (((protocol == A_POP3) ||
  2260. (protocol == A_LOCAL && !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn))) ||
  2261. (protocol == A_NONE)) &&
  2262. *gtk_entry_get_text(GTK_ENTRY(basic_page.smtpserv_entry)) == '\0') {
  2263. alertpanel_error(_("SMTP server is not entered."));
  2264. return -1;
  2265. }
  2266. if ((protocol == A_POP3 || protocol == A_IMAP4) &&
  2267. *gtk_entry_get_text(GTK_ENTRY(basic_page.uid_entry)) == '\0') {
  2268. alertpanel_error(_("User ID is not entered."));
  2269. return -1;
  2270. }
  2271. if (protocol == A_POP3 &&
  2272. *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
  2273. alertpanel_error(_("POP3 server is not entered."));
  2274. return -1;
  2275. }
  2276. if (protocol == A_POP3 || protocol == A_LOCAL) {
  2277. GtkWidget *inbox_entry = (protocol == A_POP3 ? receive_page.inbox_entry : receive_page.local_inbox_entry );
  2278. const gchar *mailbox = gtk_entry_get_text(GTK_ENTRY(inbox_entry));
  2279. FolderItem *inbox = folder_find_item_from_identifier(mailbox);
  2280. if (!inbox) {
  2281. gchar *id = NULL;
  2282. setup_write_mailbox_path(mainwindow_get_mainwindow(), "Mail");
  2283. id = folder_item_get_identifier(folder_get_default_inbox_for_class(F_MH));
  2284. gtk_entry_set_text(GTK_ENTRY(receive_page.inbox_entry),
  2285. id);
  2286. gtk_entry_set_text(GTK_ENTRY(receive_page.local_inbox_entry),
  2287. id);
  2288. g_free(id);
  2289. mailbox = gtk_entry_get_text(GTK_ENTRY(inbox_entry));
  2290. inbox = folder_find_item_from_identifier(mailbox);
  2291. }
  2292. if (inbox == NULL) {
  2293. alertpanel_error(_("The default Inbox folder doesn't exist."));
  2294. return -1;
  2295. }
  2296. }
  2297. if (protocol == A_IMAP4 &&
  2298. *gtk_entry_get_text(GTK_ENTRY(basic_page.recvserv_entry)) == '\0') {
  2299. alertpanel_error(_("IMAP4 server is not entered."));
  2300. return -1;
  2301. }
  2302. if (protocol == A_NNTP &&
  2303. *gtk_entry_get_text(GTK_ENTRY(basic_page.nntpserv_entry)) == '\0') {
  2304. alertpanel_error(_("NNTP server is not entered."));
  2305. return -1;
  2306. }
  2307. if (protocol == A_LOCAL &&
  2308. *gtk_entry_get_text(GTK_ENTRY(basic_page.localmbox_entry)) == '\0') {
  2309. alertpanel_error(_("local mailbox filename is not entered."));
  2310. return -1;
  2311. }
  2312. if (protocol == A_LOCAL &&
  2313. gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn)) && *gtk_entry_get_text(GTK_ENTRY(basic_page.mailcmd_entry)) == '\0') {
  2314. alertpanel_error(_("mail command is not entered."));
  2315. return -1;
  2316. }
  2317. if (protocol == A_IMAP4 || protocol == A_NNTP)
  2318. old_id = g_strdup_printf("#%s/%s",
  2319. protocol == A_IMAP4 ? "imap":"nntp",
  2320. tmp_ac_prefs.account_name ? tmp_ac_prefs.account_name : "(null)");
  2321. prefs_set_data_from_dialog(basic_param);
  2322. if (protocol == A_IMAP4 || protocol == A_NNTP) {
  2323. new_id = g_strdup_printf("#%s/%s",
  2324. protocol == A_IMAP4 ? "imap":"nntp",
  2325. tmp_ac_prefs.account_name);
  2326. if (old_id != NULL && new_id != NULL)
  2327. prefs_filtering_rename_path(old_id, new_id);
  2328. g_free(old_id);
  2329. g_free(new_id);
  2330. }
  2331. return 0;
  2332. }
  2333. static gint prefs_receive_apply(void)
  2334. {
  2335. prefs_set_data_from_dialog(receive_param);
  2336. return 0;
  2337. }
  2338. static gint prefs_send_apply(void)
  2339. {
  2340. prefs_set_data_from_dialog(send_param);
  2341. return 0;
  2342. }
  2343. static gint prefs_compose_apply(void)
  2344. {
  2345. prefs_set_data_from_dialog(compose_param);
  2346. return 0;
  2347. }
  2348. static gint prefs_templates_apply(void)
  2349. {
  2350. prefs_set_data_from_dialog(templates_param);
  2351. return 0;
  2352. }
  2353. static gint prefs_privacy_apply(void)
  2354. {
  2355. prefs_set_data_from_dialog(privacy_param);
  2356. return 0;
  2357. }
  2358. #ifdef USE_GNUTLS
  2359. static gint prefs_ssl_apply(void)
  2360. {
  2361. prefs_set_data_from_dialog(ssl_param);
  2362. return 0;
  2363. }
  2364. #endif
  2365. static gint prefs_advanced_apply(void)
  2366. {
  2367. prefs_set_data_from_dialog(advanced_param);
  2368. return 0;
  2369. }
  2370. static void basic_destroy_widget_func(PrefsPage *_page)
  2371. {
  2372. /* BasicPage *page = (BasicPage *) _page; */
  2373. }
  2374. static void receive_destroy_widget_func(PrefsPage *_page)
  2375. {
  2376. /* ReceivePage *page = (ReceivePage *) _page; */
  2377. }
  2378. static void send_destroy_widget_func(PrefsPage *_page)
  2379. {
  2380. /* SendPage *page = (SendPage *) _page; */
  2381. }
  2382. static void compose_destroy_widget_func(PrefsPage *_page)
  2383. {
  2384. /* ComposePage *page = (ComposePage *) _page; */
  2385. }
  2386. static void templates_destroy_widget_func(PrefsPage *_page)
  2387. {
  2388. /* TemplatesPage *page = (TemplatesPage *) _page; */
  2389. }
  2390. static void privacy_destroy_widget_func(PrefsPage *_page)
  2391. {
  2392. /* PrivacyPage *page = (PrivacyPage *) _page; */
  2393. }
  2394. #ifdef USE_GNUTLS
  2395. static void ssl_destroy_widget_func(PrefsPage *_page)
  2396. {
  2397. /* SSLPage *page = (SSLPage *) _page; */
  2398. }
  2399. #endif
  2400. static void advanced_destroy_widget_func(PrefsPage *_page)
  2401. {
  2402. /* AdvancedPage *page = (AdvancedPage *) _page; */
  2403. }
  2404. static gboolean basic_can_close_func(PrefsPage *_page)
  2405. {
  2406. BasicPage *page = (BasicPage *) _page;
  2407. if (!page->page.page_open)
  2408. return TRUE;
  2409. return prefs_basic_apply() >= 0;
  2410. }
  2411. static gboolean receive_can_close_func(PrefsPage *_page)
  2412. {
  2413. ReceivePage *page = (ReceivePage *) _page;
  2414. if (!page->page.page_open)
  2415. return TRUE;
  2416. return prefs_receive_apply() >= 0;
  2417. }
  2418. static gboolean send_can_close_func(PrefsPage *_page)
  2419. {
  2420. SendPage *page = (SendPage *) _page;
  2421. if (!page->page.page_open)
  2422. return TRUE;
  2423. return prefs_send_apply() >= 0;
  2424. }
  2425. static gboolean compose_can_close_func(PrefsPage *_page)
  2426. {
  2427. ComposePage *page = (ComposePage *) _page;
  2428. if (!page->page.page_open)
  2429. return TRUE;
  2430. return prefs_compose_apply() >= 0;
  2431. }
  2432. static gboolean templates_can_close_func(PrefsPage *_page)
  2433. {
  2434. TemplatesPage *page = (TemplatesPage *) _page;
  2435. if (!page->page.page_open)
  2436. return TRUE;
  2437. return prefs_templates_apply() >= 0;
  2438. }
  2439. static gboolean privacy_can_close_func(PrefsPage *_page)
  2440. {
  2441. PrivacyPage *page = (PrivacyPage *) _page;
  2442. if (!page->page.page_open)
  2443. return TRUE;
  2444. return prefs_privacy_apply() >= 0;
  2445. }
  2446. #ifdef USE_GNUTLS
  2447. static gboolean ssl_can_close_func(PrefsPage *_page)
  2448. {
  2449. SSLPage *page = (SSLPage *) _page;
  2450. if (!page->page.page_open)
  2451. return TRUE;
  2452. return prefs_ssl_apply() >= 0;
  2453. }
  2454. #endif
  2455. static gboolean advanced_can_close_func(PrefsPage *_page)
  2456. {
  2457. AdvancedPage *page = (AdvancedPage *) _page;
  2458. if (!page->page.page_open)
  2459. return TRUE;
  2460. return prefs_advanced_apply() >= 0;
  2461. }
  2462. static void basic_save_func(PrefsPage *_page)
  2463. {
  2464. BasicPage *page = (BasicPage *) _page;
  2465. if (!page->page.page_open)
  2466. return;
  2467. if (prefs_basic_apply() >= 0)
  2468. cancelled = FALSE;
  2469. }
  2470. static void receive_save_func(PrefsPage *_page)
  2471. {
  2472. ReceivePage *page = (ReceivePage *) _page;
  2473. if (!page->page.page_open)
  2474. return;
  2475. if (prefs_receive_apply() >= 0)
  2476. cancelled = FALSE;
  2477. }
  2478. static void send_save_func(PrefsPage *_page)
  2479. {
  2480. SendPage *page = (SendPage *) _page;
  2481. if (!page->page.page_open)
  2482. return;
  2483. if (prefs_send_apply() >= 0)
  2484. cancelled = FALSE;
  2485. }
  2486. static void compose_save_func(PrefsPage *_page)
  2487. {
  2488. ComposePage *page = (ComposePage *) _page;
  2489. if (!page->page.page_open)
  2490. return;
  2491. if (prefs_compose_apply() >= 0)
  2492. cancelled = FALSE;
  2493. }
  2494. static void templates_save_func(PrefsPage *_page)
  2495. {
  2496. TemplatesPage *page = (TemplatesPage *) _page;
  2497. if (!page->page.page_open)
  2498. return;
  2499. quotefmt_check_new_msg_formats(tmp_ac_prefs.compose_with_format,
  2500. NULL,
  2501. tmp_ac_prefs.compose_subject_format,
  2502. tmp_ac_prefs.compose_body_format);
  2503. quotefmt_check_reply_formats(tmp_ac_prefs.reply_with_format,
  2504. NULL,
  2505. tmp_ac_prefs.reply_quotemark,
  2506. tmp_ac_prefs.reply_body_format);
  2507. quotefmt_check_forward_formats(tmp_ac_prefs.forward_with_format,
  2508. NULL,
  2509. tmp_ac_prefs.forward_quotemark,
  2510. tmp_ac_prefs.forward_body_format);
  2511. if (prefs_templates_apply() >= 0)
  2512. cancelled = FALSE;
  2513. }
  2514. static void privacy_save_func(PrefsPage *_page)
  2515. {
  2516. PrivacyPage *page = (PrivacyPage *) _page;
  2517. if (!page->page.page_open)
  2518. return;
  2519. if (prefs_privacy_apply() >= 0)
  2520. cancelled = FALSE;
  2521. }
  2522. #ifdef USE_GNUTLS
  2523. static void ssl_save_func(PrefsPage *_page)
  2524. {
  2525. SSLPage *page = (SSLPage *) _page;
  2526. if (!page->page.page_open)
  2527. return;
  2528. if (prefs_ssl_apply() >= 0)
  2529. cancelled = FALSE;
  2530. }
  2531. #endif
  2532. static void advanced_save_func(PrefsPage *_page)
  2533. {
  2534. AdvancedPage *page = (AdvancedPage *) _page;
  2535. if (!page->page.page_open)
  2536. return;
  2537. if (prefs_advanced_apply() >= 0)
  2538. cancelled = FALSE;
  2539. }
  2540. static void register_basic_page(void)
  2541. {
  2542. static gchar *path[3];
  2543. path[0] = _("Account");
  2544. path[1] = _("Basic");
  2545. path[2] = NULL;
  2546. basic_page.page.path = path;
  2547. basic_page.page.weight = 1000.0;
  2548. basic_page.page.create_widget = basic_create_widget_func;
  2549. basic_page.page.destroy_widget = basic_destroy_widget_func;
  2550. basic_page.page.save_page = basic_save_func;
  2551. basic_page.page.can_close = basic_can_close_func;
  2552. prefs_account_register_page((PrefsPage *) &basic_page);
  2553. }
  2554. static void register_receive_page(void)
  2555. {
  2556. static gchar *path[3];
  2557. path[0] = _("Account");
  2558. path[1] = _("Receive");
  2559. path[2] = NULL;
  2560. receive_page.page.path = path;
  2561. receive_page.page.weight = 1000.0;
  2562. receive_page.page.create_widget = receive_create_widget_func;
  2563. receive_page.page.destroy_widget = receive_destroy_widget_func;
  2564. receive_page.page.save_page = receive_save_func;
  2565. receive_page.page.can_close = receive_can_close_func;
  2566. prefs_account_register_page((PrefsPage *) &receive_page);
  2567. }
  2568. static void register_send_page(void)
  2569. {
  2570. static gchar *path[3];
  2571. path[0] = _("Account");
  2572. path[1] = _("Send");
  2573. path[2] = NULL;
  2574. send_page.page.path = path;
  2575. send_page.page.weight = 1000.0;
  2576. send_page.page.create_widget = send_create_widget_func;
  2577. send_page.page.destroy_widget = send_destroy_widget_func;
  2578. send_page.page.save_page = send_save_func;
  2579. send_page.page.can_close = send_can_close_func;
  2580. prefs_account_register_page((PrefsPage *) &send_page);
  2581. }
  2582. static void register_compose_page(void)
  2583. {
  2584. static gchar *path[3];
  2585. path[0] = _("Account");
  2586. path[1] = _("Compose");
  2587. path[2] = NULL;
  2588. compose_page.page.path = path;
  2589. compose_page.page.weight = 1000.0;
  2590. compose_page.page.create_widget = compose_create_widget_func;
  2591. compose_page.page.destroy_widget = compose_destroy_widget_func;
  2592. compose_page.page.save_page = compose_save_func;
  2593. compose_page.page.can_close = compose_can_close_func;
  2594. prefs_account_register_page((PrefsPage *) &compose_page);
  2595. }
  2596. static void register_templates_page(void)
  2597. {
  2598. static gchar *path[3];
  2599. path[0] = _("Account");
  2600. path[1] = _("Templates");
  2601. path[2] = NULL;
  2602. templates_page.page.path = path;
  2603. templates_page.page.weight = 1000.0;
  2604. templates_page.page.create_widget = templates_create_widget_func;
  2605. templates_page.page.destroy_widget = templates_destroy_widget_func;
  2606. templates_page.page.save_page = templates_save_func;
  2607. templates_page.page.can_close = templates_can_close_func;
  2608. prefs_account_register_page((PrefsPage *) &templates_page);
  2609. }
  2610. static void register_privacy_page(void)
  2611. {
  2612. static gchar *path[3];
  2613. path[0] = _("Account");
  2614. path[1] = _("Privacy");
  2615. path[2] = NULL;
  2616. privacy_page.page.path = path;
  2617. privacy_page.page.weight = 1000.0;
  2618. privacy_page.page.create_widget = privacy_create_widget_func;
  2619. privacy_page.page.destroy_widget = privacy_destroy_widget_func;
  2620. privacy_page.page.save_page = privacy_save_func;
  2621. privacy_page.page.can_close = privacy_can_close_func;
  2622. prefs_account_register_page((PrefsPage *) &privacy_page);
  2623. }
  2624. #ifdef USE_GNUTLS
  2625. static void register_ssl_page(void)
  2626. {
  2627. static gchar *path[3];
  2628. path[0] = _("Account");
  2629. path[1] = _("SSL");
  2630. path[2] = NULL;
  2631. ssl_page.page.path = path;
  2632. ssl_page.page.weight = 1000.0;
  2633. ssl_page.page.create_widget = ssl_create_widget_func;
  2634. ssl_page.page.destroy_widget = ssl_destroy_widget_func;
  2635. ssl_page.page.save_page = ssl_save_func;
  2636. ssl_page.page.can_close = ssl_can_close_func;
  2637. prefs_account_register_page((PrefsPage *) &ssl_page);
  2638. }
  2639. static gboolean sslcert_get_client_cert_hook(gpointer source, gpointer data)
  2640. {
  2641. SSLClientCertHookData *hookdata = (SSLClientCertHookData *)source;
  2642. PrefsAccount *account = (PrefsAccount *)hookdata->account;
  2643. hookdata->cert_path = NULL;
  2644. hookdata->password = NULL;
  2645. if (!g_list_find(account_get_list(), account)) {
  2646. g_warning("can't find sock account\n");
  2647. return TRUE;
  2648. }
  2649. if (hookdata->is_smtp) {
  2650. if (account->out_ssl_client_cert_file && *account->out_ssl_client_cert_file)
  2651. hookdata->cert_path = account->out_ssl_client_cert_file;
  2652. if (account->out_ssl_client_cert_pass && *account->out_ssl_client_cert_pass)
  2653. hookdata->password = account->out_ssl_client_cert_pass;
  2654. } else {
  2655. if (account->in_ssl_client_cert_file && *account->in_ssl_client_cert_file)
  2656. hookdata->cert_path = account->in_ssl_client_cert_file;
  2657. if (account->in_ssl_client_cert_pass && *account->in_ssl_client_cert_pass)
  2658. hookdata->password = account->in_ssl_client_cert_pass;
  2659. }
  2660. return TRUE;
  2661. }
  2662. struct GetPassData {
  2663. GCond *cond;
  2664. GMutex* mutex;
  2665. gchar **pass;
  2666. };
  2667. static gboolean do_get_pass(gpointer data)
  2668. {
  2669. struct GetPassData *pass_data = (struct GetPassData *)data;
  2670. g_mutex_lock(pass_data->mutex);
  2671. *(pass_data->pass) = input_dialog_query_password("the PKCS12 client certificate", NULL);
  2672. g_cond_signal(pass_data->cond);
  2673. g_mutex_unlock(pass_data->mutex);
  2674. return FALSE;
  2675. }
  2676. static gboolean sslcert_get_password(gpointer source, gpointer data)
  2677. {
  2678. struct GetPassData pass_data;
  2679. /* do complicated stuff to be able to call GTK from the mainloop */
  2680. pass_data.cond = g_cond_new();
  2681. pass_data.mutex = g_mutex_new();
  2682. pass_data.pass = (gchar **)source;
  2683. g_mutex_lock(pass_data.mutex);
  2684. g_idle_add(do_get_pass, &pass_data);
  2685. g_cond_wait(pass_data.cond, pass_data.mutex);
  2686. g_cond_free(pass_data.cond);
  2687. g_mutex_unlock(pass_data.mutex);
  2688. g_mutex_free(pass_data.mutex);
  2689. return TRUE;
  2690. }
  2691. #endif
  2692. static void register_advanced_page(void)
  2693. {
  2694. static gchar *path[3];
  2695. path[0] = _("Account");
  2696. path[1] = _("Advanced");
  2697. path[2] = NULL;
  2698. advanced_page.page.path = path;
  2699. advanced_page.page.weight = 1000.0;
  2700. advanced_page.page.create_widget = advanced_create_widget_func;
  2701. advanced_page.page.destroy_widget = advanced_destroy_widget_func;
  2702. advanced_page.page.save_page = advanced_save_func;
  2703. advanced_page.page.can_close = advanced_can_close_func;
  2704. prefs_account_register_page((PrefsPage *) &advanced_page);
  2705. }
  2706. void prefs_account_init()
  2707. {
  2708. register_basic_page();
  2709. register_receive_page();
  2710. register_send_page();
  2711. register_compose_page();
  2712. register_templates_page();
  2713. register_privacy_page();
  2714. #ifdef USE_GNUTLS
  2715. register_ssl_page();
  2716. hooks_register_hook(SSLCERT_GET_CLIENT_CERT_HOOKLIST, sslcert_get_client_cert_hook, NULL);
  2717. hooks_register_hook(SSL_CERT_GET_PASSWORD, sslcert_get_password, NULL);
  2718. #endif
  2719. register_advanced_page();
  2720. }
  2721. PrefsAccount *prefs_account_new(void)
  2722. {
  2723. PrefsAccount *ac_prefs;
  2724. ac_prefs = g_new0(PrefsAccount, 1);
  2725. memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
  2726. prefs_set_default(basic_param);
  2727. prefs_set_default(receive_param);
  2728. prefs_set_default(send_param);
  2729. prefs_set_default(compose_param);
  2730. prefs_set_default(templates_param);
  2731. prefs_set_default(privacy_param);
  2732. prefs_set_default(ssl_param);
  2733. prefs_set_default(advanced_param);
  2734. *ac_prefs = tmp_ac_prefs;
  2735. ac_prefs->account_id = prefs_account_get_new_id();
  2736. ac_prefs->privacy_prefs = g_hash_table_new(g_str_hash, g_str_equal);
  2737. return ac_prefs;
  2738. }
  2739. void prefs_account_read_config(PrefsAccount *ac_prefs, const gchar *label)
  2740. {
  2741. const gchar *p = label;
  2742. gchar *rcpath;
  2743. gint id;
  2744. gchar **strv, **cur;
  2745. cm_return_if_fail(ac_prefs != NULL);
  2746. cm_return_if_fail(label != NULL);
  2747. memset(&tmp_ac_prefs, 0, sizeof(PrefsAccount));
  2748. tmp_ac_prefs.privacy_prefs = ac_prefs->privacy_prefs;
  2749. rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
  2750. prefs_read_config(basic_param, label, rcpath, NULL);
  2751. prefs_read_config(receive_param, label, rcpath, NULL);
  2752. prefs_read_config(send_param, label, rcpath, NULL);
  2753. prefs_read_config(compose_param, label, rcpath, NULL);
  2754. prefs_read_config(templates_param, label, rcpath, NULL);
  2755. prefs_read_config(privacy_param, label, rcpath, NULL);
  2756. prefs_read_config(ssl_param, label, rcpath, NULL);
  2757. prefs_read_config(advanced_param, label, rcpath, NULL);
  2758. g_free(rcpath);
  2759. *ac_prefs = tmp_ac_prefs;
  2760. while (*p && !g_ascii_isdigit(*p)) p++;
  2761. id = atoi(p);
  2762. if (id < 0) g_warning("wrong account id: %d\n", id);
  2763. ac_prefs->account_id = id;
  2764. if (ac_prefs->protocol == A_APOP) {
  2765. debug_print("converting protocol A_APOP to new prefs.\n");
  2766. ac_prefs->protocol = A_POP3;
  2767. ac_prefs->use_apop_auth = TRUE;
  2768. }
  2769. if (privacy_prefs != NULL) {
  2770. strv = g_strsplit(privacy_prefs, ",", 0);
  2771. for (cur = strv; *cur != NULL; cur++) {
  2772. gchar *encvalue, *value;
  2773. encvalue = strchr(*cur, '=');
  2774. if (encvalue == NULL)
  2775. continue;
  2776. encvalue[0] = '\0';
  2777. encvalue++;
  2778. value = g_malloc0(strlen(encvalue));
  2779. if (base64_decode(value, encvalue, strlen(encvalue)) > 0)
  2780. g_hash_table_insert(ac_prefs->privacy_prefs, g_strdup(*cur), g_strdup(value));
  2781. g_free(value);
  2782. }
  2783. g_strfreev(strv);
  2784. g_free(privacy_prefs);
  2785. privacy_prefs = NULL;
  2786. }
  2787. prefs_custom_header_read_config(ac_prefs);
  2788. }
  2789. static void create_privacy_prefs(gpointer key, gpointer _value, gpointer user_data)
  2790. {
  2791. GString *str = (GString *) user_data;
  2792. gchar *encvalue;
  2793. gchar *value = (gchar *) _value;
  2794. if (str->len > 0)
  2795. g_string_append_c(str, ',');
  2796. encvalue = g_malloc0(B64LEN(strlen(value)) + 1);
  2797. base64_encode(encvalue, (gchar *) value, strlen(value));
  2798. g_string_append_printf(str, "%s=%s", (gchar *) key, encvalue);
  2799. g_free(encvalue);
  2800. }
  2801. #define WRITE_PARAM(PARAM_TABLE) \
  2802. if (prefs_write_param(PARAM_TABLE, pfile->fp) < 0) { \
  2803. g_warning("failed to write configuration to file\n"); \
  2804. prefs_file_close_revert(pfile); \
  2805. g_free(privacy_prefs); \
  2806. privacy_prefs = NULL; \
  2807. return; \
  2808. }
  2809. void prefs_account_write_config_all(GList *account_list)
  2810. {
  2811. GList *cur;
  2812. gchar *rcpath;
  2813. PrefFile *pfile;
  2814. rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, ACCOUNT_RC, NULL);
  2815. if ((pfile = prefs_write_open(rcpath)) == NULL) {
  2816. g_free(rcpath);
  2817. return;
  2818. }
  2819. g_free(rcpath);
  2820. for (cur = account_list; cur != NULL; cur = cur->next) {
  2821. GString *str;
  2822. tmp_ac_prefs = *(PrefsAccount *)cur->data;
  2823. if (fprintf(pfile->fp, "[Account: %d]\n",
  2824. tmp_ac_prefs.account_id) <= 0)
  2825. return;
  2826. str = g_string_sized_new(32);
  2827. g_hash_table_foreach(tmp_ac_prefs.privacy_prefs, create_privacy_prefs, str);
  2828. privacy_prefs = str->str;
  2829. g_string_free(str, FALSE);
  2830. WRITE_PARAM(basic_param)
  2831. WRITE_PARAM(receive_param)
  2832. WRITE_PARAM(send_param)
  2833. WRITE_PARAM(compose_param)
  2834. WRITE_PARAM(templates_param)
  2835. WRITE_PARAM(privacy_param)
  2836. WRITE_PARAM(ssl_param)
  2837. WRITE_PARAM(advanced_param)
  2838. g_free(privacy_prefs);
  2839. privacy_prefs = NULL;
  2840. if (cur->next) {
  2841. if (fputc('\n', pfile->fp) == EOF) {
  2842. FILE_OP_ERROR(rcpath, "fputc");
  2843. prefs_file_close_revert(pfile);
  2844. return;
  2845. }
  2846. }
  2847. }
  2848. if (prefs_file_close(pfile) < 0)
  2849. g_warning("failed to write configuration to file\n");
  2850. }
  2851. #undef WRITE_PARAM
  2852. static gboolean free_privacy_prefs(gpointer key, gpointer value, gpointer user_data)
  2853. {
  2854. g_free(key);
  2855. g_free(value);
  2856. return TRUE;
  2857. }
  2858. void prefs_account_free(PrefsAccount *ac_prefs)
  2859. {
  2860. if (!ac_prefs) return;
  2861. g_hash_table_foreach_remove(ac_prefs->privacy_prefs, free_privacy_prefs, NULL);
  2862. tmp_ac_prefs = *ac_prefs;
  2863. prefs_free(basic_param);
  2864. prefs_free(receive_param);
  2865. prefs_free(send_param);
  2866. prefs_free(compose_param);
  2867. prefs_free(templates_param);
  2868. prefs_free(privacy_param);
  2869. prefs_free(ssl_param);
  2870. prefs_free(advanced_param);
  2871. }
  2872. const gchar *prefs_account_get_privacy_prefs(PrefsAccount *account, gchar *id)
  2873. {
  2874. return g_hash_table_lookup(account->privacy_prefs, id);
  2875. }
  2876. void prefs_account_set_privacy_prefs(PrefsAccount *account, gchar *id, gchar *new_value)
  2877. {
  2878. gchar *orig_key = NULL, *value;
  2879. if (g_hash_table_lookup_extended(account->privacy_prefs, id, (gpointer *)(gchar *) &orig_key, (gpointer *)(gchar *) &value)) {
  2880. g_hash_table_remove(account->privacy_prefs, id);
  2881. g_free(orig_key);
  2882. g_free(value);
  2883. }
  2884. if (new_value != NULL)
  2885. g_hash_table_insert(account->privacy_prefs, g_strdup(id), g_strdup(new_value));
  2886. }
  2887. static gint prefs_account_get_new_id(void)
  2888. {
  2889. GList *ac_list;
  2890. PrefsAccount *ac;
  2891. static gint last_id = 0;
  2892. for (ac_list = account_get_list(); ac_list != NULL;
  2893. ac_list = ac_list->next) {
  2894. ac = (PrefsAccount *)ac_list->data;
  2895. if (last_id < ac->account_id)
  2896. last_id = ac->account_id;
  2897. }
  2898. return last_id + 1;
  2899. }
  2900. static void destroy_dialog(gpointer data)
  2901. {
  2902. PrefsAccount *ac_prefs = (PrefsAccount *) data;
  2903. if (!cancelled) {
  2904. gboolean update_fld_list = FALSE;
  2905. if (ac_prefs->protocol == A_IMAP4 && !new_account) {
  2906. if ((&tmp_ac_prefs)->imap_subsonly != ac_prefs->imap_subsonly) {
  2907. update_fld_list = TRUE;
  2908. }
  2909. }
  2910. *ac_prefs = tmp_ac_prefs;
  2911. if (update_fld_list)
  2912. folderview_rescan_tree(ac_prefs->folder, FALSE);
  2913. } else /* the customhdr_list may have changed, update it anyway */
  2914. ac_prefs->customhdr_list = (&tmp_ac_prefs)->customhdr_list;
  2915. gtk_main_quit();
  2916. }
  2917. PrefsAccount *prefs_account_open(PrefsAccount *ac_prefs, gboolean *dirty)
  2918. {
  2919. gchar *title;
  2920. if (prefs_rc_is_readonly(ACCOUNT_RC))
  2921. return ac_prefs;
  2922. debug_print("Opening account preferences window...\n");
  2923. inc_lock();
  2924. cancelled = TRUE;
  2925. if (!ac_prefs) {
  2926. ac_prefs = prefs_account_new();
  2927. new_account = TRUE;
  2928. } else
  2929. new_account = FALSE;
  2930. if (new_account)
  2931. title = g_strdup (_("Preferences for new account"));
  2932. else
  2933. title = g_strdup_printf (_("%s - Account preferences"),
  2934. ac_prefs->account_name);
  2935. prefswindow_open_full(title, prefs_pages, ac_prefs, destroy_dialog,
  2936. &prefs_common.editaccountwin_width, &prefs_common.editaccountwin_height,
  2937. TRUE, NULL, NULL);
  2938. g_free(title);
  2939. gtk_main();
  2940. inc_unlock();
  2941. if (!cancelled && dirty != NULL)
  2942. *dirty = TRUE;
  2943. if (cancelled && new_account) {
  2944. prefs_account_free(ac_prefs);
  2945. return NULL;
  2946. } else
  2947. return ac_prefs;
  2948. }
  2949. static void crosspost_color_toggled(void)
  2950. {
  2951. gboolean is_active;
  2952. is_active = gtk_toggle_button_get_active
  2953. (GTK_TOGGLE_BUTTON(advanced_page.crosspost_checkbtn));
  2954. gtk_widget_set_sensitive(advanced_page.crosspost_colormenu, is_active);
  2955. }
  2956. static void prefs_account_crosspost_set_data_from_colormenu(PrefParam *pparam)
  2957. {
  2958. GtkWidget *menu;
  2959. GtkWidget *menuitem;
  2960. menu = gtk_cmoption_menu_get_menu(GTK_CMOPTION_MENU(advanced_page.crosspost_colormenu));
  2961. menuitem = gtk_menu_get_active(GTK_MENU(menu));
  2962. *((gint *)pparam->data) = GPOINTER_TO_INT
  2963. (g_object_get_data(G_OBJECT(menuitem), "color"));
  2964. }
  2965. static void prefs_account_crosspost_set_colormenu(PrefParam *pparam)
  2966. {
  2967. gint colorlabel = *((gint *)pparam->data);
  2968. GtkCMOptionMenu *colormenu = GTK_CMOPTION_MENU(*pparam->widget);
  2969. GtkWidget *menu;
  2970. GtkWidget *menuitem;
  2971. gtk_cmoption_menu_set_history(colormenu, colorlabel);
  2972. menu = gtk_cmoption_menu_get_menu(colormenu);
  2973. menuitem = gtk_menu_get_active(GTK_MENU(menu));
  2974. gtk_menu_item_activate(GTK_MENU_ITEM(menuitem));
  2975. }
  2976. static void pop_bfr_smtp_tm_set_sens(GtkWidget *widget, gpointer data)
  2977. {
  2978. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn,
  2979. gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
  2980. gtk_widget_set_sensitive(send_page.pop_auth_timeout_lbl,
  2981. gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
  2982. gtk_widget_set_sensitive(send_page.pop_auth_minutes_lbl,
  2983. gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn)));
  2984. }
  2985. static void prefs_account_select_folder_cb(GtkWidget *widget, gpointer data)
  2986. {
  2987. FolderItem *item;
  2988. gchar *id;
  2989. item = foldersel_folder_sel(NULL, FOLDER_SEL_COPY, NULL, FALSE);
  2990. if (item && item->path) {
  2991. id = folder_item_get_identifier(item);
  2992. if (id) {
  2993. gtk_entry_set_text(GTK_ENTRY(data), id);
  2994. g_free(id);
  2995. }
  2996. }
  2997. }
  2998. static void prefs_account_sigfile_radiobtn_cb(GtkWidget *widget, gpointer data)
  2999. {
  3000. gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), TRUE);
  3001. gtk_widget_set_sensitive(GTK_WIDGET(signature_edit_button), TRUE);
  3002. }
  3003. static void prefs_account_sigcmd_radiobtn_cb(GtkWidget *widget, gpointer data)
  3004. {
  3005. gtk_widget_set_sensitive(GTK_WIDGET(signature_browse_button), FALSE);
  3006. gtk_widget_set_sensitive(GTK_WIDGET(signature_edit_button), FALSE);
  3007. }
  3008. static void prefs_account_signature_browse_cb(GtkWidget *widget, gpointer data)
  3009. {
  3010. gchar *filename;
  3011. gchar *utf8_filename;
  3012. filename = filesel_select_file_open(_("Select signature file"), NULL);
  3013. if (!filename) return;
  3014. utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
  3015. if (!utf8_filename) {
  3016. g_warning("prefs_account_signature_browse_cb(): failed to convert character set.");
  3017. utf8_filename = g_strdup(filename);
  3018. }
  3019. gtk_entry_set_text(GTK_ENTRY(entry_sigpath), utf8_filename);
  3020. g_free(utf8_filename);
  3021. }
  3022. #ifdef USE_GNUTLS
  3023. static void prefs_account_in_cert_browse_cb(GtkWidget *widget, gpointer data)
  3024. {
  3025. gchar *filename;
  3026. gchar *utf8_filename;
  3027. filename = filesel_select_file_open(_("Select certificate file"), NULL);
  3028. if (!filename) return;
  3029. utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
  3030. if (!utf8_filename) {
  3031. g_warning("prefs_account_cert_browse_cb(): failed to convert character set.");
  3032. utf8_filename = g_strdup(filename);
  3033. }
  3034. gtk_entry_set_text(GTK_ENTRY(entry_in_cert_file), utf8_filename);
  3035. g_free(utf8_filename);
  3036. }
  3037. static void prefs_account_out_cert_browse_cb(GtkWidget *widget, gpointer data)
  3038. {
  3039. gchar *filename;
  3040. gchar *utf8_filename;
  3041. filename = filesel_select_file_open(_("Select certificate file"), NULL);
  3042. if (!filename) return;
  3043. utf8_filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
  3044. if (!utf8_filename) {
  3045. g_warning("prefs_account_cert_browse_cb(): failed to convert character set.");
  3046. utf8_filename = g_strdup(filename);
  3047. }
  3048. gtk_entry_set_text(GTK_ENTRY(entry_out_cert_file), utf8_filename);
  3049. g_free(utf8_filename);
  3050. }
  3051. #endif
  3052. static void prefs_account_signature_edit_cb(GtkWidget *widget, gpointer data)
  3053. {
  3054. const gchar *sigpath = gtk_entry_get_text(GTK_ENTRY(data));
  3055. if (!is_file_exist(sigpath))
  3056. str_write_to_file(sigpath, "");
  3057. open_txt_editor(sigpath, prefs_common_get_ext_editor_cmd());
  3058. }
  3059. static void prefs_account_edit_custom_header(void)
  3060. {
  3061. prefs_custom_header_open(&tmp_ac_prefs);
  3062. }
  3063. static void prefs_account_enum_set_data_from_radiobtn(PrefParam *pparam)
  3064. {
  3065. GtkRadioButton *radiobtn;
  3066. GSList *group;
  3067. radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
  3068. group = gtk_radio_button_get_group (radiobtn);
  3069. while (group != NULL) {
  3070. GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
  3071. if (gtk_toggle_button_get_active (btn)) {
  3072. *((gint *)pparam->data) = GPOINTER_TO_INT
  3073. (g_object_get_data (G_OBJECT (btn), MENU_VAL_ID));
  3074. break;
  3075. }
  3076. group = group->next;
  3077. }
  3078. }
  3079. static void prefs_account_enum_set_radiobtn(PrefParam *pparam)
  3080. {
  3081. GtkRadioButton *radiobtn;
  3082. GSList *group;
  3083. gpointer data;
  3084. data = GINT_TO_POINTER (*((gint *)pparam->data));
  3085. radiobtn = GTK_RADIO_BUTTON (*pparam->widget);
  3086. group = gtk_radio_button_get_group (radiobtn);
  3087. while (group != NULL) {
  3088. GtkToggleButton *btn = GTK_TOGGLE_BUTTON (group->data);
  3089. gpointer data1 = g_object_get_data (G_OBJECT (btn), MENU_VAL_ID);
  3090. if (data1 == data) {
  3091. gtk_toggle_button_set_active (btn, TRUE);
  3092. break;
  3093. }
  3094. group = group->next;
  3095. }
  3096. }
  3097. static void prefs_account_protocol_set_data_from_optmenu(PrefParam *pparam)
  3098. {
  3099. struct BasicProtocol *protocol_optmenu =
  3100. (struct BasicProtocol *)*pparam->widget;
  3101. GtkWidget *optmenu = protocol_optmenu->combobox;
  3102. *((RecvProtocol *)pparam->data) =
  3103. combobox_get_active_data(GTK_COMBO_BOX(optmenu));
  3104. }
  3105. static void prefs_account_protocol_set_optmenu(PrefParam *pparam)
  3106. {
  3107. RecvProtocol protocol;
  3108. struct BasicProtocol *protocol_optmenu =
  3109. (struct BasicProtocol *)*pparam->widget;
  3110. GtkWidget *optmenu = protocol_optmenu->combobox;
  3111. GtkWidget *optlabel = protocol_optmenu->label;
  3112. GtkWidget *descrlabel = protocol_optmenu->descrlabel;
  3113. gchar *label = NULL;
  3114. protocol = *((RecvProtocol *)pparam->data);
  3115. /* Set combobox to correct value even if it will be hidden, so
  3116. * we won't break existing accounts when saving. */
  3117. combobox_select_by_data(GTK_COMBO_BOX(optmenu), protocol);
  3118. /* Set up widgets accordingly */
  3119. if( new_account ) {
  3120. gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol"));
  3121. gtk_widget_hide(optlabel);
  3122. gtk_widget_show(optmenu);
  3123. } else {
  3124. gtk_label_set_text(GTK_LABEL(descrlabel), _("Protocol:"));
  3125. label = g_markup_printf_escaped("<b>%s</b>", protocol_names[protocol]);
  3126. gtk_label_set_markup(GTK_LABEL(optlabel), label);
  3127. g_free(label);
  3128. gtk_widget_hide(optmenu);
  3129. gtk_widget_show(optlabel);
  3130. #ifndef HAVE_LIBETPAN
  3131. if (protocol == A_IMAP4 || protocol == A_NNTP) {
  3132. gtk_widget_show(protocol_optmenu->no_imap_warn_icon);
  3133. gtk_widget_show(protocol_optmenu->no_imap_warn_label);
  3134. } else {
  3135. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3136. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3137. }
  3138. #endif
  3139. if (protocol == A_IMAP4) {
  3140. if (new_account)
  3141. gtk_toggle_button_set_active(
  3142. GTK_TOGGLE_BUTTON(send_page.msgid_checkbtn),
  3143. TRUE);
  3144. gtk_widget_hide(send_page.msgid_checkbtn);
  3145. } else {
  3146. gtk_widget_show(send_page.msgid_checkbtn);
  3147. }
  3148. }
  3149. }
  3150. static void prefs_account_imap_auth_type_set_data_from_optmenu(PrefParam *pparam)
  3151. {
  3152. *((RecvProtocol *)pparam->data) =
  3153. combobox_get_active_data(GTK_COMBO_BOX(*pparam->widget));
  3154. }
  3155. static void prefs_account_imap_auth_type_set_optmenu(PrefParam *pparam)
  3156. {
  3157. IMAPAuthType type = *((IMAPAuthType *)pparam->data);
  3158. GtkComboBox *optmenu = GTK_COMBO_BOX(*pparam->widget);
  3159. combobox_select_by_data(optmenu, type);
  3160. }
  3161. static void prefs_account_smtp_auth_type_set_data_from_optmenu(PrefParam *pparam)
  3162. {
  3163. *((RecvProtocol *)pparam->data) =
  3164. combobox_get_active_data(GTK_COMBO_BOX(*pparam->widget));
  3165. }
  3166. static void prefs_account_smtp_auth_type_set_optmenu(PrefParam *pparam)
  3167. {
  3168. SMTPAuthType type = *((SMTPAuthType *)pparam->data);
  3169. GtkComboBox *optmenu = GTK_COMBO_BOX(*pparam->widget);
  3170. combobox_select_by_data(optmenu, type);
  3171. }
  3172. static void prefs_account_set_string_from_combobox(PrefParam *pparam)
  3173. {
  3174. GtkWidget *combobox;
  3175. GtkListStore *menu;
  3176. GtkTreeIter iter;
  3177. gchar **str;
  3178. cm_return_if_fail(*pparam->widget != NULL);
  3179. combobox = *pparam->widget;
  3180. cm_return_if_fail(gtk_combo_box_get_active_iter(
  3181. GTK_COMBO_BOX(combobox), &iter));
  3182. str = (gchar **)pparam->data;
  3183. g_free(*str);
  3184. menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(combobox)));
  3185. gtk_tree_model_get(GTK_TREE_MODEL(menu), &iter,
  3186. COMBOBOX_PRIVACY_PLUGIN_ID, &(*str),
  3187. -1);
  3188. }
  3189. /* Context struct and internal function called by gtk_tree_model_foreach().
  3190. * This is used in prefs_account_set_privacy_combobox_from_string() to find
  3191. * correct combobox entry to activate when account preferences are displayed
  3192. * and their values are set according to preferences. */
  3193. typedef struct _privacy_system_set_ctx {
  3194. GtkWidget *combobox;
  3195. gchar *prefsid;
  3196. gboolean found;
  3197. } PrivacySystemSetCtx;
  3198. static gboolean _privacy_system_set_func(GtkTreeModel *model, GtkTreePath *path,
  3199. GtkTreeIter *iter, PrivacySystemSetCtx *ctx)
  3200. {
  3201. GtkWidget *combobox = ctx->combobox;
  3202. gchar *prefsid = ctx->prefsid;
  3203. gchar *curid;
  3204. /* We're searching for correct privacy plugin ID. */
  3205. gtk_tree_model_get(model, iter, COMBOBOX_PRIVACY_PLUGIN_ID, &curid, -1);
  3206. if( strcmp(prefsid, curid) == 0 ) {
  3207. gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combobox), iter);
  3208. g_free(curid);
  3209. ctx->found = TRUE;
  3210. return TRUE;
  3211. }
  3212. g_free(curid);
  3213. return FALSE;
  3214. }
  3215. static void prefs_account_set_privacy_combobox_from_string(PrefParam *pparam)
  3216. {
  3217. GtkWidget *optionmenu;
  3218. GtkListStore *menu;
  3219. GtkTreeIter iter;
  3220. gboolean found = FALSE;
  3221. gchar *prefsid;
  3222. PrivacySystemSetCtx *ctx = NULL;
  3223. cm_return_if_fail(*pparam->widget != NULL);
  3224. prefsid = *((gchar **) pparam->data);
  3225. if (prefsid == NULL)
  3226. return;
  3227. optionmenu = *pparam->widget;
  3228. menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optionmenu)));
  3229. ctx = g_new(PrivacySystemSetCtx, sizeof(PrivacySystemSetCtx));
  3230. ctx->combobox = optionmenu;
  3231. ctx->prefsid = prefsid;
  3232. ctx->found = FALSE;
  3233. gtk_tree_model_foreach(GTK_TREE_MODEL(menu),
  3234. (GtkTreeModelForeachFunc)_privacy_system_set_func, ctx);
  3235. found = ctx->found;
  3236. g_free(ctx);
  3237. /* If chosen privacy system is not available, add a dummy entry with
  3238. * "not loaded" note and make it active. */
  3239. if (!found) {
  3240. gchar *name;
  3241. name = g_strdup_printf(_("%s (plugin not loaded)"), prefsid);
  3242. gtk_list_store_append(menu, &iter);
  3243. gtk_list_store_set(menu, &iter,
  3244. COMBOBOX_TEXT, name,
  3245. COMBOBOX_DATA, 0,
  3246. COMBOBOX_SENS, TRUE,
  3247. COMBOBOX_PRIVACY_PLUGIN_ID, prefsid,
  3248. -1);
  3249. g_free(name);
  3250. gtk_combo_box_set_active_iter(GTK_COMBO_BOX(optionmenu), &iter);
  3251. }
  3252. }
  3253. static void prefs_account_protocol_changed(GtkComboBox *combobox, gpointer data)
  3254. {
  3255. RecvProtocol protocol;
  3256. struct BasicProtocol *protocol_optmenu = (struct BasicProtocol *)basic_page.protocol_optmenu;
  3257. protocol = combobox_get_active_data(combobox);
  3258. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3259. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3260. switch(protocol) {
  3261. case A_NNTP:
  3262. #ifndef HAVE_LIBETPAN
  3263. gtk_widget_show(protocol_optmenu->no_imap_warn_icon);
  3264. gtk_widget_show(protocol_optmenu->no_imap_warn_label);
  3265. #else
  3266. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3267. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3268. #endif
  3269. gtk_widget_show(send_page.msgid_checkbtn);
  3270. gtk_widget_show(basic_page.nntpserv_label);
  3271. gtk_widget_show(basic_page.nntpserv_entry);
  3272. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3273. 0, VSPACING_NARROW);
  3274. gtk_widget_set_sensitive(basic_page.nntpauth_checkbtn, TRUE);
  3275. gtk_widget_show(basic_page.nntpauth_checkbtn);
  3276. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, TRUE);
  3277. gtk_widget_show(basic_page.nntpauth_onconnect_checkbtn);
  3278. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3279. 1, VSPACING_NARROW);
  3280. gtk_widget_hide(basic_page.recvserv_label);
  3281. gtk_widget_hide(basic_page.recvserv_entry);
  3282. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3283. 2, 0);
  3284. gtk_widget_show(basic_page.smtpserv_label);
  3285. gtk_widget_show(basic_page.smtpserv_entry);
  3286. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3287. 4, VSPACING_NARROW);
  3288. gtk_widget_hide(basic_page.localmbox_label);
  3289. gtk_widget_hide(basic_page.localmbox_entry);
  3290. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3291. 3, 0);
  3292. gtk_widget_hide(basic_page.mailcmd_label);
  3293. gtk_widget_hide(basic_page.mailcmd_entry);
  3294. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3295. 6, 0);
  3296. gtk_widget_hide(basic_page.mailcmd_checkbtn);
  3297. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3298. 5, 0);
  3299. gtk_widget_show(basic_page.uid_label);
  3300. gtk_widget_show(basic_page.pass_label);
  3301. gtk_widget_show(basic_page.uid_entry);
  3302. gtk_widget_show(basic_page.pass_entry);
  3303. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3304. 7, VSPACING_NARROW);
  3305. gtk_widget_set_sensitive(basic_page.uid_label, TRUE);
  3306. gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
  3307. gtk_widget_set_sensitive(basic_page.uid_entry, TRUE);
  3308. gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
  3309. /* update userid/passwd sensitive state */
  3310. prefs_account_nntpauth_toggled
  3311. (GTK_TOGGLE_BUTTON(basic_page.nntpauth_checkbtn), NULL);
  3312. gtk_widget_hide(receive_page.pop3_frame);
  3313. gtk_widget_hide(receive_page.imap_frame);
  3314. gtk_widget_hide(receive_page.local_frame);
  3315. gtk_widget_show(receive_page.frame_maxarticle);
  3316. gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
  3317. prefs_account_filter_on_recv_toggled
  3318. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), NULL);
  3319. gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
  3320. /* update pop_before_smtp sensitivity */
  3321. gtk_toggle_button_set_active
  3322. (GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn), FALSE);
  3323. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
  3324. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn, FALSE);
  3325. if (!tmp_ac_prefs.account_name) {
  3326. gtk_toggle_button_set_active
  3327. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn),
  3328. TRUE);
  3329. gtk_toggle_button_set_active
  3330. (GTK_TOGGLE_BUTTON(receive_page.filterhook_on_recv_checkbtn),
  3331. TRUE);
  3332. gtk_toggle_button_set_active
  3333. (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
  3334. FALSE);
  3335. }
  3336. #ifdef USE_GNUTLS
  3337. gtk_widget_hide(ssl_page.pop_frame);
  3338. gtk_widget_hide(ssl_page.imap_frame);
  3339. gtk_widget_show(ssl_page.nntp_frame);
  3340. gtk_widget_show(ssl_page.send_frame);
  3341. #endif
  3342. gtk_widget_hide(advanced_page.popport_hbox);
  3343. gtk_widget_hide(advanced_page.imapport_hbox);
  3344. gtk_widget_show(advanced_page.nntpport_hbox);
  3345. gtk_widget_show(advanced_page.crosspost_checkbtn);
  3346. gtk_widget_show(advanced_page.crosspost_colormenu);
  3347. #ifndef G_OS_WIN32
  3348. gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
  3349. gtk_widget_hide(advanced_page.tunnelcmd_entry);
  3350. #endif
  3351. gtk_widget_hide(receive_page.imapdir_label);
  3352. gtk_widget_hide(receive_page.imapdir_entry);
  3353. gtk_widget_hide(receive_page.subsonly_checkbtn);
  3354. gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
  3355. gtk_widget_hide(receive_page.imap_use_trash_checkbtn);
  3356. break;
  3357. case A_LOCAL:
  3358. gtk_widget_show(send_page.msgid_checkbtn);
  3359. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3360. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3361. gtk_widget_hide(basic_page.nntpserv_label);
  3362. gtk_widget_hide(basic_page.nntpserv_entry);
  3363. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3364. 0, 0);
  3365. gtk_widget_set_sensitive(basic_page.nntpauth_checkbtn, FALSE);
  3366. gtk_widget_hide(basic_page.nntpauth_checkbtn);
  3367. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, FALSE);
  3368. gtk_widget_hide(basic_page.nntpauth_onconnect_checkbtn);
  3369. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3370. 1, 0);
  3371. gtk_widget_hide(basic_page.recvserv_label);
  3372. gtk_widget_hide(basic_page.recvserv_entry);
  3373. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3374. 2, 0);
  3375. gtk_widget_show(basic_page.smtpserv_label);
  3376. gtk_widget_show(basic_page.smtpserv_entry);
  3377. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3378. 4, VSPACING_NARROW);
  3379. gtk_widget_show(basic_page.localmbox_label);
  3380. gtk_widget_show(basic_page.localmbox_entry);
  3381. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3382. 3, VSPACING_NARROW);
  3383. gtk_widget_show(basic_page.mailcmd_label);
  3384. gtk_widget_show(basic_page.mailcmd_entry);
  3385. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3386. 6, VSPACING_NARROW);
  3387. gtk_widget_show(basic_page.mailcmd_checkbtn);
  3388. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3389. 5, VSPACING_NARROW);
  3390. gtk_widget_hide(basic_page.uid_label);
  3391. gtk_widget_hide(basic_page.pass_label);
  3392. gtk_widget_hide(basic_page.uid_entry);
  3393. gtk_widget_hide(basic_page.pass_entry);
  3394. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3395. 7, 0);
  3396. gtk_widget_set_sensitive(basic_page.uid_label, TRUE);
  3397. gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
  3398. gtk_widget_set_sensitive(basic_page.uid_entry, TRUE);
  3399. gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
  3400. gtk_widget_hide(receive_page.pop3_frame);
  3401. gtk_widget_hide(receive_page.imap_frame);
  3402. gtk_widget_show(receive_page.local_frame);
  3403. gtk_widget_hide(receive_page.frame_maxarticle);
  3404. gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
  3405. prefs_account_filter_on_recv_toggled
  3406. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), NULL);
  3407. gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
  3408. prefs_account_mailcmd_toggled
  3409. (GTK_TOGGLE_BUTTON(basic_page.mailcmd_checkbtn), NULL);
  3410. /* update pop_before_smtp sensitivity */
  3411. gtk_toggle_button_set_active
  3412. (GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn), FALSE);
  3413. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
  3414. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn, FALSE);
  3415. if (!tmp_ac_prefs.account_name) {
  3416. gtk_toggle_button_set_active
  3417. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn),
  3418. TRUE);
  3419. gtk_toggle_button_set_active
  3420. (GTK_TOGGLE_BUTTON(receive_page.filterhook_on_recv_checkbtn),
  3421. TRUE);
  3422. gtk_toggle_button_set_active
  3423. (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
  3424. TRUE);
  3425. }
  3426. #ifdef USE_GNUTLS
  3427. gtk_widget_hide(ssl_page.pop_frame);
  3428. gtk_widget_hide(ssl_page.imap_frame);
  3429. gtk_widget_hide(ssl_page.nntp_frame);
  3430. gtk_widget_show(ssl_page.send_frame);
  3431. #endif
  3432. gtk_widget_hide(advanced_page.popport_hbox);
  3433. gtk_widget_hide(advanced_page.imapport_hbox);
  3434. gtk_widget_hide(advanced_page.nntpport_hbox);
  3435. gtk_widget_hide(advanced_page.crosspost_checkbtn);
  3436. gtk_widget_hide(advanced_page.crosspost_colormenu);
  3437. #ifndef G_OS_WIN32
  3438. gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
  3439. gtk_widget_hide(advanced_page.tunnelcmd_entry);
  3440. #endif
  3441. gtk_widget_hide(receive_page.imapdir_label);
  3442. gtk_widget_hide(receive_page.imapdir_entry);
  3443. gtk_widget_hide(receive_page.subsonly_checkbtn);
  3444. gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
  3445. gtk_widget_hide(receive_page.imap_use_trash_checkbtn);
  3446. break;
  3447. case A_IMAP4:
  3448. #ifndef HAVE_LIBETPAN
  3449. gtk_widget_show(protocol_optmenu->no_imap_warn_icon);
  3450. gtk_widget_show(protocol_optmenu->no_imap_warn_label);
  3451. #endif
  3452. if (new_account)
  3453. gtk_toggle_button_set_active(
  3454. GTK_TOGGLE_BUTTON(send_page.msgid_checkbtn),
  3455. TRUE);
  3456. gtk_widget_hide(send_page.msgid_checkbtn);
  3457. gtk_widget_hide(basic_page.nntpserv_label);
  3458. gtk_widget_hide(basic_page.nntpserv_entry);
  3459. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3460. 0, 0);
  3461. gtk_widget_set_sensitive(basic_page.nntpauth_checkbtn, FALSE);
  3462. gtk_widget_hide(basic_page.nntpauth_checkbtn);
  3463. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, FALSE);
  3464. gtk_widget_hide(basic_page.nntpauth_onconnect_checkbtn);
  3465. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3466. 1, 0);
  3467. gtk_widget_set_sensitive(basic_page.recvserv_label, TRUE);
  3468. gtk_widget_set_sensitive(basic_page.recvserv_entry, TRUE);
  3469. gtk_widget_show(basic_page.recvserv_label);
  3470. gtk_widget_show(basic_page.recvserv_entry);
  3471. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3472. 2, VSPACING_NARROW);
  3473. gtk_widget_show(basic_page.smtpserv_label);
  3474. gtk_widget_show(basic_page.smtpserv_entry);
  3475. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3476. 4, VSPACING_NARROW);
  3477. gtk_widget_hide(basic_page.localmbox_label);
  3478. gtk_widget_hide(basic_page.localmbox_entry);
  3479. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3480. 3, 0);
  3481. gtk_widget_hide(basic_page.mailcmd_label);
  3482. gtk_widget_hide(basic_page.mailcmd_entry);
  3483. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3484. 6, 0);
  3485. gtk_widget_hide(basic_page.mailcmd_checkbtn);
  3486. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3487. 5, 0);
  3488. gtk_widget_show(basic_page.uid_label);
  3489. gtk_widget_show(basic_page.pass_label);
  3490. gtk_widget_show(basic_page.uid_entry);
  3491. gtk_widget_show(basic_page.pass_entry);
  3492. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3493. 7, VSPACING_NARROW);
  3494. gtk_widget_set_sensitive(basic_page.uid_label, TRUE);
  3495. gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
  3496. gtk_widget_set_sensitive(basic_page.uid_entry, TRUE);
  3497. gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
  3498. gtk_widget_hide(receive_page.pop3_frame);
  3499. gtk_widget_show(receive_page.imap_frame);
  3500. gtk_widget_hide(receive_page.local_frame);
  3501. gtk_widget_hide(receive_page.frame_maxarticle);
  3502. gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
  3503. prefs_account_filter_on_recv_toggled
  3504. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), NULL);
  3505. gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
  3506. gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
  3507. gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
  3508. /* update pop_before_smtp sensitivity */
  3509. gtk_toggle_button_set_active
  3510. (GTK_TOGGLE_BUTTON(send_page.pop_bfr_smtp_checkbtn), FALSE);
  3511. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
  3512. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_tm_spinbtn, FALSE);
  3513. if (!tmp_ac_prefs.account_name) {
  3514. gtk_toggle_button_set_active
  3515. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn),
  3516. TRUE);
  3517. gtk_toggle_button_set_active
  3518. (GTK_TOGGLE_BUTTON(receive_page.filterhook_on_recv_checkbtn),
  3519. TRUE);
  3520. gtk_toggle_button_set_active
  3521. (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
  3522. FALSE);
  3523. }
  3524. #ifdef USE_GNUTLS
  3525. gtk_widget_hide(ssl_page.pop_frame);
  3526. gtk_widget_show(ssl_page.imap_frame);
  3527. gtk_widget_hide(ssl_page.nntp_frame);
  3528. gtk_widget_show(ssl_page.send_frame);
  3529. #endif
  3530. gtk_widget_hide(advanced_page.popport_hbox);
  3531. gtk_widget_show(advanced_page.imapport_hbox);
  3532. gtk_widget_hide(advanced_page.nntpport_hbox);
  3533. gtk_widget_hide(advanced_page.crosspost_checkbtn);
  3534. gtk_widget_hide(advanced_page.crosspost_colormenu);
  3535. #ifndef G_OS_WIN32
  3536. gtk_widget_show(advanced_page.tunnelcmd_checkbtn);
  3537. gtk_widget_show(advanced_page.tunnelcmd_entry);
  3538. #endif
  3539. gtk_widget_show(receive_page.imapdir_label);
  3540. gtk_widget_show(receive_page.imapdir_entry);
  3541. gtk_widget_show(receive_page.subsonly_checkbtn);
  3542. gtk_widget_show(receive_page.low_bandwidth_checkbtn);
  3543. gtk_widget_show(receive_page.imap_use_trash_checkbtn);
  3544. break;
  3545. case A_NONE:
  3546. gtk_widget_show(send_page.msgid_checkbtn);
  3547. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3548. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3549. gtk_widget_hide(basic_page.nntpserv_label);
  3550. gtk_widget_hide(basic_page.nntpserv_entry);
  3551. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3552. 0, 0);
  3553. gtk_widget_set_sensitive(basic_page.nntpauth_checkbtn, FALSE);
  3554. gtk_widget_hide(basic_page.nntpauth_checkbtn);
  3555. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, FALSE);
  3556. gtk_widget_hide(basic_page.nntpauth_onconnect_checkbtn);
  3557. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3558. 1, 0);
  3559. gtk_widget_set_sensitive(basic_page.recvserv_label, FALSE);
  3560. gtk_widget_set_sensitive(basic_page.recvserv_entry, FALSE);
  3561. gtk_widget_hide(basic_page.recvserv_label);
  3562. gtk_widget_hide(basic_page.recvserv_entry);
  3563. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3564. 2, VSPACING_NARROW);
  3565. gtk_widget_show(basic_page.smtpserv_label);
  3566. gtk_widget_show(basic_page.smtpserv_entry);
  3567. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3568. 4, VSPACING_NARROW);
  3569. gtk_widget_hide(basic_page.localmbox_label);
  3570. gtk_widget_hide(basic_page.localmbox_entry);
  3571. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3572. 3, 0);
  3573. gtk_widget_hide(basic_page.mailcmd_label);
  3574. gtk_widget_hide(basic_page.mailcmd_entry);
  3575. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3576. 6, 0);
  3577. gtk_widget_hide(basic_page.mailcmd_checkbtn);
  3578. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3579. 5, 0);
  3580. gtk_widget_hide(basic_page.uid_label);
  3581. gtk_widget_hide(basic_page.pass_label);
  3582. gtk_widget_hide(basic_page.uid_entry);
  3583. gtk_widget_hide(basic_page.pass_entry);
  3584. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3585. 7, VSPACING_NARROW);
  3586. gtk_widget_set_sensitive(basic_page.uid_label, FALSE);
  3587. gtk_widget_set_sensitive(basic_page.pass_label, FALSE);
  3588. gtk_widget_set_sensitive(basic_page.uid_entry, FALSE);
  3589. gtk_widget_set_sensitive(basic_page.pass_entry, FALSE);
  3590. gtk_widget_set_sensitive(receive_page.pop3_frame, FALSE);
  3591. gtk_widget_hide(receive_page.pop3_frame);
  3592. gtk_widget_hide(receive_page.imap_frame);
  3593. gtk_widget_hide(receive_page.local_frame);
  3594. gtk_widget_hide(receive_page.frame_maxarticle);
  3595. gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, FALSE);
  3596. prefs_account_filter_on_recv_toggled
  3597. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), NULL);
  3598. gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, FALSE);
  3599. gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
  3600. gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
  3601. /* update pop_before_smtp sensitivity */
  3602. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, FALSE);
  3603. pop_bfr_smtp_tm_set_sens(NULL, NULL);
  3604. gtk_toggle_button_set_active
  3605. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), FALSE);
  3606. gtk_toggle_button_set_active
  3607. (GTK_TOGGLE_BUTTON(receive_page.filterhook_on_recv_checkbtn), FALSE);
  3608. gtk_toggle_button_set_active
  3609. (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn), FALSE);
  3610. #ifdef USE_GNUTLS
  3611. gtk_widget_hide(ssl_page.pop_frame);
  3612. gtk_widget_hide(ssl_page.imap_frame);
  3613. gtk_widget_hide(ssl_page.nntp_frame);
  3614. gtk_widget_show(ssl_page.send_frame);
  3615. #endif
  3616. gtk_widget_hide(advanced_page.popport_hbox);
  3617. gtk_widget_hide(advanced_page.imapport_hbox);
  3618. gtk_widget_hide(advanced_page.nntpport_hbox);
  3619. gtk_widget_hide(advanced_page.crosspost_checkbtn);
  3620. gtk_widget_hide(advanced_page.crosspost_colormenu);
  3621. #ifndef G_OS_WIN32
  3622. gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
  3623. gtk_widget_hide(advanced_page.tunnelcmd_entry);
  3624. #endif
  3625. gtk_widget_hide(receive_page.imapdir_label);
  3626. gtk_widget_hide(receive_page.imapdir_entry);
  3627. gtk_widget_hide(receive_page.subsonly_checkbtn);
  3628. gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
  3629. gtk_widget_hide(receive_page.imap_use_trash_checkbtn);
  3630. break;
  3631. case A_POP3:
  3632. default:
  3633. gtk_widget_show(send_page.msgid_checkbtn);
  3634. gtk_widget_hide(protocol_optmenu->no_imap_warn_icon);
  3635. gtk_widget_hide(protocol_optmenu->no_imap_warn_label);
  3636. gtk_widget_hide(basic_page.nntpserv_label);
  3637. gtk_widget_hide(basic_page.nntpserv_entry);
  3638. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3639. 0, 0);
  3640. gtk_widget_set_sensitive(basic_page.nntpauth_checkbtn, FALSE);
  3641. gtk_widget_hide(basic_page.nntpauth_checkbtn);
  3642. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, FALSE);
  3643. gtk_widget_hide(basic_page.nntpauth_onconnect_checkbtn);
  3644. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3645. 1, 0);
  3646. gtk_widget_set_sensitive(basic_page.recvserv_label, TRUE);
  3647. gtk_widget_set_sensitive(basic_page.recvserv_entry, TRUE);
  3648. gtk_widget_show(basic_page.recvserv_label);
  3649. gtk_widget_show(basic_page.recvserv_entry);
  3650. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3651. 2, VSPACING_NARROW);
  3652. gtk_widget_show(basic_page.smtpserv_label);
  3653. gtk_widget_show(basic_page.smtpserv_entry);
  3654. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3655. 4, VSPACING_NARROW);
  3656. gtk_widget_hide(basic_page.localmbox_label);
  3657. gtk_widget_hide(basic_page.localmbox_entry);
  3658. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3659. 3, 0);
  3660. gtk_widget_hide(basic_page.mailcmd_label);
  3661. gtk_widget_hide(basic_page.mailcmd_entry);
  3662. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3663. 6, 0);
  3664. gtk_widget_hide(basic_page.mailcmd_checkbtn);
  3665. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3666. 5, 0);
  3667. gtk_widget_show(basic_page.uid_label);
  3668. gtk_widget_show(basic_page.pass_label);
  3669. gtk_widget_show(basic_page.uid_entry);
  3670. gtk_widget_show(basic_page.pass_entry);
  3671. gtk_table_set_row_spacing (GTK_TABLE (basic_page.serv_table),
  3672. 7, VSPACING_NARROW);
  3673. gtk_widget_set_sensitive(basic_page.uid_label, TRUE);
  3674. gtk_widget_set_sensitive(basic_page.pass_label, TRUE);
  3675. gtk_widget_set_sensitive(basic_page.uid_entry, TRUE);
  3676. gtk_widget_set_sensitive(basic_page.pass_entry, TRUE);
  3677. gtk_widget_set_sensitive(receive_page.pop3_frame, TRUE);
  3678. gtk_widget_show(receive_page.pop3_frame);
  3679. gtk_widget_hide(receive_page.imap_frame);
  3680. gtk_widget_hide(receive_page.local_frame);
  3681. gtk_widget_hide(receive_page.frame_maxarticle);
  3682. gtk_widget_set_sensitive(receive_page.filter_on_recv_checkbtn, TRUE);
  3683. prefs_account_filter_on_recv_toggled
  3684. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn), NULL);
  3685. gtk_widget_set_sensitive(receive_page.recvatgetall_checkbtn, TRUE);
  3686. gtk_widget_set_sensitive(basic_page.smtpserv_entry, TRUE);
  3687. gtk_widget_set_sensitive(basic_page.smtpserv_label, TRUE);
  3688. /* update pop_before_smtp sensitivity */
  3689. gtk_widget_set_sensitive(send_page.pop_bfr_smtp_checkbtn, TRUE);
  3690. pop_bfr_smtp_tm_set_sens(NULL, NULL);
  3691. if (!tmp_ac_prefs.account_name) {
  3692. gtk_toggle_button_set_active
  3693. (GTK_TOGGLE_BUTTON(receive_page.filter_on_recv_checkbtn),
  3694. TRUE);
  3695. gtk_toggle_button_set_active
  3696. (GTK_TOGGLE_BUTTON(receive_page.filterhook_on_recv_checkbtn),
  3697. TRUE);
  3698. gtk_toggle_button_set_active
  3699. (GTK_TOGGLE_BUTTON(receive_page.recvatgetall_checkbtn),
  3700. TRUE);
  3701. }
  3702. #ifdef USE_GNUTLS
  3703. gtk_widget_show(ssl_page.pop_frame);
  3704. gtk_widget_hide(ssl_page.imap_frame);
  3705. gtk_widget_hide(ssl_page.nntp_frame);
  3706. gtk_widget_show(ssl_page.send_frame);
  3707. #endif
  3708. gtk_widget_show(advanced_page.popport_hbox);
  3709. gtk_widget_hide(advanced_page.imapport_hbox);
  3710. gtk_widget_hide(advanced_page.nntpport_hbox);
  3711. gtk_widget_hide(advanced_page.crosspost_checkbtn);
  3712. gtk_widget_hide(advanced_page.crosspost_colormenu);
  3713. #ifndef G_OS_WIN32
  3714. gtk_widget_hide(advanced_page.tunnelcmd_checkbtn);
  3715. gtk_widget_hide(advanced_page.tunnelcmd_entry);
  3716. #endif
  3717. gtk_widget_hide(receive_page.imapdir_label);
  3718. gtk_widget_hide(receive_page.imapdir_entry);
  3719. gtk_widget_hide(receive_page.subsonly_checkbtn);
  3720. gtk_widget_hide(receive_page.low_bandwidth_checkbtn);
  3721. gtk_widget_hide(receive_page.imap_use_trash_checkbtn);
  3722. break;
  3723. }
  3724. gtk_widget_queue_resize(basic_page.serv_frame);
  3725. }
  3726. static void prefs_account_nntpauth_toggled(GtkToggleButton *button,
  3727. gpointer user_data)
  3728. {
  3729. gboolean auth;
  3730. if (!GTK_WIDGET_SENSITIVE (GTK_WIDGET (button)))
  3731. return;
  3732. auth = gtk_toggle_button_get_active (button);
  3733. gtk_widget_set_sensitive(basic_page.uid_label, auth);
  3734. gtk_widget_set_sensitive(basic_page.pass_label, auth);
  3735. gtk_widget_set_sensitive(basic_page.uid_entry, auth);
  3736. gtk_widget_set_sensitive(basic_page.pass_entry, auth);
  3737. gtk_widget_set_sensitive(basic_page.nntpauth_onconnect_checkbtn, auth);
  3738. }
  3739. static void prefs_account_mailcmd_toggled(GtkToggleButton *button,
  3740. gpointer user_data)
  3741. {
  3742. gboolean use_mailcmd;
  3743. use_mailcmd = gtk_toggle_button_get_active (button);
  3744. gtk_widget_set_sensitive(basic_page.mailcmd_entry, use_mailcmd);
  3745. gtk_widget_set_sensitive(basic_page.mailcmd_label, use_mailcmd);
  3746. gtk_widget_set_sensitive(basic_page.smtpserv_entry, !use_mailcmd);
  3747. gtk_widget_set_sensitive(basic_page.smtpserv_label, !use_mailcmd);
  3748. gtk_widget_set_sensitive(basic_page.uid_entry, !use_mailcmd);
  3749. gtk_widget_set_sensitive(basic_page.pass_entry, !use_mailcmd);
  3750. }
  3751. static void prefs_account_filter_on_recv_toggled(GtkToggleButton *button,
  3752. gpointer user_data)
  3753. {
  3754. gboolean do_filter;
  3755. do_filter = gtk_toggle_button_get_active (button);
  3756. gtk_widget_set_sensitive(receive_page.filterhook_on_recv_checkbtn, do_filter);
  3757. }
  3758. #if USE_ENCHANT
  3759. static void prefs_account_compose_default_dictionary_set_string_from_optmenu
  3760. (PrefParam *pparam)
  3761. {
  3762. GtkWidget *combo;
  3763. gchar **str;
  3764. cm_return_if_fail(*pparam->widget != NULL);
  3765. combo = *pparam->widget;
  3766. str = (gchar **) pparam->data;
  3767. g_free(*str);
  3768. *str = gtkaspell_get_dictionary_menu_active_item(GTK_COMBO_BOX(combo));
  3769. }
  3770. static void prefs_account_compose_default_dictionary_set_optmenu_from_string
  3771. (PrefParam *pparam)
  3772. {
  3773. GtkWidget *combo;
  3774. gchar *dictionary;
  3775. cm_return_if_fail(*pparam->widget != NULL);
  3776. dictionary = *((gchar **) pparam->data);
  3777. if (dictionary != NULL) {
  3778. if (strrchr(dictionary, '/')) {
  3779. dictionary = g_strdup(strrchr(dictionary, '/')+1);
  3780. }
  3781. if (strchr(dictionary, '-')) {
  3782. *(strchr(dictionary, '-')) = '\0';
  3783. }
  3784. }
  3785. combo = *pparam->widget;
  3786. if (dictionary && *dictionary)
  3787. gtkaspell_set_dictionary_menu_active_item(GTK_COMBO_BOX(combo),
  3788. dictionary);
  3789. else {
  3790. GtkTreeModel *model;
  3791. GtkTreeIter iter;
  3792. if((model = gtk_combo_box_get_model(GTK_COMBO_BOX(combo))) == NULL)
  3793. return;
  3794. if((gtk_tree_model_get_iter_first(model, &iter)) == FALSE)
  3795. return;
  3796. gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter);
  3797. }
  3798. }
  3799. #endif
  3800. void prefs_account_register_page(PrefsPage *page)
  3801. {
  3802. prefs_pages = g_slist_append(prefs_pages, page);
  3803. }
  3804. void prefs_account_unregister_page(PrefsPage *page)
  3805. {
  3806. prefs_pages = g_slist_remove(prefs_pages, page);
  3807. }