Commit e79e98c428e6d8241050318f4d3a986eaf250dcd
Exists in
master
and in
1 other branch
Merge branch 'develop'
Showing
38 changed files
with
1238 additions
and
593 deletions
Show diff stats
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 "_Adicionar ao arquivo" | @@ -59,15 +59,15 @@ msgstr "_Adicionar ao arquivo" | ||
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 "Adicionar à cópia" | @@ -88,7 +88,7 @@ msgstr "Adicionar à cópia" | ||
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 "Adiciona seleção na área de transferência" | @@ -120,7 +120,7 @@ msgstr "Adiciona seleção na área de transferência" | ||
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 "Azul" | @@ -162,7 +162,7 @@ msgstr "Azul" | ||
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 "Erro ao converter valor do cgcsid" | @@ -202,7 +202,7 @@ msgstr "Erro ao converter valor do cgcsid" | ||
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 "Can't paste text" | @@ -211,7 +211,7 @@ msgid "Can't paste text" | ||
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 "Não foi possível salvar arquivo %s" | @@ -220,7 +220,7 @@ msgstr "Não foi possível salvar arquivo %s" | ||
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 "Não foi possível registrar manipuladores de I/O 3270" | @@ -228,25 +228,21 @@ msgstr "Não foi possível registrar manipuladores de I/O 3270" | ||
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 "Clique para cancelar operação" | @@ -254,11 +250,11 @@ msgstr "Clique para cancelar operação" | ||
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 "Área de transferência" | @@ -266,7 +262,7 @@ msgstr "Área de transferência" | ||
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 "Comando a executar" | @@ -302,10 +298,6 @@ msgstr "Comando a executar" | ||
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 "Copiar como texto puro" | @@ -318,7 +310,7 @@ msgstr "Copiar como texto puro" | ||
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 "Turquesa Escuro" | @@ -405,7 +397,7 @@ msgstr "Turquesa Escuro" | ||
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 "Emulação" | @@ -425,14 +417,14 @@ msgstr "Emulação" | ||
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 "Tempo estimado para a transferência" | @@ -441,7 +433,7 @@ msgstr "Tempo estimado para a transferência" | ||
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 "Cinza" | @@ -524,15 +516,15 @@ msgstr "Cinza" | ||
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 "Ignore" | @@ -568,6 +560,10 @@ msgstr "Ignore" | ||
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 "Intensificado/Protegido" | @@ -588,10 +584,14 @@ msgstr "Intensificado/Protegido" | ||
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 "Escopo de mapeamento inválido" | @@ -605,8 +605,8 @@ msgstr "Escopo de mapeamento inválido" | ||
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 "Monocromático" | @@ -662,7 +662,7 @@ msgstr "Monocromático" | ||
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 "Próxima página" | @@ -678,7 +678,7 @@ msgstr "Próxima página" | ||
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 "Nenhuma transferência" | @@ -694,14 +694,18 @@ msgstr "Nenhuma transferência" | ||
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 "Normal/Protegido" | @@ -710,7 +714,7 @@ msgstr "Normal/Protegido" | ||
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 "Estado normal na OIA" | @@ -742,10 +746,6 @@ msgstr "Estado normal na OIA" | ||
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 "Colar de um arquivo" | @@ -802,7 +802,7 @@ msgstr "Colar de um arquivo" | ||
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 "Rosa" | @@ -830,7 +830,7 @@ msgstr "Rosa" | ||
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 "Formato de registro" | @@ -938,7 +938,7 @@ msgstr "Formato de registro" | ||
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 "" | @@ -987,7 +987,11 @@ msgstr "" | ||
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 "Salvar _Como" | @@ -1009,7 +1013,7 @@ msgstr "Salvar _Como" | ||
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 "Salvar tela ou seleção" | @@ -1029,11 +1033,11 @@ msgstr "Salvar tela ou seleção" | ||
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 "Guarda fila de transferência num arquivo XML externo" | @@ -1061,7 +1065,7 @@ msgstr "Guarda fila de transferência num arquivo XML externo" | ||
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 "Secondary space" | @@ -1086,7 +1090,7 @@ msgid "Secondary space" | ||
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 "Selecionar arquivo com mapeamento personalizado" | @@ -1099,13 +1103,13 @@ msgstr "Selecionar arquivo com mapeamento personalizado" | ||
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 "Tipo de situação" | @@ -1245,7 +1249,7 @@ msgstr "Tipo de situação" | ||
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 "" | @@ -1288,11 +1292,11 @@ msgstr "" | ||
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 "" | @@ -1313,12 +1317,7 @@ msgstr "" | ||
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 "Operação de impressão está em andamento" | @@ -1377,12 +1376,12 @@ msgstr "Operação de impressão está em andamento" | ||
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 "Fila de transferências" | @@ -1464,10 +1463,14 @@ msgstr "Fila de transferências" | ||
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 "Turquesa" | @@ -1480,20 +1483,25 @@ msgstr "Turquesa" | ||
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 "Modo inesperado %d" | @@ -1503,7 +1511,11 @@ msgstr "Modo inesperado %d" | ||
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 "Variável" | @@ -1524,6 +1536,10 @@ msgstr "Variável" | ||
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 "Texto _ASCII" | @@ -1705,20 +1721,21 @@ msgstr "Texto _ASCII" | ||
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 "_Tabela de cores" | @@ -1730,7 +1747,7 @@ msgstr "_Tabela de cores" | ||
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 "Arquivo _local:" | @@ -1754,11 +1771,16 @@ msgstr "Arquivo _local:" | ||
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 "_Colar como texto" | @@ -1766,14 +1788,14 @@ msgstr "_Colar como texto" | ||
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 "Diminui o tamanho da fonte" | @@ -2305,6 +2327,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2347,12 +2372,18 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2490,6 +2521,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2511,9 +2545,6 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2750,8 +2781,8 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2774,6 +2805,10 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2927,9 +2962,6 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -2942,6 +2974,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -3339,9 +3374,6 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -3652,6 +3684,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -3995,6 +4030,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 "Diminui o tamanho da fonte" | @@ -4040,6 +4078,9 @@ msgstr "Diminui o tamanho da fonte" | ||
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 | } |
@@ -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 |
v3270.cbp
@@ -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> |