Commit e79e98c428e6d8241050318f4d3a986eaf250dcd

Authored by Perry Werneck
2 parents 0f3ebf1c b71485a6
Exists in master and in 1 other branch develop

Merge branch 'develop'

locale/pt_BR.po
@@ -5,8 +5,8 @@ msgid "" @@ -5,8 +5,8 @@ msgid ""
5 msgstr "" 5 msgstr ""
6 "Project-Id-Version: pw3270 5.0\n" 6 "Project-Id-Version: pw3270 5.0\n"
7 "Report-Msgid-Bugs-To: \n" 7 "Report-Msgid-Bugs-To: \n"
8 -"POT-Creation-Date: 2020-07-03 12:42-0300\n"  
9 -"PO-Revision-Date: 2020-07-03 15:04-0300\n" 8 +"POT-Creation-Date: 2020-08-03 15:22-0300\n"
  9 +"PO-Revision-Date: 2020-08-03 15:26-0300\n"
10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" 10 "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n"
11 "Language-Team: Português <>\n" 11 "Language-Team: Português <>\n"
12 "Language: pt_BR\n" 12 "Language: pt_BR\n"
@@ -59,15 +59,15 @@ msgstr &quot;_Adicionar ao arquivo&quot; @@ -59,15 +59,15 @@ msgstr &quot;_Adicionar ao arquivo&quot;
59 msgid "About security" 59 msgid "About security"
60 msgstr "Sobre a segurança" 60 msgstr "Sobre a segurança"
61 61
62 -#: src/dialogs/settings/accelerator.c:191 62 +#: src/dialogs/settings/accelerator.c:196
63 msgid "Accelerator" 63 msgid "Accelerator"
64 msgstr "Atalho" 64 msgstr "Atalho"
65 65
66 -#: src/dialogs/settings/accelerator.c:329 66 +#: src/dialogs/settings/accelerator.c:334
67 msgid "Accelerator is in use" 67 msgid "Accelerator is in use"
68 msgstr "Atalho está em uso" 68 msgstr "Atalho está em uso"
69 69
70 -#: src/dialogs/settings/accelerator.c:240 70 +#: src/dialogs/settings/accelerator.c:245
71 msgid "Accelerators" 71 msgid "Accelerators"
72 msgstr "Atalhos" 72 msgstr "Atalhos"
73 73
@@ -88,7 +88,7 @@ msgstr &quot;Adicionar à cópia&quot; @@ -88,7 +88,7 @@ msgstr &quot;Adicionar à cópia&quot;
88 msgid "Address or name of the host to connect." 88 msgid "Address or name of the host to connect."
89 msgstr "Endereço ou nome do host a conectar." 89 msgstr "Endereço ou nome do host a conectar."
90 90
91 -#: src/dialogs/settings/accelerator.c:201 91 +#: src/dialogs/settings/accelerator.c:206
92 msgid "Alternative" 92 msgid "Alternative"
93 msgstr "Alternativa" 93 msgstr "Alternativa"
94 94
@@ -120,7 +120,7 @@ msgstr &quot;Adiciona seleção na área de transferência&quot; @@ -120,7 +120,7 @@ msgstr &quot;Adiciona seleção na área de transferência&quot;
120 msgid "Appends the source file to the destination file." 120 msgid "Appends the source file to the destination file."
121 msgstr "Adiciona conteúdo do arquivo origem ao final do arquivo destino." 121 msgstr "Adiciona conteúdo do arquivo origem ao final do arquivo destino."
122 122
123 -#: src/dialogs/settings/accelerator.c:311 123 +#: src/dialogs/settings/accelerator.c:316
124 #, c-format 124 #, c-format
125 msgid "Assign it to action (<b>%s</b>)?" 125 msgid "Assign it to action (<b>%s</b>)?"
126 msgstr "Associar com a ação (<b>%s</b>)?" 126 msgstr "Associar com a ação (<b>%s</b>)?"
@@ -162,7 +162,7 @@ msgstr &quot;Azul&quot; @@ -162,7 +162,7 @@ msgstr &quot;Azul&quot;
162 msgid "Bold" 162 msgid "Bold"
163 msgstr "Negrito" 163 msgstr "Negrito"
164 164
165 -#: src/dialogs/load.c:181 src/dialogs/save/save.c:216 165 +#: src/dialogs/load.c:181 src/dialogs/save/save.c:268
166 msgid "C_haracter Coding" 166 msgid "C_haracter Coding"
167 msgstr "C_odificação de caracteres" 167 msgstr "C_odificação de caracteres"
168 168
@@ -202,7 +202,7 @@ msgstr &quot;Erro ao converter valor do cgcsid&quot; @@ -202,7 +202,7 @@ msgstr &quot;Erro ao converter valor do cgcsid&quot;
202 msgid "Can't parse character value" 202 msgid "Can't parse character value"
203 msgstr "Erro ao analisar valor de caractere" 203 msgstr "Erro ao analisar valor de caractere"
204 204
205 -#: src/selection/windows/paste.c:79 src/selection/windows/paste.c:119 205 +#: src/selection/linux/paste.c:81 src/selection/linux/paste.c:115
206 msgid "Can't paste" 206 msgid "Can't paste"
207 msgstr "Não é possivel colar" 207 msgstr "Não é possivel colar"
208 208
@@ -211,7 +211,7 @@ msgid &quot;Can&#39;t paste text&quot; @@ -211,7 +211,7 @@ msgid &quot;Can&#39;t paste text&quot;
211 msgstr "Não é possível colar texto" 211 msgstr "Não é possível colar texto"
212 212
213 #: src/filetransfer/save.c:117 src/filetransfer/activitylist.c:436 213 #: src/filetransfer/save.c:117 src/filetransfer/activitylist.c:436
214 -#: src/trace/trace.c:486 src/dialogs/transfer.c:91 src/dialogs/save/save.c:461 214 +#: src/trace/trace.c:486 src/dialogs/transfer.c:91 src/dialogs/save/save.c:627
215 #, c-format 215 #, c-format
216 msgid "Can't save %s" 216 msgid "Can't save %s"
217 msgstr "Não foi possível salvar arquivo %s" 217 msgstr "Não foi possível salvar arquivo %s"
@@ -220,7 +220,7 @@ msgstr &quot;Não foi possível salvar arquivo %s&quot; @@ -220,7 +220,7 @@ msgstr &quot;Não foi possível salvar arquivo %s&quot;
220 msgid "Can't set callback table" 220 msgid "Can't set callback table"
221 msgstr "Não foi possível setar a tabela de retornos" 221 msgstr "Não foi possível setar a tabela de retornos"
222 222
223 -#: src/terminal/iocallback.c:199 223 +#: src/terminal/iocallback.c:200
224 msgid "Can't set lib3270 I/O controller" 224 msgid "Can't set lib3270 I/O controller"
225 msgstr "Não foi possível registrar manipuladores de I/O 3270" 225 msgstr "Não foi possível registrar manipuladores de I/O 3270"
226 226
@@ -228,25 +228,21 @@ msgstr &quot;Não foi possível registrar manipuladores de I/O 3270&quot; @@ -228,25 +228,21 @@ msgstr &quot;Não foi possível registrar manipuladores de I/O 3270&quot;
228 msgid "Can't start file transfer session" 228 msgid "Can't start file transfer session"
229 msgstr "Não foi possível iniciar transferência de arquivo" 229 msgstr "Não foi possível iniciar transferência de arquivo"
230 230
231 -#: src/terminal/callbacks.c:396 src/filetransfer/v3270ftprogress.c:433  
232 -#: src/filetransfer/transfer.c:89 src/dialogs/load.c:111  
233 -#: src/dialogs/save/save.c:136 src/dialogs/settings/host.c:401 231 +#: src/filetransfer/v3270ftprogress.c:433 src/filetransfer/transfer.c:89
  232 +#: src/dialogs/load.c:111 src/dialogs/save/save.c:117
  233 +#: src/dialogs/settings/host.c:401
234 msgid "Cancel" 234 msgid "Cancel"
235 -msgstr "_Cancelar" 235 +msgstr "Cancelar"
236 236
237 #: src/filetransfer/transfer.c:90 237 #: src/filetransfer/transfer.c:90
238 msgid "Cancel transfer operation." 238 msgid "Cancel transfer operation."
239 msgstr "Cancelar transferência" 239 msgstr "Cancelar transferência"
240 240
241 -#: src/dialogs/settings/host.c:546  
242 -msgid "Check for SSL secure connection."  
243 -msgstr "Marcar para ativar a conexão segura via SSL."  
244 -  
245 #: src/filetransfer/tables.c:44 241 #: src/filetransfer/tables.c:44
246 msgid "Check this if the file consists of character data only." 242 msgid "Check this if the file consists of character data only."
247 msgstr "Marque se o arquivo contem apenas texto." 243 msgstr "Marque se o arquivo contem apenas texto."
248 244
249 -#: src/dialogs/load.c:206 src/dialogs/save/save.c:268 245 +#: src/dialogs/load.c:206 src/dialogs/save/save.c:343
250 msgid "Click to cancel operation" 246 msgid "Click to cancel operation"
251 msgstr "Clique para cancelar operação" 247 msgstr "Clique para cancelar operação"
252 248
@@ -254,11 +250,11 @@ msgstr &quot;Clique para cancelar operação&quot; @@ -254,11 +250,11 @@ msgstr &quot;Clique para cancelar operação&quot;
254 msgid "Click to load file" 250 msgid "Click to load file"
255 msgstr "Clique para carregar arquivo" 251 msgstr "Clique para carregar arquivo"
256 252
257 -#: src/dialogs/save/save.c:273 253 +#: src/dialogs/save/save.c:348
258 msgid "Click to save file" 254 msgid "Click to save file"
259 msgstr "Clique para salvar arquivo" 255 msgstr "Clique para salvar arquivo"
260 256
261 -#: src/dialogs/settings/clipboard.c:409 257 +#: src/dialogs/settings/clipboard.c:420
262 msgid "Clipboard" 258 msgid "Clipboard"
263 msgstr "Área de transferência" 259 msgstr "Área de transferência"
264 260
@@ -266,7 +262,7 @@ msgstr &quot;Área de transferência&quot; @@ -266,7 +262,7 @@ msgstr &quot;Área de transferência&quot;
266 msgid "Clipboard name" 262 msgid "Clipboard name"
267 msgstr "Nome da área de transferência" 263 msgstr "Nome da área de transferência"
268 264
269 -#: src/dialogs/settings/clipboard.c:408 265 +#: src/dialogs/settings/clipboard.c:419
270 msgid "Clipboard properties" 266 msgid "Clipboard properties"
271 msgstr "Configuração da área de transferência" 267 msgstr "Configuração da área de transferência"
272 268
@@ -302,10 +298,6 @@ msgstr &quot;Comando a executar&quot; @@ -302,10 +298,6 @@ msgstr &quot;Comando a executar&quot;
302 msgid "Connection" 298 msgid "Connection"
303 msgstr "Conexão" 299 msgstr "Conexão"
304 300
305 -#: src/terminal/callbacks.c:397  
306 -msgid "Continue"  
307 -msgstr "Continuar"  
308 -  
309 #: src/terminal/actions/table.c:64 src/terminal/actions/table.c:87 301 #: src/terminal/actions/table.c:64 src/terminal/actions/table.c:87
310 msgid "Copy" 302 msgid "Copy"
311 msgstr "Copiar" 303 msgstr "Copiar"
@@ -318,7 +310,7 @@ msgstr &quot;Copiar como texto puro&quot; @@ -318,7 +310,7 @@ msgstr &quot;Copiar como texto puro&quot;
318 msgid "Copy as table" 310 msgid "Copy as table"
319 msgstr "Copiar como tabela" 311 msgstr "Copiar como tabela"
320 312
321 -#: src/dialogs/settings/clipboard.c:239 313 +#: src/dialogs/settings/clipboard.c:250
322 msgid "Copy options" 314 msgid "Copy options"
323 msgstr "Opções da cópia" 315 msgstr "Opções da cópia"
324 316
@@ -405,7 +397,7 @@ msgstr &quot;Turquesa Escuro&quot; @@ -405,7 +397,7 @@ msgstr &quot;Turquesa Escuro&quot;
405 msgid "Default" 397 msgid "Default"
406 msgstr "Padrão" 398 msgstr "Padrão"
407 399
408 -#: src/dialogs/popups.c:149 400 +#: src/dialogs/popups.c:132
409 msgid "Don't ask again" 401 msgid "Don't ask again"
410 msgstr "Não perguntar de novo" 402 msgstr "Não perguntar de novo"
411 403
@@ -425,14 +417,14 @@ msgstr &quot;Emulação&quot; @@ -425,14 +417,14 @@ msgstr &quot;Emulação&quot;
425 msgid "Enabled" 417 msgid "Enabled"
426 msgstr "Habilitado" 418 msgstr "Habilitado"
427 419
428 -#: src/dialogs/popups.c:56 src/dialogs/popups.c:85  
429 -msgid "Error"  
430 -msgstr "Erro"  
431 -  
432 #: src/dialogs/print/print.c:72 420 #: src/dialogs/print/print.c:72
433 msgid "Error on print operation" 421 msgid "Error on print operation"
434 msgstr "Erro na operação de impressão" 422 msgstr "Erro na operação de impressão"
435 423
  424 +#: src/dialogs/save/save.c:579
  425 +msgid "Error saving image"
  426 +msgstr "Erro ao salvar imagem"
  427 +
436 #: src/filetransfer/tables.c:224 428 #: src/filetransfer/tables.c:224
437 msgid "Estimated transfer arrival" 429 msgid "Estimated transfer arrival"
438 msgstr "Tempo estimado para a transferência" 430 msgstr "Tempo estimado para a transferência"
@@ -441,7 +433,7 @@ msgstr &quot;Tempo estimado para a transferência&quot; @@ -441,7 +433,7 @@ msgstr &quot;Tempo estimado para a transferência&quot;
441 msgid "Field colors" 433 msgid "Field colors"
442 msgstr "Cor dos campos" 434 msgstr "Cor dos campos"
443 435
444 -#: src/dialogs/save/save.c:230 436 +#: src/dialogs/save/save.c:282
445 msgid "File _Format" 437 msgid "File _Format"
446 msgstr "_Formato do arquivo" 438 msgstr "_Formato do arquivo"
447 439
@@ -524,15 +516,15 @@ msgstr &quot;Cinza&quot; @@ -524,15 +516,15 @@ msgstr &quot;Cinza&quot;
524 msgid "Green" 516 msgid "Green"
525 msgstr "Verde" 517 msgstr "Verde"
526 518
527 -#: src/dialogs/settings/clipboard.c:241 519 +#: src/dialogs/settings/clipboard.c:252
528 msgid "HTML options" 520 msgid "HTML options"
529 msgstr "Opções HTML" 521 msgstr "Opções HTML"
530 522
531 -#: src/dialogs/settings/host.c:635 523 +#: src/dialogs/settings/host.c:664
532 msgid "Host" 524 msgid "Host"
533 msgstr "Servidor" 525 msgstr "Servidor"
534 526
535 -#: src/dialogs/settings/host.c:634 527 +#: src/dialogs/settings/host.c:663
536 msgid "Host settings" 528 msgid "Host settings"
537 msgstr "Configurações do servidor" 529 msgstr "Configurações do servidor"
538 530
@@ -568,6 +560,10 @@ msgstr &quot;Ignore&quot; @@ -568,6 +560,10 @@ msgstr &quot;Ignore&quot;
568 msgid "Ignore the fail and remove the file from queue." 560 msgid "Ignore the fail and remove the file from queue."
569 msgstr "Ignore the fail and remove the file from queue." 561 msgstr "Ignore the fail and remove the file from queue."
570 562
  563 +#: src/dialogs/settings/clipboard.c:173
  564 +msgid "Image copy"
  565 +msgstr "Copiar imagem"
  566 +
571 #: src/terminal/actions/table.c:196 567 #: src/terminal/actions/table.c:196
572 msgid "Increase the font size" 568 msgid "Increase the font size"
573 msgstr "Aumenta o tamanho da fonte" 569 msgstr "Aumenta o tamanho da fonte"
@@ -588,10 +584,14 @@ msgstr &quot;Intensificado/Protegido&quot; @@ -588,10 +584,14 @@ msgstr &quot;Intensificado/Protegido&quot;
588 msgid "Intensified/Unprotected" 584 msgid "Intensified/Unprotected"
589 msgstr "Intensificado/Desprotegido" 585 msgstr "Intensificado/Desprotegido"
590 586
591 -#: src/terminal/callbacks.c:424  
592 -msgid "Invalid callback table, possible version mismatch in lib3270" 587 +#: src/terminal/callbacks.c:463
  588 +#, c-format
  589 +msgid ""
  590 +"Invalid callback table, the release %s of lib%s can't be used (expecting "
  591 +"revision %s)"
593 msgstr "" 592 msgstr ""
594 -"Tabela de callbacks inválida, possível divergência de versão na lib3270" 593 +"Tabela de callbacks inválida, a revisão %s da lib%s não pode ser usada "
  594 +"(esperando a revisão %s)"
595 595
596 #: src/terminal/charset.c:132 596 #: src/terminal/charset.c:132
597 msgid "Invalid cgcsgid value" 597 msgid "Invalid cgcsgid value"
@@ -605,8 +605,8 @@ msgstr &quot;Escopo de mapeamento inválido&quot; @@ -605,8 +605,8 @@ msgstr &quot;Escopo de mapeamento inválido&quot;
605 msgid "Invalid state" 605 msgid "Invalid state"
606 msgstr "Estado inválido" 606 msgstr "Estado inválido"
607 607
608 -#: src/dialogs/settings/accelerator.c:145  
609 -#: src/dialogs/settings/accelerator.c:239 608 +#: src/dialogs/settings/accelerator.c:150
  609 +#: src/dialogs/settings/accelerator.c:244
610 msgid "Keyboard accelerators" 610 msgid "Keyboard accelerators"
611 msgstr "Atalhos de teclado" 611 msgstr "Atalhos de teclado"
612 612
@@ -662,7 +662,7 @@ msgstr &quot;Monocromático&quot; @@ -662,7 +662,7 @@ msgstr &quot;Monocromático&quot;
662 msgid "Mustard" 662 msgid "Mustard"
663 msgstr "Mostarda" 663 msgstr "Mostarda"
664 664
665 -#: src/dialogs/settings/accelerator.c:153 665 +#: src/dialogs/settings/accelerator.c:158
666 msgid "Name" 666 msgid "Name"
667 msgstr "Nome" 667 msgstr "Nome"
668 668
@@ -678,7 +678,7 @@ msgstr &quot;Próxima página&quot; @@ -678,7 +678,7 @@ msgstr &quot;Próxima página&quot;
678 msgid "No active transfer" 678 msgid "No active transfer"
679 msgstr "Nenhuma transferência ativa" 679 msgstr "Nenhuma transferência ativa"
680 680
681 -#: src/terminal/properties/get.c:198 681 +#: src/terminal/properties/get.c:205
682 msgid "No host defined" 682 msgid "No host defined"
683 msgstr "Nenhum servidor definido" 683 msgstr "Nenhum servidor definido"
684 684
@@ -694,14 +694,18 @@ msgstr &quot;Nenhuma transferência&quot; @@ -694,14 +694,18 @@ msgstr &quot;Nenhuma transferência&quot;
694 msgid "No transfer in progress" 694 msgid "No transfer in progress"
695 msgstr "Nenhuma transferência em andamento" 695 msgstr "Nenhuma transferência em andamento"
696 696
697 -#: src/dialogs/settings/clipboard.c:306 697 +#: src/dialogs/settings/clipboard.c:317
698 msgid "None (Don't export color)" 698 msgid "None (Don't export color)"
699 msgstr "Nenhum (Não exporta cores)" 699 msgstr "Nenhum (Não exporta cores)"
700 700
701 -#: src/dialogs/settings/clipboard.c:426 701 +#: src/dialogs/settings/clipboard.c:437
702 msgid "None (Don't export font name)" 702 msgid "None (Don't export font name)"
703 msgstr "Nenhuma (Não exporta fontes)" 703 msgstr "Nenhuma (Não exporta fontes)"
704 704
  705 +#: src/selection/linux/paste.c:117
  706 +msgid "None of the screens in the clipboard match with the current one."
  707 +msgstr "Nenhuma das telas da área de transferência corresponde à atual."
  708 +
705 #: src/dialogs/settings/colors.c:174 709 #: src/dialogs/settings/colors.c:174
706 msgid "Normal/Protected" 710 msgid "Normal/Protected"
707 msgstr "Normal/Protegido" 711 msgstr "Normal/Protegido"
@@ -710,7 +714,7 @@ msgstr &quot;Normal/Protegido&quot; @@ -710,7 +714,7 @@ msgstr &quot;Normal/Protegido&quot;
710 msgid "Normal/Unprotected" 714 msgid "Normal/Unprotected"
711 msgstr "Normal/Desprotegido" 715 msgstr "Normal/Desprotegido"
712 716
713 -#: src/selection/windows/paste.c:75 717 +#: src/selection/linux/paste.c:77
714 msgid "Not the same terminal type" 718 msgid "Not the same terminal type"
715 msgstr "O tipo de terminal é diferente" 719 msgstr "O tipo de terminal é diferente"
716 720
@@ -742,10 +746,6 @@ msgstr &quot;Estado normal na OIA&quot; @@ -742,10 +746,6 @@ msgstr &quot;Estado normal na OIA&quot;
742 msgid "Open" 746 msgid "Open"
743 msgstr "Abrir" 747 msgstr "Abrir"
744 748
745 -#: src/dialogs/popups.c:116  
746 -msgid "Operation failed"  
747 -msgstr "Operação falhou"  
748 -  
749 #: src/dialogs/save/convenience.c:65 src/dialogs/save/convenience.c:93 749 #: src/dialogs/save/convenience.c:65 src/dialogs/save/convenience.c:93
750 msgid "Operation has failed" 750 msgid "Operation has failed"
751 msgstr "Operação falhou" 751 msgstr "Operação falhou"
@@ -802,7 +802,7 @@ msgstr &quot;Colar de um arquivo&quot; @@ -802,7 +802,7 @@ msgstr &quot;Colar de um arquivo&quot;
802 msgid "Paste from text file" 802 msgid "Paste from text file"
803 msgstr "Colar de um arquivo texto" 803 msgstr "Colar de um arquivo texto"
804 804
805 -#: src/dialogs/settings/clipboard.c:240 805 +#: src/dialogs/settings/clipboard.c:251
806 msgid "Paste options" 806 msgid "Paste options"
807 msgstr "Opções para colar" 807 msgstr "Opções para colar"
808 808
@@ -830,7 +830,7 @@ msgstr &quot;Rosa&quot; @@ -830,7 +830,7 @@ msgstr &quot;Rosa&quot;
830 msgid "Plain text" 830 msgid "Plain text"
831 msgstr "Texto puro" 831 msgstr "Texto puro"
832 832
833 -#: src/dialogs/settings/clipboard.c:374 833 +#: src/dialogs/settings/clipboard.c:385
834 msgid "Plain text only" 834 msgid "Plain text only"
835 msgstr "Apenas texto puro" 835 msgstr "Apenas texto puro"
836 836
@@ -938,7 +938,7 @@ msgstr &quot;Formato de registro&quot; @@ -938,7 +938,7 @@ msgstr &quot;Formato de registro&quot;
938 msgid "Red" 938 msgid "Red"
939 msgstr "Vermelho" 939 msgstr "Vermelho"
940 940
941 -#: src/dialogs/settings/accelerator.c:454 941 +#: src/dialogs/settings/accelerator.c:459
942 msgid "Rejected by action" 942 msgid "Rejected by action"
943 msgstr "Rejeitado pela ação" 943 msgstr "Rejeitado pela ação"
944 944
@@ -987,7 +987,11 @@ msgstr &quot;&quot; @@ -987,7 +987,11 @@ msgstr &quot;&quot;
987 "SPACE can be specified in units of TRACKS, CYLINDERS, or AVBLOCK, and only " 987 "SPACE can be specified in units of TRACKS, CYLINDERS, or AVBLOCK, and only "
988 "one option can be used." 988 "one option can be used."
989 989
990 -#: src/dialogs/settings/clipboard.c:307 src/dialogs/settings/clipboard.c:427 990 +#: src/dialogs/settings/host.c:560
  991 +msgid "SSL/TLS"
  992 +msgstr "SSL/TLS"
  993 +
  994 +#: src/dialogs/settings/clipboard.c:318 src/dialogs/settings/clipboard.c:438
991 msgid "Same of the screen" 995 msgid "Same of the screen"
992 msgstr "Igual ao terminal" 996 msgstr "Igual ao terminal"
993 997
@@ -1009,7 +1013,7 @@ msgstr &quot;Salvar _Como&quot; @@ -1009,7 +1013,7 @@ msgstr &quot;Salvar _Como&quot;
1009 msgid "Save all" 1013 msgid "Save all"
1010 msgstr "Salvar tela" 1014 msgstr "Salvar tela"
1011 1015
1012 -#: src/terminal/actions/table.c:262 src/dialogs/save/save.c:302 1016 +#: src/terminal/actions/table.c:262 src/dialogs/save/save.c:377
1013 msgid "Save copy" 1017 msgid "Save copy"
1014 msgstr "Salvar cópia" 1018 msgstr "Salvar cópia"
1015 1019
@@ -1029,11 +1033,11 @@ msgstr &quot;Salvar tela ou seleção&quot; @@ -1029,11 +1033,11 @@ msgstr &quot;Salvar tela ou seleção&quot;
1029 msgid "Save selected" 1033 msgid "Save selected"
1030 msgstr "Salvar seleção" 1034 msgstr "Salvar seleção"
1031 1035
1032 -#: src/terminal/actions/table.c:253 src/dialogs/save/save.c:301 1036 +#: src/terminal/actions/table.c:253 src/dialogs/save/save.c:376
1033 msgid "Save selected area" 1037 msgid "Save selected area"
1034 msgstr "Salvar área selecionada" 1038 msgstr "Salvar área selecionada"
1035 1039
1036 -#: src/dialogs/save/save.c:300 1040 +#: src/dialogs/save/save.c:375
1037 msgid "Save terminal contents" 1041 msgid "Save terminal contents"
1038 msgstr "Salvar conteúdo da tela" 1042 msgstr "Salvar conteúdo da tela"
1039 1043
@@ -1061,7 +1065,7 @@ msgstr &quot;Guarda fila de transferência num arquivo XML externo&quot; @@ -1061,7 +1065,7 @@ msgstr &quot;Guarda fila de transferência num arquivo XML externo&quot;
1061 msgid "Save transfer queue to file" 1065 msgid "Save transfer queue to file"
1062 msgstr "Salvar fila de transferências para arquivo" 1066 msgstr "Salvar fila de transferências para arquivo"
1063 1067
1064 -#: src/dialogs/settings/clipboard.c:375 1068 +#: src/dialogs/settings/clipboard.c:386
1065 msgid "Screen with terminal attributes" 1069 msgid "Screen with terminal attributes"
1066 msgstr "Completa incluindo atributos do terminal" 1070 msgstr "Completa incluindo atributos do terminal"
1067 1071
@@ -1086,7 +1090,7 @@ msgid &quot;Secondary space&quot; @@ -1086,7 +1090,7 @@ msgid &quot;Secondary space&quot;
1086 msgstr "Secondary space" 1090 msgstr "Secondary space"
1087 1091
1088 #: src/filetransfer/v3270ft.c:303 src/filetransfer/settings.c:209 1092 #: src/filetransfer/v3270ft.c:303 src/filetransfer/settings.c:209
1089 -#: src/dialogs/save/save.c:114 src/dialogs/save/save.c:137 1093 +#: src/dialogs/save/save.c:98 src/dialogs/save/save.c:118
1090 #: src/dialogs/settings/host.c:402 1094 #: src/dialogs/settings/host.c:402
1091 msgid "Select" 1095 msgid "Select"
1092 msgstr "Selecionar" 1096 msgstr "Selecionar"
@@ -1099,13 +1103,13 @@ msgstr &quot;Selecionar arquivo com mapeamento personalizado&quot; @@ -1099,13 +1103,13 @@ msgstr &quot;Selecionar arquivo com mapeamento personalizado&quot;
1099 msgid "Select custom charset mapping" 1103 msgid "Select custom charset mapping"
1100 msgstr "Seleciona mapeamento de teclado personalizado" 1104 msgstr "Seleciona mapeamento de teclado personalizado"
1101 1105
1102 -#: src/dialogs/save/save.c:113 src/dialogs/save/save.c:133 1106 +#: src/dialogs/save/save.c:97 src/dialogs/save/save.c:114
1103 msgid "Select destination file" 1107 msgid "Select destination file"
1104 msgstr "Selecionar arquivo destino" 1108 msgstr "Selecionar arquivo destino"
1105 1109
1106 #: src/filetransfer/v3270ft.c:591 src/filetransfer/settings.c:467 1110 #: src/filetransfer/v3270ft.c:591 src/filetransfer/settings.c:467
1107 #: src/dialogs/load.c:92 src/dialogs/load.c:108 src/dialogs/load.c:171 1111 #: src/dialogs/load.c:92 src/dialogs/load.c:108 src/dialogs/load.c:171
1108 -#: src/dialogs/save/save.c:205 1112 +#: src/dialogs/save/save.c:258
1109 msgid "Select file" 1113 msgid "Select file"
1110 msgstr "Selecionar arquivo" 1114 msgstr "Selecionar arquivo"
1111 1115
@@ -1245,7 +1249,7 @@ msgstr &quot;Tipo de situação&quot; @@ -1245,7 +1249,7 @@ msgstr &quot;Tipo de situação&quot;
1245 msgid "State of the dynamic font spacing" 1249 msgid "State of the dynamic font spacing"
1246 msgstr "Estado do espaçamento dinâmico" 1250 msgstr "Estado do espaçamento dinâmico"
1247 1251
1248 -#: src/dialogs/settings/accelerator.c:171 1252 +#: src/dialogs/settings/accelerator.c:176
1249 msgid "Summary" 1253 msgid "Summary"
1250 msgstr "Sumário" 1254 msgstr "Sumário"
1251 1255
@@ -1288,11 +1292,11 @@ msgstr &quot;&quot; @@ -1288,11 +1292,11 @@ msgstr &quot;&quot;
1288 "has been reached, or the maximum number of data blocks per file (16060) has " 1292 "has been reached, or the maximum number of data blocks per file (16060) has "
1289 "been reached." 1293 "been reached."
1290 1294
1291 -#: src/dialogs/settings/host.c:616 1295 +#: src/dialogs/settings/host.c:645
1292 msgid "The EBCDIC host character set. " 1296 msgid "The EBCDIC host character set. "
1293 msgstr "A tabela de caracteres EBCDIC." 1297 msgstr "A tabela de caracteres EBCDIC."
1294 1298
1295 -#: src/dialogs/settings/accelerator.c:450 1299 +#: src/dialogs/settings/accelerator.c:455
1296 #, c-format 1300 #, c-format
1297 msgid "The action \"%s\" can't manage alternative keys" 1301 msgid "The action \"%s\" can't manage alternative keys"
1298 msgstr "A ação \"%s\" não permite uso de atalho alternativo" 1302 msgstr "A ação \"%s\" não permite uso de atalho alternativo"
@@ -1313,12 +1317,7 @@ msgstr &quot;&quot; @@ -1313,12 +1317,7 @@ msgstr &quot;&quot;
1313 "Tabela de callbacks para transferência de arquivos inválida, possível " 1317 "Tabela de callbacks para transferência de arquivos inválida, possível "
1314 "divergência de versão na lib3270" 1318 "divergência de versão na lib3270"
1315 1319
1316 -#: src/terminal/callbacks.c:391  
1317 -#, c-format  
1318 -msgid "The error code was %d"  
1319 -msgstr "O código de erro foi %d"  
1320 -  
1321 -#: src/dialogs/save/save.c:415 1320 +#: src/dialogs/save/save.c:425
1322 #, c-format 1321 #, c-format
1323 msgid "The file \"%s\" already exists. Replace it?" 1322 msgid "The file \"%s\" already exists. Replace it?"
1324 msgstr "O arquivo \"%s\" já existe, substituir?" 1323 msgstr "O arquivo \"%s\" já existe, substituir?"
@@ -1377,12 +1376,12 @@ msgstr &quot;Operação de impressão está em andamento&quot; @@ -1377,12 +1376,12 @@ msgstr &quot;Operação de impressão está em andamento&quot;
1377 msgid "The print settings should be stored." 1376 msgid "The print settings should be stored."
1378 msgstr "Configuração de impressão deve ser armazenada" 1377 msgstr "Configuração de impressão deve ser armazenada"
1379 1378
1380 -#: src/dialogs/settings/accelerator.c:304 1379 +#: src/dialogs/settings/accelerator.c:309
1381 #, c-format 1380 #, c-format
1382 msgid "The selected accelerator is in use by action <b>%s</b> (<b>%s</b>)" 1381 msgid "The selected accelerator is in use by action <b>%s</b> (<b>%s</b>)"
1383 msgstr "O atalho selecionado está em uso pela ação <b>%s</b> (<b>%s</b>)" 1382 msgstr "O atalho selecionado está em uso pela ação <b>%s</b> (<b>%s</b>)"
1384 1383
1385 -#: src/dialogs/settings/accelerator.c:324 1384 +#: src/dialogs/settings/accelerator.c:329
1386 msgid "The selected accelerator is in use by the same action" 1385 msgid "The selected accelerator is in use by the same action"
1387 msgstr "O atalho selecionado está em uso na mesma ação" 1386 msgstr "O atalho selecionado está em uso na mesma ação"
1388 1387
@@ -1464,10 +1463,14 @@ msgstr &quot;Fila de transferências&quot; @@ -1464,10 +1463,14 @@ msgstr &quot;Fila de transferências&quot;
1464 msgid "Transfer speed" 1463 msgid "Transfer speed"
1465 msgstr "Velocidade de transferência" 1464 msgstr "Velocidade de transferência"
1466 1465
1467 -#: src/terminal/properties/init.c:250 1466 +#: src/terminal/properties/init.c:249
1468 msgid "True if the terminal has copy blocks" 1467 msgid "True if the terminal has copy blocks"
1469 msgstr "Verdadeiro se o terminal tiver blocos copiados" 1468 msgstr "Verdadeiro se o terminal tiver blocos copiados"
1470 1469
  1470 +#: src/terminal/properties/init.c:264
  1471 +msgid "True if the timer indicator is active"
  1472 +msgstr "Verdadeiro se indicador de tempo estiver ativo"
  1473 +
1471 #: src/filetransfer/transfer.c:84 1474 #: src/filetransfer/transfer.c:84
1472 msgid "Try again with the same file." 1475 msgid "Try again with the same file."
1473 msgstr "Tente de novo com o mesmo arquivo." 1476 msgstr "Tente de novo com o mesmo arquivo."
@@ -1480,20 +1483,25 @@ msgstr &quot;Turquesa&quot; @@ -1480,20 +1483,25 @@ msgstr &quot;Turquesa&quot;
1480 msgid "UTF-8" 1483 msgid "UTF-8"
1481 msgstr "UTF-8" 1484 msgstr "UTF-8"
1482 1485
1483 -#: src/selection/windows/paste.c:115  
1484 -msgid "Unable to paste formatted data"  
1485 -msgstr "Incapaz de colar tela formatada." 1486 +#: src/selection/linux/paste.c:116
  1487 +msgid "Unable to paste formatted data."
  1488 +msgstr "Incapaz de colar dados formatados."
1486 1489
1487 #: src/filetransfer/tables.c:92 1490 #: src/filetransfer/tables.c:92
1488 msgid "Undefined" 1491 msgid "Undefined"
1489 msgstr "Indefinido" 1492 msgstr "Indefinido"
1490 1493
1491 -#: src/dialogs/save/save.c:400 1494 +#: src/terminal/callbacks.c:472
  1495 +#, c-format
  1496 +msgid "Unexpected callback table, the release %s of lib%s is invalid"
  1497 +msgstr "Tabela de callbacks inesperada, a revisão %s da lib%s é inválida"
  1498 +
  1499 +#: src/dialogs/save/save.c:495
1492 #, c-format 1500 #, c-format
1493 msgid "Unexpected format %d" 1501 msgid "Unexpected format %d"
1494 msgstr "Formato inesperado %d" 1502 msgstr "Formato inesperado %d"
1495 1503
1496 -#: src/dialogs/save/save.c:370 1504 +#: src/dialogs/save/save.c:463 src/dialogs/save/save.c:559
1497 #, c-format 1505 #, c-format
1498 msgid "Unexpected mode %d" 1506 msgid "Unexpected mode %d"
1499 msgstr "Modo inesperado %d" 1507 msgstr "Modo inesperado %d"
@@ -1503,7 +1511,11 @@ msgstr &quot;Modo inesperado %d&quot; @@ -1503,7 +1511,11 @@ msgstr &quot;Modo inesperado %d&quot;
1503 msgid "Unexpected status %d in print operation" 1511 msgid "Unexpected status %d in print operation"
1504 msgstr "Estado inesperado %d na operação de impressão" 1512 msgstr "Estado inesperado %d na operação de impressão"
1505 1513
1506 -#: src/dialogs/windows/select.c:169 src/dialogs/save/save.c:149 1514 +#: src/dialogs/settings/host.c:559
  1515 +msgid "Unsecure"
  1516 +msgstr "Insegura"
  1517 +
  1518 +#: src/dialogs/save/save.c:130
1507 msgid "Untitled document" 1519 msgid "Untitled document"
1508 msgstr "Documento sem título" 1520 msgstr "Documento sem título"
1509 1521
@@ -1524,6 +1536,10 @@ msgstr &quot;Variável&quot; @@ -1524,6 +1536,10 @@ msgstr &quot;Variável&quot;
1524 msgid "Western Europe (ISO 8859-1)" 1536 msgid "Western Europe (ISO 8859-1)"
1525 msgstr "Europa ocidental (ISO 8859-1)" 1537 msgstr "Europa ocidental (ISO 8859-1)"
1526 1538
  1539 +#: src/dialogs/settings/clipboard.c:174
  1540 +msgid "When set allow image formats on clipboard"
  1541 +msgstr "Quando ativo permite imagens na área de transferência"
  1542 +
1527 #: src/dialogs/settings/clipboard.c:154 1543 #: src/dialogs/settings/clipboard.c:154
1528 msgid "" 1544 msgid ""
1529 "When set search clipboard for a similar screen, if found paste unprotected " 1545 "When set search clipboard for a similar screen, if found paste unprotected "
@@ -1705,20 +1721,21 @@ msgstr &quot;Texto _ASCII&quot; @@ -1705,20 +1721,21 @@ msgstr &quot;Texto _ASCII&quot;
1705 msgid "_Apply" 1721 msgid "_Apply"
1706 msgstr "_Aplicar" 1722 msgstr "_Aplicar"
1707 1723
1708 -#: src/selection/windows/paste.c:83 src/selection/windows/paste.c:123  
1709 -#: src/dialogs/load.c:205 src/dialogs/load.c:224  
1710 -#: src/dialogs/windows/select.c:158 src/dialogs/print/settingsdialog.c:410  
1711 -#: src/dialogs/print/settingsdialog.c:429 src/dialogs/save/save.c:267  
1712 -#: src/dialogs/save/save.c:286 src/dialogs/settings/dialog.c:231 1724 +#: src/selection/linux/paste.c:85 src/dialogs/popups.c:157
  1725 +#: src/dialogs/load.c:205 src/dialogs/load.c:224 src/dialogs/linux/select.c:51
  1726 +#: src/dialogs/linux/select.c:77 src/dialogs/print/settingsdialog.c:410
  1727 +#: src/dialogs/print/settingsdialog.c:429 src/dialogs/save/save.c:342
  1728 +#: src/dialogs/save/save.c:361 src/dialogs/settings/dialog.c:231
1713 msgid "_Cancel" 1729 msgid "_Cancel"
1714 msgstr "_Cancelar" 1730 msgstr "_Cancelar"
1715 1731
1716 -#: src/dialogs/settings/host.c:615 1732 +#: src/dialogs/settings/host.c:644
1717 msgid "_Charset" 1733 msgid "_Charset"
1718 msgstr "Tabela de _Caracteres" 1734 msgstr "Tabela de _Caracteres"
1719 1735
1720 #: src/trace/tracewindow.c:125 src/dialogs/transfer.c:163 1736 #: src/trace/tracewindow.c:125 src/dialogs/transfer.c:163
1721 #: src/dialogs/transfer.c:183 src/dialogs/security.c:235 1737 #: src/dialogs/transfer.c:183 src/dialogs/security.c:235
  1738 +#: src/dialogs/popups.c:95
1722 msgid "_Close" 1739 msgid "_Close"
1723 msgstr "_Close" 1740 msgstr "_Close"
1724 1741
@@ -1730,7 +1747,7 @@ msgstr &quot;_Tabela de cores&quot; @@ -1730,7 +1747,7 @@ msgstr &quot;_Tabela de cores&quot;
1730 msgid "_File" 1747 msgid "_File"
1731 msgstr "_Arquivo" 1748 msgstr "_Arquivo"
1732 1749
1733 -#: src/dialogs/load.c:163 src/dialogs/save/save.c:192 1750 +#: src/dialogs/load.c:163 src/dialogs/save/save.c:250
1734 msgid "_Filename" 1751 msgid "_Filename"
1735 msgstr "Nome do _Arquivo" 1752 msgstr "Nome do _Arquivo"
1736 1753
@@ -1754,11 +1771,16 @@ msgstr &quot;Arquivo _local:&quot; @@ -1754,11 +1771,16 @@ msgstr &quot;Arquivo _local:&quot;
1754 msgid "_Model" 1771 msgid "_Model"
1755 msgstr "_Modelo" 1772 msgstr "_Modelo"
1756 1773
  1774 +#: src/dialogs/popups.c:77 src/dialogs/popups.c:83 src/dialogs/popups.c:89
  1775 +#: src/dialogs/popups.c:101
  1776 +msgid "_Ok"
  1777 +msgstr "_Ok"
  1778 +
1757 #: src/filetransfer/v3270ft.c:333 1779 #: src/filetransfer/v3270ft.c:333
1758 msgid "_Operation" 1780 msgid "_Operation"
1759 msgstr "_Operação:" 1781 msgstr "_Operação:"
1760 1782
1761 -#: src/selection/windows/paste.c:84 src/selection/windows/paste.c:124 1783 +#: src/selection/linux/paste.c:86 src/selection/linux/paste.c:118
1762 msgid "_Paste as text" 1784 msgid "_Paste as text"
1763 msgstr "_Colar como texto" 1785 msgstr "_Colar como texto"
1764 1786
@@ -1766,14 +1788,14 @@ msgstr &quot;_Colar como texto&quot; @@ -1766,14 +1788,14 @@ msgstr &quot;_Colar como texto&quot;
1766 msgid "_Remote file" 1788 msgid "_Remote file"
1767 msgstr "Arquivo _remoto:" 1789 msgstr "Arquivo _remoto:"
1768 1790
1769 -#: src/trace/tracewindow.c:123 src/dialogs/save/save.c:272  
1770 -#: src/dialogs/save/save.c:287 1791 +#: src/trace/tracewindow.c:123 src/dialogs/save/save.c:347
  1792 +#: src/dialogs/save/save.c:362
1771 msgid "_Save" 1793 msgid "_Save"
1772 msgstr "_Salvar" 1794 msgstr "_Salvar"
1773 1795
1774 #: src/dialogs/settings/host.c:545 1796 #: src/dialogs/settings/host.c:545
1775 -msgid "_Secure connection."  
1776 -msgstr "Conexão _Segura." 1797 +msgid "_Security"
  1798 +msgstr "_Segurança"
1777 1799
1778 #: src/dialogs/settings/host.c:228 1800 #: src/dialogs/settings/host.c:228
1779 msgid "_Service" 1801 msgid "_Service"
@@ -2305,6 +2327,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2305,6 +2327,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2305 #~ msgid "Charset has more than 256 entries" 2327 #~ msgid "Charset has more than 256 entries"
2306 #~ msgstr "Tabela de tradução tem mais de 256 caracteres" 2328 #~ msgstr "Tabela de tradução tem mais de 256 caracteres"
2307 2329
  2330 +#~ msgid "Check for SSL secure connection."
  2331 +#~ msgstr "Marcar para ativar a conexão segura via SSL."
  2332 +
2308 #~ msgid "Check for text files." 2333 #~ msgid "Check for text files."
2309 #~ msgstr "Marque se o arquivo for texto." 2334 #~ msgstr "Marque se o arquivo for texto."
2310 2335
@@ -2347,12 +2372,18 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2347,12 +2372,18 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2347 #~ msgid "Connection state" 2372 #~ msgid "Connection state"
2348 #~ msgstr "Estado da conexão" 2373 #~ msgstr "Estado da conexão"
2349 2374
  2375 +#~ msgid "Continue"
  2376 +#~ msgstr "Continuar"
  2377 +
2350 #~ msgid "Copiar tudo" 2378 #~ msgid "Copiar tudo"
2351 #~ msgstr "Copiar tudo" 2379 #~ msgstr "Copiar tudo"
2352 2380
2353 #~ msgid "Copy as HTML" 2381 #~ msgid "Copy as HTML"
2354 #~ msgstr "Copiar como HTML" 2382 #~ msgstr "Copiar como HTML"
2355 2383
  2384 +#~ msgid "Critical Error"
  2385 +#~ msgstr "Erro crítico"
  2386 +
2356 #, fuzzy 2387 #, fuzzy
2357 #~ msgid "Cross hair Cursor" 2388 #~ msgid "Cross hair Cursor"
2358 #~ msgstr "Cursor mira" 2389 #~ msgstr "Cursor mira"
@@ -2490,6 +2521,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2490,6 +2521,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2490 #~ msgid "Erase to end of line" 2521 #~ msgid "Erase to end of line"
2491 #~ msgstr "Apagar até o final da linha" 2522 #~ msgstr "Apagar até o final da linha"
2492 2523
  2524 +#~ msgid "Error"
  2525 +#~ msgstr "Erro"
  2526 +
2493 #~ msgid "Error \"%s\" reading from local file (rc=%d)" 2527 #~ msgid "Error \"%s\" reading from local file (rc=%d)"
2494 #~ msgstr "Erro \"%s\" lendo arquivo local (rc=%d)" 2528 #~ msgstr "Erro \"%s\" lendo arquivo local (rc=%d)"
2495 2529
@@ -2511,9 +2545,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2511,9 +2545,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2511 #~ msgid "Error in ioctl(%s) when setting no blocking mode" 2545 #~ msgid "Error in ioctl(%s) when setting no blocking mode"
2512 #~ msgstr "Erro em ioctl(%s) ao ativar o modo não blocante" 2546 #~ msgstr "Erro em ioctl(%s) ao ativar o modo não blocante"
2513 2547
2514 -#~ msgid "Error loading %s"  
2515 -#~ msgstr "Erro lendo %s"  
2516 -  
2517 #~ msgid "Error loading CRL" 2548 #~ msgid "Error loading CRL"
2518 #~ msgstr "Erro lendo CRL" 2549 #~ msgstr "Erro lendo CRL"
2519 2550
@@ -2750,8 +2781,8 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2750,8 +2781,8 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2750 #~ msgid "Incorrect request code: file transfer canceled" 2781 #~ msgid "Incorrect request code: file transfer canceled"
2751 #~ msgstr "Código de requisição incorreto, transferência cancelada" 2782 #~ msgstr "Código de requisição incorreto, transferência cancelada"
2752 2783
2753 -#~ msgid "Informations"  
2754 -#~ msgstr "Informações" 2784 +#~ msgid "Information"
  2785 +#~ msgstr "Informação"
2755 2786
2756 #~ msgid "Input method" 2787 #~ msgid "Input method"
2757 #~ msgstr "Método de entrada" 2788 #~ msgstr "Método de entrada"
@@ -2774,6 +2805,10 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2774,6 +2805,10 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2774 #~ msgid "Invalid argument format" 2805 #~ msgid "Invalid argument format"
2775 #~ msgstr "O formato do argumento é inválido" 2806 #~ msgstr "O formato do argumento é inválido"
2776 2807
  2808 +#~ msgid "Invalid callback table, possible version mismatch in lib3270"
  2809 +#~ msgstr ""
  2810 +#~ "Tabela de callbacks inválida, possível divergência de versão na lib3270"
  2811 +
2777 #~ msgid "Invalid character value" 2812 #~ msgid "Invalid character value"
2778 #~ msgstr "Valor de caractere inválido" 2813 #~ msgstr "Valor de caractere inválido"
2779 2814
@@ -2927,9 +2962,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2927,9 +2962,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2927 #~ msgid "Non zero if the host is TSO." 2962 #~ msgid "Non zero if the host is TSO."
2928 #~ msgstr "Diferente de zero se o host é TSO" 2963 #~ msgstr "Diferente de zero se o host é TSO"
2929 2964
2930 -#~ msgid "None of the screens in the clipboard match with the current one."  
2931 -#~ msgstr "Nenhuma das telas da área de transferência corresponde à atual."  
2932 -  
2933 #~ msgid "Not available" 2965 #~ msgid "Not available"
2934 #~ msgstr "Não disponível" 2966 #~ msgstr "Não disponível"
2935 2967
@@ -2942,6 +2974,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -2942,6 +2974,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
2942 #~ "Permitida apenas uma opção dentre TRACKS, CYLINDERS, AVBLOCK: " 2974 #~ "Permitida apenas uma opção dentre TRACKS, CYLINDERS, AVBLOCK: "
2943 #~ "Transferência cancelada" 2975 #~ "Transferência cancelada"
2944 2976
  2977 +#~ msgid "Operation failed"
  2978 +#~ msgstr "Operação falhou"
  2979 +
2945 #~ msgid "Option '%c:' is not supported" 2980 #~ msgid "Option '%c:' is not supported"
2946 #~ msgstr "Opção não suportada: '%c:'" 2981 #~ msgstr "Opção não suportada: '%c:'"
2947 2982
@@ -3339,9 +3374,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -3339,9 +3374,6 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
3339 #~ msgid "Secure connection was successful." 3374 #~ msgid "Secure connection was successful."
3340 #~ msgstr "Conexão segura efetuada com sucesso." 3375 #~ msgstr "Conexão segura efetuada com sucesso."
3341 3376
3342 -#~ msgid "Security error"  
3343 -#~ msgstr "Erro de segurança"  
3344 -  
3345 #~ msgid "Security warning" 3377 #~ msgid "Security warning"
3346 #~ msgstr "Alerta de segurança" 3378 #~ msgstr "Alerta de segurança"
3347 3379
@@ -3652,6 +3684,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -3652,6 +3684,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
3652 #~ "Intervalo de tempo entre o desbloqueio de teclado pelo host e o " 3684 #~ "Intervalo de tempo entre o desbloqueio de teclado pelo host e o "
3653 #~ "desbloqueio real" 3685 #~ "desbloqueio real"
3654 3686
  3687 +#~ msgid "The error code was %d"
  3688 +#~ msgstr "O código de erro foi %d"
  3689 +
3655 #~ msgid "The height %d is less than model %d rows (%d)" 3690 #~ msgid "The height %d is less than model %d rows (%d)"
3656 #~ msgstr "A altura %d é menor que o número de linhas do modelo %d (%d)" 3691 #~ msgstr "A altura %d é menor que o número de linhas do modelo %d (%d)"
3657 3692
@@ -3995,6 +4030,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -3995,6 +4030,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
3995 #~ msgid "Waiting for PUT response" 4030 #~ msgid "Waiting for PUT response"
3996 #~ msgstr "Aguardando resposta do pedido de upload" 4031 #~ msgstr "Aguardando resposta do pedido de upload"
3997 4032
  4033 +#~ msgid "Warning"
  4034 +#~ msgstr "Alerta"
  4035 +
3998 #~ msgid "Where to save the received file." 4036 #~ msgid "Where to save the received file."
3999 #~ msgstr "Onde salvar o arquivo recebido." 4037 #~ msgstr "Onde salvar o arquivo recebido."
4000 4038
@@ -4040,6 +4078,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot; @@ -4040,6 +4078,9 @@ msgstr &quot;Diminui o tamanho da fonte&quot;
4040 #~ msgid "_Receive" 4078 #~ msgid "_Receive"
4041 #~ msgstr "_Receber" 4079 #~ msgstr "_Receber"
4042 4080
  4081 +#~ msgid "_Secure connection."
  4082 +#~ msgstr "Conexão _Segura."
  4083 +
4043 #~ msgid "_Send" 4084 #~ msgid "_Send"
4044 #~ msgstr "_Enviar" 4085 #~ msgstr "_Enviar"
4045 4086
src/dialogs/popups.c
@@ -32,182 +32,204 @@ @@ -32,182 +32,204 @@
32 #include <terminal.h> 32 #include <terminal.h>
33 #include <v3270/dialogs.h> 33 #include <v3270/dialogs.h>
34 #include <v3270/settings.h> 34 #include <v3270/settings.h>
  35 + #include <lib3270/popup.h>
35 36
36 /*--[ Implement ]------------------------------------------------------------------------------------*/ 37 /*--[ Implement ]------------------------------------------------------------------------------------*/
37 38
38 - void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type , const gchar *title, const gchar *message, const gchar *text) {  
39 - GtkWidget * dialog;  
40 - GtkWidget * toplevel = NULL;  
41 - GtkMessageType msgtype = GTK_MESSAGE_WARNING;  
42 - GtkButtonsType buttons = GTK_BUTTONS_OK; 39 + GtkResponseType v3270_popup_dialog_show(GtkWidget *widget, const LIB3270_POPUP *popup, gboolean wait) {
43 40
44 - if(widget && GTK_IS_WIDGET(widget))  
45 - toplevel = gtk_widget_get_toplevel(GTK_WIDGET(widget)); 41 + g_return_val_if_fail(GTK_IS_WIDGET(widget),GTK_RESPONSE_NONE);
46 42
47 - if(!GTK_IS_WINDOW(toplevel))  
48 - toplevel = NULL; 43 + // Check if the dialog is enabled
  44 + gboolean allow_disabling = (popup->name && GTK_IS_V3270(widget));
49 45
50 - if(type == LIB3270_NOTIFY_CRITICAL) {  
51 - msgtype = GTK_MESSAGE_ERROR;  
52 - buttons = GTK_BUTTONS_CLOSE;  
53 - } 46 + debug("%s: name=%s allow-disabling: %s", __FUNCTION__, popup->name, allow_disabling ? "Yes" : "No");
54 47
55 - if(!title)  
56 - title = _( "Error" );  
57 -  
58 - if(message) {  
59 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",message);  
60 - if(text && *text)  
61 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",text);  
62 - } else if(text && *text) {  
63 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",text);  
64 - } else {  
65 - dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(toplevel),GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,msgtype,buttons,"%s",title);  
66 - } 48 + if(allow_disabling) {
67 49
68 - gtk_window_set_title(GTK_WINDOW(dialog),title);  
69 - gtk_widget_show_all(dialog);  
70 - gtk_dialog_run(GTK_DIALOG (dialog));  
71 - gtk_widget_destroy(dialog); 50 + GtkResponseType response = 0;
72 51
73 - } 52 + debug("Emitting %s","V3270_SIGNAL_LOAD_POPUP_RESPONSE");
  53 + v3270_signal_emit(
  54 + widget,
  55 + V3270_SIGNAL_LOAD_POPUP_RESPONSE,
  56 + popup->name,
  57 + &response
  58 + );
74 59
75 - void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) {  
76 - GtkWidget * dialog =  
77 - gtk_message_dialog_new_with_markup(  
78 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
79 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
80 - GTK_MESSAGE_ERROR,  
81 - GTK_BUTTONS_CLOSE,  
82 - "%s",summary  
83 - ); 60 + debug("Got response %d",(int) response);
84 61
85 - gtk_window_set_title(GTK_WINDOW(dialog), (title ? title : _("Error"))); 62 + if(response && response != GTK_RESPONSE_NONE)
  63 + return response;
86 64
87 - if(body)  
88 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",body); 65 + allow_disabling = (response == GTK_RESPONSE_NONE);
  66 + }
89 67
90 - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);  
91 - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); 68 + // Popup settings.
  69 + static const struct _settings {
  70 + GtkMessageType type;
  71 + const gchar *button;
  72 + } settings[LIB3270_NOTIFY_USER] = {
  73 +
  74 + // LIB3270_NOTIFY_INFO - Simple information dialog.
  75 + {
  76 + .type = GTK_MESSAGE_INFO,
  77 + .button = N_("_Ok"),
  78 + },
  79 +
  80 + // LIB3270_NOTIFY_WARNING - Warning message.
  81 + {
  82 + .type = GTK_MESSAGE_WARNING,
  83 + .button = N_("_Ok"),
  84 + },
  85 +
  86 + // LIB3270_NOTIFY_ERROR - Error message.
  87 + {
  88 + .type = GTK_MESSAGE_ERROR,
  89 + .button = N_("_Ok"),
  90 + },
  91 +
  92 + // LIB3270_NOTIFY_CRITICAL - Critical error, user can abort application.
  93 + {
  94 + .type = GTK_MESSAGE_ERROR,
  95 + .button = N_("_Close"),
  96 + },
  97 +
  98 + // LIB3270_NOTIFY_SECURE - Secure host dialog.
  99 + {
  100 + .type = GTK_MESSAGE_OTHER,
  101 + .button = N_("_Ok"),
  102 + }
92 103
93 - gtk_widget_show_all(dialog); 104 + };
94 105
95 - } 106 + // Create dialog
  107 + GtkWidget * dialog =
  108 + gtk_message_dialog_new_with_markup(
  109 + GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  110 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  111 + settings[popup->type].type,
  112 + GTK_BUTTONS_NONE,
  113 + (popup->body ? "<b><big>%s</big></b>" : "%s"),
  114 + popup->summary
  115 + );
96 116
97 - void v3270_popup_gerror(GtkWidget *widget, GError *error, const gchar *title, const gchar *fmt, ...) { 117 + if(popup->body) {
  118 + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"<small>%s</small>",popup->body);
  119 + }
98 120
99 - // Format message.  
100 - va_list arg_ptr;  
101 - va_start(arg_ptr, fmt);  
102 - g_autofree gchar *text = g_strdup_vprintf(fmt,arg_ptr);  
103 - va_end(arg_ptr); 121 + if(popup->title) {
  122 + gtk_window_set_title(GTK_WINDOW(dialog),popup->title);
  123 + }
104 124
105 - GtkWidget *dialog = gtk_message_dialog_new(  
106 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
107 - GTK_DIALOG_DESTROY_WITH_PARENT,  
108 - GTK_MESSAGE_ERROR,  
109 - GTK_BUTTONS_OK,  
110 - "%s",text  
111 - ); 125 + if(wait) {
112 126
113 - if(title)  
114 - gtk_window_set_title(GTK_WINDOW(dialog), title);  
115 - else  
116 - gtk_window_set_title(GTK_WINDOW(dialog), (title ? title : _("Operation failed"))); 127 + GtkWidget * dont_ask = NULL;
117 128
118 - if(error)  
119 - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); 129 + if(allow_disabling) {
  130 + // Set check button
  131 + dont_ask = gtk_check_button_new_with_label(_("Don't ask again"));
120 132
121 - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);  
122 - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); 133 + gtk_widget_set_can_focus(dont_ask,FALSE);
  134 + gtk_widget_set_can_default(dont_ask,FALSE);
123 135
124 - gtk_widget_show_all(dialog); 136 +#if GTK_CHECK_VERSION(3,20,0)
  137 + gtk_widget_set_focus_on_click(dont_ask,FALSE);
  138 +#endif // GTK 3,20,0
125 139
126 - } 140 + gtk_widget_set_valign(dont_ask, GTK_ALIGN_BASELINE);
  141 + gtk_widget_set_halign(dont_ask, GTK_ALIGN_START);
127 142
128 - GtkResponseType v3270_popup_toggleable_dialog(GtkWidget *widget, V3270_TOGGLEABLE_DIALOG id, const gchar *title, const gchar *summary, const gchar *body, const gchar *first_button_text, ...) { 143 + gtk_box_pack_start(
  144 + GTK_BOX(gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog))),
  145 + dont_ask,
  146 + TRUE,
  147 + TRUE,
  148 + 0
  149 + );
  150 + }
129 151
130 - GtkResponseType response = GTK_V3270(widget)->responses[id]; 152 + // Wait for response.
  153 + if(popup->label) {
131 154
132 - if(response == GTK_RESPONSE_NONE) {  
133 - GtkWidget * dialog =  
134 - gtk_message_dialog_new(  
135 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
136 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
137 - GTK_MESSAGE_INFO,  
138 - GTK_BUTTONS_NONE,  
139 - "%s",  
140 - summary 155 + gtk_dialog_add_button(GTK_DIALOG(dialog), _("_Cancel"), GTK_RESPONSE_CANCEL);
  156 + gtk_dialog_add_button(GTK_DIALOG(dialog), popup->label, GTK_RESPONSE_APPLY);
  157 + gtk_dialog_set_default_response(
  158 + GTK_DIALOG(dialog),
  159 + (popup->type == LIB3270_NOTIFY_SECURE ? GTK_RESPONSE_CANCEL : GTK_RESPONSE_APPLY)
141 ); 160 );
142 161
143 - if(body)  
144 - gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(dialog),"%s",body); 162 + } else {
145 163
146 - gtk_window_set_title(GTK_WINDOW(dialog),title); 164 + gtk_dialog_add_button(GTK_DIALOG(dialog), g_dgettext(GETTEXT_PACKAGE,settings[popup->type].button), GTK_RESPONSE_OK);
147 165
148 - // Set check button  
149 - GtkWidget * dont_ask = gtk_check_button_new_with_label(_("Don't ask again")); 166 + }
150 167
151 - gtk_widget_set_can_focus(dont_ask,FALSE);  
152 - gtk_widget_set_can_default(dont_ask,FALSE);  
153 -#if GTK_CHECK_VERSION(3,20,0)  
154 - gtk_widget_set_focus_on_click(dont_ask,FALSE);  
155 -#endif // GTK 3,20,0 168 + gtk_widget_show_all(dialog);
  169 + GtkResponseType rc = gtk_dialog_run(GTK_DIALOG(dialog));
156 170
157 - gtk_widget_set_valign(dont_ask, GTK_ALIGN_BASELINE);  
158 - gtk_widget_set_halign(dont_ask, GTK_ALIGN_START); 171 + if(dont_ask && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dont_ask)) && rc != GTK_RESPONSE_DELETE_EVENT && rc != GTK_RESPONSE_NONE) {
159 172
160 - gtk_box_pack_start(  
161 - GTK_BOX(gtk_message_dialog_get_message_area(GTK_MESSAGE_DIALOG(dialog))),  
162 - dont_ask,  
163 - TRUE,  
164 - TRUE,  
165 - 0  
166 - ); 173 + gboolean saved = FALSE;
167 174
168 - if(first_button_text) {  
169 - // From https://github.com/GNOME/gtk/blob/master/gtk/gtkdialog.c  
170 - va_list args;  
171 - const gchar* text;  
172 - gint response_id; 175 + v3270_signal_emit(
  176 + widget,
  177 + V3270_SIGNAL_SAVE_POPUP_RESPONSE,
  178 + popup->name,
  179 + rc,
  180 + &saved
  181 + );
173 182
174 - va_start(args, first_button_text); 183 + debug("response was %s",saved ? "saved" : "not saved");
175 184
176 - text = first_button_text;  
177 - while(text) {  
178 - response_id = va_arg(args, gint); 185 + }
179 186
180 - gtk_dialog_add_button(GTK_DIALOG(dialog), text, response_id); 187 + gtk_widget_destroy(dialog);
  188 + return rc;
181 189
182 - if(response_id == GTK_RESPONSE_APPLY || response_id == GTK_RESPONSE_OK || response_id == GTK_RESPONSE_YES)  
183 - gtk_dialog_set_default_response(GTK_DIALOG(dialog),response_id); 190 + }
184 191
185 - text = va_arg(args, gchar*);  
186 - } 192 + // Unnamed dialog, no need for wait.
  193 + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
  194 + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL);
187 195
188 - va_end (args);  
189 - } 196 + gtk_dialog_add_button(GTK_DIALOG(dialog), settings[popup->type].button, GTK_RESPONSE_OK);
190 197
191 - gtk_widget_show_all(dialog);  
192 - response = gtk_dialog_run(GTK_DIALOG(dialog)); 198 + gtk_widget_show_all(dialog);
193 199
194 - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dont_ask))) { 200 + return GTK_RESPONSE_NONE;
195 201
196 - GTK_V3270(widget)->responses[id] = response;  
197 - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->responses[id]);  
198 - v3270_emit_save_settings(widget); 202 + }
199 203
200 - debug(  
201 - "Property %s is now %d",  
202 - g_param_spec_get_name(GTK_V3270_GET_CLASS(widget)->responses[id]),  
203 - GTK_V3270(widget)->responses[id]  
204 - ); 204 + void v3270_error_popup(GtkWidget *widget, const gchar *title, const gchar *summary, const gchar *body) {
205 205
206 - } 206 + LIB3270_POPUP popup = {
  207 + .type = LIB3270_NOTIFY_ERROR,
  208 + .title = title,
  209 + .summary = summary,
  210 + .body = body
  211 + };
207 212
208 - gtk_widget_destroy(dialog);  
209 - } 213 + v3270_popup_dialog_show(widget, &popup, FALSE);
  214 +
  215 + }
  216 +
  217 + void v3270_popup_gerror(GtkWidget *widget, GError *error, const gchar *title, const gchar *fmt, ...) {
  218 +
  219 + // Format message.
  220 + va_list arg_ptr;
  221 + va_start(arg_ptr, fmt);
  222 + g_autofree gchar *summary = g_strdup_vprintf(fmt,arg_ptr);
  223 + va_end(arg_ptr);
210 224
211 - return response; 225 + LIB3270_POPUP popup = {
  226 + .type = LIB3270_NOTIFY_ERROR,
  227 + .title = title,
  228 + .summary = summary,
  229 + .body = error->message
  230 + };
  231 +
  232 + v3270_popup_dialog_show(widget, &popup, FALSE);
212 233
213 } 234 }
  235 +
src/dialogs/save/save.c
@@ -91,22 +91,6 @@ @@ -91,22 +91,6 @@
91 #ifdef WIN32 91 #ifdef WIN32
92 static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *widget) 92 static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *widget)
93 { 93 {
94 - /*  
95 -  
96 - GtkFileChooserNative * dialog =  
97 - gtk_file_chooser_native_new(  
98 - _( "Select destination file"),  
99 - GTK_WINDOW(widget),  
100 - GTK_FILE_CHOOSER_ACTION_SAVE,  
101 - _("Select"),  
102 - _("Cancel")  
103 - );  
104 -  
105 - gint rc = gtk_native_dialog_run (GTK_NATIVE_DIALOG(dialog));  
106 -  
107 - debug("rc=%d",rc);  
108 - */  
109 -  
110 g_autofree gchar *filename = 94 g_autofree gchar *filename =
111 v3270_select_file( 95 v3270_select_file(
112 GTK_WIDGET(widget), 96 GTK_WIDGET(widget),
@@ -125,9 +109,6 @@ static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIco @@ -125,9 +109,6 @@ static void icon_press(GtkEntry G_GNUC_UNUSED(*entry), G_GNUC_UNUSED GtkEntryIco
125 static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *widget) 109 static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_pos, G_GNUC_UNUSED GdkEvent *event, V3270SaveDialog *widget)
126 { 110 {
127 111
128 - //gint format = gtk_combo_box_get_active(GTK_COMBO_BOX(widget->format));  
129 - //g_autofree gchar * extension = g_strconcat("*",formats[format].extension,NULL);  
130 -  
131 GtkWidget * dialog = 112 GtkWidget * dialog =
132 gtk_file_chooser_dialog_new( 113 gtk_file_chooser_dialog_new(
133 _( "Select destination file"), 114 _( "Select destination file"),
@@ -156,6 +137,83 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -156,6 +137,83 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
156 } 137 }
157 #endif // _WIN32 138 #endif // _WIN32
158 139
  140 +
  141 + static void filename_changed(GtkEntry *entry, GtkComboBox *formats)
  142 + {
  143 + const gchar * text = gtk_entry_get_text(entry);
  144 +
  145 + if(!(text && *text))
  146 + return;
  147 +
  148 + const gchar * extension = strrchr(text,'.');
  149 + if(!extension)
  150 + return;
  151 +
  152 + extension++;
  153 + const gchar * format = gtk_combo_box_get_active_id(formats);
  154 + if(*format == '.')
  155 + format++;
  156 +
  157 + if(g_ascii_strcasecmp(extension,format) == 0)
  158 + return;
  159 +
  160 + gint column = gtk_combo_box_get_id_column(formats);
  161 + GtkTreeModel * model = gtk_combo_box_get_model(formats);
  162 + GtkTreeIter iter;
  163 +
  164 + debug("id_column=%d",column);
  165 +
  166 + if(gtk_tree_model_get_iter_first(model,&iter))
  167 + {
  168 + do
  169 + {
  170 + g_autofree gchar *id = NULL;
  171 + gtk_tree_model_get(model, &iter, column, &id, -1);
  172 +
  173 + if(g_ascii_strcasecmp(extension,id + (*id == '.' ? 1 : 0)) == 0)
  174 + {
  175 + gtk_combo_box_set_active_iter(formats,&iter);
  176 + break;
  177 + }
  178 +
  179 + } while(gtk_tree_model_iter_next(model,&iter));
  180 + }
  181 +
  182 + }
  183 +
  184 + static void fileformat_changed(GtkComboBox *formats, GtkEntry *entry)
  185 + {
  186 + const gchar * text = gtk_entry_get_text(entry);
  187 +
  188 + if(!(text && *text))
  189 + return;
  190 +
  191 + gchar * extension = strrchr(text,'.');
  192 + if(!extension)
  193 + return;
  194 +
  195 + extension++;
  196 + const gchar * format = gtk_combo_box_get_active_id(formats);
  197 + if(*format == '.')
  198 + format++;
  199 +
  200 + if(g_ascii_strcasecmp(extension,format) == 0)
  201 + return;
  202 +
  203 + size_t szFilename = strlen(text) + strlen(format);
  204 + g_autofree gchar * filename = g_malloc0(szFilename + 1);
  205 +
  206 + strncpy(filename,text,szFilename);
  207 + extension = strrchr(filename,'.');
  208 + if(extension)
  209 + {
  210 + *(++extension) = 0;
  211 + strncat(filename, format + (*format == '.' ? 1 : 0),szFilename);
  212 + gtk_entry_set_text(entry,filename);
  213 + }
  214 +
  215 + }
  216 +
159 static void V3270SaveDialog_init(V3270SaveDialog *dialog) 217 static void V3270SaveDialog_init(V3270SaveDialog *dialog)
160 { 218 {
161 // 0--------1---------------------2-------3--------------------4 219 // 0--------1---------------------2-------3--------------------4
@@ -195,16 +253,10 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -195,16 +253,10 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
195 gtk_grid_attach(grid,widget,0,0,1,1); 253 gtk_grid_attach(grid,widget,0,0,1,1);
196 gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename); 254 gtk_label_set_mnemonic_widget(GTK_LABEL(widget),dialog->filename);
197 255
198 -//#ifdef WIN32  
199 -// widget = gtk_button_new_from_icon_name("document-open",GTK_ICON_SIZE_BUTTON);  
200 -// g_signal_connect(G_OBJECT(widget),"clicked",G_CALLBACK(select_file),dialog);  
201 -// gtk_grid_attach(grid,widget,4,0,1,1);  
202 -//#else  
203 - gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-open"); 256 + gtk_entry_set_icon_from_icon_name(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,"document-save-as");
204 gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE); 257 gtk_entry_set_icon_activatable(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,TRUE);
205 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file")); 258 gtk_entry_set_icon_tooltip_text(GTK_ENTRY(dialog->filename),GTK_ENTRY_ICON_SECONDARY,_("Select file"));
206 g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog); 259 g_signal_connect(G_OBJECT(dialog->filename),"icon-press",G_CALLBACK(icon_press),dialog);
207 -//#endif // WIN32  
208 260
209 gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60); 261 gtk_entry_set_width_chars(GTK_ENTRY(dialog->filename),60);
210 gtk_entry_set_max_length(GTK_ENTRY(dialog->filename),PATH_MAX); 262 gtk_entry_set_max_length(GTK_ENTRY(dialog->filename),PATH_MAX);
@@ -240,7 +292,7 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -240,7 +292,7 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
240 { 292 {
241 gtk_combo_box_text_insert( 293 gtk_combo_box_text_insert(
242 GTK_COMBO_BOX_TEXT(dialog->format), 294 GTK_COMBO_BOX_TEXT(dialog->format),
243 - ix, 295 + -1,
244 formats[ix].extension, 296 formats[ix].extension,
245 g_dgettext(GETTEXT_PACKAGE,formats[ix].name) 297 g_dgettext(GETTEXT_PACKAGE,formats[ix].name)
246 ); 298 );
@@ -248,6 +300,29 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -248,6 +300,29 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
248 300
249 gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->format),0); 301 gtk_combo_box_set_active(GTK_COMBO_BOX(dialog->format),0);
250 302
  303 + // Image formats.
  304 + GSList *img_formats = gdk_pixbuf_get_formats();
  305 + GSList *img_format;
  306 +
  307 + for(img_format = img_formats;img_format;img_format = g_slist_next(img_format))
  308 + {
  309 + GdkPixbufFormat * pixFormat = (GdkPixbufFormat *) img_format->data;
  310 +
  311 + if (gdk_pixbuf_format_is_writable(pixFormat))
  312 + {
  313 + gtk_combo_box_text_insert(
  314 + GTK_COMBO_BOX_TEXT(dialog->format),
  315 + -1,
  316 + gdk_pixbuf_format_get_name(pixFormat),
  317 + gdk_pixbuf_format_get_description(pixFormat)
  318 + );
  319 + }
  320 +
  321 + }
  322 +
  323 + g_signal_connect(dialog->filename,"changed",G_CALLBACK(filename_changed),dialog->format);
  324 + g_signal_connect(dialog->format,"changed",G_CALLBACK(fileformat_changed),dialog->filename);
  325 +
251 } 326 }
252 327
253 328
@@ -335,20 +410,38 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -335,20 +410,38 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
335 return GTK_WIDGET(dialog); 410 return GTK_WIDGET(dialog);
336 } 411 }
337 412
338 - void v3270_save_dialog_apply(GtkWidget *widget, GError **error) 413 + static const gchar * get_filename(V3270SaveDialog * dialog)
339 { 414 {
340 - V3270SaveDialog * dialog = V3270_SAVE_DIALOG(widget); 415 + const gchar * filename = gtk_entry_get_text(GTK_ENTRY(dialog->filename));
  416 + gint response = GTK_RESPONSE_OK;
341 417
342 - if(!v3270_is_connected(dialog->terminal)) 418 + if(g_file_test(filename,G_FILE_TEST_EXISTS))
343 { 419 {
344 - *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENOTCONN));  
345 - return; 420 + GtkWidget * confirmation =
  421 + gtk_message_dialog_new_with_markup(
  422 + GTK_WINDOW(dialog),
  423 + GTK_DIALOG_DESTROY_WITH_PARENT,
  424 + GTK_MESSAGE_QUESTION,GTK_BUTTONS_OK_CANCEL,
  425 + _("The file \"%s\" already exists. Replace it?"),
  426 + filename
  427 + );
  428 +
  429 + response = gtk_dialog_run(GTK_DIALOG(confirmation));
  430 + gtk_widget_destroy(confirmation);
346 } 431 }
347 432
  433 + return (response == GTK_RESPONSE_OK ? filename : NULL);
  434 +
  435 + }
  436 +
  437 + static void save_as_text(V3270SaveDialog * dialog, size_t index, GError **error)
  438 + {
348 // Get selection 439 // Get selection
349 GList * dynamic = NULL; 440 GList * dynamic = NULL;
350 const GList * selection = NULL; 441 const GList * selection = NULL;
351 442
  443 + debug("%s(%d)",__FUNCTION__,dialog->mode);
  444 +
352 switch(dialog->mode) 445 switch(dialog->mode)
353 { 446 {
354 case LIB3270_CONTENT_ALL: 447 case LIB3270_CONTENT_ALL:
@@ -371,6 +464,8 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -371,6 +464,8 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
371 return; 464 return;
372 } 465 }
373 466
  467 + debug("Selection=%p",selection);
  468 +
374 if(!selection) 469 if(!selection)
375 { 470 {
376 *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENODATA)); 471 *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENODATA));
@@ -382,7 +477,7 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -382,7 +477,7 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
382 477
383 debug("Encoding: %s",encoding); 478 debug("Encoding: %s",encoding);
384 479
385 - switch(gtk_combo_box_get_active(GTK_COMBO_BOX(dialog->format))) 480 + switch(index)
386 { 481 {
387 case 0: // "Plain text" 482 case 0: // "Plain text"
388 text = v3270_get_selection_as_text(GTK_V3270(dialog->terminal), selection, encoding, dialog->mode == LIB3270_CONTENT_ALL); 483 text = v3270_get_selection_as_text(GTK_V3270(dialog->terminal), selection, encoding, dialog->mode == LIB3270_CONTENT_ALL);
@@ -402,25 +497,9 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -402,25 +497,9 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
402 497
403 if(text) 498 if(text)
404 { 499 {
405 - const gchar * filename = gtk_entry_get_text(GTK_ENTRY(dialog->filename));  
406 - gint response = GTK_RESPONSE_OK; 500 + const gchar * filename = get_filename(dialog);
407 501
408 - if(g_file_test(filename,G_FILE_TEST_EXISTS))  
409 - {  
410 - GtkWidget * confirmation =  
411 - gtk_message_dialog_new_with_markup(  
412 - GTK_WINDOW(widget),  
413 - GTK_DIALOG_DESTROY_WITH_PARENT,  
414 - GTK_MESSAGE_QUESTION,GTK_BUTTONS_OK_CANCEL,  
415 - _("The file \"%s\" already exists. Replace it?"),  
416 - filename  
417 - );  
418 -  
419 - response = gtk_dialog_run(GTK_DIALOG(confirmation));  
420 - gtk_widget_destroy(confirmation);  
421 - }  
422 -  
423 - if(response == GTK_RESPONSE_OK) 502 + if(filename)
424 { 503 {
425 g_file_set_contents( 504 g_file_set_contents(
426 gtk_entry_get_text(GTK_ENTRY(dialog->filename)), 505 gtk_entry_get_text(GTK_ENTRY(dialog->filename)),
@@ -445,6 +524,93 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_ @@ -445,6 +524,93 @@ static void icon_press(GtkEntry *entry, G_GNUC_UNUSED GtkEntryIconPosition icon_
445 #pragma GCC diagnostic pop 524 #pragma GCC diagnostic pop
446 } 525 }
447 526
  527 + static void save_as_image(V3270SaveDialog * dialog, const gchar *format, GError **error)
  528 + {
  529 + debug("%s(%d)",__FUNCTION__,dialog->mode);
  530 +
  531 + GdkPixbuf * pixbuf = NULL;
  532 +
  533 + switch(dialog->mode)
  534 + {
  535 + case LIB3270_CONTENT_ALL:
  536 + debug("%s","LIB3270_CONTENT_ALL");
  537 + pixbuf = v3270_get_as_pixbuf(dialog->terminal);
  538 + break;
  539 +
  540 + case LIB3270_CONTENT_COPY:
  541 + {
  542 + debug("%s","LIB3270_CONTENT_COPY");
  543 + const GList * selection = v3270_get_selection_blocks(dialog->terminal);
  544 + pixbuf = v3270_get_selection_as_pixbuf(GTK_V3270(dialog->terminal), selection, FALSE);
  545 + }
  546 + break;
  547 +
  548 + case LIB3270_CONTENT_SELECTED:
  549 + {
  550 + debug("%s","LIB3270_CONTENT_SELECTED");
  551 + GList * selection = g_list_append_lib3270_selection(NULL, v3270_get_session(dialog->terminal),FALSE);
  552 + debug("Selection=%p",selection);
  553 + pixbuf = v3270_get_selection_as_pixbuf(GTK_V3270(dialog->terminal), selection, FALSE);
  554 + g_list_free_full(selection,(GDestroyNotify) lib3270_free);
  555 + }
  556 + break;
  557 +
  558 + default:
  559 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,_( "Unexpected mode %d" ),(int) dialog->mode);
  560 + return;
  561 + }
  562 +
  563 + debug("pixbuff=%p",pixbuf);
  564 +
  565 + if(pixbuf)
  566 + {
  567 + const gchar * filename = get_filename(dialog);
  568 +
  569 + debug("Filename=%p",filename);
  570 + if(filename)
  571 + {
  572 + gdk_pixbuf_save(pixbuf,filename,format,error,NULL);
  573 + }
  574 +
  575 + g_object_unref(pixbuf);
  576 + }
  577 + else
  578 + {
  579 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),-1,_( "Error saving image" ));
  580 + }
  581 +
  582 + }
  583 +
  584 + void v3270_save_dialog_apply(GtkWidget *widget, GError **error)
  585 + {
  586 + size_t ix;
  587 + V3270SaveDialog * dialog = V3270_SAVE_DIALOG(widget);
  588 +
  589 + if(!v3270_is_connected(dialog->terminal))
  590 + {
  591 + *error = g_error_new(g_quark_from_static_string(PACKAGE_NAME),ENOTCONN,"%s",strerror(ENOTCONN));
  592 + return;
  593 + }
  594 +
  595 + // Get type ID
  596 + const gchar * format = gtk_combo_box_get_active_id(GTK_COMBO_BOX(dialog->format));
  597 +
  598 + // Check for text formats.
  599 + for(ix=0;ix<G_N_ELEMENTS(formats);ix++)
  600 + {
  601 + if(!strcmp(formats[ix].extension,format))
  602 + {
  603 + // Is text format, save it
  604 + save_as_text(dialog, ix, error);
  605 + return;
  606 + }
  607 +
  608 + }
  609 +
  610 + save_as_image(dialog, format, error);
  611 +
  612 + }
  613 +
448 void v3270_save_dialog_run(GtkWidget *widget) 614 void v3270_save_dialog_run(GtkWidget *widget)
449 { 615 {
450 if(gtk_dialog_run(GTK_DIALOG(widget)) == GTK_RESPONSE_APPLY) 616 if(gtk_dialog_run(GTK_DIALOG(widget)) == GTK_RESPONSE_APPLY)
src/dialogs/settings/accelerator.c
@@ -140,6 +140,11 @@ @@ -140,6 +140,11 @@
140 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(widget->store),1,GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID); 140 gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(widget->store),1,GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID);
141 141
142 GtkWidget * view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(widget->store)); 142 GtkWidget * view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(widget->store));
  143 +
  144 + gtk_tree_view_set_enable_search(GTK_TREE_VIEW(view),TRUE);
  145 + gtk_tree_view_set_search_column(GTK_TREE_VIEW(view),1);
  146 +
  147 +
143 g_signal_connect(G_OBJECT(widget),"realize",G_CALLBACK(realize),view); 148 g_signal_connect(G_OBJECT(widget),"realize",G_CALLBACK(realize),view);
144 149
145 gtk_widget_set_tooltip_markup(view,_("Keyboard accelerators")); 150 gtk_widget_set_tooltip_markup(view,_("Keyboard accelerators"));
src/dialogs/settings/clipboard.c
@@ -163,11 +163,22 @@ @@ -163,11 +163,22 @@
163 .label = N_("Smart copy"), 163 .label = N_("Smart copy"),
164 .tooltip = N_("When set the first copy operation after the selection will set the clipboard contents and the next ones will append"), 164 .tooltip = N_("When set the first copy operation after the selection will set the clipboard contents and the next ones will append"),
165 .left = 1, 165 .left = 1,
  166 + .top = 4,
  167 + .width = 1,
  168 + .height = 1,
  169 + .grid = COPY_SETTINGS
  170 + },
  171 +
  172 + {
  173 + .label = N_("Image copy"),
  174 + .tooltip = N_("When set allow image formats on clipboard"),
  175 + .left = 1,
166 .top = 3, 176 .top = 3,
167 .width = 1, 177 .width = 1,
168 .height = 1, 178 .height = 1,
169 .grid = COPY_SETTINGS 179 .grid = COPY_SETTINGS
170 } 180 }
  181 +
171 }; 182 };
172 183
173 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 184 /*--[ Globals ]--------------------------------------------------------------------------------------*/
@@ -472,6 +483,7 @@ static void load(GtkWidget *w, GtkWidget *t) { @@ -472,6 +483,7 @@ static void load(GtkWidget *w, GtkWidget *t) {
472 gtk_toggle_button_set_active(widget->input.checkboxes[0],(terminal->selection.options & V3270_SELECTION_NON_BREAKABLE_SPACE) != 0); 483 gtk_toggle_button_set_active(widget->input.checkboxes[0],(terminal->selection.options & V3270_SELECTION_NON_BREAKABLE_SPACE) != 0);
473 gtk_toggle_button_set_active(widget->input.checkboxes[1],(terminal->selection.options & V3270_SELECTION_SCREEN_PASTE) != 0); 484 gtk_toggle_button_set_active(widget->input.checkboxes[1],(terminal->selection.options & V3270_SELECTION_SCREEN_PASTE) != 0);
474 gtk_toggle_button_set_active(widget->input.checkboxes[2],(terminal->selection.options & V3270_SELECTION_SMART_COPY) != 0); 485 gtk_toggle_button_set_active(widget->input.checkboxes[2],(terminal->selection.options & V3270_SELECTION_SMART_COPY) != 0);
  486 + gtk_toggle_button_set_active(widget->input.checkboxes[3],(terminal->selection.options & V3270_SELECTION_PIXBUFF) != 0);
475 487
476 // 488 //
477 // Set font combo-box 489 // Set font combo-box
@@ -559,6 +571,12 @@ static void apply(GtkWidget *w, GtkWidget *t) { @@ -559,6 +571,12 @@ static void apply(GtkWidget *w, GtkWidget *t) {
559 terminal->selection.options &= ~V3270_SELECTION_SMART_COPY; 571 terminal->selection.options &= ~V3270_SELECTION_SMART_COPY;
560 } 572 }
561 573
  574 + if(gtk_toggle_button_get_active(widget->input.checkboxes[3])) {
  575 + terminal->selection.options |= V3270_SELECTION_PIXBUFF;
  576 + } else {
  577 + terminal->selection.options &= ~V3270_SELECTION_PIXBUFF;
  578 + }
  579 +
562 // Get font settings 580 // Get font settings
563 switch(get_active_id(widget,0)) { 581 switch(get_active_id(widget,0)) {
564 case '0': 582 case '0':
src/dialogs/settings/host.c
@@ -52,21 +52,21 @@ @@ -52,21 +52,21 @@
52 { 52 {
53 { 53 {
54 .left = 2, 54 .left = 2,
55 - .top = 3,  
56 - .width = 1, 55 + .top = 2,
  56 + .width = 2,
57 .grid = CONNECTION, 57 .grid = CONNECTION,
58 .id = LIB3270_TOGGLE_CONNECT_ON_STARTUP, 58 .id = LIB3270_TOGGLE_CONNECT_ON_STARTUP,
59 }, 59 },
60 { 60 {
61 - .left = 3,  
62 - .top = 3, 61 + .left = 4,
  62 + .top = 2,
63 .width = 1, 63 .width = 1,
64 .grid = CONNECTION, 64 .grid = CONNECTION,
65 .id = LIB3270_TOGGLE_RECONNECT, 65 .id = LIB3270_TOGGLE_RECONNECT,
66 }, 66 },
67 { 67 {
68 - .left = 4,  
69 - .top = 3, 68 + .left = 5,
  69 + .top = 2,
70 .width = 1, 70 .width = 1,
71 .grid = CONNECTION, 71 .grid = CONNECTION,
72 .id = LIB3270_TOGGLE_KEEP_ALIVE, 72 .id = LIB3270_TOGGLE_KEEP_ALIVE,
@@ -208,7 +208,7 @@ @@ -208,7 +208,7 @@
208 { 208 {
209 .left = 0, 209 .left = 0,
210 .top = 0, 210 .top = 0,
211 - .width = 4, 211 + .width = 5,
212 .height = 1, 212 .height = 1,
213 .grid = CONNECTION, 213 .grid = CONNECTION,
214 214
@@ -260,7 +260,7 @@ @@ -260,7 +260,7 @@
260 { 260 {
261 .left = 2, 261 .left = 2,
262 .top = 1, 262 .top = 1,
263 - .width = 2, 263 + .width = 3,
264 .height = 1, 264 .height = 1,
265 .grid = CONNECTION, 265 .grid = CONNECTION,
266 266
@@ -279,7 +279,7 @@ @@ -279,7 +279,7 @@
279 struct 279 struct
280 { 280 {
281 GtkEntry * entry[G_N_ELEMENTS(entryfields)]; ///< @brief Entry fields for host & service name. 281 GtkEntry * entry[G_N_ELEMENTS(entryfields)]; ///< @brief Entry fields for host & service name.
282 - GtkToggleButton * ssl; ///< @brief SSL Connection? 282 + GtkComboBox * ssl; ///< @brief SSL Connection?
283 GtkComboBox * combos[G_N_ELEMENTS(combos)]; ///< @brief Combo-boxes. 283 GtkComboBox * combos[G_N_ELEMENTS(combos)]; ///< @brief Combo-boxes.
284 GtkComboBox * charset; ///< @brief Charset combo box. 284 GtkComboBox * charset; ///< @brief Charset combo box.
285 GtkToggleButton * toggles[G_N_ELEMENTS(toggleList)]; ///< @brief Toggle checks. 285 GtkToggleButton * toggles[G_N_ELEMENTS(toggleList)]; ///< @brief Toggle checks.
@@ -540,12 +540,41 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget) @@ -540,12 +540,41 @@ static void V3270HostSelectWidget_init(V3270HostSelectWidget *widget)
540 540
541 } 541 }
542 542
543 - // SSL checkbox 543 + // SSL input
544 { 544 {
  545 + GtkWidget *label = gtk_label_new_with_mnemonic(_( "_Security" ));
  546 + gtk_widget_set_halign(label,GTK_ALIGN_END);
  547 + gtk_grid_attach(GTK_GRID(grids[CONNECTION]),label,0,3,1,1);
  548 +
  549 + GtkTreeModel * model = (GtkTreeModel *) gtk_list_store_new(1,G_TYPE_STRING);
  550 +
  551 + widget->input.ssl = GTK_COMBO_BOX(gtk_combo_box_new_with_model(model));
  552 +
  553 + GtkCellRenderer * text_renderer = gtk_cell_renderer_text_new();
  554 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(widget->input.ssl), text_renderer, TRUE);
  555 + gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(widget->input.ssl), text_renderer, "text", 0, NULL);
  556 +
  557 + static const gchar * levels[] =
  558 + {
  559 + N_("Unsecure"),
  560 + N_("SSL/TLS")
  561 + };
  562 +
  563 + size_t level;
  564 + for(level = 0; level < G_N_ELEMENTS(levels); level++)
  565 + {
  566 + GtkTreeIter iter;
  567 + gtk_list_store_append((GtkListStore *) model, &iter);
  568 + gtk_list_store_set((GtkListStore *) model, &iter, 0, levels[level], -1);
  569 + };
  570 +
  571 + /*
545 widget->input.ssl = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_mnemonic(_( "_Secure connection." ))); 572 widget->input.ssl = GTK_TOGGLE_BUTTON(gtk_check_button_new_with_mnemonic(_( "_Secure connection." )));
546 gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.ssl),_( "Check for SSL secure connection." )); 573 gtk_widget_set_tooltip_text(GTK_WIDGET(widget->input.ssl),_( "Check for SSL secure connection." ));
547 gtk_widget_set_halign(GTK_WIDGET(widget->input.ssl),GTK_ALIGN_START); 574 gtk_widget_set_halign(GTK_WIDGET(widget->input.ssl),GTK_ALIGN_START);
548 - gtk_grid_attach(GTK_GRID(grids[CONNECTION]),GTK_WIDGET(widget->input.ssl),1,3,1,1); 575 + */
  576 +
  577 + gtk_grid_attach(GTK_GRID(grids[CONNECTION]),GTK_WIDGET(widget->input.ssl),1,3,2,1);
549 } 578 }
550 579
551 // Toggle checkboxes 580 // Toggle checkboxes
@@ -699,7 +728,7 @@ static void apply(GtkWidget *w, GtkWidget *terminal) @@ -699,7 +728,7 @@ static void apply(GtkWidget *w, GtkWidget *terminal)
699 { 728 {
700 g_autofree gchar * url = 729 g_autofree gchar * url =
701 g_strconcat( 730 g_strconcat(
702 - (gtk_toggle_button_get_active(widget->input.ssl) ? "tn3270s://" : "tn3270://"), 731 + (gtk_combo_box_get_active(widget->input.ssl) > 0 ? "tn3270s://" : "tn3270://"),
703 gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]), 732 gtk_entry_get_text(widget->input.entry[ENTRY_HOSTNAME]),
704 ":", 733 ":",
705 gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]), 734 gtk_entry_get_text(widget->input.entry[ENTRY_SRVCNAME]),
@@ -778,9 +807,9 @@ static void load(GtkWidget *w, GtkWidget *terminal) @@ -778,9 +807,9 @@ static void load(GtkWidget *w, GtkWidget *terminal)
778 { 807 {
779 808
780 g_autofree gchar * url = g_strdup(u); 809 g_autofree gchar * url = g_strdup(u);
781 - debug("URL=[%s]",url);  
782 810
783 - gtk_toggle_button_set_active(widget->input.ssl,g_str_has_prefix(u,"tn3270s")); 811 + gtk_combo_box_set_active(widget->input.ssl,(g_str_has_prefix(u,"tn3270s") ? 1 : 0));
  812 +// gtk_toggle_button_set_active(widget->input.ssl,g_str_has_prefix(u,"tn3270s"));
784 813
785 gchar *hostname = strstr(url,"://"); 814 gchar *hostname = strstr(url,"://");
786 if(!hostname) 815 if(!hostname)
src/include/clipboard.h
@@ -45,7 +45,8 @@ @@ -45,7 +45,8 @@
45 CLIPBOARD_TYPE_TEXT, 45 CLIPBOARD_TYPE_TEXT,
46 CLIPBOARD_TYPE_CSV, 46 CLIPBOARD_TYPE_CSV,
47 CLIPBOARD_TYPE_HTML, 47 CLIPBOARD_TYPE_HTML,
48 - CLIPBOARD_TYPE_V3270_FORMATTED 48 + CLIPBOARD_TYPE_V3270_FORMATTED,
  49 + CLIPBOARD_TYPE_PIXBUFF
49 }; 50 };
50 51
51 /// @brief Column from selection. 52 /// @brief Column from selection.
@@ -91,6 +92,7 @@ @@ -91,6 +92,7 @@
91 92
92 /// @brief Get contents. 93 /// @brief Get contents.
93 G_GNUC_INTERNAL gchar * v3270_get_selection_as_text(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all); 94 G_GNUC_INTERNAL gchar * v3270_get_selection_as_text(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all);
  95 + G_GNUC_INTERNAL GdkPixbuf * v3270_get_selection_as_pixbuf(v3270 * terminal, const GList *selection, gboolean all);
94 G_GNUC_INTERNAL gchar * v3270_get_selection_as_table(v3270 * terminal, const GList *selection, const gchar *delimiter, const gchar *encoding, gboolean all); 96 G_GNUC_INTERNAL gchar * v3270_get_selection_as_table(v3270 * terminal, const GList *selection, const gchar *delimiter, const gchar *encoding, gboolean all);
95 G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_div(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all, const V3270SelectionOption options); 97 G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_div(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all, const V3270SelectionOption options);
96 G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_table(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all, const V3270SelectionOption options); 98 G_GNUC_INTERNAL gchar * v3270_get_selection_as_html_table(v3270 * terminal, const GList *selection, const gchar *encoding, gboolean all, const V3270SelectionOption options);
src/include/internals.h
@@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
44 #include <lib3270/log.h> 44 #include <lib3270/log.h>
45 #include <v3270.h> 45 #include <v3270.h>
46 #include <v3270/toggle.h> 46 #include <v3270/toggle.h>
  47 + #include <lib3270/popup.h>
47 48
48 G_BEGIN_DECLS 49 G_BEGIN_DECLS
49 50
@@ -82,7 +83,6 @@ @@ -82,7 +83,6 @@
82 V3270_SIGNAL_KEYPRESS, 83 V3270_SIGNAL_KEYPRESS,
83 V3270_SIGNAL_MODEL_CHANGED, 84 V3270_SIGNAL_MODEL_CHANGED,
84 V3270_SIGNAL_CHANGED, 85 V3270_SIGNAL_CHANGED,
85 - V3270_SIGNAL_MESSAGE,  
86 V3270_SIGNAL_FIELD, 86 V3270_SIGNAL_FIELD,
87 V3270_SIGNAL_SESSION_CHANGED, 87 V3270_SIGNAL_SESSION_CHANGED,
88 88
@@ -114,7 +114,9 @@ @@ -114,7 +114,9 @@
114 // 114 //
115 // Settings signals (Mostly fired by V3270Settings dialogs). 115 // Settings signals (Mostly fired by V3270Settings dialogs).
116 // 116 //
117 - V3270_SIGNAL_SAVE_SETTINGS, ///< @brief Notify main application to save all widget settings. 117 + V3270_SIGNAL_SAVE_SETTINGS, ///< @brief Notify main application to save all widget settings.
  118 + V3270_SIGNAL_LOAD_POPUP_RESPONSE, ///< @brief Load popup response (GTK_RESPONSE_NONE to show popup).
  119 + V3270_SIGNAL_SAVE_POPUP_RESPONSE, ///< @brief Save popup response.
118 120
119 V3270_SIGNAL_LAST 121 V3270_SIGNAL_LAST
120 }; 122 };
@@ -133,6 +135,8 @@ @@ -133,6 +135,8 @@
133 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_grid(GtkAlign align); 135 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_grid(GtkAlign align);
134 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_frame(GtkWidget * child, const gchar *title); 136 G_GNUC_INTERNAL GtkWidget * v3270_dialog_create_frame(GtkWidget * child, const gchar *title);
135 137
  138 + G_GNUC_INTERNAL GtkResponseType v3270_popup_dialog_show(GtkWidget *widget, const LIB3270_POPUP *popup, gboolean wait);
  139 +
136 G_GNUC_INTERNAL void v3270_signal_emit(gpointer instance, enum V3270_SIGNAL signal_id, ...); 140 G_GNUC_INTERNAL void v3270_signal_emit(gpointer instance, enum V3270_SIGNAL signal_id, ...);
137 141
138 G_GNUC_INTERNAL void v3270_dialog_close(GtkDialog *dialog, gpointer user_data); 142 G_GNUC_INTERNAL void v3270_dialog_close(GtkDialog *dialog, gpointer user_data);
@@ -181,6 +185,7 @@ @@ -181,6 +185,7 @@
181 unsigned short keycode; 185 unsigned short keycode;
182 } V3270PFKeyAccelerator; 186 } V3270PFKeyAccelerator;
183 187
  188 + /*
184 typedef enum v3270_toggleable_dialog 189 typedef enum v3270_toggleable_dialog
185 { 190 {
186 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED, 191 V3270_TOGGLEABLE_DIALOG_PASTE_FAILED,
@@ -189,6 +194,7 @@ @@ -189,6 +194,7 @@
189 } V3270_TOGGLEABLE_DIALOG; 194 } V3270_TOGGLEABLE_DIALOG;
190 195
191 G_GNUC_INTERNAL GtkResponseType v3270_popup_toggleable_dialog(GtkWidget *widget, V3270_TOGGLEABLE_DIALOG id, const gchar *title, const gchar *summary, const gchar *body, const gchar *first_button_text, ...) G_GNUC_NULL_TERMINATED; 196 G_GNUC_INTERNAL GtkResponseType v3270_popup_toggleable_dialog(GtkWidget *widget, V3270_TOGGLEABLE_DIALOG id, const gchar *title, const gchar *summary, const gchar *body, const gchar *first_button_text, ...) G_GNUC_NULL_TERMINATED;
  197 + */
192 198
193 #if GTK_CHECK_VERSION(3,12,0) 199 #if GTK_CHECK_VERSION(3,12,0)
194 G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); 200 G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget);
src/include/terminal.h
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 33
34 G_BEGIN_DECLS 34 G_BEGIN_DECLS
35 35
  36 +/*
36 /// @brief V3270 Properties saved to the configuration file. 37 /// @brief V3270 Properties saved to the configuration file.
37 typedef enum 38 typedef enum
38 { 39 {
@@ -56,6 +57,7 @@ G_BEGIN_DECLS @@ -56,6 +57,7 @@ G_BEGIN_DECLS
56 } V3270_SETTING; 57 } V3270_SETTING;
57 58
58 G_GNUC_INTERNAL void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id); 59 G_GNUC_INTERNAL void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id);
  60 +*/
59 61
60 struct _v3270Class 62 struct _v3270Class
61 { 63 {
@@ -69,7 +71,7 @@ G_BEGIN_DECLS @@ -69,7 +71,7 @@ G_BEGIN_DECLS
69 GParamSpec * toggle[LIB3270_TOGGLE_COUNT]; // Toggle properties. 71 GParamSpec * toggle[LIB3270_TOGGLE_COUNT]; // Toggle properties.
70 72
71 // Properties saved to the configuration file. 73 // Properties saved to the configuration file.
72 - GParamSpec * settings[V3270_SETTING_COUNT]; 74 + const gchar **persistent;
73 75
74 // Signal related properties 76 // Signal related properties
75 GParamSpec * online; 77 GParamSpec * online;
@@ -78,6 +80,7 @@ G_BEGIN_DECLS @@ -78,6 +80,7 @@ G_BEGIN_DECLS
78 GParamSpec * session_name; 80 GParamSpec * session_name;
79 GParamSpec * trace; 81 GParamSpec * trace;
80 GParamSpec * has_copy; 82 GParamSpec * has_copy;
  83 + GParamSpec * has_timer;
81 84
82 struct 85 struct
83 { 86 {
@@ -86,14 +89,11 @@ G_BEGIN_DECLS @@ -86,14 +89,11 @@ G_BEGIN_DECLS
86 guint integer; 89 guint integer;
87 guint uint; 90 guint uint;
88 guint str; 91 guint str;
89 - guint responses; 92 +// guint responses;
90 } type; 93 } type;
91 94
92 } properties; 95 } properties;
93 96
94 - // Predefined responses.  
95 - GParamSpec * responses[V3270_TOGGLEABLE_DIALOG_CUSTOM];  
96 -  
97 // Cursors 97 // Cursors
98 GdkCursor * cursors[LIB3270_POINTER_COUNT]; 98 GdkCursor * cursors[LIB3270_POINTER_COUNT];
99 99
@@ -104,7 +104,8 @@ G_BEGIN_DECLS @@ -104,7 +104,8 @@ G_BEGIN_DECLS
104 void (*activate)(GtkWidget *widget); 104 void (*activate)(GtkWidget *widget);
105 void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE_ID toggle_id,gboolean toggle_state,const gchar *toggle_name); 105 void (*toggle_changed)(v3270 *widget,LIB3270_TOGGLE_ID toggle_id,gboolean toggle_state,const gchar *toggle_name);
106 void (*message_changed)(v3270 *widget, LIB3270_MESSAGE id); 106 void (*message_changed)(v3270 *widget, LIB3270_MESSAGE id);
107 - void (*popup_message)(GtkWidget *widget, LIB3270_NOTIFY id , const gchar *title, const gchar *message, const gchar *text); 107 + guint (*load_popup_response)(v3270 *widget, const gchar *popup_name, guint response);
  108 + gboolean (*save_popup_response)(v3270 *widget, const gchar *popup_name, guint response);
108 109
109 }; 110 };
110 111
@@ -127,6 +128,7 @@ G_BEGIN_DECLS @@ -127,6 +128,7 @@ G_BEGIN_DECLS
127 V3270_SELECTION_SCREEN_PASTE = 0x08, ///< @brief Enable screen paste. 128 V3270_SELECTION_SCREEN_PASTE = 0x08, ///< @brief Enable screen paste.
128 V3270_SELECTION_SMART_COPY = 0x10, ///< @brief Enable copy/append based on current selection state. 129 V3270_SELECTION_SMART_COPY = 0x10, ///< @brief Enable copy/append based on current selection state.
129 V3270_SELECTION_DIALOG_STATE = 0x20, ///< @brief Used for settings dialog. 130 V3270_SELECTION_DIALOG_STATE = 0x20, ///< @brief Used for settings dialog.
  131 + V3270_SELECTION_PIXBUFF = 0x40, ///< @brief Allow pixbuf formats.
130 132
131 } V3270SelectionOption; 133 } V3270SelectionOption;
132 134
@@ -160,7 +162,7 @@ G_BEGIN_DECLS @@ -160,7 +162,7 @@ G_BEGIN_DECLS
160 int copying : 1; /// @brief Copy with center mouse button 162 int copying : 1; /// @brief Copy with center mouse button
161 163
162 /// @brief Action properties. 164 /// @brief Action properties.
163 - GtkResponseType responses[V3270_TOGGLEABLE_DIALOG_CUSTOM]; 165 +// GtkResponseType responses[V3270_TOGGLEABLE_DIALOG_CUSTOM];
164 166
165 GSource * timer; 167 GSource * timer;
166 GtkIMContext * input_method; 168 GtkIMContext * input_method;
@@ -256,6 +258,7 @@ G_BEGIN_DECLS @@ -256,6 +258,7 @@ G_BEGIN_DECLS
256 }; 258 };
257 259
258 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget); 260 G_GNUC_INTERNAL void v3270_activate(GtkWidget *widget);
  261 + G_GNUC_INTERNAL GdkPixbuf * v3270_get_as_pixbuf(GtkWidget *widget);
259 262
260 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 263 /*--[ Globals ]--------------------------------------------------------------------------------------*/
261 264
src/include/v3270.h
@@ -215,13 +215,10 @@ @@ -215,13 +215,10 @@
215 LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget); 215 LIB3270_EXPORT GtkIMContext * v3270_get_im_context(GtkWidget *widget);
216 LIB3270_EXPORT const gchar * v3270_get_default_font_name(); 216 LIB3270_EXPORT const gchar * v3270_get_default_font_name();
217 217
218 - LIB3270_EXPORT void v3270_popup_message(GtkWidget *widget, LIB3270_NOTIFY type, const gchar *title, const gchar *message, const gchar *text);  
219 -  
220 LIB3270_EXPORT const gchar * v3270_get_session_name(GtkWidget *widget); 218 LIB3270_EXPORT const gchar * v3270_get_session_name(GtkWidget *widget);
221 LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name); 219 LIB3270_EXPORT void v3270_set_session_name(GtkWidget *widget, const gchar *name);
222 LIB3270_EXPORT gchar * v3270_get_session_title(GtkWidget *widget); 220 LIB3270_EXPORT gchar * v3270_get_session_title(GtkWidget *widget);
223 221
224 -// LIB3270_EXPORT gchar * v3270_get_title(GtkWidget *widget);  
225 LIB3270_EXPORT gchar * v3270_set_title(GtkWidget *widget, const gchar *title); 222 LIB3270_EXPORT gchar * v3270_set_title(GtkWidget *widget, const gchar *title);
226 223
227 LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id); 224 LIB3270_EXPORT int v3270_set_script(GtkWidget *widget, const gchar id);
src/include/v3270/settings.h
@@ -48,7 +48,7 @@ @@ -48,7 +48,7 @@
48 LIB3270_EXPORT void v3270_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); 48 LIB3270_EXPORT void v3270_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name);
49 49
50 /// @brief Emit the "save-settings" signal. 50 /// @brief Emit the "save-settings" signal.
51 - LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget); 51 + LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name);
52 52
53 #ifdef _WIN32 53 #ifdef _WIN32
54 54
src/selection/linux/copy.c
@@ -104,6 +104,20 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa @@ -104,6 +104,20 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
104 } 104 }
105 break; 105 break;
106 106
  107 + case CLIPBOARD_TYPE_PIXBUFF:
  108 + {
  109 + GdkPixbuf * pixbuff = v3270_get_selection_as_pixbuf(terminal, terminal->selection.blocks, FALSE);
  110 +
  111 + debug("%s: pixbuff=%p (blocks=%p)",__FUNCTION__,pixbuff,terminal->selection.blocks);
  112 +
  113 + if(pixbuff)
  114 + {
  115 + gtk_selection_data_set_pixbuf(selection,pixbuff);
  116 + g_object_unref(pixbuff);
  117 + }
  118 + }
  119 + break;
  120 +
107 default: 121 default:
108 g_warning("Unexpected clipboard type %d\n",target); 122 g_warning("Unexpected clipboard type %d\n",target);
109 } 123 }
@@ -143,6 +157,11 @@ void v3270_update_system_clipboard(GtkWidget *widget) @@ -143,6 +157,11 @@ void v3270_update_system_clipboard(GtkWidget *widget)
143 157
144 } 158 }
145 159
  160 + if(terminal->selection.options & V3270_SELECTION_PIXBUFF)
  161 + {
  162 + gtk_target_list_add_image_targets(list,CLIPBOARD_TYPE_PIXBUFF,TRUE);
  163 + }
  164 +
146 int n_targets; 165 int n_targets;
147 GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); 166 GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets);
148 167
src/selection/linux/paste.c
@@ -30,6 +30,7 @@ @@ -30,6 +30,7 @@
30 #include <clipboard.h> 30 #include <clipboard.h>
31 #include <lib3270/toggle.h> 31 #include <lib3270/toggle.h>
32 #include <v3270/dialogs.h> 32 #include <v3270/dialogs.h>
  33 + #include <lib3270/popup.h>
33 34
34 /*--[ Implement ]------------------------------------------------------------------------------------*/ 35 /*--[ Implement ]------------------------------------------------------------------------------------*/
35 36
@@ -108,17 +109,16 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select @@ -108,17 +109,16 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select
108 if(!v3270_set_from_data_block(terminal, selection)) 109 if(!v3270_set_from_data_block(terminal, selection))
109 { 110 {
110 debug("%s: Can't paste data",__FUNCTION__); 111 debug("%s: Can't paste data",__FUNCTION__);
111 - if(  
112 - v3270_popup_toggleable_dialog(  
113 - widget,  
114 - V3270_TOGGLEABLE_DIALOG_PASTE_FAILED,  
115 - _("Can't paste"),  
116 - _("Unable to paste formatted data."),  
117 - _("None of the screens in the clipboard match with the current one."),  
118 - _("_Cancel"), GTK_RESPONSE_CANCEL,  
119 - _("_Paste as text"), GTK_RESPONSE_APPLY,  
120 - NULL  
121 - ) == GTK_RESPONSE_APPLY) 112 +
  113 + LIB3270_POPUP popup = {
  114 + .name = "cantpaste",
  115 + .title = _("Can't paste"),
  116 + .summary = _("Unable to paste formatted data."),
  117 + .body = _("None of the screens in the clipboard match with the current one."),
  118 + .label = _("_Paste as text")
  119 + };
  120 +
  121 + if(v3270_popup_dialog_show(widget,&popup,1) == GTK_RESPONSE_APPLY)
122 { 122 {
123 gtk_clipboard_request_text( 123 gtk_clipboard_request_text(
124 clipboard, 124 clipboard,
@@ -127,51 +127,8 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select @@ -127,51 +127,8 @@ static void formatted_received(GtkClipboard *clipboard, GtkSelectionData *select
127 ); 127 );
128 } 128 }
129 129
130 - /*  
131 - GtkResponseType response = GTK_V3270(terminal)->responses[V3270_TOGGLEABLE_DIALOG_PASTE_FAILED];  
132 -  
133 - if(response == GTK_RESPONSE_NONE)  
134 - {  
135 - // No predefined response, ask.  
136 - GtkWidget * dialog =  
137 - gtk_message_dialog_new(  
138 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
139 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
140 - GTK_MESSAGE_INFO,  
141 - GTK_BUTTONS_NONE,  
142 - _("Unable to paste formatted data")  
143 - );  
144 -  
145 -  
146 - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't paste"));  
147 -  
148 - gtk_dialog_add_buttons(  
149 - GTK_DIALOG (dialog),  
150 - _("_Cancel"), GTK_RESPONSE_CANCEL,  
151 - _("_Paste as text"), GTK_RESPONSE_APPLY,  
152 - NULL  
153 - );  
154 -  
155 - gtk_dialog_set_default_response(GTK_DIALOG (dialog),response);  
156 -  
157 - gint response = gtk_dialog_run(GTK_DIALOG(dialog));  
158 -  
159 - gtk_widget_destroy(dialog);  
160 - }  
161 -  
162 - if(response == GTK_RESPONSE_APPLY)  
163 - {  
164 - gtk_clipboard_request_text(  
165 - clipboard,  
166 - (GtkClipboardTextReceivedFunc) text_received,  
167 - (gpointer) widget  
168 - );  
169 - }  
170 -  
171 - */  
172 return; 130 return;
173 131
174 -  
175 } 132 }
176 133
177 } 134 }
src/selection/pixbuf.c 0 → 100644
@@ -0,0 +1,153 @@ @@ -0,0 +1,153 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin
  19 + * St, Fifth Floor, Boston, MA 02110-1301 USA
  20 + *
  21 + * Este programa está nomeado como - e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #include <clipboard.h>
  31 + #include <lib3270/selection.h>
  32 + #include <v3270/dialogs.h>
  33 +
  34 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  35 +
  36 +GdkPixbuf * v3270_get_selection_as_pixbuf(v3270 * terminal, const GList *selections, gboolean all)
  37 +{
  38 + const GList *selection;
  39 +
  40 + // Get image size
  41 + size_t rows = 0, from_col = 1000, to_col = 0;
  42 +
  43 + for(selection = selections; selection; selection = g_list_next(selection))
  44 + {
  45 + lib3270_selection * block = ((lib3270_selection *) selection->data);
  46 + unsigned int row, src = 0;
  47 +
  48 + for(row=0; row < block->bounds.height; row++)
  49 + {
  50 + size_t hasSelection = FALSE;
  51 + unsigned int col;
  52 +
  53 + for(col=0; col<block->bounds.width; col++)
  54 + {
  55 + if( (block->contents[src].attribute.visual & LIB3270_ATTR_SELECTED) || all )
  56 + {
  57 + hasSelection = TRUE;
  58 + if(col < from_col)
  59 + from_col = col;
  60 + if(col > to_col)
  61 + to_col = col;
  62 + }
  63 + src++;
  64 + }
  65 +
  66 + if(hasSelection)
  67 + {
  68 + rows++;
  69 + }
  70 +
  71 + }
  72 +
  73 + }
  74 +
  75 + debug("Selection rows=%u cols=%u",(unsigned int) rows, (unsigned int) (to_col - from_col));
  76 +
  77 + if(!(rows || (from_col > to_col)))
  78 + return NULL;
  79 +
  80 + gint width = ((to_col - from_col)+1) * terminal->font.width;
  81 + gint height = rows * terminal->font.spacing.value;
  82 +
  83 + debug("%s: width=%d height=%d",__FUNCTION__,width,height);
  84 +
  85 + cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
  86 +
  87 + cairo_t *cr = cairo_create(surface);
  88 +#ifdef DEBUG
  89 + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_BLUE);
  90 +#else
  91 + gdk_cairo_set_source_rgba(cr,terminal->color+V3270_COLOR_BACKGROUND);
  92 +#endif // DEBUG
  93 + cairo_rectangle(cr, 0, 0, width, height);
  94 + cairo_fill(cr);
  95 + cairo_stroke(cr);
  96 +
  97 + // Draw contents
  98 + GdkRectangle rect;
  99 + memset(&rect,0,sizeof(rect));
  100 + rect.width = terminal->font.width;
  101 + rect.height = terminal->font.spacing.value;
  102 +
  103 + cairo_set_scaled_font(cr,terminal->font.scaled);
  104 +
  105 + for(selection = selections; selection; selection = g_list_next(selection))
  106 + {
  107 + lib3270_selection * block = ((lib3270_selection *) selection->data);
  108 + unsigned int row, col, src = 0;
  109 +
  110 + for(row=0; row < block->bounds.height; row++)
  111 + {
  112 + size_t hasSelection = FALSE;
  113 + rect.x = 0;
  114 +
  115 + src += from_col;
  116 + for(col=from_col; col<block->bounds.width; col++)
  117 + {
  118 + if( (block->contents[src].attribute.visual & LIB3270_ATTR_SELECTED) || all )
  119 + {
  120 + hasSelection = TRUE;
  121 +
  122 + v3270_draw_element(
  123 + cr,
  124 + block->contents[src].chr,
  125 + block->contents[src].attribute.visual & ~LIB3270_ATTR_SELECTED,
  126 + terminal->host,
  127 + &terminal->font,
  128 + &rect,
  129 + terminal->color
  130 + );
  131 +
  132 + }
  133 + src++;
  134 + rect.x += rect.width;
  135 + }
  136 +
  137 + if(hasSelection)
  138 + {
  139 + rect.y += terminal->font.spacing.value;
  140 + }
  141 +
  142 + }
  143 + }
  144 +
  145 + cairo_destroy(cr);
  146 +
  147 + GdkPixbuf * pixbuf = gdk_pixbuf_get_from_surface(surface,0,0,width,height);
  148 +
  149 + cairo_surface_destroy(surface);
  150 +
  151 + return pixbuf;
  152 +
  153 +}
src/selection/selection.c
@@ -151,7 +151,7 @@ void v3270_selection_set_font_family(GtkWidget *widget, const gchar *name) { @@ -151,7 +151,7 @@ void v3270_selection_set_font_family(GtkWidget *widget, const gchar *name) {
151 terminal->selection.font_family = g_strdup(name); 151 terminal->selection.font_family = g_strdup(name);
152 } 152 }
153 153
154 - v3270_emit_save_settings(widget); 154 + v3270_emit_save_settings(widget,NULL);
155 155
156 } 156 }
157 157
@@ -181,7 +181,7 @@ void v3270_selection_set_color_scheme(GtkWidget *widget, const gchar *name) { @@ -181,7 +181,7 @@ void v3270_selection_set_color_scheme(GtkWidget *widget, const gchar *name) {
181 terminal->selection.color.scheme = g_strdup(name); 181 terminal->selection.color.scheme = g_strdup(name);
182 } 182 }
183 183
184 - v3270_emit_save_settings(widget); 184 + v3270_emit_save_settings(widget,NULL);
185 185
186 } 186 }
187 187
src/selection/windows/copy.c
@@ -104,6 +104,20 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa @@ -104,6 +104,20 @@ static void clipboard_get(G_GNUC_UNUSED GtkClipboard *clipboard, GtkSelectionDa
104 } 104 }
105 break; 105 break;
106 106
  107 + case CLIPBOARD_TYPE_PIXBUFF:
  108 + {
  109 + GdkPixbuf * pixbuff = v3270_get_selection_as_pixbuf(terminal, terminal->selection.blocks, FALSE);
  110 +
  111 + debug("%s: pixbuff=%p (blocks=%p)",__FUNCTION__,pixbuff,terminal->selection.blocks);
  112 +
  113 + if(pixbuff)
  114 + {
  115 + gtk_selection_data_set_pixbuf(selection,pixbuff);
  116 + g_object_unref(pixbuff);
  117 + }
  118 + }
  119 + break;
  120 +
107 default: 121 default:
108 g_warning("Unexpected clipboard type %d\n",target); 122 g_warning("Unexpected clipboard type %d\n",target);
109 } 123 }
@@ -143,6 +157,11 @@ void v3270_update_system_clipboard(GtkWidget *widget) @@ -143,6 +157,11 @@ void v3270_update_system_clipboard(GtkWidget *widget)
143 157
144 } 158 }
145 159
  160 + if(terminal->selection.options & V3270_SELECTION_PIXBUFF)
  161 + {
  162 + gtk_target_list_add_image_targets(list,CLIPBOARD_TYPE_PIXBUFF,TRUE);
  163 + }
  164 +
146 int n_targets; 165 int n_targets;
147 GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets); 166 GtkTargetEntry * targets = gtk_target_table_new_from_list(list, &n_targets);
148 167
src/terminal/actions/action.c
@@ -246,7 +246,7 @@ @@ -246,7 +246,7 @@
246 } 246 }
247 247
248 static gboolean bg_notify_enabled(GObject *action) { 248 static gboolean bg_notify_enabled(GObject *action) {
249 - debug("%s(%s,%s,%d)",__FUNCTION__,g_action_get_name(G_ACTION(action)),(g_action_get_enabled(G_ACTION(action)) ? "enabled" : "disabled"),(int) v3270_action_get_group(G_ACTION(action))); 249 +// debug("%s(%s,%s,%d)",__FUNCTION__,g_action_get_name(G_ACTION(action)),(g_action_get_enabled(G_ACTION(action)) ? "enabled" : "disabled"),(int) v3270_action_get_group(G_ACTION(action)));
250 g_object_notify(action, "enabled"); 250 g_object_notify(action, "enabled");
251 return FALSE; 251 return FALSE;
252 } 252 }
src/terminal/actions/table.c
@@ -56,7 +56,7 @@ @@ -56,7 +56,7 @@
56 56
57 // Standard Clipboard actions 57 // Standard Clipboard actions
58 { 58 {
59 - .flags = V3270_COPY_SMART, 59 + .flags = (V3270_ACTION_FLAGS) V3270_COPY_SMART,
60 .name = "copy", 60 .name = "copy",
61 .keys = "<Primary>c", 61 .keys = "<Primary>c",
62 .group = LIB3270_ACTION_GROUP_SELECTION, 62 .group = LIB3270_ACTION_GROUP_SELECTION,
@@ -70,7 +70,7 @@ @@ -70,7 +70,7 @@
70 { 70 {
71 .name = "copy-append", 71 .name = "copy-append",
72 .keys = "<Alt>c", 72 .keys = "<Alt>c",
73 - .flags = V3270_COPY_APPEND, 73 + .flags = (V3270_ACTION_FLAGS) V3270_COPY_APPEND,
74 .group = LIB3270_ACTION_GROUP_SELECTION, 74 .group = LIB3270_ACTION_GROUP_SELECTION,
75 .label = N_( "Add to copy" ), 75 .label = N_( "Add to copy" ),
76 .summary = N_("Append selection to clipboard"), 76 .summary = N_("Append selection to clipboard"),
@@ -81,7 +81,7 @@ @@ -81,7 +81,7 @@
81 { 81 {
82 .name = "copy-text", 82 .name = "copy-text",
83 .keys = "<Primary><Shift>c", 83 .keys = "<Primary><Shift>c",
84 - .flags = V3270_COPY_TEXT, 84 + .flags = (V3270_ACTION_FLAGS) V3270_COPY_TEXT,
85 .group = LIB3270_ACTION_GROUP_SELECTION, 85 .group = LIB3270_ACTION_GROUP_SELECTION,
86 .icon = "edit-copy", 86 .icon = "edit-copy",
87 .label = N_( "Copy" ), 87 .label = N_( "Copy" ),
@@ -92,7 +92,7 @@ @@ -92,7 +92,7 @@
92 { 92 {
93 .name = "copy-table", 93 .name = "copy-table",
94 .keys = "<Shift><Alt>c", 94 .keys = "<Shift><Alt>c",
95 - .flags = V3270_COPY_TABLE, 95 + .flags = (V3270_ACTION_FLAGS) V3270_COPY_TABLE,
96 .group = LIB3270_ACTION_GROUP_SELECTION, 96 .group = LIB3270_ACTION_GROUP_SELECTION,
97 .icon = "edit-copy", 97 .icon = "edit-copy",
98 .label = N_( "Copy as table" ), 98 .label = N_( "Copy as table" ),
@@ -234,7 +234,7 @@ @@ -234,7 +234,7 @@
234 }, 234 },
235 235
236 { 236 {
237 - .flags = LIB3270_CONTENT_ALL, 237 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_ALL,
238 .group = LIB3270_ACTION_GROUP_ONLINE, 238 .group = LIB3270_ACTION_GROUP_ONLINE,
239 .name = "save-all", 239 .name = "save-all",
240 .label = N_("Save all"), 240 .label = N_("Save all"),
@@ -245,7 +245,7 @@ @@ -245,7 +245,7 @@
245 }, 245 },
246 246
247 { 247 {
248 - .flags = LIB3270_CONTENT_SELECTED, 248 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_SELECTED,
249 .group = LIB3270_ACTION_GROUP_SELECTION, 249 .group = LIB3270_ACTION_GROUP_SELECTION,
250 .name = "save-selected", 250 .name = "save-selected",
251 .label = N_("Save selected"), 251 .label = N_("Save selected"),
@@ -256,7 +256,7 @@ @@ -256,7 +256,7 @@
256 }, 256 },
257 257
258 { 258 {
259 - .flags = LIB3270_CONTENT_COPY, 259 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_COPY,
260 .group = LIB3270_ACTION_GROUP_COPY, 260 .group = LIB3270_ACTION_GROUP_COPY,
261 .name = "save-copy", 261 .name = "save-copy",
262 .label = N_("Save copy"), 262 .label = N_("Save copy"),
@@ -281,7 +281,7 @@ @@ -281,7 +281,7 @@
281 }, 281 },
282 282
283 { 283 {
284 - .flags = LIB3270_CONTENT_ALL, 284 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_ALL,
285 .group = LIB3270_ACTION_GROUP_ONLINE, 285 .group = LIB3270_ACTION_GROUP_ONLINE,
286 .name = "print-all", 286 .name = "print-all",
287 .icon = "document-print", 287 .icon = "document-print",
@@ -292,7 +292,7 @@ @@ -292,7 +292,7 @@
292 }, 292 },
293 293
294 { 294 {
295 - .flags = LIB3270_CONTENT_SELECTED, 295 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_SELECTED,
296 .group = LIB3270_ACTION_GROUP_SELECTION, 296 .group = LIB3270_ACTION_GROUP_SELECTION,
297 .name = "print-selected", 297 .name = "print-selected",
298 .icon = "document-print", 298 .icon = "document-print",
@@ -303,7 +303,7 @@ @@ -303,7 +303,7 @@
303 }, 303 },
304 304
305 { 305 {
306 - .flags = LIB3270_CONTENT_COPY, 306 + .flags = (V3270_ACTION_FLAGS) LIB3270_CONTENT_COPY,
307 .group = LIB3270_ACTION_GROUP_COPY, 307 .group = LIB3270_ACTION_GROUP_COPY,
308 .name = "print-copy", 308 .name = "print-copy",
309 .icon = "document-print", 309 .icon = "document-print",
src/terminal/actions/toggle.c
@@ -112,7 +112,7 @@ @@ -112,7 +112,7 @@
112 return G_VARIANT_TYPE_BOOLEAN; 112 return G_VARIANT_TYPE_BOOLEAN;
113 } 113 }
114 114
115 - static gboolean get_enabled(GAction *action, GtkWidget *terminal) { 115 + static gboolean get_enabled(GAction G_GNUC_UNUSED(*action), GtkWidget G_GNUC_UNUSED(*terminal)) {
116 return TRUE; 116 return TRUE;
117 } 117 }
118 118
@@ -126,7 +126,7 @@ @@ -126,7 +126,7 @@
126 126
127 } 127 }
128 128
129 - void Lib3270ToggleAction_init(Lib3270ToggleAction *action) { 129 + void Lib3270ToggleAction_init(Lib3270ToggleAction G_GNUC_UNUSED(*action)) {
130 } 130 }
131 131
132 GAction * g_action_new_from_toggle(const LIB3270_TOGGLE * definition) { 132 GAction * g_action_new_from_toggle(const LIB3270_TOGGLE * definition) {
src/terminal/callbacks.c
@@ -43,19 +43,41 @@ @@ -43,19 +43,41 @@
43 #include <lib3270.h> 43 #include <lib3270.h>
44 #include <lib3270/session.h> 44 #include <lib3270/session.h>
45 #include <lib3270/log.h> 45 #include <lib3270/log.h>
  46 + #include <lib3270/popup.h>
46 #include <errno.h> 47 #include <errno.h>
  48 + #include <v3270/settings.h>
47 49
48 /*--[ Implement ]------------------------------------------------------------------------------------*/ 50 /*--[ Implement ]------------------------------------------------------------------------------------*/
49 51
50 -static void set_timer(H3270 *session, unsigned char on) 52 +struct has_timer
51 { 53 {
52 - GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(session)); 54 + H3270 * hSession;
  55 + unsigned char on;
  56 +};
  57 +
  58 +static gboolean bg_has_timer(struct has_timer *data)
  59 +{
  60 + GtkWidget *widget = GTK_WIDGET(lib3270_get_user_data(data->hSession));
53 61
54 - if(on) 62 + if(data->on)
55 v3270_start_timer(widget); 63 v3270_start_timer(widget);
56 else 64 else
57 v3270_stop_timer(widget); 65 v3270_stop_timer(widget);
58 66
  67 + g_free(data);
  68 +
  69 + return FALSE;
  70 +}
  71 +
  72 +static void set_timer(H3270 *session, unsigned char on)
  73 +{
  74 + struct has_timer *data = g_malloc0(sizeof(struct has_timer));
  75 +
  76 + data->hSession = session;
  77 + data->on = on;
  78 +
  79 + g_idle_add((GSourceFunc) bg_has_timer, data);
  80 +
59 } 81 }
60 82
61 static void update_toggle(H3270 *session, LIB3270_TOGGLE_ID id, unsigned char value, G_GNUC_UNUSED LIB3270_TOGGLE_TYPE reason, const char *name) 83 static void update_toggle(H3270 *session, LIB3270_TOGGLE_ID id, unsigned char value, G_GNUC_UNUSED LIB3270_TOGGLE_TYPE reason, const char *name)
@@ -91,7 +113,8 @@ static gboolean v3270_update_url(v3270 *terminal) @@ -91,7 +113,8 @@ static gboolean v3270_update_url(v3270 *terminal)
91 { 113 {
92 GtkWidget * widget = GTK_WIDGET(terminal); 114 GtkWidget * widget = GTK_WIDGET(terminal);
93 debug("url=%s",v3270_get_url(widget)); 115 debug("url=%s",v3270_get_url(widget));
94 - v3270_notify_setting(widget,V3270_SETTING_URL); 116 +
  117 + v3270_emit_save_settings(widget,"url");
95 v3270_signal_emit(widget, V3270_SIGNAL_SESSION_CHANGED); 118 v3270_signal_emit(widget, V3270_SIGNAL_SESSION_CHANGED);
96 return FALSE; 119 return FALSE;
97 } 120 }
@@ -180,9 +203,7 @@ static void update_model(H3270 *session, const char *name, int model, G_GNUC_UNU @@ -180,9 +203,7 @@ static void update_model(H3270 *session, const char *name, int model, G_GNUC_UNU
180 { 203 {
181 GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); 204 GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session));
182 205
183 - debug("%s: terminal=%p pspec=%p",__FUNCTION__,widget,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]);  
184 - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]);  
185 - 206 +// g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]);
186 v3270_signal_emit(widget,V3270_SIGNAL_MODEL_CHANGED, (guint) model, name); 207 v3270_signal_emit(widget,V3270_SIGNAL_MODEL_CHANGED, (guint) model, name);
187 } 208 }
188 209
@@ -255,18 +276,20 @@ static void update_selection(H3270 *session, G_GNUC_UNUSED int start, G_GNUC_UNU @@ -255,18 +276,20 @@ static void update_selection(H3270 *session, G_GNUC_UNUSED int start, G_GNUC_UNU
255 276
256 } 277 }
257 278
258 -static void message(H3270 *session, LIB3270_NOTIFY id , const char *title, const char *message, const char *text) 279 +/*
  280 +static void message(H3270 *session, LIB3270_NOTIFY type , const char *title, const char *message, const char *text)
259 { 281 {
260 - v3270_signal_emit(  
261 - GTK_WIDGET(lib3270_get_user_data(session)),  
262 - V3270_SIGNAL_MESSAGE,  
263 - (int) id,  
264 - (gchar *) title,  
265 - (gchar *) message,  
266 - (gchar *) text  
267 - ); 282 + LIB3270_POPUP popup = {
  283 + .type = type,
  284 + .title = title,
  285 + .summary = message,
  286 + .body = text
  287 + };
  288 +
  289 + v3270_popup_dialog_show(GTK_WIDGET(lib3270_get_user_data(session)),&popup,0);
268 290
269 } 291 }
  292 +*/
270 293
271 static int print(H3270 *session, LIB3270_CONTENT_OPTION mode) 294 static int print(H3270 *session, LIB3270_CONTENT_OPTION mode)
272 { 295 {
@@ -303,27 +326,26 @@ static int load(H3270 *session, const char *filename) @@ -303,27 +326,26 @@ static int load(H3270 *session, const char *filename)
303 return 0; 326 return 0;
304 } 327 }
305 328
  329 +/*
306 static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args) 330 static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args)
307 { 331 {
308 - GtkWidget *terminal = (GtkWidget *) lib3270_get_user_data(session); 332 + LIB3270_POPUP popup = {
  333 + .type = type,
  334 + .title = title,
  335 + .summary = msg
  336 + };
309 337
310 - if(terminal && GTK_IS_V3270(terminal))  
311 - { 338 + g_autofree gchar * body = NULL;
312 339
313 - if(fmt)  
314 - {  
315 - gchar *text = g_strdup_vprintf(fmt,args);  
316 - v3270_popup_message(GTK_WIDGET(terminal),type,title,msg,text);  
317 - g_free(text);  
318 - }  
319 - else  
320 - {  
321 - v3270_popup_message(GTK_WIDGET(terminal),type,title,msg,NULL);  
322 - } 340 + if(fmt) {
  341 + body = g_strdup_vprintf(fmt,args);
  342 + popup.body = body;
  343 + }
323 344
324 - } 345 + v3270_popup_dialog_show(GTK_WIDGET(lib3270_get_user_data(session)),&popup,0);
325 346
326 } 347 }
  348 + */
327 349
328 static gboolean bg_update_ssl(H3270 *session) 350 static gboolean bg_update_ssl(H3270 *session)
329 { 351 {
@@ -362,6 +384,7 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title @@ -362,6 +384,7 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title
362 g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_update_oia, data, g_free); 384 g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,(GSourceFunc) bg_update_oia, data, g_free);
363 } 385 }
364 386
  387 + /*
365 static int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body) 388 static int popup_ssl_error(H3270 *session, int rc, const char *title, const char *summary, const char *body)
366 { 389 {
367 GtkWidget *terminal = (GtkWidget *) lib3270_get_user_data(session); 390 GtkWidget *terminal = (GtkWidget *) lib3270_get_user_data(session);
@@ -411,17 +434,47 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title @@ -411,17 +434,47 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title
411 434
412 return -1; 435 return -1;
413 } 436 }
  437 + */
  438 +
  439 + static int popup(H3270 *hSession, const LIB3270_POPUP *popup, unsigned char wait) {
  440 +
  441 + GtkResponseType response = v3270_popup_dialog_show(
  442 + GTK_WIDGET(lib3270_get_user_data(hSession)),
  443 + popup,
  444 + wait != 0);
  445 +
  446 + if(response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY)
  447 + return 0;
  448 +
  449 + return errno = ECANCELED;
  450 +
  451 + }
414 452
415 void v3270_install_callbacks(v3270 *widget) 453 void v3270_install_callbacks(v3270 *widget)
416 { 454 {
417 struct lib3270_session_callbacks *cbk; 455 struct lib3270_session_callbacks *cbk;
418 456
419 - lib3270_set_popup_handler(widget->host, popup_handler);  
420 -  
421 - cbk = lib3270_get_session_callbacks(widget->host,sizeof(struct lib3270_session_callbacks)); 457 + cbk = lib3270_get_session_callbacks(widget->host,G_STRINGIFY(LIB3270_REVISION),sizeof(struct lib3270_session_callbacks));
422 if(!cbk) 458 if(!cbk)
423 { 459 {
424 - g_error( _( "Invalid callback table, possible version mismatch in lib3270") ); 460 + if(g_ascii_strcasecmp(G_STRINGIFY(LIB3270_REVISION),lib3270_get_revision()))
  461 + {
  462 + g_error(
  463 + _("Invalid callback table, the release %s of lib%s can't be used (expecting revision %s)"),
  464 + lib3270_get_revision(),
  465 + G_STRINGIFY(LIB3270_NAME),
  466 + G_STRINGIFY(LIB3270_REVISION)
  467 + );
  468 + }
  469 + else
  470 + {
  471 + g_error(
  472 + _("Unexpected callback table, the release %s of lib%s is invalid"),
  473 + lib3270_get_revision(),
  474 + G_STRINGIFY(LIB3270_NAME)
  475 + );
  476 + }
  477 +
425 return; 478 return;
426 } 479 }
427 480
@@ -445,12 +498,11 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title @@ -445,12 +498,11 @@ static void popup_handler(H3270 *session, LIB3270_NOTIFY type, const char *title
445 cbk->update_model = update_model; 498 cbk->update_model = update_model;
446 cbk->changed = changed; 499 cbk->changed = changed;
447 cbk->ctlr_done = ctlr_done; 500 cbk->ctlr_done = ctlr_done;
448 - cbk->message = message;  
449 cbk->update_ssl = update_ssl; 501 cbk->update_ssl = update_ssl;
450 cbk->print = print; 502 cbk->print = print;
451 cbk->save = save; 503 cbk->save = save;
452 cbk->load = load; 504 cbk->load = load;
453 - cbk->popup_ssl_error = popup_ssl_error; 505 + cbk->popup = popup;
454 506
455 } 507 }
456 508
src/terminal/charset.c
@@ -40,6 +40,7 @@ @@ -40,6 +40,7 @@
40 #include <lib3270/charset.h> 40 #include <lib3270/charset.h>
41 #include <lib3270/log.h> 41 #include <lib3270/log.h>
42 #include <v3270/dialogs.h> 42 #include <v3270/dialogs.h>
  43 + #include <v3270/settings.h>
43 44
44 #define ERROR_DOMAIN g_quark_from_static_string(PACKAGE_NAME) 45 #define ERROR_DOMAIN g_quark_from_static_string(PACKAGE_NAME)
45 46
@@ -337,8 +338,7 @@ @@ -337,8 +338,7 @@
337 g_free(cfg.host); 338 g_free(cfg.host);
338 g_free(cfg.display); 339 g_free(cfg.display);
339 340
340 - debug("%s=%p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_REMAP_FILE]);  
341 - v3270_notify_setting(widget,V3270_SETTING_REMAP_FILE); 341 + v3270_emit_save_settings(widget,"remap_file");
342 342
343 } 343 }
344 344
src/terminal/colors.c
@@ -36,40 +36,92 @@ @@ -36,40 +36,92 @@
36 36
37 /*--[ Implement ]------------------------------------------------------------------------------------*/ 37 /*--[ Implement ]------------------------------------------------------------------------------------*/
38 38
39 -const gchar * v3270_get_default_colors() {  
40 -  
41 - return "#000000," // V3270_COLOR_BACKGROUND  
42 - "#7890F0," // V3270_COLOR_BLUE  
43 - "#FF0000," // V3270_COLOR_RED  
44 - "#FF00FF," // V3270_COLOR_PINK  
45 - "#00FF00," // V3270_COLOR_GREEN  
46 - "#00FFFF," // V3270_COLOR_TURQUOISE  
47 - "#FFFF00," // V3270_COLOR_YELLOW  
48 - "#FFFFFF," // V3270_COLOR_WHITE  
49 - "#000000," // V3270_COLOR_BLACK  
50 - "#000080," // V3270_COLOR_DARK_BLUE  
51 - "#FFA200," // V3270_COLOR_ORANGE  
52 - "#800080," // V3270_COLOR_PURPLE  
53 - "#008000," // V3270_COLOR_DARK_GREEN  
54 - "#008080," // V3270_COLOR_DARK_TURQUOISE  
55 - "#A0A000," // V3270_COLOR_MUSTARD  
56 - "#C0C0C0," // V3270_COLOR_GRAY  
57 -  
58 - "#00FF00," // V3270_COLOR_FIELD_DEFAULT  
59 - "#FF0000," // V3270_COLOR_FIELD_INTENSIFIED  
60 - "#00FFFF," // V3270_COLOR_FIELD_PROTECTED  
61 - "#FFFFFF," // V3270_COLOR_FIELD_PROTECTED_INTENSIFIED  
62 -  
63 - "#404040," // V3270_COLOR_SELECTED_BG  
64 - "#FFFFFF," // V3270_COLOR_SELECTED_FG,  
65 -  
66 - "#00FF00," // V3270_COLOR_CROSS_HAIR  
67 -  
68 - "#000000," // V3270_COLOR_OIA_BACKGROUND  
69 - "#00FF00," // V3270_COLOR_OIA  
70 - "#7890F0," // V3270_COLOR_OIA_SEPARATOR  
71 - "#FFFFFF," // V3270_COLOR_OIA_STATUS_OK  
72 - "#FFFF00," // V3270_COLOR_OIA_STATUS_WARNING 39 +const gchar * v3270_get_default_colors()
  40 +{
  41 +
  42 +#ifdef _WIN32
  43 + {
  44 + HKEY hKey;
  45 + DWORD disp = 0;
  46 + LSTATUS rc = RegCreateKeyEx(
  47 + HKEY_LOCAL_MACHINE,
  48 + "Software\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),
  49 + 0,
  50 + NULL,
  51 + REG_OPTION_NON_VOLATILE,
  52 + KEY_QUERY_VALUE|KEY_READ,
  53 + NULL,
  54 + &hKey,
  55 + &disp);
  56 +
  57 + debug("%s=%d","Software\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc);
  58 +
  59 + if(rc == ERROR_SUCCESS)
  60 + {
  61 + static char * default_colors = NULL;
  62 + DWORD cbData = 4096;
  63 +
  64 + if(!default_colors)
  65 + {
  66 + default_colors = (char *) malloc(cbData+1);
  67 + }
  68 + else
  69 + {
  70 + default_colors = (char *) realloc(default_colors,cbData+1);
  71 + }
  72 +
  73 + DWORD dwRet = RegQueryValueEx(hKey,"colors",NULL,NULL,(LPBYTE) default_colors, &cbData);
  74 +
  75 + debug("dwRet=%d",dwRet);
  76 +
  77 + RegCloseKey(hKey);
  78 +
  79 + if(dwRet == ERROR_SUCCESS)
  80 + {
  81 + default_colors = (char *) realloc(default_colors,cbData+1);
  82 + default_colors[cbData] = 0;
  83 +
  84 + return default_colors;
  85 + }
  86 +
  87 + free(default_colors);
  88 + default_colors = NULL;
  89 + }
  90 + }
  91 +#endif // _WIN32
  92 +
  93 + return "#000000;" // V3270_COLOR_BACKGROUND
  94 + "#7890F0;" // V3270_COLOR_BLUE
  95 + "#FF0000;" // V3270_COLOR_RED
  96 + "#FF00FF;" // V3270_COLOR_PINK
  97 + "#00FF00;" // V3270_COLOR_GREEN
  98 + "#00FFFF;" // V3270_COLOR_TURQUOISE
  99 + "#FFFF00;" // V3270_COLOR_YELLOW
  100 + "#FFFFFF;" // V3270_COLOR_WHITE
  101 + "#000000;" // V3270_COLOR_BLACK
  102 + "#000080;" // V3270_COLOR_DARK_BLUE
  103 + "#FFA200;" // V3270_COLOR_ORANGE
  104 + "#800080;" // V3270_COLOR_PURPLE
  105 + "#008000;" // V3270_COLOR_DARK_GREEN
  106 + "#008080;" // V3270_COLOR_DARK_TURQUOISE
  107 + "#A0A000;" // V3270_COLOR_MUSTARD
  108 + "#C0C0C0;" // V3270_COLOR_GRAY
  109 +
  110 + "#00FF00;" // V3270_COLOR_FIELD_DEFAULT
  111 + "#FF0000;" // V3270_COLOR_FIELD_INTENSIFIED
  112 + "#00FFFF;" // V3270_COLOR_FIELD_PROTECTED
  113 + "#FFFFFF;" // V3270_COLOR_FIELD_PROTECTED_INTENSIFIED
  114 +
  115 + "#404040;" // V3270_COLOR_SELECTED_BG
  116 + "#FFFFFF;" // V3270_COLOR_SELECTED_FG,
  117 +
  118 + "#00FF00;" // V3270_COLOR_CROSS_HAIR
  119 +
  120 + "#000000;" // V3270_COLOR_OIA_BACKGROUND
  121 + "#00FF00;" // V3270_COLOR_OIA
  122 + "#7890F0;" // V3270_COLOR_OIA_SEPARATOR
  123 + "#FFFFFF;" // V3270_COLOR_OIA_STATUS_OK
  124 + "#FFFF00;" // V3270_COLOR_OIA_STATUS_WARNING
73 "#FFFF00"; // V3270_COLOR_OIA_STATUS_INVALID 125 "#FFFF00"; // V3270_COLOR_OIA_STATUS_INVALID
74 } 126 }
75 127
@@ -83,7 +135,7 @@ LIB3270_EXPORT void v3270_set_colors(GtkWidget *widget, const gchar *colors) @@ -83,7 +135,7 @@ LIB3270_EXPORT void v3270_set_colors(GtkWidget *widget, const gchar *colors)
83 } 135 }
84 136
85 v3270_set_color_table(GTK_V3270(widget)->color,colors); 137 v3270_set_color_table(GTK_V3270(widget)->color,colors);
86 - v3270_emit_save_settings(widget); 138 + v3270_emit_save_settings(widget,NULL);
87 v3270_reload(widget); 139 v3270_reload(widget);
88 140
89 } 141 }
src/terminal/drawing/draw.c
@@ -524,6 +524,29 @@ LIB3270_EXPORT void v3270_reload(GtkWidget *widget) @@ -524,6 +524,29 @@ LIB3270_EXPORT void v3270_reload(GtkWidget *widget)
524 524
525 } 525 }
526 526
  527 +GdkPixbuf * v3270_get_as_pixbuf(GtkWidget *widget)
  528 +{
  529 + v3270 * terminal = GTK_V3270(widget);
  530 +
  531 + if(!(gtk_widget_get_realized(widget) && terminal->drawing))
  532 + return NULL;
  533 +
  534 + gint width = gtk_widget_get_allocated_width(widget);
  535 + gint height = gtk_widget_get_allocated_height(widget);
  536 +
  537 + cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);
  538 +
  539 + cairo_t *cr = cairo_create(surface);
  540 + v3270_redraw(terminal, cr, width, height);
  541 + cairo_destroy (cr);
  542 +
  543 + GdkPixbuf * pixbuf = gdk_pixbuf_get_from_surface(surface,0,0,width,height);
  544 +
  545 + cairo_surface_destroy (surface);
  546 +
  547 + return pixbuf;
  548 +}
  549 +
527 void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor) 550 void v3270_update_char(H3270 *session, int addr, unsigned char chr, unsigned short attr, unsigned char cursor)
528 { 551 {
529 v3270 * terminal = GTK_V3270(lib3270_get_user_data(session)); 552 v3270 * terminal = GTK_V3270(lib3270_get_user_data(session));
src/terminal/drawing/oia.c
@@ -827,6 +827,7 @@ struct timer_info @@ -827,6 +827,7 @@ struct timer_info
827 static void release_timer(struct timer_info *info) 827 static void release_timer(struct timer_info *info)
828 { 828 {
829 info->terminal->timer = NULL; 829 info->terminal->timer = NULL;
  830 + g_object_notify_by_pspec(G_OBJECT(info->terminal),GTK_V3270_GET_CLASS(info->terminal)->properties.has_timer);
830 831
831 if(info->terminal->surface) 832 if(info->terminal->surface)
832 { 833 {
@@ -1051,6 +1052,8 @@ void v3270_start_timer(GtkWidget *widget) @@ -1051,6 +1052,8 @@ void v3270_start_timer(GtkWidget *widget)
1051 terminal->timer = g_timeout_source_new(100); 1052 terminal->timer = g_timeout_source_new(100);
1052 g_source_set_callback(terminal->timer,(GSourceFunc) update_timer, info, (GDestroyNotify) release_timer); 1053 g_source_set_callback(terminal->timer,(GSourceFunc) update_timer, info, (GDestroyNotify) release_timer);
1053 1054
  1055 + g_object_notify_by_pspec(G_OBJECT(terminal),GTK_V3270_GET_CLASS(widget)->properties.has_timer);
  1056 +
1054 g_source_attach(terminal->timer,NULL); 1057 g_source_attach(terminal->timer,NULL);
1055 g_source_unref(terminal->timer); 1058 g_source_unref(terminal->timer);
1056 1059
src/terminal/font/properties.c
@@ -47,11 +47,65 @@ static const gchar * invalid_font_messages[] = { @@ -47,11 +47,65 @@ static const gchar * invalid_font_messages[] = {
47 const gchar * v3270_get_default_font_name() 47 const gchar * v3270_get_default_font_name()
48 { 48 {
49 #if defined(_WIN32) 49 #if defined(_WIN32)
50 - return "Lucida Console"; 50 + {
  51 + HKEY hKey;
  52 + DWORD disp = 0;
  53 + LSTATUS rc = RegCreateKeyEx(
  54 + HKEY_LOCAL_MACHINE,
  55 + "Software\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),
  56 + 0,
  57 + NULL,
  58 + REG_OPTION_NON_VOLATILE,
  59 + KEY_QUERY_VALUE|KEY_READ,
  60 + NULL,
  61 + &hKey,
  62 + &disp);
  63 +
  64 + debug("%s=%d","Software\\" LIB3270_STRINGIZE_VALUE_OF(PRODUCT_NAME),rc);
  65 +
  66 + if(rc == ERROR_SUCCESS)
  67 + {
  68 + static char * default_font_name = NULL;
  69 + DWORD cbData = 4096;
  70 +
  71 + if(!default_font_name)
  72 + {
  73 + default_font_name = (char *) malloc(cbData+1);
  74 + }
  75 + else
  76 + {
  77 + default_font_name = (char *) realloc(default_font_name,cbData+1);
  78 + }
  79 +
  80 + DWORD dwRet = RegQueryValueEx(hKey,"font-family",NULL,NULL,(LPBYTE) default_font_name, &cbData);
  81 +
  82 + debug("dwRet=%d",dwRet);
  83 +
  84 + RegCloseKey(hKey);
  85 +
  86 + if(dwRet == ERROR_SUCCESS)
  87 + {
  88 + default_font_name = (char *) realloc(default_font_name,cbData+1);
  89 + default_font_name[cbData] = 0;
  90 + return default_font_name;
  91 + }
  92 +
  93 + free(default_font_name);
  94 + default_font_name = NULL;
  95 + }
  96 + }
  97 +
  98 + // TODO: Search for a valid font-family
  99 + return "Courier New";
  100 +
51 #elif defined(__APPLE__) 101 #elif defined(__APPLE__)
  102 +
52 return "Courier New"; 103 return "Courier New";
  104 +
53 #else 105 #else
  106 +
54 return "monospace"; 107 return "monospace";
  108 +
55 #endif // _WIN32 109 #endif // _WIN32
56 } 110 }
57 111
@@ -108,10 +162,7 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) @@ -108,10 +162,7 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name)
108 terminal->font.family = g_strdup(name); 162 terminal->font.family = g_strdup(name);
109 terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; 163 terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL;
110 164
111 - v3270_emit_save_settings(widget);  
112 -  
113 - debug("%s: %p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_FONT_FAMILY]);  
114 - v3270_notify_setting(widget,V3270_SETTING_FONT_FAMILY); 165 + v3270_emit_save_settings(widget,"font_family");
115 166
116 if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) 167 if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget))
117 { 168 {
@@ -123,13 +174,6 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) @@ -123,13 +174,6 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name)
123 174
124 } 175 }
125 176
126 -void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id)  
127 -{  
128 - debug("%s(%u)",__FUNCTION__,(unsigned int) id);  
129 - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[id]);  
130 - v3270_emit_save_settings(widget);  
131 -}  
132 -  
133 LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget) 177 LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget)
134 { 178 {
135 g_return_val_if_fail(GTK_IS_V3270(widget),NULL); 179 g_return_val_if_fail(GTK_IS_V3270(widget),NULL);
src/terminal/iocallback.c
@@ -37,7 +37,7 @@ static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag, @@ -37,7 +37,7 @@ static void * static_AddSource(H3270 *session, int fd, LIB3270_IO_FLAG flag,
37 static void static_RemoveSource(H3270 *session, void *id); 37 static void static_RemoveSource(H3270 *session, void *id);
38 static void static_SetSourceState(H3270 *session, void *id, int enabled); 38 static void static_SetSourceState(H3270 *session, void *id, int enabled);
39 39
40 -static void * static_AddTimer(H3270 *session, unsigned long interval_ms, int (*proc)(H3270 *session)); 40 +static void * static_AddTimer(H3270 *session, unsigned long interval_ms, int (*proc)(H3270 *session, void *userdata), void *userdata);
41 static void static_RemoveTimer(H3270 *session, void * timer); 41 static void static_RemoveTimer(H3270 *session, void * timer);
42 static int static_Sleep(H3270 *hSession, int seconds); 42 static int static_Sleep(H3270 *hSession, int seconds);
43 static int static_RunPendingEvents(H3270 *hSession, int wait); 43 static int static_RunPendingEvents(H3270 *hSession, int wait);
@@ -48,7 +48,7 @@ static int static_RunPendingEvents(H3270 *hSession, int wait); @@ -48,7 +48,7 @@ static int static_RunPendingEvents(H3270 *hSession, int wait);
48 { 48 {
49 unsigned char remove; 49 unsigned char remove;
50 void * userdata; 50 void * userdata;
51 - int (*call)(H3270 *session); 51 + int (*call)(H3270 *session, void *userdata);
52 H3270 * session; 52 H3270 * session;
53 } TIMER; 53 } TIMER;
54 54
@@ -74,17 +74,18 @@ static void static_SetSourceState(G_GNUC_UNUSED H3270 *session, void *id, int en @@ -74,17 +74,18 @@ static void static_SetSourceState(G_GNUC_UNUSED H3270 *session, void *id, int en
74 static gboolean do_timer(TIMER *t) 74 static gboolean do_timer(TIMER *t)
75 { 75 {
76 if(!t->remove) 76 if(!t->remove)
77 - return t->call(t->session) != 0; 77 + return t->call(t->session,t->userdata);
78 78
79 return FALSE; 79 return FALSE;
80 } 80 }
81 81
82 -static void * static_AddTimer(H3270 *session, unsigned long interval, int (*call)(H3270 *session)) 82 +static void * static_AddTimer(H3270 *session, unsigned long interval, int (*call)(H3270 *session, void *userdata), void *userdata)
83 { 83 {
84 TIMER *t = g_malloc0(sizeof(TIMER)); 84 TIMER *t = g_malloc0(sizeof(TIMER));
85 85
86 t->call = call; 86 t->call = call;
87 t->session = session; 87 t->session = session;
  88 + t->userdata = userdata;
88 89
89 g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free); 90 g_timeout_add_full(G_PRIORITY_DEFAULT, (guint) interval, (GSourceFunc) do_timer, t, g_free);
90 91
src/terminal/keyfile.c
@@ -308,13 +308,17 @@ @@ -308,13 +308,17 @@
308 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) 308 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++)
309 save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); 309 save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name);
310 310
311 - // Save V3270 Responses  
312 - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++)  
313 - save_by_pspec(widget,klass->responses[ix],key_file,group_name);  
314 -  
315 // Save V3270 properties 311 // Save V3270 properties
316 - for(ix = 0; ix < V3270_SETTING_COUNT; ix++)  
317 - save_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); 312 + for(ix = 0; klass->properties.persistent[ix];ix++)
  313 + {
  314 + save_by_pspec(
  315 + widget,
  316 + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]),
  317 + key_file,
  318 + group_name
  319 + );
  320 +
  321 + }
318 322
319 } 323 }
320 324
@@ -360,13 +364,17 @@ @@ -360,13 +364,17 @@
360 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) 364 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++)
361 load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); 365 load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name);
362 366
363 - // Load V3270 Responses  
364 - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++)  
365 - load_by_pspec(widget,klass->responses[ix],key_file,group_name);  
366 -  
367 // Load V3270 properties 367 // Load V3270 properties
368 - for(ix = 0; ix < V3270_SETTING_COUNT; ix++)  
369 - load_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); 368 + for(ix = 0; klass->properties.persistent[ix];ix++)
  369 + {
  370 + load_by_pspec(
  371 + widget,
  372 + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]),
  373 + key_file,
  374 + group_name
  375 + );
  376 +
  377 + }
370 378
371 g_object_thaw_notify(G_OBJECT(widget)); 379 g_object_thaw_notify(G_OBJECT(widget));
372 terminal->freeze = 0; 380 terminal->freeze = 0;
src/terminal/marshal
@@ -6,6 +6,8 @@ VOID:POINTER @@ -6,6 +6,8 @@ VOID:POINTER
6 VOID:VOID,POINTER,POINTER 6 VOID:VOID,POINTER,POINTER
7 VOID:VOID,UINT,POINTER 7 VOID:VOID,UINT,POINTER
8 BOOLEAN:UINT,ENUM 8 BOOLEAN:UINT,ENUM
  9 +UINT:POINTER
  10 +BOOLEAN:POINTER,UINT
9 VOID:VOID,BOOLEAN 11 VOID:VOID,BOOLEAN
10 BOOLEAN:VOID,BOOLEAN,BOOLEAN,POINTER 12 BOOLEAN:VOID,BOOLEAN,BOOLEAN,POINTER
11 VOID:VOID,UINT,UINT 13 VOID:VOID,UINT,UINT
src/terminal/properties/get.c
@@ -39,11 +39,13 @@ @@ -39,11 +39,13 @@
39 39
40 // debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec)); 40 // debug("%s(%u,%s)",__FUNCTION__,prop_id,g_param_spec_get_name(pspec));
41 41
  42 + /*
42 if(prop_id >= klass->properties.type.responses) 43 if(prop_id >= klass->properties.type.responses)
43 { 44 {
44 g_value_set_int(value,(int) window->responses[prop_id - klass->properties.type.responses]); 45 g_value_set_int(value,(int) window->responses[prop_id - klass->properties.type.responses]);
45 } 46 }
46 - else if(prop_id >= klass->properties.type.str) 47 + else */
  48 + if(prop_id >= klass->properties.type.str)
47 { 49 {
48 const LIB3270_STRING_PROPERTY * prop = (lib3270_get_string_properties_list()+(prop_id - klass->properties.type.str)); 50 const LIB3270_STRING_PROPERTY * prop = (lib3270_get_string_properties_list()+(prop_id - klass->properties.type.str));
49 // debug("%s.%s.%s",__FUNCTION__,"string",prop->name); 51 // debug("%s.%s.%s",__FUNCTION__,"string",prop->name);
@@ -146,6 +148,11 @@ @@ -146,6 +148,11 @@
146 case V3270_PROPERTY_HAS_COPY: 148 case V3270_PROPERTY_HAS_COPY:
147 g_value_set_boolean(value,window->selection.blocks != NULL); 149 g_value_set_boolean(value,window->selection.blocks != NULL);
148 break; 150 break;
  151 +
  152 + case V3270_PROPERTY_HAS_TIMER:
  153 + g_value_set_boolean(value,window->timer != NULL);
  154 + break;
  155 +
149 default: 156 default:
150 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); 157 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
151 158
src/terminal/properties/init.c
@@ -43,15 +43,7 @@ @@ -43,15 +43,7 @@
43 } properties[] = { 43 } properties[] = {
44 { "connected", &klass->properties.online }, 44 { "connected", &klass->properties.online },
45 { "associated-lu", &klass->properties.associated_lu }, 45 { "associated-lu", &klass->properties.associated_lu },
46 - { "url", &klass->properties.settings[V3270_SETTING_URL] },  
47 - { "model-number", &klass->properties.settings[V3270_SETTING_MODEL_NUMBER] },  
48 { "has-selection", &klass->properties.selection }, 46 { "has-selection", &klass->properties.selection },
49 - { "oversize", &klass->properties.settings[V3270_SETTING_OVERSIZE] },  
50 - { "host-charset", &klass->properties.settings[V3270_SETTING_HOST_CHARSET] },  
51 - { "unlock-delay", &klass->properties.settings[V3270_SETTING_UNLOCK_DELAY] },  
52 - { "color-type", &klass->properties.settings[V3270_SETTING_COLOR_TYPE] },  
53 - { "host-type", &klass->properties.settings[V3270_SETTING_HOST_TYPE] },  
54 - { "crl-preferred-protocol", &klass->properties.settings[V3270_SETTING_CRL_PROTOCOL] },  
55 }; 47 };
56 48
57 size_t ix; 49 size_t ix;
@@ -83,7 +75,7 @@ @@ -83,7 +75,7 @@
83 // Setup internal properties. 75 // Setup internal properties.
84 76
85 // Font family 77 // Font family
86 - klass->properties.settings[V3270_SETTING_FONT_FAMILY] = 78 + spec =
87 g_param_spec_string( 79 g_param_spec_string(
88 "font_family", 80 "font_family",
89 "font_family", 81 "font_family",
@@ -95,7 +87,7 @@ @@ -95,7 +87,7 @@
95 g_object_class_install_property( 87 g_object_class_install_property(
96 gobject_class, 88 gobject_class,
97 V3270_PROPERTY_FONT_FAMILY, 89 V3270_PROPERTY_FONT_FAMILY,
98 - klass->properties.settings[V3270_SETTING_FONT_FAMILY] 90 + spec
99 ); 91 );
100 92
101 // Session name. 93 // Session name.
@@ -114,7 +106,7 @@ @@ -114,7 +106,7 @@
114 ); 106 );
115 107
116 // Auto disconnect 108 // Auto disconnect
117 - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] = 109 + spec =
118 g_param_spec_uint( 110 g_param_spec_uint(
119 "auto_disconnect", 111 "auto_disconnect",
120 "auto_disconnect", 112 "auto_disconnect",
@@ -128,7 +120,7 @@ @@ -128,7 +120,7 @@
128 g_object_class_install_property( 120 g_object_class_install_property(
129 gobject_class, 121 gobject_class,
130 V3270_PROPERTY_AUTO_DISCONNECT, 122 V3270_PROPERTY_AUTO_DISCONNECT,
131 - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] 123 + spec
132 ); 124 );
133 125
134 // Clipboard 126 // Clipboard
@@ -147,7 +139,7 @@ @@ -147,7 +139,7 @@
147 ); 139 );
148 140
149 // Remap file 141 // Remap file
150 - klass->properties.settings[V3270_SETTING_REMAP_FILE] = 142 + spec =
151 g_param_spec_string( 143 g_param_spec_string(
152 "remap_file", 144 "remap_file",
153 "remap_file", 145 "remap_file",
@@ -159,11 +151,11 @@ @@ -159,11 +151,11 @@
159 g_object_class_install_property( 151 g_object_class_install_property(
160 gobject_class, 152 gobject_class,
161 V3270_PROPERTY_REMAP_FILE, 153 V3270_PROPERTY_REMAP_FILE,
162 - klass->properties.settings[V3270_SETTING_REMAP_FILE] 154 + spec
163 ); 155 );
164 156
165 // Dynamic font spacing 157 // Dynamic font spacing
166 - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] = 158 + spec =
167 g_param_spec_boolean( 159 g_param_spec_boolean(
168 "dynamic_font_spacing", 160 "dynamic_font_spacing",
169 "dynamic_font_spacing", 161 "dynamic_font_spacing",
@@ -175,11 +167,11 @@ @@ -175,11 +167,11 @@
175 g_object_class_install_property( 167 g_object_class_install_property(
176 gobject_class, 168 gobject_class,
177 V3270_PROPERTY_DYNAMIC_SPACING, 169 V3270_PROPERTY_DYNAMIC_SPACING,
178 - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] 170 + spec
179 ); 171 );
180 172
181 // Lu names 173 // Lu names
182 - klass->properties.settings[V3270_SETTING_LU_NAMES] = 174 + spec =
183 g_param_spec_string( 175 g_param_spec_string(
184 "lu_names", 176 "lu_names",
185 "lu_names", 177 "lu_names",
@@ -191,7 +183,7 @@ @@ -191,7 +183,7 @@
191 g_object_class_install_property( 183 g_object_class_install_property(
192 gobject_class, 184 gobject_class,
193 V3270_PROPERTY_LU_NAMES, 185 V3270_PROPERTY_LU_NAMES,
194 - klass->properties.settings[V3270_SETTING_LU_NAMES] 186 + spec
195 ); 187 );
196 188
197 // Trace 189 // Trace
@@ -209,7 +201,7 @@ @@ -209,7 +201,7 @@
209 ); 201 );
210 202
211 // Colors 203 // Colors
212 - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] = 204 + spec =
213 g_param_spec_string( 205 g_param_spec_string(
214 "colors", 206 "colors",
215 "colors", 207 "colors",
@@ -221,11 +213,11 @@ @@ -221,11 +213,11 @@
221 g_object_class_install_property( 213 g_object_class_install_property(
222 gobject_class, 214 gobject_class,
223 V3270_PROPERTY_TERMINAL_COLORS, 215 V3270_PROPERTY_TERMINAL_COLORS,
224 - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] 216 + spec
225 ); 217 );
226 218
227 // Clipboard options 219 // Clipboard options
228 - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] = 220 + spec =
229 g_param_spec_uint( 221 g_param_spec_uint(
230 "selection_flags", 222 "selection_flags",
231 "selection_flags", 223 "selection_flags",
@@ -239,10 +231,9 @@ @@ -239,10 +231,9 @@
239 g_object_class_install_property( 231 g_object_class_install_property(
240 gobject_class, 232 gobject_class,
241 V3270_PROPERTY_SELECTION_OPTIONS, 233 V3270_PROPERTY_SELECTION_OPTIONS,
242 - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] 234 + spec
243 ); 235 );
244 236
245 -  
246 klass->properties.has_copy = 237 klass->properties.has_copy =
247 g_param_spec_boolean( 238 g_param_spec_boolean(
248 "has_copy", 239 "has_copy",
@@ -258,6 +249,20 @@ @@ -258,6 +249,20 @@
258 klass->properties.has_copy 249 klass->properties.has_copy
259 ); 250 );
260 251
  252 + klass->properties.has_timer =
  253 + g_param_spec_boolean(
  254 + "has_timer",
  255 + "has_timer",
  256 + _( "True if the timer indicator is active" ),
  257 + FALSE,
  258 + G_PARAM_READABLE
  259 + );
  260 +
  261 + g_object_class_install_property(
  262 + gobject_class,
  263 + V3270_PROPERTY_HAS_TIMER,
  264 + klass->properties.has_timer
  265 + );
261 266
262 // 267 //
263 // Create dynamic properties 268 // Create dynamic properties
@@ -385,6 +390,7 @@ @@ -385,6 +390,7 @@
385 // 390 //
386 // Create action properties. 391 // Create action properties.
387 // 392 //
  393 + /*
388 klass->properties.type.responses = klass->properties.count; 394 klass->properties.type.responses = klass->properties.count;
389 395
390 static const struct 396 static const struct
@@ -422,7 +428,7 @@ @@ -422,7 +428,7 @@
422 } 428 }
423 429
424 } 430 }
425 - 431 + */
426 432
427 } 433 }
428 434
src/terminal/properties/private.h
@@ -59,8 +59,9 @@ @@ -59,8 +59,9 @@
59 V3270_PROPERTY_TERMINAL_COLORS = 10, ///< @brief Terminal colors. 59 V3270_PROPERTY_TERMINAL_COLORS = 10, ///< @brief Terminal colors.
60 V3270_PROPERTY_SELECTION_OPTIONS = 11, 60 V3270_PROPERTY_SELECTION_OPTIONS = 11,
61 V3270_PROPERTY_HAS_COPY = 12, ///< @brief Terminal has copy. 61 V3270_PROPERTY_HAS_COPY = 12, ///< @brief Terminal has copy.
  62 + V3270_PROPERTY_HAS_TIMER = 13, ///< @brief Timer indicator state.
62 63
63 - V3270_PROPERTY_DYNAMIC = 13 ///< @brief Id of the first LIB3270 internal property. 64 + V3270_PROPERTY_DYNAMIC = 14 ///< @brief Id of the first LIB3270 internal property.
64 }; 65 };
65 66
66 G_GNUC_INTERNAL void v3270_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); 67 G_GNUC_INTERNAL void v3270_get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
src/terminal/properties/set.c
@@ -29,6 +29,7 @@ @@ -29,6 +29,7 @@
29 29
30 #include "private.h" 30 #include "private.h"
31 #include <v3270/trace.h> 31 #include <v3270/trace.h>
  32 + #include <v3270/settings.h>
32 33
33 /*--[ Implement ]------------------------------------------------------------------------------------*/ 34 /*--[ Implement ]------------------------------------------------------------------------------------*/
34 35
@@ -256,7 +257,7 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) @@ -256,7 +257,7 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes)
256 if(terminal->activity.disconnect != minutes) 257 if(terminal->activity.disconnect != minutes)
257 { 258 {
258 terminal->activity.disconnect = minutes; 259 terminal->activity.disconnect = minutes;
259 - v3270_notify_setting(widget,V3270_SETTING_AUTO_DISCONNECT); 260 + v3270_emit_save_settings(widget,"auto_disconnect");
260 } 261 }
261 262
262 } 263 }
@@ -273,7 +274,7 @@ LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean s @@ -273,7 +274,7 @@ LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean s
273 terminal->font.spacing.dynamic = state; 274 terminal->font.spacing.dynamic = state;
274 v3270_reconfigure(terminal); 275 v3270_reconfigure(terminal);
275 gtk_widget_queue_draw(widget); 276 gtk_widget_queue_draw(widget);
276 - v3270_notify_setting(widget,V3270_SETTING_DYNAMIC_SPACING); 277 + v3270_emit_save_settings(widget,"dynamic_font_spacing");
277 } 278 }
278 279
279 } 280 }
@@ -282,6 +283,6 @@ LIB3270_EXPORT void v3270_set_lunames(GtkWidget *widget, const gchar *lunames) @@ -282,6 +283,6 @@ LIB3270_EXPORT void v3270_set_lunames(GtkWidget *widget, const gchar *lunames)
282 { 283 {
283 g_return_if_fail(GTK_IS_V3270(widget)); 284 g_return_if_fail(GTK_IS_V3270(widget));
284 lib3270_set_lunames(GTK_V3270(widget)->host,(lunames && *lunames ? lunames : NULL)); 285 lib3270_set_lunames(GTK_V3270(widget)->host,(lunames && *lunames ? lunames : NULL));
285 - v3270_notify_setting(widget,V3270_SETTING_LU_NAMES); 286 + v3270_emit_save_settings(widget,"lu_names");
286 } 287 }
287 288
src/terminal/widget.c
@@ -58,6 +58,26 @@ @@ -58,6 +58,26 @@
58 * 58 *
59 */ 59 */
60 60
  61 +/// @brief Persistent properties (load/save from session file).
  62 +static const gchar *persistent_properties[] = {
  63 + "url",
  64 + "model-number",
  65 + "oversize",
  66 + "host-charset",
  67 + "unlock-delay",
  68 + "color-type",
  69 + "host-type",
  70 + "crl-preferred-protocol",
  71 + "remap_file",
  72 + "dynamic_font_spacing",
  73 + "lu_names",
  74 + "font_family",
  75 + "auto_disconnect",
  76 + "colors",
  77 + "selection_flags",
  78 + NULL
  79 +};
  80 +
61 /*--[ Widget definition ]----------------------------------------------------------------------------*/ 81 /*--[ Widget definition ]----------------------------------------------------------------------------*/
62 82
63 G_DEFINE_TYPE(v3270, v3270, GTK_TYPE_WIDGET); 83 G_DEFINE_TYPE(v3270, v3270, GTK_TYPE_WIDGET);
@@ -201,12 +221,14 @@ static void finalize(GObject *object) { @@ -201,12 +221,14 @@ static void finalize(GObject *object) {
201 G_OBJECT_CLASS(v3270_parent_class)->finalize(object); 221 G_OBJECT_CLASS(v3270_parent_class)->finalize(object);
202 } 222 }
203 223
204 -static void v3270_class_init(v3270Class *klass)  
205 -{ 224 + static void v3270_class_init(v3270Class *klass)
  225 + {
206 GObjectClass * gobject_class = G_OBJECT_CLASS(klass); 226 GObjectClass * gobject_class = G_OBJECT_CLASS(klass);
207 GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); 227 GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass);
208 GtkBindingSet * binding = gtk_binding_set_by_class(klass); 228 GtkBindingSet * binding = gtk_binding_set_by_class(klass);
209 229
  230 + klass->properties.persistent = persistent_properties;
  231 +
210 // Setup widget key bindings 232 // Setup widget key bindings
211 gtk_binding_entry_skip(binding,GDK_F10,0); 233 gtk_binding_entry_skip(binding,GDK_F10,0);
212 234
@@ -242,11 +264,11 @@ static void v3270_class_init(v3270Class *klass) @@ -242,11 +264,11 @@ static void v3270_class_init(v3270Class *klass)
242 klass->activate = v3270_activate; 264 klass->activate = v3270_activate;
243 klass->toggle_changed = v3270_toggle_changed; 265 klass->toggle_changed = v3270_toggle_changed;
244 klass->message_changed = v3270_update_message; 266 klass->message_changed = v3270_update_message;
245 - klass->popup_message = v3270_popup_message;  
246 267
247 // Register I/O Handlers 268 // Register I/O Handlers
248 v3270_register_io_handlers(klass); 269 v3270_register_io_handlers(klass);
249 270
  271 +
250 // Cursors 272 // Cursors
251 { 273 {
252 #ifdef WIN32 274 #ifdef WIN32
@@ -428,15 +450,6 @@ static void v3270_class_init(v3270Class *klass) @@ -428,15 +450,6 @@ static void v3270_class_init(v3270Class *klass)
428 v3270_VOID__VOID_UINT_UINT, 450 v3270_VOID__VOID_UINT_UINT,
429 G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); 451 G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT);
430 452
431 - v3270_widget_signal[V3270_SIGNAL_MESSAGE] =  
432 - g_signal_new( I_("popup_message"),  
433 - G_OBJECT_CLASS_TYPE (gobject_class),  
434 - G_SIGNAL_RUN_FIRST,  
435 - G_STRUCT_OFFSET (v3270Class, popup_message),  
436 - NULL, NULL,  
437 - v3270_VOID__VOID_UINT_POINTER_POINTER_POINTER,  
438 - G_TYPE_NONE, 4, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);  
439 -  
440 v3270_widget_signal[V3270_SIGNAL_FIELD] = 453 v3270_widget_signal[V3270_SIGNAL_FIELD] =
441 g_signal_new( I_("field_clicked"), 454 g_signal_new( I_("field_clicked"),
442 G_OBJECT_CLASS_TYPE (gobject_class), 455 G_OBJECT_CLASS_TYPE (gobject_class),
@@ -474,6 +487,24 @@ static void v3270_class_init(v3270Class *klass) @@ -474,6 +487,24 @@ static void v3270_class_init(v3270Class *klass)
474 v3270_VOID__VOID, 487 v3270_VOID__VOID,
475 G_TYPE_NONE, 0); 488 G_TYPE_NONE, 0);
476 489
  490 + v3270_widget_signal[V3270_SIGNAL_LOAD_POPUP_RESPONSE] =
  491 + g_signal_new( I_("load-popup-response"),
  492 + G_OBJECT_CLASS_TYPE (gobject_class),
  493 + G_SIGNAL_RUN_LAST,
  494 + 0,
  495 + NULL, NULL,
  496 + v3270_UINT__POINTER,
  497 + G_TYPE_UINT, 1, G_TYPE_POINTER);
  498 +
  499 + v3270_widget_signal[V3270_SIGNAL_SAVE_POPUP_RESPONSE] =
  500 + g_signal_new( I_("save-popup-response"),
  501 + G_OBJECT_CLASS_TYPE (gobject_class),
  502 + G_SIGNAL_RUN_LAST,
  503 + 0,
  504 + NULL, NULL,
  505 + v3270_BOOLEAN__POINTER_UINT,
  506 + G_TYPE_BOOLEAN, 2, G_TYPE_POINTER, G_TYPE_UINT);
  507 +
477 v3270_init_properties(gobject_class); 508 v3270_init_properties(gobject_class);
478 509
479 } 510 }
@@ -492,7 +523,7 @@ static void release_activity_timer(v3270 *widget) @@ -492,7 +523,7 @@ static void release_activity_timer(v3270 *widget)
492 523
493 static void v3270_init(v3270 *widget) 524 static void v3270_init(v3270 *widget)
494 { 525 {
495 - size_t ix; 526 + // size_t ix;
496 527
497 widget->host = lib3270_session_new(NULL); 528 widget->host = lib3270_session_new(NULL);
498 lib3270_set_user_data(widget->host,widget); 529 lib3270_set_user_data(widget->host,widget);
@@ -534,8 +565,10 @@ static void v3270_init(v3270 *widget) @@ -534,8 +565,10 @@ static void v3270_init(v3270 *widget)
534 v3270_font_info_init(&widget->font); 565 v3270_font_info_init(&widget->font);
535 v3270_set_color_table(widget->color,v3270_get_default_colors()); 566 v3270_set_color_table(widget->color,v3270_get_default_colors());
536 567
  568 + /*
537 for(ix = 0; ix < G_N_ELEMENTS(widget->responses); ix++) 569 for(ix = 0; ix < G_N_ELEMENTS(widget->responses); ix++)
538 widget->responses[ix] = GTK_RESPONSE_NONE; 570 widget->responses[ix] = GTK_RESPONSE_NONE;
  571 + */
539 572
540 // Init accelerators 573 // Init accelerators
541 v3270_init_accelerators(widget); 574 v3270_init_accelerators(widget);
@@ -813,8 +846,11 @@ static gboolean bg_emit_save_settings(v3270 *terminal) @@ -813,8 +846,11 @@ static gboolean bg_emit_save_settings(v3270 *terminal)
813 return FALSE; 846 return FALSE;
814 } 847 }
815 848
816 -LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget) 849 +LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name)
817 { 850 {
  851 + if(property_name)
  852 + g_object_notify(G_OBJECT(widget),property_name);
  853 +
818 debug("%s(Freeze is %s)",__FUNCTION__,GTK_V3270(widget)->freeze ? "ON" : "OFF"); 854 debug("%s(Freeze is %s)",__FUNCTION__,GTK_V3270(widget)->freeze ? "ON" : "OFF");
819 if(widget && GTK_IS_V3270(widget) && !GTK_V3270(widget)->freeze) 855 if(widget && GTK_IS_V3270(widget) && !GTK_V3270(widget)->freeze)
820 { 856 {
src/terminal/windows/init.c
@@ -40,9 +40,13 @@ @@ -40,9 +40,13 @@
40 40
41 BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID G_GNUC_UNUSED(lpvResvd)) 41 BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID G_GNUC_UNUSED(lpvResvd))
42 { 42 {
  43 + debug("%s starts",__FUNCTION__);
  44 +
  45 + /*
43 switch(dwcallpurpose) 46 switch(dwcallpurpose)
44 { 47 {
45 case DLL_PROCESS_ATTACH: 48 case DLL_PROCESS_ATTACH:
  49 + debug("%s: DLL_PROCESS_ATTACH",__FUNCTION__);
46 { 50 {
47 char lpFilename[4096]; 51 char lpFilename[4096];
48 52
@@ -58,14 +62,16 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID G_GNUC_UNUSED( @@ -58,14 +62,16 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwcallpurpose, LPVOID G_GNUC_UNUSED(
58 62
59 bindtextdomain(GETTEXT_PACKAGE,lpFilename); 63 bindtextdomain(GETTEXT_PACKAGE,lpFilename);
60 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); 64 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
61 -  
62 } 65 }
63 break; 66 break;
64 67
65 case DLL_PROCESS_DETACH: 68 case DLL_PROCESS_DETACH:
  69 + debug("%s: DLL_PROCESS_DETACH",__FUNCTION__);
66 break; 70 break;
67 71
68 } 72 }
  73 + */
69 74
  75 + debug("%s ends",__FUNCTION__);
70 return TRUE; 76 return TRUE;
71 } 77 }
src/terminal/windows/registry.c
@@ -263,10 +263,6 @@ @@ -263,10 +263,6 @@
263 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) 263 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++)
264 save_by_pspec(widget,klass->properties.toggle[ix],hKey); 264 save_by_pspec(widget,klass->properties.toggle[ix],hKey);
265 265
266 - // Save V3270 Responses  
267 - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++)  
268 - save_by_pspec(widget,klass->responses[ix],hKey);  
269 -  
270 // Save V3270 properties 266 // Save V3270 properties
271 for(ix = 0; ix < V3270_SETTING_COUNT; ix++) 267 for(ix = 0; ix < V3270_SETTING_COUNT; ix++)
272 save_by_pspec(widget,klass->properties.settings[ix],hKey); 268 save_by_pspec(widget,klass->properties.settings[ix],hKey);
@@ -328,10 +324,6 @@ @@ -328,10 +324,6 @@
328 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) 324 for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++)
329 load_by_pspec(widget,klass->properties.toggle[ix],hKey); 325 load_by_pspec(widget,klass->properties.toggle[ix],hKey);
330 326
331 - // Load V3270 Responses  
332 - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++)  
333 - load_by_pspec(widget,klass->responses[ix],hKey);  
334 -  
335 // Load V3270 properties 327 // Load V3270 properties
336 for(ix = 0; ix < V3270_SETTING_COUNT; ix++) 328 for(ix = 0; ix < V3270_SETTING_COUNT; ix++)
337 load_by_pspec(widget,klass->properties.settings[ix],hKey); 329 load_by_pspec(widget,klass->properties.settings[ix],hKey);
src/testprogram/testprogram.c
@@ -71,35 +71,6 @@ @@ -71,35 +71,6 @@
71 } 71 }
72 */ 72 */
73 73
74 -#ifdef _WIN32  
75 -  
76 - static int get_registry(HKEY *hKey,REGSAM samDesired)  
77 - {  
78 - DWORD disp;  
79 -  
80 - if(RegCreateKeyEx(HKEY_CURRENT_USER,"software\\v3270",0,NULL,REG_OPTION_NON_VOLATILE,samDesired,NULL,hKey,&disp) != ERROR_SUCCESS)  
81 - {  
82 - g_warning("Can't open registry");  
83 - return -1;  
84 - }  
85 -  
86 - return 0;  
87 -  
88 - }  
89 -  
90 - static void save_settings(GtkWidget *terminal, GtkWidget *window)  
91 - {  
92 - HKEY hKey = 0;  
93 -  
94 - if(get_registry(&hKey,KEY_SET_VALUE))  
95 - return;  
96 -  
97 - v3270_to_registry(terminal,hKey,"terminal");  
98 - RegCloseKey(hKey);  
99 - }  
100 -  
101 -#else  
102 -  
103 static GKeyFile * get_key_file() 74 static GKeyFile * get_key_file()
104 { 75 {
105 GKeyFile * key_file = g_key_file_new(); 76 GKeyFile * key_file = g_key_file_new();
@@ -109,7 +80,7 @@ @@ -109,7 +80,7 @@
109 80
110 static void save_settings(GtkWidget *terminal, GtkWidget *window) 81 static void save_settings(GtkWidget *terminal, GtkWidget *window)
111 { 82 {
112 - debug("%s: Saving settings for windows %p",__FUNCTION__,window); 83 + debug("%s: Saving settings for window %p",__FUNCTION__,window);
113 84
114 GKeyFile * key_file = get_key_file(); 85 GKeyFile * key_file = get_key_file();
115 86
@@ -122,8 +93,6 @@ @@ -122,8 +93,6 @@
122 93
123 } 94 }
124 95
125 -#endif // _WIN32  
126 -  
127 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) { 96 static void activate(GtkApplication* app, G_GNUC_UNUSED gpointer user_data) {
128 97
129 GtkWidget * window = gtk_application_window_new(app); 98 GtkWidget * window = gtk_application_window_new(app);
@@ -132,7 +101,7 @@ @@ -132,7 +101,7 @@
132 GtkWidget * notebook = gtk_notebook_new(); 101 GtkWidget * notebook = gtk_notebook_new();
133 102
134 // Hack to speed up the tests. 103 // Hack to speed up the tests.
135 - lib3270_disable_crl_download(v3270_get_session(terminal)); 104 + lib3270_ssl_set_crl_download(v3270_get_session(terminal),0);
136 105
137 gtk_box_pack_start(GTK_BOX(vBox),create_toolbar(terminal),FALSE,TRUE,0); 106 gtk_box_pack_start(GTK_BOX(vBox),create_toolbar(terminal),FALSE,TRUE,0);
138 gtk_box_pack_start(GTK_BOX(vBox),notebook,TRUE,TRUE,0); 107 gtk_box_pack_start(GTK_BOX(vBox),notebook,TRUE,TRUE,0);
@@ -147,32 +116,12 @@ @@ -147,32 +116,12 @@
147 116
148 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new("Terminal")); 117 gtk_notebook_append_page(GTK_NOTEBOOK(notebook),terminal,gtk_label_new("Terminal"));
149 118
150 -#ifdef _WIN32  
151 - v3270_set_font_family(terminal,"Lucida Console");  
152 -#endif // _WIN32  
153 -  
154 - v3270_selection_set_font_family(terminal,"monospace");  
155 -  
156 // Load settings before connecting the signals. 119 // Load settings before connecting the signals.
157 -#ifdef _WIN32  
158 - {  
159 - HKEY hKey = 0;  
160 -  
161 - if(!get_registry(&hKey,KEY_SET_VALUE))  
162 - {  
163 - v3270_load_registry(terminal,hKey,"terminal");  
164 - RegCloseKey(hKey);  
165 - }  
166 -  
167 - }  
168 -#else  
169 debug("%s: Loading settings...",__FUNCTION__); 120 debug("%s: Loading settings...",__FUNCTION__);
170 GKeyFile * key_file = get_key_file(); 121 GKeyFile * key_file = get_key_file();
171 v3270_load_key_file(terminal,key_file,NULL); 122 v3270_load_key_file(terminal,key_file,NULL);
172 v3270_accelerator_map_load_key_file(terminal,key_file,NULL); 123 v3270_accelerator_map_load_key_file(terminal,key_file,NULL);
173 -  
174 g_key_file_free(key_file); 124 g_key_file_free(key_file);
175 -#endif // _WIN32  
176 125
177 } 126 }
178 127
src/testprogram/toolbar.c
@@ -37,6 +37,7 @@ @@ -37,6 +37,7 @@
37 #include <v3270/selection.h> 37 #include <v3270/selection.h>
38 #include <v3270/trace.h> 38 #include <v3270/trace.h>
39 #include <lib3270/log.h> 39 #include <lib3270/log.h>
  40 + #include <lib3270/popup.h>
40 #include <stdlib.h> 41 #include <stdlib.h>
41 42
42 #pragma GCC diagnostic ignored "-Wunused-parameter" 43 #pragma GCC diagnostic ignored "-Wunused-parameter"
@@ -103,9 +104,13 @@ @@ -103,9 +104,13 @@
103 lib3270_disconnect(v3270_get_session(terminal)); 104 lib3270_disconnect(v3270_get_session(terminal));
104 } 105 }
105 106
106 - static void save_all_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) 107 + static void save_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
107 { 108 {
108 - lib3270_save_all(v3270_get_session(terminal),NULL); 109 + H3270 *hSession = v3270_get_session(terminal);
  110 + if(lib3270_get_has_selection(hSession))
  111 + lib3270_save_selected(hSession,NULL);
  112 + else
  113 + lib3270_save_all(hSession,NULL);
109 } 114 }
110 115
111 static void load_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal) 116 static void load_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *terminal)
@@ -159,6 +164,7 @@ @@ -159,6 +164,7 @@
159 */ 164 */
160 165
161 166
  167 + /*
162 { 168 {
163 // 169 //
164 // Test V3270 FT Dialog 170 // Test V3270 FT Dialog
@@ -176,7 +182,24 @@ @@ -176,7 +182,24 @@
176 gtk_widget_show_all(dialog); 182 gtk_widget_show_all(dialog);
177 183
178 } 184 }
  185 + */
  186 +
179 187
  188 + }
  189 +
  190 + static void popup_clicked(GtkButton *button, GtkWidget *terminal)
  191 + {
  192 +
  193 + /*
  194 + static const LIB3270_POPUP popup = {
  195 + .name = "sample_popup",
  196 + .type = LIB3270_NOTIFY_INFO,
  197 + .summary = "This is the summary of message",
  198 + .body = "This it the body of the message, can be used for a bigger explanation"
  199 + };
  200 +
  201 + lib3270_popup(v3270_get_session(terminal), &popup, 1);
  202 + */
180 203
181 } 204 }
182 205
@@ -226,8 +249,9 @@ @@ -226,8 +249,9 @@
226 { "gtk-harddisk", G_CALLBACK(ft_clicked), "Open file transfer dialog" }, 249 { "gtk-harddisk", G_CALLBACK(ft_clicked), "Open file transfer dialog" },
227 { "gtk-copy", G_CALLBACK(copy_clicked), "Copy data" }, 250 { "gtk-copy", G_CALLBACK(copy_clicked), "Copy data" },
228 { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" }, 251 { "gtk-paste", G_CALLBACK(paste_clicked), "Paste data" },
229 - { "document-save", G_CALLBACK(save_all_clicked), "Save screen" }, 252 + { "document-save", G_CALLBACK(save_clicked), "Save screen or selection" },
230 { "document-open", G_CALLBACK(load_clicked), "Paste file" }, 253 { "document-open", G_CALLBACK(load_clicked), "Paste file" },
  254 + { "dialog-information", G_CALLBACK(popup_clicked), "Show test popup" },
231 255
232 { "applications-system", G_CALLBACK(preferences_clicked), "Session properties" }, 256 { "applications-system", G_CALLBACK(preferences_clicked), "Session properties" },
233 257
@@ -217,6 +217,9 @@ @@ -217,6 +217,9 @@
217 <Unit filename="src/selection/linux/paste.c"> 217 <Unit filename="src/selection/linux/paste.c">
218 <Option compilerVar="CC" /> 218 <Option compilerVar="CC" />
219 </Unit> 219 </Unit>
  220 + <Unit filename="src/selection/pixbuf.c">
  221 + <Option compilerVar="CC" />
  222 + </Unit>
220 <Unit filename="src/selection/selection.c"> 223 <Unit filename="src/selection/selection.c">
221 <Option compilerVar="CC" /> 224 <Option compilerVar="CC" />
222 </Unit> 225 </Unit>
@@ -358,6 +361,7 @@ @@ -358,6 +361,7 @@
358 <Unit filename="src/terminal/linux/iosource.c"> 361 <Unit filename="src/terminal/linux/iosource.c">
359 <Option compilerVar="CC" /> 362 <Option compilerVar="CC" />
360 </Unit> 363 </Unit>
  364 + <Unit filename="src/terminal/marshal" />
361 <Unit filename="src/terminal/marshal.h" /> 365 <Unit filename="src/terminal/marshal.h" />
362 <Unit filename="src/terminal/mouse.c"> 366 <Unit filename="src/terminal/mouse.c">
363 <Option compilerVar="CC" /> 367 <Option compilerVar="CC" />
@@ -417,9 +421,6 @@ @@ -417,9 +421,6 @@
417 <Option compilerVar="CC" /> 421 <Option compilerVar="CC" />
418 </Unit> 422 </Unit>
419 <Extensions> 423 <Extensions>
420 - <code_completion />  
421 - <envvars />  
422 - <debugger />  
423 <lib_finder disable_auto="1" /> 424 <lib_finder disable_auto="1" />
424 </Extensions> 425 </Extensions>
425 </Project> 426 </Project>