Commit cad6def6474ad8b9765ef6b6eb039e146c75a278

Authored by Perry Werneck
Committed by GitHub
2 parents a8f72c8e a8f2e87c

Merge pull request #12 from PerryWerneck/develop

Updating to latest code from develop. Many fixes and enhancements.
Showing 58 changed files with 3907 additions and 1817 deletions   Show diff stats
@@ -57,6 +57,9 @@ src/include/lib3270 @@ -57,6 +57,9 @@ src/include/lib3270
57 vgcore.* 57 vgcore.*
58 gschemas.compiled 58 gschemas.compiled
59 *.gschema.xml 59 *.gschema.xml
  60 +appdata.xml
  61 +*.[0-9]
  62 +
60 *.3270 63 *.3270
61 macos/**/*.app 64 macos/**/*.app
62 mime.xml 65 mime.xml
@@ -38,8 +38,9 @@ SOURCES= \ @@ -38,8 +38,9 @@ SOURCES= \
38 $(wildcard src/objects/terminal/*.c) \ 38 $(wildcard src/objects/terminal/*.c) \
39 $(wildcard src/objects/toolbar/*.c) \ 39 $(wildcard src/objects/toolbar/*.c) \
40 $(wildcard src/objects/settings/*.c) \ 40 $(wildcard src/objects/settings/*.c) \
41 - $(wildcard src/objects/@OSNAME@/*.c) \ 41 + $(wildcard src/objects/os/@OSNAME@/*.c) \
42 $(wildcard src/main/*.c) \ 42 $(wildcard src/main/*.c) \
  43 + $(wildcard src/tools/*.c) \
43 $(wildcard src/main/@OSNAME@/*.c) \ 44 $(wildcard src/main/@OSNAME@/*.c) \
44 $(wildcard src/main/@OSNAME@/*.rc) \ 45 $(wildcard src/main/@OSNAME@/*.rc) \
45 $(wildcard src/objects/keypad/*.c) 46 $(wildcard src/objects/keypad/*.c)
@@ -63,6 +64,7 @@ WINDRES=@WINDRES@ @@ -63,6 +64,7 @@ WINDRES=@WINDRES@
63 AR=@AR@ 64 AR=@AR@
64 VALGRIND=@VALGRIND@ 65 VALGRIND=@VALGRIND@
65 CONVERT=@CONVERT@ 66 CONVERT=@CONVERT@
  67 +STRIP=@STRIP@
66 68
67 #---[ Paths ]---------------------------------------------------------------------------- 69 #---[ Paths ]----------------------------------------------------------------------------
68 70
@@ -127,6 +129,11 @@ $(OBJDBG)/%.o: \ @@ -127,6 +129,11 @@ $(OBJDBG)/%.o: \
127 129
128 @$(CC) \ 130 @$(CC) \
129 $(CFLAGS) \ 131 $(CFLAGS) \
  132 + -DDEBUG=1 \
  133 + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $<
  134 +
  135 + @$(CC) \
  136 + $(CFLAGS) \
130 -Wall -Wextra -fstack-check \ 137 -Wall -Wextra -fstack-check \
131 -DDEBUG=1 \ 138 -DDEBUG=1 \
132 -o $@ -c $< 139 -o $@ -c $<
@@ -154,6 +161,12 @@ $(OBJRLS)/%.o: \ @@ -154,6 +161,12 @@ $(OBJRLS)/%.o: \
154 161
155 @echo $< ... 162 @echo $< ...
156 @$(MKDIR) $(dir $@) 163 @$(MKDIR) $(dir $@)
  164 +
  165 + @$(CC) \
  166 + $(CFLAGS) \
  167 + -DNDEBUG=1 \
  168 + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $<
  169 +
157 @$(CC) \ 170 @$(CC) \
158 $(CFLAGS) \ 171 $(CFLAGS) \
159 -DNDEBUG=1 \ 172 -DNDEBUG=1 \
@@ -179,6 +192,7 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \ @@ -179,6 +192,7 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \
179 --keyword=_ \ 192 --keyword=_ \
180 --keyword=N_ \ 193 --keyword=N_ \
181 --keyword=MSG_:2 \ 194 --keyword=MSG_:2 \
  195 + --keyword=NC_:1c,2 \
182 --output=$@ \ 196 --output=$@ \
183 $< 197 $<
184 @touch $@ 198 @touch $@
@@ -258,6 +272,10 @@ $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@: \ @@ -258,6 +272,10 @@ $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@: \
258 $^ \ 272 $^ \
259 $(LIBS) 273 $(LIBS)
260 274
  275 +strip: \
  276 + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@
  277 +
  278 + @$(STRIP) --discard-all $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@
261 279
262 #---[ Install Targets ]------------------------------------------------------------------ 280 #---[ Install Targets ]------------------------------------------------------------------
263 281
@@ -266,18 +284,11 @@ install: \ @@ -266,18 +284,11 @@ install: \
266 install-keypads 284 install-keypads
267 285
268 install-application: \ 286 install-application: \
269 - $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ 287 + install-@OSNAME@-application \
270 install-locale \ 288 install-locale \
271 install-schemas \ 289 install-schemas \
272 - install-branding  
273 -  
274 - @$(MKDIR) \  
275 - $(DESTDIR)/$(bindir)  
276 -  
277 - @$(INSTALL_PROGRAM) \  
278 - $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \  
279 - $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@  
280 - 290 + install-branding \
  291 + install-icons
281 292
282 @$(MKDIR) \ 293 @$(MKDIR) \
283 $(DESTDIR)/$(libdir)/$(PRODUCT_NAME)-plugins 294 $(DESTDIR)/$(libdir)/$(PRODUCT_NAME)-plugins
@@ -292,6 +303,28 @@ install-application: \ @@ -292,6 +303,28 @@ install-application: \
292 @$(MKDIR) \ 303 @$(MKDIR) \
293 $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad 304 $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad
294 305
  306 +install-linux-application: \
  307 + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@
  308 +
  309 + @$(MKDIR) \
  310 + $(DESTDIR)/$(bindir)
  311 +
  312 + @$(INSTALL_PROGRAM) \
  313 + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \
  314 + $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@
  315 +
  316 +
  317 +install-windows-application: \
  318 + strip
  319 +
  320 + @$(MKDIR) \
  321 + $(DESTDIR)/$(bindir)
  322 +
  323 + @$(INSTALL_PROGRAM) \
  324 + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \
  325 + $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@
  326 +
  327 +
295 install-keypads: 328 install-keypads:
296 329
297 @$(MKDIR) \ 330 @$(MKDIR) \
@@ -301,6 +334,15 @@ install-keypads: @@ -301,6 +334,15 @@ install-keypads:
301 keypad/*.xml \ 334 keypad/*.xml \
302 $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad 335 $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad
303 336
  337 +install-icons:
  338 +
  339 + @$(MKDIR) \
  340 + $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/icons
  341 +
  342 + @$(INSTALL_DATA) \
  343 + icons/*.svg \
  344 + $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/icons
  345 +
304 #---[ Misc Targets ]--------------------------------------------------------------------- 346 #---[ Misc Targets ]---------------------------------------------------------------------
305 347
306 locale/$(PACKAGE_NAME).pot: \ 348 locale/$(PACKAGE_NAME).pot: \
@@ -335,6 +377,14 @@ run: \ @@ -335,6 +377,14 @@ run: \
335 @G_DEBUG=fatal-warnings \ 377 @G_DEBUG=fatal-warnings \
336 $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ 378 $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@
337 379
  380 +
  381 +run-inspector: \
  382 + $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ \
  383 + gschemas.compiled
  384 +
  385 + @GTK_DEBUG=interactive \
  386 + $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@
  387 +
338 mem-check: \ 388 mem-check: \
339 $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ 389 $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@
340 390
@@ -382,4 +432,6 @@ clean: \ @@ -382,4 +432,6 @@ clean: \
382 cleanDebug \ 432 cleanDebug \
383 cleanRelease 433 cleanRelease
384 434
  435 +-include $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).d)
  436 +-include $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).d)
385 437
branding/Makefile.in
@@ -44,6 +44,8 @@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ @@ -44,6 +44,8 @@ INSTALL_PROGRAM=@INSTALL_PROGRAM@
44 CONVERT=@CONVERT@ 44 CONVERT=@CONVERT@
45 OPTIPNG=@OPTIPNG@ 45 OPTIPNG=@OPTIPNG@
46 DESKTOP_INSTALL=@DESKTOP_INSTALL@ 46 DESKTOP_INSTALL=@DESKTOP_INSTALL@
  47 +SCOUR=@SCOUR@
  48 +APPSTREAMCLI=@APPSTREAMCLI@
47 49
48 #---[ Rules ]---------------------------------------------------------------------------- 50 #---[ Rules ]----------------------------------------------------------------------------
49 51
@@ -107,6 +109,20 @@ $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/%.png: \ @@ -107,6 +109,20 @@ $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/%.png: \
107 @$(MKDIR) `dirname $@` 109 @$(MKDIR) `dirname $@`
108 @$(INSTALL_DATA) $< $@ 110 @$(INSTALL_DATA) $< $@
109 111
  112 +$(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/icons/%.svg: \
  113 + %.svg
  114 +
  115 + @echo $@ ...
  116 + @$(MKDIR) `dirname $@`
  117 +
  118 +ifeq ($(SCOUR),no)
  119 + @$(INSTALL_DATA) $< $@
  120 +else
  121 + @$(SCOUR) -i $< -o $@
  122 +endif
  123 +
  124 + @chmod 644 $@
  125 +
110 $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ 126 $(DESTDIR)$(datarootdir)/pixmaps/%.png: \
111 $(BINDIR)/%.png 127 $(BINDIR)/%.png
112 128
@@ -114,11 +130,19 @@ $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ @@ -114,11 +130,19 @@ $(DESTDIR)$(datarootdir)/pixmaps/%.png: \
114 @$(MKDIR) `dirname $@` 130 @$(MKDIR) `dirname $@`
115 @$(INSTALL_DATA) $< $@ 131 @$(INSTALL_DATA) $< $@
116 132
  133 +validate:
  134 +
  135 +ifneq ($(SCOUR),no)
  136 + @$(APPSTREAMCLI) validate appdata.xml
  137 +endif
  138 +
  139 +
117 install: \ 140 install: \
118 install-@OSNAME@ 141 install-@OSNAME@
119 142
120 install-linux: \ 143 install-linux: \
121 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ 144 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \
  145 + $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/icons/$(PRODUCT_NAME).svg \
122 $(DESTDIR)$(datarootdir)/pixmaps/$(PRODUCT_NAME).png \ 146 $(DESTDIR)$(datarootdir)/pixmaps/$(PRODUCT_NAME).png \
123 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png 147 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png
124 148
@@ -138,6 +162,12 @@ install-linux: \ @@ -138,6 +162,12 @@ install-linux: \
138 mime.xml \ 162 mime.xml \
139 $(DESTDIR)$(datarootdir)/mime/packages/$(PRODUCT_NAME).xml 163 $(DESTDIR)$(datarootdir)/mime/packages/$(PRODUCT_NAME).xml
140 164
  165 + @$(MKDIR) $(DESTDIR)$(datarootdir)/appdata
  166 +
  167 + @$(INSTALL_DATA) \
  168 + appdata.xml \
  169 + $(DESTDIR)$(datarootdir)/appdata/$(PRODUCT_NAME).appdata.xml
  170 +
141 install-windows: \ 171 install-windows: \
142 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ 172 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \
143 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png \ 173 $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png \
branding/appdata.xml.in 0 → 100644
@@ -0,0 +1,39 @@ @@ -0,0 +1,39 @@
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +<component type="desktop">
  3 + <id>br.com.bb.pw3270</id>
  4 + <name>3270 Terminal</name>
  5 + <name xml:lang="pt_BR">Terminal 3270</name>
  6 + <summary>IBM 3270 Terminal emulator</summary>
  7 + <summary xml:lang="pt_BR">Emulador de terminal IBM 3270</summary>
  8 + <developer_name>perry.werneck@gmail.com</developer_name>
  9 + <description>
  10 + <p>
  11 + GTK Based 3270 terminal emulator
  12 + pw3270 is a modern, GTK-based, completely free tn3270 emulator.
  13 +
  14 + Created originally for Banco do Brasil, it's now an official Brazilian Government Public Software project, and is used worldwide.
  15 + </p>
  16 + </description>
  17 +
  18 + <metadata_license>CC0-1.0</metadata_license>
  19 + <project_license>LGPL-3.0</project_license>
  20 +
  21 + <url type="bugtracker">https://github.com/PerryWerneck/pw3270/issues</url>
  22 + <url type="homepage">https://github.com/PerryWerneck/pw3270</url>
  23 + <project_group>GNOME</project_group>
  24 +
  25 + <launchable type="desktop-id">@PRODUCT_NAME@.desktop</launchable>
  26 +
  27 + <screenshots>
  28 + <screenshot type="default">
  29 + <caption>@PRODUCT_NAME@</caption>
  30 + <image height="600" width="600">https://raw.githubusercontent.com/PerryWerneck/pw3270/master/branding/pw3270-logo.svg</image>
  31 + </screenshot>
  32 + </screenshots>
  33 +
  34 + <update_contact>perry.werneck@gmail.com</update_contact>
  35 +
  36 + <provides>
  37 + <id>@PRODUCT_NAME@pw32.desktop</id>
  38 + </provides>
  39 +</component>
branding/launcher.desktop.in
@@ -3,9 +3,10 @@ X-SuSE-translate=true @@ -3,9 +3,10 @@ X-SuSE-translate=true
3 GenericName=@PRODUCT_NAME@ 3 GenericName=@PRODUCT_NAME@
4 Name=3270 Terminal 4 Name=3270 Terminal
5 Name[pt_BR]=Terminal 3270 5 Name[pt_BR]=Terminal 3270
6 -Comment=@PACKAGE_DESCRIPTION@ 6 +Comment=IBM 3270 Terminal emulator
  7 +Comment[pt_BR]=Emulador de terminal IBM 3270
7 Exec=@PRODUCT_NAME@ %u 8 Exec=@PRODUCT_NAME@ %u
8 -Icon=@PRODUCT_NAME@ 9 +Icon=/usr/share/@PRODUCT_NAME@/icons/@PRODUCT_NAME@.svg
9 Terminal=false 10 Terminal=false
10 Type=Application 11 Type=Application
11 StartupNotify=true 12 StartupNotify=true
@@ -67,7 +67,7 @@ case &quot;$host&quot; in @@ -67,7 +67,7 @@ case &quot;$host&quot; in
67 67
68 CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" 68 CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600"
69 LDFLAGS="$LDFLAGS -pthread" 69 LDFLAGS="$LDFLAGS -pthread"
70 - LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32" 70 + LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32 -lole32 -luuid"
71 71
72 app_win32_revision=$(date +%-y.%-m.%-d.%-H) 72 app_win32_revision=$(date +%-y.%-m.%-d.%-H)
73 AC_SUBST(WIN32_VERSION,$app_win32_revision) 73 AC_SUBST(WIN32_VERSION,$app_win32_revision)
@@ -141,6 +141,10 @@ AC_PATH_TOOL([MSGMERGE], [msgmerge], [no]) @@ -141,6 +141,10 @@ AC_PATH_TOOL([MSGMERGE], [msgmerge], [no])
141 AC_PATH_TOOL([MSGFMT], [msgfmt], [no]) 141 AC_PATH_TOOL([MSGFMT], [msgfmt], [no])
142 AC_PATH_TOOL([VALGRIND], [valgrind], [no]) 142 AC_PATH_TOOL([VALGRIND], [valgrind], [no])
143 143
  144 +AC_PATH_TOOL([SCOUR], [scour], [no])
  145 +AC_PATH_TOOL([APPSTREAMCLI],[appstreamcli], [no])
  146 +AC_PATH_TOOL([STRIP], [strip], [true])
  147 +
144 AC_PATH_TOOL([DESKTOP_INSTALL],[desktop-file-install],[no]) 148 AC_PATH_TOOL([DESKTOP_INSTALL],[desktop-file-install],[no])
145 149
146 PKG_CHECK_EXISTS 150 PKG_CHECK_EXISTS
@@ -245,6 +249,7 @@ AC_CONFIG_FILES(locale/Makefile) @@ -245,6 +249,7 @@ AC_CONFIG_FILES(locale/Makefile)
245 AC_CONFIG_FILES(branding/Makefile) 249 AC_CONFIG_FILES(branding/Makefile)
246 AC_CONFIG_FILES(branding/launcher.desktop) 250 AC_CONFIG_FILES(branding/launcher.desktop)
247 AC_CONFIG_FILES(branding/mime.xml) 251 AC_CONFIG_FILES(branding/mime.xml)
  252 +AC_CONFIG_FILES(branding/appdata.xml)
248 253
249 dnl --------------------------------------------------------------------------- 254 dnl ---------------------------------------------------------------------------
250 dnl Output the generated config.status script. 255 dnl Output the generated config.status script.
icons/gtk-connect-symbolic.svg 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<svg
  3 + xmlns:dc="http://purl.org/dc/elements/1.1/"
  4 + xmlns:cc="http://creativecommons.org/ns#"
  5 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  6 + xmlns:svg="http://www.w3.org/2000/svg"
  7 + xmlns="http://www.w3.org/2000/svg"
  8 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  9 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  10 + version="1.1"
  11 + id="svg851"
  12 + width="256"
  13 + height="256"
  14 + viewBox="0 0 256 256"
  15 + sodipodi:docname="gtk-connect-symbolic.svg"
  16 + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
  17 + <metadata
  18 + id="metadata857">
  19 + <rdf:RDF>
  20 + <cc:Work
  21 + rdf:about="">
  22 + <dc:format>image/svg+xml</dc:format>
  23 + <dc:type
  24 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  25 + <dc:title></dc:title>
  26 + </cc:Work>
  27 + </rdf:RDF>
  28 + </metadata>
  29 + <defs
  30 + id="defs855">
  31 + <marker
  32 + style="overflow:visible"
  33 + id="Arrow1Lstart"
  34 + refX="0.0"
  35 + refY="0.0"
  36 + orient="auto"
  37 + inkscape:stockid="Arrow1Lstart"
  38 + inkscape:isstock="true">
  39 + <path
  40 + transform="scale(0.8) translate(12.5,0)"
  41 + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
  42 + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  43 + id="path1007" />
  44 + </marker>
  45 + </defs>
  46 + <sodipodi:namedview
  47 + pagecolor="#ffffff"
  48 + bordercolor="#666666"
  49 + borderopacity="1"
  50 + objecttolerance="10"
  51 + gridtolerance="10"
  52 + guidetolerance="10"
  53 + inkscape:pageopacity="0"
  54 + inkscape:pageshadow="2"
  55 + inkscape:window-width="1366"
  56 + inkscape:window-height="713"
  57 + id="namedview853"
  58 + showgrid="false"
  59 + inkscape:zoom="1.3921165"
  60 + inkscape:cx="99.069109"
  61 + inkscape:cy="184.6652"
  62 + inkscape:window-x="0"
  63 + inkscape:window-y="25"
  64 + inkscape:window-maximized="1"
  65 + inkscape:current-layer="g859"
  66 + inkscape:document-rotation="0" />
  67 + <g
  68 + inkscape:groupmode="layer"
  69 + inkscape:label="Image"
  70 + id="g859">
  71 + <g
  72 + id="g923"
  73 + transform="matrix(3.7795276,0,0,3.7795276,-118.40429,8.6123775)">
  74 + <path
  75 + id="rect883-3"
  76 + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.858311;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  77 + d="m 92.554935,8.5779117 c -1.798383,-0.1481724 -3.650627,1.2722474 -3.264892,3.1739583 0,13.525103 0,27.050206 0,40.575309 -0.01033,1.949711 3.647396,3.05186 4.472053,1.706431 0,-15.097123 0,-30.194245 0,-45.2913683 -0.392532,-0.1087998 -0.799794,-0.1644515 -1.207161,-0.16433 z m 4.073796,-9.29504033 c -2.07079,-0.0714654 -3.476923,2.03267503 -3.165182,3.95774393 0.01085,19.2643707 -0.0217,38.5298257 0.01628,57.7935187 0.126716,2.110405 2.653929,3.534377 4.522972,2.533701 0,-21.322901 0,-42.645803 0,-63.96870376 -0.426607,-0.20655366 -0.89981,-0.31703838 -1.374071,-0.31625987 z" />
  78 + <path
  79 + id="path930-7"
  80 + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.11486;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  81 + d="M 82.489067,12.90927 A 15.467497,18.678622 0 0 0 68.038271,24.929209 H 52.736878 c -1.91384,0 -3.45457,1.540729 -3.45457,3.454569 v 6.097817 c 0,1.913843 1.54073,3.454572 3.45457,3.454572 h 15.205791 a 15.467497,18.678622 0 0 0 14.546398,12.330512 15.467497,18.678622 0 0 0 7.232118,-2.168342 V 15.077612 A 15.467497,18.678622 0 0 0 82.489067,12.90927 Z" />
  82 + </g>
  83 + </g>
  84 +</svg>
icons/gtk-disconnect-symbolic.svg 0 → 100644
@@ -0,0 +1,84 @@ @@ -0,0 +1,84 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 +<svg
  3 + xmlns:dc="http://purl.org/dc/elements/1.1/"
  4 + xmlns:cc="http://creativecommons.org/ns#"
  5 + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  6 + xmlns:svg="http://www.w3.org/2000/svg"
  7 + xmlns="http://www.w3.org/2000/svg"
  8 + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
  9 + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
  10 + version="1.1"
  11 + id="svg851"
  12 + width="256"
  13 + height="256"
  14 + viewBox="0 0 256 256"
  15 + sodipodi:docname="gtk-disconnect-symbolic.svg"
  16 + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
  17 + <metadata
  18 + id="metadata857">
  19 + <rdf:RDF>
  20 + <cc:Work
  21 + rdf:about="">
  22 + <dc:format>image/svg+xml</dc:format>
  23 + <dc:type
  24 + rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
  25 + <dc:title></dc:title>
  26 + </cc:Work>
  27 + </rdf:RDF>
  28 + </metadata>
  29 + <defs
  30 + id="defs855">
  31 + <marker
  32 + style="overflow:visible"
  33 + id="Arrow1Lstart"
  34 + refX="0.0"
  35 + refY="0.0"
  36 + orient="auto"
  37 + inkscape:stockid="Arrow1Lstart"
  38 + inkscape:isstock="true">
  39 + <path
  40 + transform="scale(0.8) translate(12.5,0)"
  41 + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
  42 + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
  43 + id="path1007" />
  44 + </marker>
  45 + </defs>
  46 + <sodipodi:namedview
  47 + pagecolor="#ffffff"
  48 + bordercolor="#666666"
  49 + borderopacity="1"
  50 + objecttolerance="10"
  51 + gridtolerance="10"
  52 + guidetolerance="10"
  53 + inkscape:pageopacity="0"
  54 + inkscape:pageshadow="2"
  55 + inkscape:window-width="1366"
  56 + inkscape:window-height="713"
  57 + id="namedview853"
  58 + showgrid="false"
  59 + inkscape:zoom="1.3921165"
  60 + inkscape:cx="108.83539"
  61 + inkscape:cy="125.36992"
  62 + inkscape:window-x="0"
  63 + inkscape:window-y="25"
  64 + inkscape:window-maximized="1"
  65 + inkscape:current-layer="g859"
  66 + inkscape:document-rotation="0" />
  67 + <g
  68 + inkscape:groupmode="layer"
  69 + inkscape:label="Image"
  70 + id="g859">
  71 + <g
  72 + id="g927"
  73 + transform="matrix(3.7795276,0,0,3.7795276,-161.57965,-402.67362)">
  74 + <path
  75 + id="rect883-3-6"
  76 + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.858311;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  77 + d="m 103.7142,117.39733 c -1.79838,-0.14817 -3.65063,1.27225 -3.26489,3.17396 0,13.5251 0,27.0502 0,40.5753 -0.0103,1.94971 3.6474,3.05189 4.47205,1.70644 0,-15.09713 0,-30.19425 0,-45.29137 -0.39253,-0.1088 -0.79979,-0.16445 -1.20716,-0.16433 z m 4.0738,-9.29504 c -2.07079,-0.0715 -3.47692,2.03267 -3.16518,3.95774 0.0108,19.26437 -0.0217,38.52983 0.0163,57.79352 0.12672,2.11041 2.65393,3.53439 4.52297,2.5337 0,-21.3229 0,-42.6458 0,-63.9687 -0.42661,-0.20656 -0.89981,-0.31704 -1.37407,-0.31626 z" />
  78 + <path
  79 + id="path930"
  80 + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.11486;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
  81 + d="M 77.280561,122.17098 A 15.467497,18.678622 0 0 0 62.829766,134.19091 H 47.528374 c -1.913834,0 -3.45457,1.54073 -3.45457,3.45457 v 6.09782 c 0,1.91384 1.540736,3.45457 3.45457,3.45457 h 15.20579 a 15.467497,18.678622 0 0 0 14.546397,12.33051 15.467497,18.678622 0 0 0 7.463112,-2.3182 v -4.08812 h 8.846487 c 1.75914,0 3.175,-1.41638 3.175,-3.17552 v -2.35489 c 0,-1.75914 -1.41586,-3.17552 -3.175,-3.17552 h -8.846487 v -7.1329 h 8.901264 c 1.759143,0 3.175518,-1.41638 3.175518,-3.17552 v -2.35489 c 0,-1.75914 -1.416375,-3.17552 -3.175518,-3.17552 h -8.901264 v -4.0876 a 15.467497,18.678622 0 0 0 -7.463112,-2.31872 z" />
  82 + </g>
  83 + </g>
  84 +</svg>
locale/pt_BR.po
@@ -5,8 +5,8 @@ msgid &quot;&quot; @@ -5,8 +5,8 @@ msgid &quot;&quot;
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-08-05 16:03-0300\n"  
9 -"PO-Revision-Date: 2020-06-06 11:11-0300\n" 8 +"POT-Creation-Date: 2020-10-15 13:43-0300\n"
  9 +"PO-Revision-Date: 2020-10-15 13:45-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"
@@ -20,17 +20,37 @@ msgstr &quot;&quot; @@ -20,17 +20,37 @@ msgstr &quot;&quot;
20 "11) ? 2 : 3;\n" 20 "11) ? 2 : 3;\n"
21 "X-Generator: Gtranslator 2.91.7\n" 21 "X-Generator: Gtranslator 2.91.7\n"
22 22
23 -#: src/objects/application/application.c:208 23 +#: src/objects/application/application.c:206
24 #, c-format 24 #, c-format
25 msgid "\"%s\" is not a valid user interface name" 25 msgid "\"%s\" is not a valid user interface name"
26 msgstr "\"%s\" não é um nome válido para interface de usuário" 26 msgstr "\"%s\" não é um nome válido para interface de usuário"
27 27
28 -#: src/objects/application/actions/about.c:96 28 +#: src/objects/application/actions/about.c:93
  29 +msgid "32 bits Linux"
  30 +msgstr "Linux 32 bits"
  31 +
  32 +#: src/objects/application/actions/about.c:91
  33 +msgid "32 bits Windows"
  34 +msgstr "Windows 32 bits"
  35 +
  36 +#: src/objects/actions/save.c:156 src/objects/os/linux/savedesktopicon.c:267
  37 +msgid "3270 session files"
  38 +msgstr "Arquivos de sessão TN3270"
  39 +
  40 +#: src/objects/application/actions/about.c:87
29 #, c-format 41 #, c-format
30 -msgid "3270 terminal emulator for GTK %d.%d"  
31 -msgstr "Emulador 3270 para GTK+ %d.%d" 42 +msgid "3270 terminal emulator for %s."
  43 +msgstr "Emulador 3270 para %s"
  44 +
  45 +#: src/objects/application/actions/about.c:95
  46 +msgid "64 bits Linux"
  47 +msgstr "Linux 64 bits"
  48 +
  49 +#: src/objects/application/actions/about.c:89
  50 +msgid "64 bits Windows"
  51 +msgstr "Windows 64 bits"
32 52
33 -#: src/objects/application/actions/about.c:161 ui/application.xml:39 53 +#: src/objects/application/actions/about.c:188 ui/application.xml:39
34 #: ui/application.xml:537 54 #: ui/application.xml:537
35 msgid "About PW3270" 55 msgid "About PW3270"
36 msgstr "Sobre o PW3270" 56 msgstr "Sobre o PW3270"
@@ -39,23 +59,23 @@ msgstr &quot;Sobre o PW3270&quot; @@ -39,23 +59,23 @@ msgstr &quot;Sobre o PW3270&quot;
39 msgid "Action Name" 59 msgid "Action Name"
40 msgstr "Nome da ação" 60 msgstr "Nome da ação"
41 61
42 -#: src/objects/window/window.c:163 src/objects/toolbar/toolbar.c:135 62 +#: src/objects/window/window.c:184
43 msgid "Action Names" 63 msgid "Action Names"
44 msgstr "Nome das ações" 64 msgstr "Nome das ações"
45 65
46 -#: ui/window.xml:369 ui/window.xml:479 ui/application.xml:509 66 +#: ui/window.xml:379 ui/window.xml:494 ui/application.xml:509
47 msgid "Alert sound" 67 msgid "Alert sound"
48 msgstr "Aviso sonoro" 68 msgstr "Aviso sonoro"
49 69
50 -#: src/main/tools.c:99 70 +#: src/main/tools.c:99 src/tools/entry.c:88
51 msgid "All files" 71 msgid "All files"
52 msgstr "Todos os arquivos" 72 msgstr "Todos os arquivos"
53 73
54 -#: ui/window.xml:168 ui/application.xml:251 74 +#: ui/window.xml:178 ui/application.xml:251
55 msgid "Append to copy" 75 msgid "Append to copy"
56 msgstr "Adicionar à cópia" 76 msgstr "Adicionar à cópia"
57 77
58 -#: src/objects/application/actions/about.c:126 78 +#: src/objects/application/actions/about.c:129
59 msgid "Apple version" 79 msgid "Apple version"
60 msgstr "Versão Apple" 80 msgstr "Versão Apple"
61 81
@@ -63,11 +83,15 @@ msgstr &quot;Versão Apple&quot; @@ -63,11 +83,15 @@ msgstr &quot;Versão Apple&quot;
63 msgid "Application" 83 msgid "Application"
64 msgstr "Aplicação" 84 msgstr "Aplicação"
65 85
66 -#: src/objects/application/actions/preferences.c:69 ui/application.xml:83 86 +#: src/objects/window/header-settings.c:123
  87 +msgid "Application menu"
  88 +msgstr "Menu da aplicação"
  89 +
  90 +#: src/objects/application/actions/preferences.c:76 ui/application.xml:83
67 msgid "Application preferences" 91 msgid "Application preferences"
68 msgstr "Preferências da aplicação" 92 msgstr "Preferências da aplicação"
69 93
70 -#: src/objects/window/page.c:263 94 +#: src/objects/window/page.c:264
71 msgid "Apply" 95 msgid "Apply"
72 msgstr "Aplicar" 96 msgstr "Aplicar"
73 97
@@ -75,15 +99,15 @@ msgstr &quot;Aplicar&quot; @@ -75,15 +99,15 @@ msgstr &quot;Aplicar&quot;
75 msgid "Auto-Reconnect" 99 msgid "Auto-Reconnect"
76 msgstr "Reconectar automaticamente" 100 msgstr "Reconectar automaticamente"
77 101
78 -#: src/objects/toolbar/settings.c:114 102 +#: src/objects/toolbar/settings.c:112 src/objects/settings/actionview.c:73
79 msgid "Available" 103 msgid "Available"
80 msgstr "Disponível" 104 msgstr "Disponível"
81 105
82 -#: src/objects/application/actions/about.c:130 106 +#: src/objects/application/actions/about.c:132
83 msgid "Based on X3270 from" 107 msgid "Based on X3270 from"
84 msgstr "Baseado no X3270 por" 108 msgstr "Baseado no X3270 por"
85 109
86 -#: ui/window.xml:398 ui/application.xml:474 110 +#: ui/window.xml:408 ui/application.xml:474
87 msgid "Blank Fill" 111 msgid "Blank Fill"
88 msgstr "Completar com espaços" 112 msgstr "Completar com espaços"
89 113
@@ -95,21 +119,17 @@ msgstr &quot;Cursor piscante&quot; @@ -95,21 +119,17 @@ msgstr &quot;Cursor piscante&quot;
95 msgid "Bold" 119 msgid "Bold"
96 msgstr "Negrito" 120 msgstr "Negrito"
97 121
98 -#: src/objects/application/actions/about.c:142  
99 -msgid "Brazilian Public Software Portal"  
100 -msgstr "Portal do Software Público Brasileiro" 122 +#: src/objects/window/terminal.c:165
  123 +msgid "Can't load session file"
  124 +msgstr "Não foi possível carregar arquivo de sessão"
101 125
102 -#: src/objects/window/terminal.c:197 126 +#: src/objects/window/terminal.c:160
103 #, c-format 127 #, c-format
104 -msgid "Can't save file \"%s\""  
105 -msgstr "Não foi possível salvar arquivo \"%s\""  
106 -  
107 -#: src/objects/window/terminal.c:202  
108 -msgid "Can't save session file"  
109 -msgstr "Não foi possível salvar arquivo de sessão" 128 +msgid "Can't use \"%s\""
  129 +msgstr "Não posso usar %s"
110 130
111 -#: src/objects/actions/save.c:65 src/objects/application/actions/open.c:49  
112 -#: src/objects/window/page.c:264 131 +#: src/objects/application/actions/open.c:49 src/objects/window/page.c:265
  132 +#: src/tools/entry.c:71
113 msgid "Cancel" 133 msgid "Cancel"
114 msgstr "_Cancelar" 134 msgstr "_Cancelar"
115 135
@@ -117,7 +137,19 @@ msgstr &quot;_Cancelar&quot; @@ -117,7 +137,19 @@ msgstr &quot;_Cancelar&quot;
117 msgid "Change terminal colors" 137 msgid "Change terminal colors"
118 msgstr "Mudar cores do terminal" 138 msgstr "Mudar cores do terminal"
119 139
120 -#: ui/window.xml:182 ui/window.xml:324 ui/application.xml:304 140 +#: src/objects/application/actions/preferences.c:78
  141 +msgid "Change the application preferences"
  142 +msgstr "Modificar preferências da aplicação"
  143 +
  144 +#: src/objects/window/header-settings.c:98
  145 +msgid "Change the position of the title bar icons"
  146 +msgstr "Modificar posição dos ícones da barra de título"
  147 +
  148 +#: src/objects/window/actions/sessionproperties.c:47
  149 +msgid "Change the preferences for the active session"
  150 +msgstr "Modificar preferências da sessão ativa"
  151 +
  152 +#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:304
121 msgid "Clear" 153 msgid "Clear"
122 msgstr "Limpar" 154 msgstr "Limpar"
123 155
@@ -134,8 +166,8 @@ msgstr &quot;Fecha todas as janelas e encerra a aplicação&quot; @@ -134,8 +166,8 @@ msgstr &quot;Fecha todas as janelas e encerra a aplicação&quot;
134 msgid "Close the window" 166 msgid "Close the window"
135 msgstr "Fechar a janela" 167 msgstr "Fechar a janela"
136 168
137 -#: src/objects/window/actions/close.c:60 ui/window.xml:270 ui/window.xml:458  
138 -#: ui/window.xml:560 ui/application.xml:216 169 +#: src/objects/window/actions/close.c:60 ui/window.xml:280 ui/window.xml:473
  170 +#: ui/window.xml:580 ui/application.xml:216
139 msgid "Close window" 171 msgid "Close window"
140 msgstr "Fechar janela" 172 msgstr "Fechar janela"
141 173
@@ -143,6 +175,10 @@ msgstr &quot;Fechar janela&quot; @@ -143,6 +175,10 @@ msgstr &quot;Fechar janela&quot;
143 msgid "Colors" 175 msgid "Colors"
144 msgstr "Cores" 176 msgstr "Cores"
145 177
  178 +#: src/objects/os/linux/savedesktopicon.c:101
  179 +msgid "Comment"
  180 +msgstr "Comentário"
  181 +
146 #: src/objects/window/actions/connect.c:59 182 #: src/objects/window/actions/connect.c:59
147 msgid "Connect" 183 msgid "Connect"
148 msgstr "Conectar" 184 msgstr "Conectar"
@@ -155,11 +191,15 @@ msgstr &quot;Conectar ao iniciar&quot; @@ -155,11 +191,15 @@ msgstr &quot;Conectar ao iniciar&quot;
155 msgid "Connect to host" 191 msgid "Connect to host"
156 msgstr "Conectar ao servidor" 192 msgstr "Conectar ao servidor"
157 193
158 -#: src/objects/window/window.c:702 src/objects/window/page.c:217 194 +#: src/objects/window/window.c:753 src/objects/window/page.c:218
159 msgid "Connected to host" 195 msgid "Connected to host"
160 msgstr "Conectado no servidor" 196 msgstr "Conectado no servidor"
161 197
162 -#: src/objects/application/actions/about.c:127 198 +#: src/tools/entry.c:131
  199 +msgid "Continue"
  200 +msgstr "Continuar"
  201 +
  202 +#: src/objects/application/actions/about.c:130
163 msgid "Contributors" 203 msgid "Contributors"
164 msgstr "Contribuidores" 204 msgstr "Contribuidores"
165 205
@@ -167,6 +207,14 @@ msgstr &quot;Contribuidores&quot; @@ -167,6 +207,14 @@ msgstr &quot;Contribuidores&quot;
167 msgid "Copy" 207 msgid "Copy"
168 msgstr "Copiar" 208 msgstr "Copiar"
169 209
  210 +#: ui/window.xml:168
  211 +msgid "Copy as HTML"
  212 +msgstr "Copiar como HTML"
  213 +
  214 +#: ui/window.xml:173
  215 +msgid "Copy as image"
  216 +msgstr "Copiar como imagem"
  217 +
170 #: ui/window.xml:163 ui/application.xml:246 218 #: ui/window.xml:163 ui/application.xml:246
171 msgid "Copy as table" 219 msgid "Copy as table"
172 msgstr "Copiar como tabela" 220 msgstr "Copiar como tabela"
@@ -175,11 +223,11 @@ msgstr &quot;Copiar como tabela&quot; @@ -175,11 +223,11 @@ msgstr &quot;Copiar como tabela&quot;
175 msgid "Copy as text" 223 msgid "Copy as text"
176 msgstr "Copiar como texto" 224 msgstr "Copiar como texto"
177 225
178 -#: src/objects/windows/savedesktopicon.c:79  
179 -msgid "Create a desktop icon for the current session"  
180 -msgstr "Criar ícone da área de trabalho para a sessão atual." 226 +#: src/objects/os/linux/savedesktopicon.c:114
  227 +msgid "Create shortcut for the current session"
  228 +msgstr "Criar atalho para a sessão atual."
181 229
182 -#: ui/window.xml:359 ui/application.xml:459 230 +#: ui/window.xml:369 ui/application.xml:459
183 msgid "Cross hair cursor" 231 msgid "Cross hair cursor"
184 msgstr "Cursor mira" 232 msgstr "Cursor mira"
185 233
@@ -195,28 +243,24 @@ msgstr &quot;Tela atual&quot; @@ -195,28 +243,24 @@ msgstr &quot;Tela atual&quot;
195 msgid "Current session" 243 msgid "Current session"
196 msgstr "Sessão atual" 244 msgstr "Sessão atual"
197 245
198 -#: ui/window.xml:173 ui/application.xml:256 246 +#: ui/window.xml:183 ui/application.xml:256
199 msgid "Cut" 247 msgid "Cut"
200 msgstr "Recortar" 248 msgstr "Recortar"
201 249
202 -#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:314 250 +#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:314
203 msgid "Delete Field" 251 msgid "Delete Field"
204 msgstr "Apagar campo" 252 msgstr "Apagar campo"
205 253
206 -#: ui/window.xml:93 ui/application.xml:158  
207 -msgid "Desktop icon"  
208 -msgstr "Ícone da área de trabalho"  
209 -  
210 -#: ui/window.xml:265 ui/window.xml:453 254 +#: ui/window.xml:275 ui/window.xml:468
211 msgid "Disconnect" 255 msgid "Disconnect"
212 msgstr "Desconectar" 256 msgstr "Desconectar"
213 257
214 -#: src/objects/window/window.c:702 src/objects/window/window.c:729  
215 -#: src/objects/window/page.c:206 258 +#: src/objects/window/window.c:753 src/objects/window/window.c:780
  259 +#: src/objects/window/page.c:207
216 msgid "Disconnected from host" 260 msgid "Disconnected from host"
217 msgstr "Desconectado do servidor" 261 msgstr "Desconectado do servidor"
218 262
219 -#: ui/window.xml:381 ui/window.xml:492 ui/application.xml:524 263 +#: ui/window.xml:391 ui/window.xml:507 ui/application.xml:524
220 msgid "Dynamic font spacing" 264 msgid "Dynamic font spacing"
221 msgstr "Espaçamento dinâmico" 265 msgstr "Espaçamento dinâmico"
222 266
@@ -240,15 +284,19 @@ msgstr &quot;Largura do elemento em colunas&quot; @@ -240,15 +284,19 @@ msgstr &quot;Largura do elemento em colunas&quot;
240 msgid "Enabled" 284 msgid "Enabled"
241 msgstr "Habilitado" 285 msgstr "Habilitado"
242 286
243 -#: ui/window.xml:187 ui/window.xml:329 ui/application.xml:309 287 +#: src/objects/settings/actionview.c:78
  288 +msgid "End"
  289 +msgstr "Final"
  290 +
  291 +#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:309
244 msgid "Erase input" 292 msgid "Erase input"
245 msgstr "Apagar campos" 293 msgstr "Apagar campos"
246 294
247 -#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:319 295 +#: ui/window.xml:207 ui/window.xml:349 ui/application.xml:319
248 msgid "Erase to end of field" 296 msgid "Erase to end of field"
249 msgstr "Apagar até o final do campo" 297 msgstr "Apagar até o final do campo"
250 298
251 -#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:324 299 +#: ui/window.xml:212 ui/window.xml:354 ui/application.xml:324
252 msgid "Erase to end of line" 300 msgid "Erase to end of line"
253 msgstr "Apagar até o final da linha" 301 msgstr "Apagar até o final da linha"
254 302
@@ -256,15 +304,11 @@ msgstr &quot;Apagar até o final da linha&quot; @@ -256,15 +304,11 @@ msgstr &quot;Apagar até o final da linha&quot;
256 msgid "Field attributes" 304 msgid "Field attributes"
257 msgstr "Mostra atributos de campo" 305 msgstr "Mostra atributos de campo"
258 306
259 -#: src/objects/windows/savedesktopicon.c:62  
260 -msgid "File name"  
261 -msgstr "Nome do arquivo"  
262 -  
263 #: ui/application.xml:454 307 #: ui/application.xml:454
264 msgid "Full Screen" 308 msgid "Full Screen"
265 msgstr "Tela cheia" 309 msgstr "Tela cheia"
266 310
267 -#: ui/window.xml:236 ui/window.xml:407 ui/window.xml:497 311 +#: ui/window.xml:246 ui/window.xml:417 ui/window.xml:512
268 msgid "Full screen" 312 msgid "Full screen"
269 msgstr "Tela cheia" 313 msgstr "Tela cheia"
270 314
@@ -272,6 +316,10 @@ msgstr &quot;Tela cheia&quot; @@ -272,6 +316,10 @@ msgstr &quot;Tela cheia&quot;
272 msgid "Function bar" 316 msgid "Function bar"
273 msgstr "Barra de funções" 317 msgstr "Barra de funções"
274 318
  319 +#: src/objects/os/linux/savedesktopicon.c:94
  320 +msgid "Generic name"
  321 +msgstr "Nome genérico"
  322 +
275 #: ui/application.xml:36 ui/application.xml:534 323 #: ui/application.xml:36 ui/application.xml:534
276 msgid "Help" 324 msgid "Help"
277 msgstr "Ajuda" 325 msgstr "Ajuda"
@@ -280,11 +328,11 @@ msgstr &quot;Ajuda&quot; @@ -280,11 +328,11 @@ msgstr &quot;Ajuda&quot;
280 msgid "Host properties" 328 msgid "Host properties"
281 msgstr "Propriedades do Servidor" 329 msgstr "Propriedades do Servidor"
282 330
283 -#: src/objects/window/window.c:469 331 +#: src/objects/window/window.c:552 src/objects/os/linux/savedesktopicon.c:102
284 msgid "IBM 3270 Terminal emulator" 332 msgid "IBM 3270 Terminal emulator"
285 msgstr "Emulador 3270" 333 msgstr "Emulador 3270"
286 334
287 -#: src/objects/actions/view.c:89 335 +#: src/objects/actions/view.c:90
288 msgid "Icon" 336 msgid "Icon"
289 msgstr "Ícone" 337 msgstr "Ícone"
290 338
@@ -292,19 +340,27 @@ msgstr &quot;Ícone&quot; @@ -292,19 +340,27 @@ msgstr &quot;Ícone&quot;
292 msgid "Icon Name" 340 msgid "Icon Name"
293 msgstr "Nome do ícone" 341 msgstr "Nome do ícone"
294 342
295 -#: src/objects/toolbar/settings.c:50 343 +#: src/objects/toolbar/settings.c:54
296 msgid "Icon Size" 344 msgid "Icon Size"
297 msgstr "Tamanho do ícone" 345 msgstr "Tamanho do ícone"
298 346
299 -#: src/objects/toolbar/toolbar.c:262 347 +#: src/objects/toolbar/settings.c:61
  348 +msgid "Icon Style"
  349 +msgstr "Estilo do ícone"
  350 +
  351 +#: src/objects/toolbar/models.c:52
300 msgid "Icon _size" 352 msgid "Icon _size"
301 msgstr "_Tamanho do ícone" 353 msgstr "_Tamanho do ícone"
302 354
303 -#: src/objects/toolbar/toolbar.c:84 355 +#: src/objects/toolbar/models.c:108
  356 +msgid "Icon type"
  357 +msgstr "Tipo do ícone"
  358 +
  359 +#: src/objects/toolbar/models.c:97
304 msgid "Icons & text" 360 msgid "Icons & text"
305 msgstr "Ícones e texto" 361 msgstr "Ícones e texto"
306 362
307 -#: src/objects/toolbar/toolbar.c:74 363 +#: src/objects/toolbar/models.c:87
308 msgid "Icons only" 364 msgid "Icons only"
309 msgstr "Apenas ícones" 365 msgstr "Apenas ícones"
310 366
@@ -312,7 +368,7 @@ msgstr &quot;Apenas ícones&quot; @@ -312,7 +368,7 @@ msgstr &quot;Apenas ícones&quot;
312 msgid "If the action can be activated" 368 msgid "If the action can be activated"
313 msgstr "Se a ação pode ser ativada" 369 msgstr "Se a ação pode ser ativada"
314 370
315 -#: ui/window.xml:469 371 +#: ui/window.xml:484
316 msgid "Insert" 372 msgid "Insert"
317 msgstr "Inserção" 373 msgstr "Inserção"
318 374
@@ -320,7 +376,15 @@ msgstr &quot;Inserção&quot; @@ -320,7 +376,15 @@ msgstr &quot;Inserção&quot;
320 msgid "Invalid or unknown property type" 376 msgid "Invalid or unknown property type"
321 msgstr "Tipo da propriedade é inválido ou desconhecido" 377 msgstr "Tipo da propriedade é inválido ou desconhecido"
322 378
323 -#: src/objects/toolbar/settings.c:108 379 +#: src/objects/settings/actionview.c:79
  380 +msgid "Items packed from the end to the start"
  381 +msgstr "Itens empacotados do final para o início"
  382 +
  383 +#: src/objects/settings/actionview.c:69
  384 +msgid "Items packed from the start to the end"
  385 +msgstr "Itens empacotados do início para o final"
  386 +
  387 +#: src/objects/toolbar/settings.c:106
324 msgid "Itens" 388 msgid "Itens"
325 msgstr "Itens" 389 msgstr "Itens"
326 390
@@ -348,22 +412,26 @@ msgstr &quot;Largura do painel em colunas&quot; @@ -348,22 +412,26 @@ msgstr &quot;Largura do painel em colunas&quot;
348 msgid "Keypads" 412 msgid "Keypads"
349 msgstr "Painéis" 413 msgstr "Painéis"
350 414
351 -#: src/objects/actions/view.c:98 415 +#: src/objects/application/actions/about.c:140
  416 +msgid "LICENSE"
  417 +msgstr "LICENCA"
  418 +
  419 +#: src/objects/actions/view.c:99
352 msgid "Label" 420 msgid "Label"
353 msgstr "Etiqueta" 421 msgstr "Etiqueta"
354 422
355 -#: src/objects/toolbar/toolbar.c:58 423 +#: src/objects/toolbar/models.c:66
356 msgid "Large" 424 msgid "Large"
357 msgstr "Grande" 425 msgstr "Grande"
358 426
359 -#: src/objects/windows/savedesktopicon.c:67  
360 -msgid "Launcher name"  
361 -msgstr "Nome do lançador"  
362 -  
363 -#: src/objects/toolbar/settings.c:207 427 +#: src/objects/toolbar/settings.c:176
364 msgid "Layout" 428 msgid "Layout"
365 msgstr "Formato" 429 msgstr "Formato"
366 430
  431 +#: src/objects/settings/actionview.c:74
  432 +msgid "List of the available and unpacked actions"
  433 +msgstr "Lista de ações disponíveis ainda não empacotadas"
  434 +
367 #: ui/application.xml:71 435 #: ui/application.xml:71
368 msgid "Main Menu" 436 msgid "Main Menu"
369 msgstr "Menu principal" 437 msgstr "Menu principal"
@@ -372,11 +440,11 @@ msgstr &quot;Menu principal&quot; @@ -372,11 +440,11 @@ msgstr &quot;Menu principal&quot;
372 msgid "Main Toolbar" 440 msgid "Main Toolbar"
373 msgstr "Barra de ferramentas" 441 msgstr "Barra de ferramentas"
374 442
375 -#: ui/window.xml:540 443 +#: ui/window.xml:555
376 msgid "Main menu" 444 msgid "Main menu"
377 msgstr "Menu principal" 445 msgstr "Menu principal"
378 446
379 -#: src/objects/application/actions/about.c:125 447 +#: src/objects/application/actions/about.c:128
380 msgid "Maintainers" 448 msgid "Maintainers"
381 msgstr "Mantenedores" 449 msgstr "Mantenedores"
382 450
@@ -384,23 +452,23 @@ msgstr &quot;Mantenedores&quot; @@ -384,23 +452,23 @@ msgstr &quot;Mantenedores&quot;
384 msgid "Menu" 452 msgid "Menu"
385 msgstr "Menu" 453 msgstr "Menu"
386 454
387 -#: ui/window.xml:506 ui/application.xml:403 455 +#: ui/window.xml:521 ui/application.xml:403
388 msgid "Model 2 - 80x24" 456 msgid "Model 2 - 80x24"
389 msgstr "Modelo 2 - 80x24" 457 msgstr "Modelo 2 - 80x24"
390 458
391 -#: ui/window.xml:511 ui/application.xml:408 459 +#: ui/window.xml:526 ui/application.xml:408
392 msgid "Model 3 - 80x32" 460 msgid "Model 3 - 80x32"
393 msgstr "Modelo 3 - 80x32" 461 msgstr "Modelo 3 - 80x32"
394 462
395 -#: ui/window.xml:516 ui/application.xml:413 463 +#: ui/window.xml:531 ui/application.xml:413
396 msgid "Model 4 - 80x43" 464 msgid "Model 4 - 80x43"
397 msgstr "Modelo 4 - 80x43" 465 msgstr "Modelo 4 - 80x43"
398 466
399 -#: ui/window.xml:521 ui/application.xml:418 467 +#: ui/window.xml:536 ui/application.xml:418
400 msgid "Model 5 - 132x27" 468 msgid "Model 5 - 132x27"
401 msgstr "Modelo 5 - 132x27" 469 msgstr "Modelo 5 - 132x27"
402 470
403 -#: ui/window.xml:376 ui/application.xml:444 471 +#: ui/window.xml:386 ui/application.xml:444
404 msgid "Monocase" 472 msgid "Monocase"
405 msgstr "Só Maiúsculas" 473 msgstr "Só Maiúsculas"
406 474
@@ -408,7 +476,7 @@ msgstr &quot;Só Maiúsculas&quot; @@ -408,7 +476,7 @@ msgstr &quot;Só Maiúsculas&quot;
408 msgid "Network keep alive" 476 msgid "Network keep alive"
409 msgstr "Network keep alive" 477 msgstr "Network keep alive"
410 478
411 -#: src/objects/window/page.c:274 479 +#: src/objects/window/page.c:275
412 msgid "New session name" 480 msgid "New session name"
413 msgstr "Novo nome de sessão" 481 msgstr "Novo nome de sessão"
414 482
@@ -456,7 +524,7 @@ msgstr &quot;Abrir sessão em nova aba&quot; @@ -456,7 +524,7 @@ msgstr &quot;Abrir sessão em nova aba&quot;
456 msgid "Open session in New window" 524 msgid "Open session in New window"
457 msgstr "Abrir sessão em nova janela" 525 msgstr "Abrir sessão em nova janela"
458 526
459 -#: ui/window.xml:212 ui/window.xml:354 ui/window.xml:489 ui/application.xml:431 527 +#: ui/window.xml:222 ui/window.xml:364 ui/window.xml:504 ui/application.xml:431
460 msgid "Options" 528 msgid "Options"
461 msgstr "Opções" 529 msgstr "Opções"
462 530
@@ -464,22 +532,26 @@ msgstr &quot;Opções&quot; @@ -464,22 +532,26 @@ msgstr &quot;Opções&quot;
464 msgid "Parameter Type" 532 msgid "Parameter Type"
465 msgstr "Tipo de parâmetro" 533 msgstr "Tipo de parâmetro"
466 534
467 -#: ui/window.xml:286 ui/application.xml:261 535 +#: ui/window.xml:296 ui/application.xml:261
468 msgid "Paste from clipboard" 536 msgid "Paste from clipboard"
469 msgstr "Colar da área de transferência" 537 msgstr "Colar da área de transferência"
470 538
471 -#: ui/window.xml:296 ui/application.xml:271 539 +#: ui/window.xml:306 ui/application.xml:271
472 msgid "Paste from text file" 540 msgid "Paste from text file"
473 msgstr "Colar de um arquivo texto" 541 msgstr "Colar de um arquivo texto"
474 542
475 -#: ui/window.xml:291 ui/application.xml:266 543 +#: ui/window.xml:301 ui/application.xml:266
476 msgid "Paste next" 544 msgid "Paste next"
477 msgstr "Colar próximo" 545 msgstr "Colar próximo"
478 546
479 -#: ui/window.xml:393 ui/application.xml:469 547 +#: ui/window.xml:403 ui/application.xml:469
480 msgid "Paste with left margin" 548 msgid "Paste with left margin"
481 msgstr "Colar com margem esquerda" 549 msgstr "Colar com margem esquerda"
482 550
  551 +#: src/objects/os/linux/savedesktopicon.c:71
  552 +msgid "Path for the new shortcut"
  553 +msgstr "Caminho para o novo atalho"
  554 +
483 #: ui/window.xml:129 555 #: ui/window.xml:129
484 msgid "Preferences" 556 msgid "Preferences"
485 msgstr "Preferências" 557 msgstr "Preferências"
@@ -488,11 +560,11 @@ msgstr &quot;Preferências&quot; @@ -488,11 +560,11 @@ msgstr &quot;Preferências&quot;
488 msgid "Print" 560 msgid "Print"
489 msgstr "Imprimir" 561 msgstr "Imprimir"
490 562
491 -#: ui/window.xml:439 563 +#: ui/window.xml:454
492 msgid "Print screen" 564 msgid "Print screen"
493 msgstr "Imrpimir o conteúdo da tela" 565 msgstr "Imrpimir o conteúdo da tela"
494 566
495 -#: ui/window.xml:252 567 +#: ui/window.xml:262
496 msgid "Print selected" 568 msgid "Print selected"
497 msgstr "Imprimir seleção" 569 msgstr "Imprimir seleção"
498 570
@@ -505,15 +577,15 @@ msgstr &quot;Propriedade \&quot;%s\&quot; é inválida para este objeto&quot; @@ -505,15 +577,15 @@ msgstr &quot;Propriedade \&quot;%s\&quot; é inválida para este objeto&quot;
505 msgid "Quit" 577 msgid "Quit"
506 msgstr "Sair" 578 msgstr "Sair"
507 579
508 -#: src/objects/window/page.c:261 580 +#: src/objects/window/page.c:262
509 msgid "Rename Session" 581 msgid "Rename Session"
510 msgstr "Renomear sessão" 582 msgstr "Renomear sessão"
511 583
512 -#: ui/window.xml:315 ui/application.xml:295 584 +#: ui/window.xml:325 ui/application.xml:295
513 msgid "Reselect" 585 msgid "Reselect"
514 msgstr "Reselecionar" 586 msgstr "Reselecionar"
515 587
516 -#: ui/window.xml:364 ui/application.xml:464 588 +#: ui/window.xml:374 ui/application.xml:464
517 msgid "Resize on alternate screen" 589 msgid "Resize on alternate screen"
518 msgstr "Mudar tamanho do terminal em tela alternativa" 590 msgstr "Mudar tamanho do terminal em tela alternativa"
519 591
@@ -521,55 +593,59 @@ msgstr &quot;Mudar tamanho do terminal em tela alternativa&quot; @@ -521,55 +593,59 @@ msgstr &quot;Mudar tamanho do terminal em tela alternativa&quot;
521 msgid "Right keypad" 593 msgid "Right keypad"
522 msgstr "Painel direito" 594 msgstr "Painel direito"
523 595
524 -#: src/objects/toolbar/toolbar.c:286  
525 -msgid "S_tyle"  
526 -msgstr "E_stilo"  
527 -  
528 -#: src/objects/actions/save.c:64 ui/window.xml:69 ui/application.xml:134 596 +#: ui/window.xml:69 ui/application.xml:134
529 msgid "Save" 597 msgid "Save"
530 msgstr "Salvar" 598 msgstr "Salvar"
531 599
532 -#: src/objects/actions/save.c:49  
533 -msgid "Save As"  
534 -msgstr "Salvar Como"  
535 -  
536 -#: src/objects/windows/savedesktopicon.c:78  
537 -msgid "Save desktop icon"  
538 -msgstr "Salvar ícone da área de trabalho" 600 +#: src/objects/actions/save.c:77
  601 +msgid "Save current session preferences to file"
  602 +msgstr "Salvar preferências da sessão para arquivo"
539 603
540 -#: ui/window.xml:434 604 +#: ui/window.xml:449
541 msgid "Save screen" 605 msgid "Save screen"
542 msgstr "Salvar tela" 606 msgstr "Salvar tela"
543 607
544 -#: ui/window.xml:247 608 +#: ui/window.xml:257
545 msgid "Save selected" 609 msgid "Save selected"
546 msgstr "Salvar seleção" 610 msgstr "Salvar seleção"
547 611
548 -#: src/objects/actions/save.c:51  
549 -msgid "Save session properties"  
550 -msgstr "Salvar propriedades da sessão" 612 +#: src/objects/actions/save.c:75 src/objects/actions/save.c:153
  613 +msgid "Save session preferences"
  614 +msgstr "Salvar preferências da sessão"
  615 +
  616 +#: src/objects/os/linux/savedesktopicon.c:113
  617 +msgid "Save session shortcut"
  618 +msgstr "Salvar atalho para a sessão"
551 619
552 -#: ui/window.xml:503 ui/application.xml:400 620 +#: src/objects/os/linux/savedesktopicon.c:264
  621 +msgid "Save to session filename"
  622 +msgstr "Salvar para arquivo de sessão"
  623 +
  624 +#: src/objects/os/linux/savedesktopicon.c:236
  625 +msgid "Save to shortcut file"
  626 +msgstr "Salvar para atalho"
  627 +
  628 +#: ui/window.xml:518 ui/application.xml:400
553 msgid "Screen size" 629 msgid "Screen size"
554 msgstr "Tamanho da tela" 630 msgstr "Tamanho da tela"
555 631
556 -#: ui/window.xml:310 ui/application.xml:285 632 +#: ui/window.xml:320 ui/application.xml:285
557 msgid "Select Field" 633 msgid "Select Field"
558 msgstr "Selecionar campo" 634 msgstr "Selecionar campo"
559 635
560 -#: ui/window.xml:305 ui/application.xml:280 636 +#: ui/window.xml:315 ui/application.xml:280
561 msgid "Select all" 637 msgid "Select all"
562 msgstr "Selecionar tudo" 638 msgstr "Selecionar tudo"
563 639
564 -#: ui/window.xml:217 ui/application.xml:479 640 +#: ui/window.xml:227 ui/application.xml:479
565 msgid "Select by rectangles" 641 msgid "Select by rectangles"
566 msgstr "Seleção retangular" 642 msgstr "Seleção retangular"
567 643
568 -#: src/objects/toolbar/settings.c:108 644 +#: src/objects/toolbar/settings.c:106
569 msgid "Select the toolbar itens" 645 msgid "Select the toolbar itens"
570 msgstr "Selecione itens da barra de ferramentas" 646 msgstr "Selecione itens da barra de ferramentas"
571 647
572 -#: src/objects/toolbar/settings.c:113 648 +#: src/objects/toolbar/settings.c:111
573 msgid "Selected" 649 msgid "Selected"
574 msgstr "Selecionado" 650 msgstr "Selecionado"
575 651
@@ -582,12 +658,12 @@ msgstr &quot;Área selecionada&quot; @@ -582,12 +658,12 @@ msgstr &quot;Área selecionada&quot;
582 msgid "Send/Receive" 658 msgid "Send/Receive"
583 msgstr "Enviar/Receber" 659 msgstr "Enviar/Receber"
584 660
585 -#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:444 661 +#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:459
586 #: ui/application.xml:195 662 #: ui/application.xml:195
587 msgid "Send/Receive files" 663 msgid "Send/Receive files"
588 msgstr "Enviar/Receber arquivos" 664 msgstr "Enviar/Receber arquivos"
589 665
590 -#: src/objects/toolbar/settings.c:266 src/objects/toolbar/settings.c:276 666 +#: src/objects/toolbar/settings.c:234 src/objects/toolbar/settings.c:244
591 msgid "Separator" 667 msgid "Separator"
592 msgstr "Separador" 668 msgstr "Separador"
593 669
@@ -595,10 +671,14 @@ msgstr &quot;Separador&quot; @@ -595,10 +671,14 @@ msgstr &quot;Separador&quot;
595 msgid "Session" 671 msgid "Session"
596 msgstr "Sessão" 672 msgstr "Sessão"
597 673
598 -#: ui/application.xml:76 674 +#: ui/window.xml:440 ui/window.xml:560 ui/application.xml:76
599 msgid "Session Trace" 675 msgid "Session Trace"
600 msgstr "Trace da sessão" 676 msgstr "Trace da sessão"
601 677
  678 +#: src/objects/actions/save.c:63 src/objects/os/linux/savedesktopicon.c:85
  679 +msgid "Session file"
  680 +msgstr "Arquivo de sessão"
  681 +
602 #: ui/window.xml:61 ui/application.xml:126 682 #: ui/window.xml:61 ui/application.xml:126
603 msgid "Session in New Tab" 683 msgid "Session in New Tab"
604 msgstr "Sessão em nova aba" 684 msgstr "Sessão em nova aba"
@@ -607,12 +687,16 @@ msgstr &quot;Sessão em nova aba&quot; @@ -607,12 +687,16 @@ msgstr &quot;Sessão em nova aba&quot;
607 msgid "Session in new window" 687 msgid "Session in new window"
608 msgstr "Sessão em nova janela" 688 msgstr "Sessão em nova janela"
609 689
610 -#: src/objects/window/actions/sessionproperties.c:45 ui/window.xml:98  
611 -#: ui/window.xml:554 ui/application.xml:163  
612 -msgid "Session properties"  
613 -msgstr "Propriedades da sessão" 690 +#: src/objects/actions/save.c:56 src/objects/os/linux/savedesktopicon.c:77
  691 +msgid "Session name"
  692 +msgstr "Nome da sessão"
614 693
615 -#: src/objects/application/application.c:221 694 +#: src/objects/window/actions/sessionproperties.c:46 ui/window.xml:98
  695 +#: ui/window.xml:574 ui/application.xml:163
  696 +msgid "Session preferences"
  697 +msgstr "Preferências da sessão"
  698 +
  699 +#: src/objects/application/application.c:219
616 msgid "Set the user-interface type" 700 msgid "Set the user-interface type"
617 msgstr "Define o tipo de interface do usuário" 701 msgstr "Define o tipo de interface do usuário"
618 702
@@ -620,34 +704,58 @@ msgstr &quot;Define o tipo de interface do usuário&quot; @@ -620,34 +704,58 @@ msgstr &quot;Define o tipo de interface do usuário&quot;
620 msgid "Settings" 704 msgid "Settings"
621 msgstr "Configurações" 705 msgstr "Configurações"
622 706
623 -#: src/objects/toolbar/settings.c:207 707 +#: src/objects/toolbar/settings.c:176
624 msgid "Setup the toolbar layout" 708 msgid "Setup the toolbar layout"
625 msgstr "Configura formato da barra de ferramentas" 709 msgstr "Configura formato da barra de ferramentas"
626 710
627 -#: src/objects/toolbar/settings.c:90 711 +#: src/objects/window/header-settings.c:87
  712 +msgid "Setup title bar"
  713 +msgstr "Configurar barra de título"
  714 +
  715 +#: src/objects/toolbar/toolbar.c:214 src/objects/toolbar/settings.c:88
628 msgid "Setup toolbar" 716 msgid "Setup toolbar"
629 msgstr "Configurar barra de ferramentas" 717 msgstr "Configurar barra de ferramentas"
630 718
  719 +#: src/objects/os/linux/savedesktopicon.c:70
  720 +msgid "Shortcut file"
  721 +msgstr "Arquivo de atalho"
  722 +
  723 +#: ui/window.xml:93 ui/application.xml:158
  724 +msgid "Shortcut for this session"
  725 +msgstr "Atalho para essa sessão"
  726 +
  727 +#: src/objects/os/linux/savedesktopicon.c:63
  728 +msgid "Shortcut name"
  729 +msgstr "Nome do atalho"
  730 +
631 #: ui/application.xml:494 731 #: ui/application.xml:494
632 msgid "Show Underline" 732 msgid "Show Underline"
633 msgstr "Mostrar sublinhado" 733 msgstr "Mostrar sublinhado"
634 734
635 -#: ui/window.xml:231 735 +#: ui/window.xml:241
636 msgid "Show menu" 736 msgid "Show menu"
637 msgstr "Mostrar menu" 737 msgstr "Mostrar menu"
638 738
639 -#: ui/window.xml:226 739 +#: ui/window.xml:236
640 msgid "Show toolbar" 740 msgid "Show toolbar"
641 msgstr "Mostrar barra de ferramentas" 741 msgstr "Mostrar barra de ferramentas"
642 742
643 -#: src/objects/toolbar/toolbar.c:53 743 +#: src/objects/toolbar/models.c:61
644 msgid "Small" 744 msgid "Small"
645 msgstr "Pequeno" 745 msgstr "Pequeno"
646 746
647 -#: ui/window.xml:388 ui/application.xml:504 747 +#: ui/window.xml:398 ui/application.xml:504
648 msgid "Smart paste" 748 msgid "Smart paste"
649 msgstr "Colar inteligente" 749 msgstr "Colar inteligente"
650 750
  751 +#: src/objects/os/linux/savedesktopicon.c:239
  752 +msgid "Standard desktop files"
  753 +msgstr "Arquivo de atalho padrão"
  754 +
  755 +#: src/objects/settings/actionview.c:68
  756 +msgid "Start"
  757 +msgstr "Inicio"
  758 +
651 #: src/objects/actions/abstract.c:152 759 #: src/objects/actions/abstract.c:152
652 msgid "State" 760 msgid "State"
653 msgstr "Estado" 761 msgstr "Estado"
@@ -656,11 +764,12 @@ msgstr &quot;Estado&quot; @@ -656,11 +764,12 @@ msgstr &quot;Estado&quot;
656 msgid "State Type" 764 msgid "State Type"
657 msgstr "Tipo do estado" 765 msgstr "Tipo do estado"
658 766
659 -#: src/objects/toolbar/settings.c:55  
660 -msgid "Style"  
661 -msgstr "Estilo" 767 +#: src/objects/toolbar/models.c:115
  768 +msgid "Symbolic"
  769 +msgstr "Simbólico"
662 770
663 -#: src/objects/toolbar/toolbar.c:47 src/objects/toolbar/toolbar.c:69 771 +#: src/objects/toolbar/models.c:55 src/objects/toolbar/models.c:82
  772 +#: src/objects/toolbar/models.c:111
664 msgid "System default" 773 msgid "System default"
665 msgstr "Padrão do sistema" 774 msgstr "Padrão do sistema"
666 775
@@ -676,7 +785,7 @@ msgstr &quot;Aba com a sessão padrão&quot; @@ -676,7 +785,7 @@ msgstr &quot;Aba com a sessão padrão&quot;
676 msgid "Terminal font" 785 msgid "Terminal font"
677 msgstr "Fonte do terminal" 786 msgstr "Fonte do terminal"
678 787
679 -#: src/objects/toolbar/toolbar.c:79 788 +#: src/objects/toolbar/models.c:92
680 msgid "Text only" 789 msgid "Text only"
681 msgstr "Apenas texto" 790 msgstr "Apenas texto"
682 791
@@ -696,6 +805,14 @@ msgstr &quot;A dica da ação&quot; @@ -696,6 +805,14 @@ msgstr &quot;A dica da ação&quot;
696 msgid "The code of the User interface type" 805 msgid "The code of the User interface type"
697 msgstr "Código identificando o tipo de interface do usuário" 806 msgstr "Código identificando o tipo de interface do usuário"
698 807
  808 +#: src/objects/actions/save.c:64
  809 +msgid "The file to save the current session preferences"
  810 +msgstr "O arquivo com as preferências da sessão atual"
  811 +
  812 +#: src/objects/os/linux/savedesktopicon.c:86
  813 +msgid "The file with the session preferences for this shortcut"
  814 +msgstr "O arquivo com as preferências da sessão para esse atalho"
  815 +
699 #: src/objects/actions/abstract.c:110 816 #: src/objects/actions/abstract.c:110
700 msgid "The label for the action" 817 msgid "The label for the action"
701 msgstr "A etiqueta da ação" 818 msgstr "A etiqueta da ação"
@@ -704,11 +821,11 @@ msgstr &quot;A etiqueta da ação&quot; @@ -704,11 +821,11 @@ msgstr &quot;A etiqueta da ação&quot;
704 msgid "The name of associated action" 821 msgid "The name of associated action"
705 msgstr "Nome da ação associada" 822 msgstr "Nome da ação associada"
706 823
707 -#: src/objects/window/window.c:164 824 +#: src/objects/window/window.c:185
708 msgid "The name of the actions in the header bar" 825 msgid "The name of the actions in the header bar"
709 msgstr "O nome das ações na barra de título" 826 msgstr "O nome das ações na barra de título"
710 827
711 -#: src/objects/toolbar/toolbar.c:136 828 +#: src/objects/toolbar/toolbar.c:98
712 msgid "The name of the actions in the toolbar" 829 msgid "The name of the actions in the toolbar"
713 msgstr "O nome das ações na barra de ferramentas" 830 msgstr "O nome das ações na barra de ferramentas"
714 831
@@ -732,15 +849,25 @@ msgstr &quot;O nome usado para ativar a ação&quot; @@ -732,15 +849,25 @@ msgstr &quot;O nome usado para ativar a ação&quot;
732 msgid "The position of the keypad" 849 msgid "The position of the keypad"
733 msgstr "A posição do painel" 850 msgstr "A posição do painel"
734 851
  852 +#: src/objects/actions/save.c:57 src/objects/os/linux/savedesktopicon.c:79
  853 +msgid "The session name used in the window/tab title (empty for default)"
  854 +msgstr ""
  855 +"O nome da sessão usada no título da janela/aba. Vazio para usar o valor "
  856 +"padrão"
  857 +
735 #: src/objects/actions/abstract.c:153 858 #: src/objects/actions/abstract.c:153
736 msgid "The state the action is in" 859 msgid "The state the action is in"
737 msgstr "O estado em que a ação está" 860 msgstr "O estado em que a ação está"
738 861
739 -#: src/objects/toolbar/toolbar.c:147 862 +#: src/objects/toolbar/toolbar.c:109
740 msgid "The toolbar icon size" 863 msgid "The toolbar icon size"
741 msgstr "Tamanho dos ícones na barra de ferramentas" 864 msgstr "Tamanho dos ícones na barra de ferramentas"
742 865
743 -#: src/objects/toolbar/toolbar.c:160 866 +#: src/objects/toolbar/toolbar.c:135
  867 +msgid "The toolbar icon type"
  868 +msgstr "Tipo dos ícones na barra de ferramentas"
  869 +
  870 +#: src/objects/toolbar/toolbar.c:122
744 msgid "The toolbar style" 871 msgid "The toolbar style"
745 msgstr "Estilo da barra de ferramentas" 872 msgstr "Estilo da barra de ferramentas"
746 873
@@ -756,12 +883,28 @@ msgstr &quot;The type of GVariant passed to activate()&quot; @@ -756,12 +883,28 @@ msgstr &quot;The type of GVariant passed to activate()&quot;
756 msgid "The type of the state kept by the action" 883 msgid "The type of the state kept by the action"
757 msgstr "O tipo do estado mantido pela ação" 884 msgstr "O tipo do estado mantido pela ação"
758 885
759 -#: src/objects/toolbar/settings.c:89 ui/window.xml:420 ui/window.xml:535 886 +#: src/objects/window/header-settings.c:86
  887 +msgid "Title bar"
  888 +msgstr "Barra de título"
  889 +
  890 +#: src/objects/window/header-settings.c:98
  891 +msgid "Title bar actions"
  892 +msgstr "Ações da barra de título"
  893 +
  894 +#: src/objects/toolbar/settings.c:87 ui/window.xml:430 ui/window.xml:550
760 #: ui/application.xml:342 895 #: ui/application.xml:342
761 msgid "Toolbar" 896 msgid "Toolbar"
762 msgstr "Barra de ferramentas" 897 msgstr "Barra de ferramentas"
763 898
764 -#: ui/window.xml:425 899 +#: src/objects/toolbar/settings.c:68
  900 +msgid "Toolbar Style"
  901 +msgstr "Estilo da barra de ferramentas"
  902 +
  903 +#: src/objects/toolbar/models.c:79
  904 +msgid "Toolbar s_tyle"
  905 +msgstr "Est_ilo da barra de ferramentas"
  906 +
  907 +#: ui/window.xml:435
765 msgid "Top menu" 908 msgid "Top menu"
766 msgstr "Menu principal" 909 msgstr "Menu principal"
767 910
@@ -769,7 +912,7 @@ msgstr &quot;Menu principal&quot; @@ -769,7 +912,7 @@ msgstr &quot;Menu principal&quot;
769 msgid "Trace" 912 msgid "Trace"
770 msgstr "Trace" 913 msgstr "Trace"
771 914
772 -#: ui/window.xml:474 ui/application.xml:449 915 +#: ui/window.xml:489 ui/application.xml:449
773 msgid "Track Cursor" 916 msgid "Track Cursor"
774 msgstr "Mostrar posição do cursor" 917 msgstr "Mostrar posição do cursor"
775 918
@@ -777,7 +920,7 @@ msgstr &quot;Mostrar posição do cursor&quot; @@ -777,7 +920,7 @@ msgstr &quot;Mostrar posição do cursor&quot;
777 msgid "UI Type" 920 msgid "UI Type"
778 msgstr "Interface de usuário" 921 msgstr "Interface de usuário"
779 922
780 -#: ui/window.xml:257 ui/application.xml:290 923 +#: ui/window.xml:267 ui/application.xml:290
781 msgid "Unselect" 924 msgid "Unselect"
782 msgstr "Remover seleção" 925 msgstr "Remover seleção"
783 926
@@ -785,34 +928,38 @@ msgstr &quot;Remover seleção&quot; @@ -785,34 +928,38 @@ msgstr &quot;Remover seleção&quot;
785 msgid "Use +/- for field navigation" 928 msgid "Use +/- for field navigation"
786 msgstr "Usar teclas +/- para navegar por campos" 929 msgstr "Usar teclas +/- para navegar por campos"
787 930
788 -#: src/objects/application/actions/about.c:86  
789 -#: src/objects/application/actions/about.c:88 931 +#: src/objects/application/actions/about.c:70
790 #, c-format 932 #, c-format
791 msgid "Version %s-%s" 933 msgid "Version %s-%s"
792 msgstr "Versão %s-%s" 934 msgstr "Versão %s-%s"
793 935
794 -#: src/objects/window/header.c:66 ui/window.xml:417 ui/window.xml:532 936 +#: src/objects/window/header.c:66 ui/window.xml:427 ui/window.xml:547
795 #: ui/application.xml:63 937 #: ui/application.xml:63
796 msgid "View" 938 msgid "View"
797 msgstr "Exibir" 939 msgstr "Exibir"
798 940
  941 +#: src/objects/application/actions/about.c:163
  942 +msgid "View this project on github"
  943 +msgstr "Portal do Software Público Brasileiro"
  944 +
799 #: ui/window.xml:40 ui/application.xml:105 945 #: ui/window.xml:40 ui/application.xml:105
800 msgid "Window with default session" 946 msgid "Window with default session"
801 msgstr "Janela com sessão padrão" 947 msgstr "Janela com sessão padrão"
802 948
803 -#: src/objects/settings/dialog.c:84 949 +#: src/objects/settings/dialog.c:79
804 msgid "_Apply" 950 msgid "_Apply"
805 msgstr "_Aplicar" 951 msgstr "_Aplicar"
806 952
807 -#: src/objects/settings/dialog.c:83 src/objects/windows/savedesktopicon.c:104 953 +#: src/objects/actions/save.c:102 src/objects/settings/dialog.c:78
  954 +#: src/objects/os/linux/savedesktopicon.c:174
808 msgid "_Cancel" 955 msgid "_Cancel"
809 msgstr "_Cancelar" 956 msgstr "_Cancelar"
810 957
811 -#: src/objects/window/page.c:394 958 +#: src/objects/window/page.c:371
812 msgid "_Close session" 959 msgid "_Close session"
813 msgstr "_Fechar sessão" 960 msgstr "_Fechar sessão"
814 961
815 -#: ui/window.xml:549 ui/application.xml:368 962 +#: ui/window.xml:569 ui/application.xml:368
816 msgid "_Connect" 963 msgid "_Connect"
817 msgstr "_Conectar" 964 msgstr "_Conectar"
818 965
@@ -820,7 +967,7 @@ msgstr &quot;_Conectar&quot; @@ -820,7 +967,7 @@ msgstr &quot;_Conectar&quot;
820 msgid "_Disconnect" 967 msgid "_Disconnect"
821 msgstr "_Desconectar" 968 msgstr "_Desconectar"
822 969
823 -#: ui/window.xml:148 ui/window.xml:281 ui/application.xml:231 970 +#: ui/window.xml:148 ui/window.xml:291 ui/application.xml:231
824 msgid "_Edit" 971 msgid "_Edit"
825 msgstr "_Editar" 972 msgstr "_Editar"
826 973
@@ -840,15 +987,15 @@ msgstr &quot;_Nova&quot; @@ -840,15 +987,15 @@ msgstr &quot;_Nova&quot;
840 msgid "_Open" 987 msgid "_Open"
841 msgstr "_Abrir" 988 msgstr "_Abrir"
842 989
843 -#: src/objects/toolbar/toolbar.c:308  
844 -msgid "_Properties"  
845 -msgstr "_Propriedades" 990 +#: src/objects/toolbar/toolbar.c:236
  991 +msgid "_Preferences"
  992 +msgstr "_Preferências"
846 993
847 -#: src/objects/window/page.c:388 994 +#: src/objects/window/page.c:365
848 msgid "_Rename session" 995 msgid "_Rename session"
849 msgstr "Renomear sessão" 996 msgstr "Renomear sessão"
850 997
851 -#: src/objects/windows/savedesktopicon.c:105 998 +#: src/objects/actions/save.c:103 src/objects/os/linux/savedesktopicon.c:175
852 msgid "_Save" 999 msgid "_Save"
853 msgstr "_Salvar" 1000 msgstr "_Salvar"
854 1001
@@ -856,7 +1003,11 @@ msgstr &quot;_Salvar&quot; @@ -856,7 +1003,11 @@ msgstr &quot;_Salvar&quot;
856 msgid "_View" 1003 msgid "_View"
857 msgstr "_Exibir" 1004 msgstr "_Exibir"
858 1005
859 -#: src/objects/application/actions/about.c:145 1006 +#: src/objects/application/actions/about.c:162
  1007 +msgid "https://github.com/PerryWerneck/pw3270"
  1008 +msgstr "https://portal.softwarepublico.gov.br/social/pw3270/"
  1009 +
  1010 +#: src/objects/application/actions/about.c:165
860 msgid "translator-credits" 1011 msgid "translator-credits"
861 msgstr "translator-credits" 1012 msgstr "translator-credits"
862 1013
@@ -1165,6 +1316,10 @@ msgstr &quot;translator-credits&quot; @@ -1165,6 +1316,10 @@ msgstr &quot;translator-credits&quot;
1165 #~ msgid "Blue" 1316 #~ msgid "Blue"
1166 #~ msgstr "Azul" 1317 #~ msgstr "Azul"
1167 1318
  1319 +#~ msgctxt "ProjectURLTitle"
  1320 +#~ msgid "Brazilian Public Software Portal"
  1321 +#~ msgstr "Portal do Software Público Brasileiro"
  1322 +
1168 #~ msgid "Break" 1323 #~ msgid "Break"
1169 #~ msgstr "Break" 1324 #~ msgstr "Break"
1170 1325
@@ -1287,7 +1442,7 @@ msgstr &quot;translator-credits&quot; @@ -1287,7 +1442,7 @@ msgstr &quot;translator-credits&quot;
1287 #~ msgid "Can't load plugin %s" 1442 #~ msgid "Can't load plugin %s"
1288 #~ msgstr "Não foi possível carregar plugin %s" 1443 #~ msgstr "Não foi possível carregar plugin %s"
1289 1444
1290 -#~ msgid "Can't open %s" 1445 +#~ msgid "Can't open \"%s\""
1291 #~ msgstr "Não foi possível abrir %s" 1446 #~ msgstr "Não foi possível abrir %s"
1292 1447
1293 #~ msgid "Can't open CRL File" 1448 #~ msgid "Can't open CRL File"
@@ -1335,9 +1490,6 @@ msgstr &quot;translator-credits&quot; @@ -1335,9 +1490,6 @@ msgstr &quot;translator-credits&quot;
1335 #~ msgid "Can't save \"%s\": %s" 1490 #~ msgid "Can't save \"%s\": %s"
1336 #~ msgstr "Não foi possível salvar %s: %s" 1491 #~ msgstr "Não foi possível salvar %s: %s"
1337 1492
1338 -#~ msgid "Can't save %s"  
1339 -#~ msgstr "Não foi possível salvar arquivo %s"  
1340 -  
1341 #~ msgid "" 1493 #~ msgid ""
1342 #~ "Can't save copy to file\n" 1494 #~ "Can't save copy to file\n"
1343 #~ "%s" 1495 #~ "%s"
@@ -1345,6 +1497,9 @@ msgstr &quot;translator-credits&quot; @@ -1345,6 +1497,9 @@ msgstr &quot;translator-credits&quot;
1345 #~ "Não foi possível salvar cópia para o arquivo\n" 1497 #~ "Não foi possível salvar cópia para o arquivo\n"
1346 #~ "%s" 1498 #~ "%s"
1347 1499
  1500 +#~ msgid "Can't save file \"%s\""
  1501 +#~ msgstr "Não foi possível salvar arquivo \"%s\""
  1502 +
1348 #~ msgid "" 1503 #~ msgid ""
1349 #~ "Can't save screen to file\n" 1504 #~ "Can't save screen to file\n"
1350 #~ "%s" 1505 #~ "%s"
@@ -1508,9 +1663,6 @@ msgstr &quot;translator-credits&quot; @@ -1508,9 +1663,6 @@ msgstr &quot;translator-credits&quot;
1508 #~ msgid "Command to execute" 1663 #~ msgid "Command to execute"
1509 #~ msgstr "Comando a executar" 1664 #~ msgstr "Comando a executar"
1510 1665
1511 -#~ msgid "Comment"  
1512 -#~ msgstr "Comentário"  
1513 -  
1514 #~ msgid "Complete" 1666 #~ msgid "Complete"
1515 #~ msgstr "Completo" 1667 #~ msgstr "Completo"
1516 1668
@@ -1532,9 +1684,6 @@ msgstr &quot;translator-credits&quot; @@ -1532,9 +1684,6 @@ msgstr &quot;translator-credits&quot;
1532 #~ msgid "Copiar tudo" 1684 #~ msgid "Copiar tudo"
1533 #~ msgstr "Copiar tudo" 1685 #~ msgstr "Copiar tudo"
1534 1686
1535 -#~ msgid "Copy as HTML"  
1536 -#~ msgstr "Copiar como HTML"  
1537 -  
1538 #~ msgid "Creates a file with fixed-length records." 1687 #~ msgid "Creates a file with fixed-length records."
1539 #~ msgstr "Cria arquivo com registros de tamanho fixo." 1688 #~ msgstr "Cria arquivo com registros de tamanho fixo."
1540 1689
@@ -1620,9 +1769,15 @@ msgstr &quot;translator-credits&quot; @@ -1620,9 +1769,15 @@ msgstr &quot;translator-credits&quot;
1620 #~ msgid "Default host URL" 1769 #~ msgid "Default host URL"
1621 #~ msgstr "URL parão para acesso ao host" 1770 #~ msgstr "URL parão para acesso ao host"
1622 1771
  1772 +#~ msgid "Description"
  1773 +#~ msgstr "Descrição"
  1774 +
1623 #~ msgid "Description of the current security state" 1775 #~ msgid "Description of the current security state"
1624 #~ msgstr "Descrição do estado de segurança atual" 1776 #~ msgstr "Descrição do estado de segurança atual"
1625 1777
  1778 +#~ msgid "Desktop icon"
  1779 +#~ msgstr "Ícone da área de trabalho"
  1780 +
1626 #~ msgid "Device type rejected" 1781 #~ msgid "Device type rejected"
1627 #~ msgstr "Tipo de dispositivo rejeitado" 1782 #~ msgstr "Tipo de dispositivo rejeitado"
1628 1783
@@ -1766,6 +1921,9 @@ msgstr &quot;translator-credits&quot; @@ -1766,6 +1921,9 @@ msgstr &quot;translator-credits&quot;
1766 #~ msgid "File _Format" 1921 #~ msgid "File _Format"
1767 #~ msgstr "_Formato do arquivo" 1922 #~ msgstr "_Formato do arquivo"
1768 1923
  1924 +#~ msgid "File name"
  1925 +#~ msgstr "Nome do arquivo"
  1926 +
1769 #~ msgid "File transfer complete" 1927 #~ msgid "File transfer complete"
1770 #~ msgstr "Transferência completa" 1928 #~ msgstr "Transferência completa"
1771 1929
@@ -1836,9 +1994,6 @@ msgstr &quot;translator-credits&quot; @@ -1836,9 +1994,6 @@ msgstr &quot;translator-credits&quot;
1836 #~ msgid "GTK Version mismatch" 1994 #~ msgid "GTK Version mismatch"
1837 #~ msgstr "Divergência de versão GTK" 1995 #~ msgstr "Divergência de versão GTK"
1838 1996
1839 -#~ msgid "Generic name"  
1840 -#~ msgstr "Nome genérico"  
1841 -  
1842 #~ msgid "Get transfer queue from an external XML file" 1997 #~ msgid "Get transfer queue from an external XML file"
1843 #~ msgstr "Obtém a fila de transferência de um arquivo XML externo" 1998 #~ msgstr "Obtém a fila de transferência de um arquivo XML externo"
1844 1999
@@ -2142,6 +2297,12 @@ msgstr &quot;translator-credits&quot; @@ -2142,6 +2297,12 @@ msgstr &quot;translator-credits&quot;
2142 #~ msgid "Latest program message" 2297 #~ msgid "Latest program message"
2143 #~ msgstr "Última mensagem de programa" 2298 #~ msgstr "Última mensagem de programa"
2144 2299
  2300 +#~ msgid "Launcher name"
  2301 +#~ msgstr "Nome do lançador"
  2302 +
  2303 +#~ msgid "Left"
  2304 +#~ msgstr "Esquerda"
  2305 +
2145 #~ msgid "Load" 2306 #~ msgid "Load"
2146 #~ msgstr "Load" 2307 #~ msgstr "Load"
2147 2308
@@ -2459,6 +2620,10 @@ msgstr &quot;translator-credits&quot; @@ -2459,6 +2620,10 @@ msgstr &quot;translator-credits&quot;
2459 #~ msgid "Port or service name (empty for \"telnet\")." 2620 #~ msgid "Port or service name (empty for \"telnet\")."
2460 #~ msgstr "Nº da porta ou nome do serviço (em branco para \"telnet\")." 2621 #~ msgstr "Nº da porta ou nome do serviço (em branco para \"telnet\")."
2461 2622
  2623 +#~ msgctxt "PrjLabel"
  2624 +#~ msgid "Portal do Software Público Brasileiro"
  2625 +#~ msgstr "https://portal.softwarepublico.gov.br/social/pw3270/"
  2626 +
2462 #~ msgid "Predefined color schemes" 2627 #~ msgid "Predefined color schemes"
2463 #~ msgstr "Esquemas de cor pré-definidos" 2628 #~ msgstr "Esquemas de cor pré-definidos"
2464 2629
@@ -2645,6 +2810,9 @@ msgstr &quot;translator-credits&quot; @@ -2645,6 +2810,9 @@ msgstr &quot;translator-credits&quot;
2645 #~ msgid "Revocation list" 2810 #~ msgid "Revocation list"
2646 #~ msgstr "Lista de revogados" 2811 #~ msgstr "Lista de revogados"
2647 2812
  2813 +#~ msgid "Right"
  2814 +#~ msgstr "Direita"
  2815 +
2648 #~ msgid "SOCKS4 Proxy: client is not reachable" 2816 #~ msgid "SOCKS4 Proxy: client is not reachable"
2649 #~ msgstr "SOCKS4 Proxy: client is not reachable" 2817 #~ msgstr "SOCKS4 Proxy: client is not reachable"
2650 2818
@@ -2773,6 +2941,12 @@ msgstr &quot;translator-credits&quot; @@ -2773,6 +2941,12 @@ msgstr &quot;translator-credits&quot;
2773 #~ msgid "SSLv2/v3 read server hello A" 2941 #~ msgid "SSLv2/v3 read server hello A"
2774 #~ msgstr "SSLv2/v3 read server hello A" 2942 #~ msgstr "SSLv2/v3 read server hello A"
2775 2943
  2944 +#~ msgid "S_tyle"
  2945 +#~ msgstr "E_stilo"
  2946 +
  2947 +#~ msgid "Save As"
  2948 +#~ msgstr "Salvar Como"
  2949 +
2776 #~ msgid "Save copied data" 2950 #~ msgid "Save copied data"
2777 #~ msgstr "Salvar cópia" 2951 #~ msgstr "Salvar cópia"
2778 2952
@@ -2782,6 +2956,9 @@ msgstr &quot;translator-credits&quot; @@ -2782,6 +2956,9 @@ msgstr &quot;translator-credits&quot;
2782 #~ msgid "Save copy to file" 2956 #~ msgid "Save copy to file"
2783 #~ msgstr "Salvar cópia para arquivo" 2957 #~ msgstr "Salvar cópia para arquivo"
2784 2958
  2959 +#~ msgid "Save desktop icon"
  2960 +#~ msgstr "Salvar ícone da área de trabalho"
  2961 +
2785 #~ msgid "Save desktop launcher" 2962 #~ msgid "Save desktop launcher"
2786 #~ msgstr "Salvar lançador para área de trabalho" 2963 #~ msgstr "Salvar lançador para área de trabalho"
2787 2964
@@ -2800,9 +2977,6 @@ msgstr &quot;translator-credits&quot; @@ -2800,9 +2977,6 @@ msgstr &quot;translator-credits&quot;
2800 #~ msgid "Save terminal contents" 2977 #~ msgid "Save terminal contents"
2801 #~ msgstr "Salvar conteúdo da tela" 2978 #~ msgstr "Salvar conteúdo da tela"
2802 2979
2803 -#~ msgid "Save trace file"  
2804 -#~ msgstr "Salvar arquivo de trace"  
2805 -  
2806 #~ msgid "Save trace to file" 2980 #~ msgid "Save trace to file"
2807 #~ msgstr "Salvar trace para arquivo" 2981 #~ msgstr "Salvar trace para arquivo"
2808 2982
@@ -2865,12 +3039,12 @@ msgstr &quot;translator-credits&quot; @@ -2865,12 +3039,12 @@ msgstr &quot;translator-credits&quot;
2865 #~ msgid "Security warning" 3039 #~ msgid "Security warning"
2866 #~ msgstr "Alerta de segurança" 3040 #~ msgstr "Alerta de segurança"
2867 3041
  3042 +#~ msgid "Select"
  3043 +#~ msgstr "Selecionar"
  3044 +
2868 #~ msgid "Select destination file" 3045 #~ msgid "Select destination file"
2869 #~ msgstr "Selecionar arquivo destino" 3046 #~ msgstr "Selecionar arquivo destino"
2870 3047
2871 -#~ msgid "Select file"  
2872 -#~ msgstr "Selecionar arquivo"  
2873 -  
2874 #~ msgid "Select file to receive" 3048 #~ msgid "Select file to receive"
2875 #~ msgstr "Selecione arquivo a receber" 3049 #~ msgstr "Selecione arquivo a receber"
2876 3050
@@ -2895,6 +3069,9 @@ msgstr &quot;translator-credits&quot; @@ -2895,6 +3069,9 @@ msgstr &quot;translator-credits&quot;
2895 #~ msgid "Select previous file" 3069 #~ msgid "Select previous file"
2896 #~ msgstr "Selecionar arquivo anterior" 3070 #~ msgstr "Selecionar arquivo anterior"
2897 3071
  3072 +#~ msgid "Select the title bar itens"
  3073 +#~ msgstr "Selecione itens da barra de título"
  3074 +
2898 #~ msgid "Select() failed when processing for events." 3075 #~ msgid "Select() failed when processing for events."
2899 #~ msgstr "Select() falhou ao processar eventos." 3076 #~ msgstr "Select() falhou ao processar eventos."
2900 3077
@@ -2913,9 +3090,6 @@ msgstr &quot;translator-credits&quot; @@ -2913,9 +3090,6 @@ msgstr &quot;translator-credits&quot;
2913 #~ msgid "Send an \"Enter\" action." 3090 #~ msgid "Send an \"Enter\" action."
2914 #~ msgstr "Envia um \"Enter\"." 3091 #~ msgstr "Envia um \"Enter\"."
2915 3092
2916 -#~ msgid "Send file"  
2917 -#~ msgstr "Enviar arquivo"  
2918 -  
2919 #~ msgid "Send file to host" 3093 #~ msgid "Send file to host"
2920 #~ msgstr "Enviar arquivo para o servidor" 3094 #~ msgstr "Enviar arquivo para o servidor"
2921 3095
@@ -3048,9 +3222,6 @@ msgstr &quot;translator-credits&quot; @@ -3048,9 +3222,6 @@ msgstr &quot;translator-credits&quot;
3048 #~ msgid "Start upload." 3222 #~ msgid "Start upload."
3049 #~ msgstr "Iniciar envio." 3223 #~ msgstr "Iniciar envio."
3050 3224
3051 -#~ msgid "Starting"  
3052 -#~ msgstr "Iniciando"  
3053 -  
3054 #~ msgid "Starting transfer" 3225 #~ msgid "Starting transfer"
3055 #~ msgstr "Iniciando transferência" 3226 #~ msgstr "Iniciando transferência"
3056 3227
@@ -3060,6 +3231,9 @@ msgstr &quot;translator-credits&quot; @@ -3060,6 +3231,9 @@ msgstr &quot;translator-credits&quot;
3060 #~ msgid "State is 3270, TN3270e or SSCP" 3231 #~ msgid "State is 3270, TN3270e or SSCP"
3061 #~ msgstr "Estado do terminal é 3270, TN3270e or SSCP" 3232 #~ msgstr "Estado do terminal é 3270, TN3270e or SSCP"
3062 3233
  3234 +#~ msgid "Style"
  3235 +#~ msgstr "Estilo"
  3236 +
3063 #~ msgid "Subject issuer mismatch" 3237 #~ msgid "Subject issuer mismatch"
3064 #~ msgstr "Divergência na identidade do emissor" 3238 #~ msgstr "Divergência na identidade do emissor"
3065 3239
@@ -3847,6 +4021,9 @@ msgstr &quot;translator-credits&quot; @@ -3847,6 +4021,9 @@ msgstr &quot;translator-credits&quot;
3847 #~ msgid "_Port:" 4021 #~ msgid "_Port:"
3848 #~ msgstr "_Porta:" 4022 #~ msgstr "_Porta:"
3849 4023
  4024 +#~ msgid "_Properties"
  4025 +#~ msgstr "_Propriedades"
  4026 +
3850 #~ msgid "_Receive" 4027 #~ msgid "_Receive"
3851 #~ msgstr "_Receber" 4028 #~ msgstr "_Receber"
3852 4029
@@ -3895,6 +4072,19 @@ msgstr &quot;translator-credits&quot; @@ -3895,6 +4072,19 @@ msgstr &quot;translator-credits&quot;
3895 #~ msgid "fcntl() error when getting socket state." 4072 #~ msgid "fcntl() error when getting socket state."
3896 #~ msgstr "erro fcntl() ao obter estado do socket." 4073 #~ msgstr "erro fcntl() ao obter estado do socket."
3897 4074
  4075 +#, fuzzy
  4076 +#~ msgctxt "PrjLabel"
  4077 +#~ msgid "https://github.com/PerryWerneck/pw3270"
  4078 +#~ msgstr "Portal do Software Público Brasileiro"
  4079 +
  4080 +#~ msgctxt "ProjectURLLabel"
  4081 +#~ msgid "https://github.com/PerryWerneck/pw3270"
  4082 +#~ msgstr "Portal do Software Público Brasileiro"
  4083 +
  4084 +#~ msgctxt "ProjectURL"
  4085 +#~ msgid "https://portal.softwarepublico.gov.br/social/pw3270/"
  4086 +#~ msgstr "https://portal.softwarepublico.gov.br/social/pw3270/"
  4087 +
3898 #~ msgid "ioctl(%s)" 4088 #~ msgid "ioctl(%s)"
3899 #~ msgstr "ioctl(%s)" 4089 #~ msgstr "ioctl(%s)"
3900 4090
locale/pw3270.pot
@@ -8,7 +8,7 @@ msgid &quot;&quot; @@ -8,7 +8,7 @@ msgid &quot;&quot;
8 msgstr "" 8 msgstr ""
9 "Project-Id-Version: PACKAGE VERSION\n" 9 "Project-Id-Version: PACKAGE VERSION\n"
10 "Report-Msgid-Bugs-To: \n" 10 "Report-Msgid-Bugs-To: \n"
11 -"POT-Creation-Date: 2020-08-05 16:03-0300\n" 11 +"POT-Creation-Date: 2020-10-15 13:43-0300\n"
12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" 13 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14 "Language-Team: LANGUAGE <LL@li.org>\n" 14 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,17 +17,37 @@ msgstr &quot;&quot; @@ -17,17 +17,37 @@ msgstr &quot;&quot;
17 "Content-Type: text/plain; charset=CHARSET\n" 17 "Content-Type: text/plain; charset=CHARSET\n"
18 "Content-Transfer-Encoding: 8bit\n" 18 "Content-Transfer-Encoding: 8bit\n"
19 19
20 -#: src/objects/application/application.c:208 20 +#: src/objects/application/application.c:206
21 #, c-format 21 #, c-format
22 msgid "\"%s\" is not a valid user interface name" 22 msgid "\"%s\" is not a valid user interface name"
23 msgstr "" 23 msgstr ""
24 24
25 -#: src/objects/application/actions/about.c:96 25 +#: src/objects/application/actions/about.c:93
  26 +msgid "32 bits Linux"
  27 +msgstr ""
  28 +
  29 +#: src/objects/application/actions/about.c:91
  30 +msgid "32 bits Windows"
  31 +msgstr ""
  32 +
  33 +#: src/objects/actions/save.c:156 src/objects/os/linux/savedesktopicon.c:267
  34 +msgid "3270 session files"
  35 +msgstr ""
  36 +
  37 +#: src/objects/application/actions/about.c:87
26 #, c-format 38 #, c-format
27 -msgid "3270 terminal emulator for GTK %d.%d" 39 +msgid "3270 terminal emulator for %s."
28 msgstr "" 40 msgstr ""
29 41
30 -#: src/objects/application/actions/about.c:161 ui/application.xml:39 42 +#: src/objects/application/actions/about.c:95
  43 +msgid "64 bits Linux"
  44 +msgstr ""
  45 +
  46 +#: src/objects/application/actions/about.c:89
  47 +msgid "64 bits Windows"
  48 +msgstr ""
  49 +
  50 +#: src/objects/application/actions/about.c:188 ui/application.xml:39
31 #: ui/application.xml:537 51 #: ui/application.xml:537
32 msgid "About PW3270" 52 msgid "About PW3270"
33 msgstr "" 53 msgstr ""
@@ -36,23 +56,23 @@ msgstr &quot;&quot; @@ -36,23 +56,23 @@ msgstr &quot;&quot;
36 msgid "Action Name" 56 msgid "Action Name"
37 msgstr "" 57 msgstr ""
38 58
39 -#: src/objects/window/window.c:163 src/objects/toolbar/toolbar.c:135 59 +#: src/objects/window/window.c:184
40 msgid "Action Names" 60 msgid "Action Names"
41 msgstr "" 61 msgstr ""
42 62
43 -#: ui/window.xml:369 ui/window.xml:479 ui/application.xml:509 63 +#: ui/window.xml:379 ui/window.xml:494 ui/application.xml:509
44 msgid "Alert sound" 64 msgid "Alert sound"
45 msgstr "" 65 msgstr ""
46 66
47 -#: src/main/tools.c:99 67 +#: src/main/tools.c:99 src/tools/entry.c:88
48 msgid "All files" 68 msgid "All files"
49 msgstr "" 69 msgstr ""
50 70
51 -#: ui/window.xml:168 ui/application.xml:251 71 +#: ui/window.xml:178 ui/application.xml:251
52 msgid "Append to copy" 72 msgid "Append to copy"
53 msgstr "" 73 msgstr ""
54 74
55 -#: src/objects/application/actions/about.c:126 75 +#: src/objects/application/actions/about.c:129
56 msgid "Apple version" 76 msgid "Apple version"
57 msgstr "" 77 msgstr ""
58 78
@@ -60,11 +80,15 @@ msgstr &quot;&quot; @@ -60,11 +80,15 @@ msgstr &quot;&quot;
60 msgid "Application" 80 msgid "Application"
61 msgstr "" 81 msgstr ""
62 82
63 -#: src/objects/application/actions/preferences.c:69 ui/application.xml:83 83 +#: src/objects/window/header-settings.c:123
  84 +msgid "Application menu"
  85 +msgstr ""
  86 +
  87 +#: src/objects/application/actions/preferences.c:76 ui/application.xml:83
64 msgid "Application preferences" 88 msgid "Application preferences"
65 msgstr "" 89 msgstr ""
66 90
67 -#: src/objects/window/page.c:263 91 +#: src/objects/window/page.c:264
68 msgid "Apply" 92 msgid "Apply"
69 msgstr "" 93 msgstr ""
70 94
@@ -72,15 +96,15 @@ msgstr &quot;&quot; @@ -72,15 +96,15 @@ msgstr &quot;&quot;
72 msgid "Auto-Reconnect" 96 msgid "Auto-Reconnect"
73 msgstr "" 97 msgstr ""
74 98
75 -#: src/objects/toolbar/settings.c:114 99 +#: src/objects/toolbar/settings.c:112 src/objects/settings/actionview.c:73
76 msgid "Available" 100 msgid "Available"
77 msgstr "" 101 msgstr ""
78 102
79 -#: src/objects/application/actions/about.c:130 103 +#: src/objects/application/actions/about.c:132
80 msgid "Based on X3270 from" 104 msgid "Based on X3270 from"
81 msgstr "" 105 msgstr ""
82 106
83 -#: ui/window.xml:398 ui/application.xml:474 107 +#: ui/window.xml:408 ui/application.xml:474
84 msgid "Blank Fill" 108 msgid "Blank Fill"
85 msgstr "" 109 msgstr ""
86 110
@@ -92,21 +116,17 @@ msgstr &quot;&quot; @@ -92,21 +116,17 @@ msgstr &quot;&quot;
92 msgid "Bold" 116 msgid "Bold"
93 msgstr "" 117 msgstr ""
94 118
95 -#: src/objects/application/actions/about.c:142  
96 -msgid "Brazilian Public Software Portal" 119 +#: src/objects/window/terminal.c:165
  120 +msgid "Can't load session file"
97 msgstr "" 121 msgstr ""
98 122
99 -#: src/objects/window/terminal.c:197 123 +#: src/objects/window/terminal.c:160
100 #, c-format 124 #, c-format
101 -msgid "Can't save file \"%s\""  
102 -msgstr ""  
103 -  
104 -#: src/objects/window/terminal.c:202  
105 -msgid "Can't save session file" 125 +msgid "Can't use \"%s\""
106 msgstr "" 126 msgstr ""
107 127
108 -#: src/objects/actions/save.c:65 src/objects/application/actions/open.c:49  
109 -#: src/objects/window/page.c:264 128 +#: src/objects/application/actions/open.c:49 src/objects/window/page.c:265
  129 +#: src/tools/entry.c:71
110 msgid "Cancel" 130 msgid "Cancel"
111 msgstr "" 131 msgstr ""
112 132
@@ -114,7 +134,19 @@ msgstr &quot;&quot; @@ -114,7 +134,19 @@ msgstr &quot;&quot;
114 msgid "Change terminal colors" 134 msgid "Change terminal colors"
115 msgstr "" 135 msgstr ""
116 136
117 -#: ui/window.xml:182 ui/window.xml:324 ui/application.xml:304 137 +#: src/objects/application/actions/preferences.c:78
  138 +msgid "Change the application preferences"
  139 +msgstr ""
  140 +
  141 +#: src/objects/window/header-settings.c:98
  142 +msgid "Change the position of the title bar icons"
  143 +msgstr ""
  144 +
  145 +#: src/objects/window/actions/sessionproperties.c:47
  146 +msgid "Change the preferences for the active session"
  147 +msgstr ""
  148 +
  149 +#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:304
118 msgid "Clear" 150 msgid "Clear"
119 msgstr "" 151 msgstr ""
120 152
@@ -131,8 +163,8 @@ msgstr &quot;&quot; @@ -131,8 +163,8 @@ msgstr &quot;&quot;
131 msgid "Close the window" 163 msgid "Close the window"
132 msgstr "" 164 msgstr ""
133 165
134 -#: src/objects/window/actions/close.c:60 ui/window.xml:270 ui/window.xml:458  
135 -#: ui/window.xml:560 ui/application.xml:216 166 +#: src/objects/window/actions/close.c:60 ui/window.xml:280 ui/window.xml:473
  167 +#: ui/window.xml:580 ui/application.xml:216
136 msgid "Close window" 168 msgid "Close window"
137 msgstr "" 169 msgstr ""
138 170
@@ -140,6 +172,10 @@ msgstr &quot;&quot; @@ -140,6 +172,10 @@ msgstr &quot;&quot;
140 msgid "Colors" 172 msgid "Colors"
141 msgstr "" 173 msgstr ""
142 174
  175 +#: src/objects/os/linux/savedesktopicon.c:101
  176 +msgid "Comment"
  177 +msgstr ""
  178 +
143 #: src/objects/window/actions/connect.c:59 179 #: src/objects/window/actions/connect.c:59
144 msgid "Connect" 180 msgid "Connect"
145 msgstr "" 181 msgstr ""
@@ -152,11 +188,15 @@ msgstr &quot;&quot; @@ -152,11 +188,15 @@ msgstr &quot;&quot;
152 msgid "Connect to host" 188 msgid "Connect to host"
153 msgstr "" 189 msgstr ""
154 190
155 -#: src/objects/window/window.c:702 src/objects/window/page.c:217 191 +#: src/objects/window/window.c:753 src/objects/window/page.c:218
156 msgid "Connected to host" 192 msgid "Connected to host"
157 msgstr "" 193 msgstr ""
158 194
159 -#: src/objects/application/actions/about.c:127 195 +#: src/tools/entry.c:131
  196 +msgid "Continue"
  197 +msgstr ""
  198 +
  199 +#: src/objects/application/actions/about.c:130
160 msgid "Contributors" 200 msgid "Contributors"
161 msgstr "" 201 msgstr ""
162 202
@@ -164,6 +204,14 @@ msgstr &quot;&quot; @@ -164,6 +204,14 @@ msgstr &quot;&quot;
164 msgid "Copy" 204 msgid "Copy"
165 msgstr "" 205 msgstr ""
166 206
  207 +#: ui/window.xml:168
  208 +msgid "Copy as HTML"
  209 +msgstr ""
  210 +
  211 +#: ui/window.xml:173
  212 +msgid "Copy as image"
  213 +msgstr ""
  214 +
167 #: ui/window.xml:163 ui/application.xml:246 215 #: ui/window.xml:163 ui/application.xml:246
168 msgid "Copy as table" 216 msgid "Copy as table"
169 msgstr "" 217 msgstr ""
@@ -172,11 +220,11 @@ msgstr &quot;&quot; @@ -172,11 +220,11 @@ msgstr &quot;&quot;
172 msgid "Copy as text" 220 msgid "Copy as text"
173 msgstr "" 221 msgstr ""
174 222
175 -#: src/objects/windows/savedesktopicon.c:79  
176 -msgid "Create a desktop icon for the current session" 223 +#: src/objects/os/linux/savedesktopicon.c:114
  224 +msgid "Create shortcut for the current session"
177 msgstr "" 225 msgstr ""
178 226
179 -#: ui/window.xml:359 ui/application.xml:459 227 +#: ui/window.xml:369 ui/application.xml:459
180 msgid "Cross hair cursor" 228 msgid "Cross hair cursor"
181 msgstr "" 229 msgstr ""
182 230
@@ -192,28 +240,24 @@ msgstr &quot;&quot; @@ -192,28 +240,24 @@ msgstr &quot;&quot;
192 msgid "Current session" 240 msgid "Current session"
193 msgstr "" 241 msgstr ""
194 242
195 -#: ui/window.xml:173 ui/application.xml:256 243 +#: ui/window.xml:183 ui/application.xml:256
196 msgid "Cut" 244 msgid "Cut"
197 msgstr "" 245 msgstr ""
198 246
199 -#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:314 247 +#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:314
200 msgid "Delete Field" 248 msgid "Delete Field"
201 msgstr "" 249 msgstr ""
202 250
203 -#: ui/window.xml:93 ui/application.xml:158  
204 -msgid "Desktop icon"  
205 -msgstr ""  
206 -  
207 -#: ui/window.xml:265 ui/window.xml:453 251 +#: ui/window.xml:275 ui/window.xml:468
208 msgid "Disconnect" 252 msgid "Disconnect"
209 msgstr "" 253 msgstr ""
210 254
211 -#: src/objects/window/window.c:702 src/objects/window/window.c:729  
212 -#: src/objects/window/page.c:206 255 +#: src/objects/window/window.c:753 src/objects/window/window.c:780
  256 +#: src/objects/window/page.c:207
213 msgid "Disconnected from host" 257 msgid "Disconnected from host"
214 msgstr "" 258 msgstr ""
215 259
216 -#: ui/window.xml:381 ui/window.xml:492 ui/application.xml:524 260 +#: ui/window.xml:391 ui/window.xml:507 ui/application.xml:524
217 msgid "Dynamic font spacing" 261 msgid "Dynamic font spacing"
218 msgstr "" 262 msgstr ""
219 263
@@ -237,15 +281,19 @@ msgstr &quot;&quot; @@ -237,15 +281,19 @@ msgstr &quot;&quot;
237 msgid "Enabled" 281 msgid "Enabled"
238 msgstr "" 282 msgstr ""
239 283
240 -#: ui/window.xml:187 ui/window.xml:329 ui/application.xml:309 284 +#: src/objects/settings/actionview.c:78
  285 +msgid "End"
  286 +msgstr ""
  287 +
  288 +#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:309
241 msgid "Erase input" 289 msgid "Erase input"
242 msgstr "" 290 msgstr ""
243 291
244 -#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:319 292 +#: ui/window.xml:207 ui/window.xml:349 ui/application.xml:319
245 msgid "Erase to end of field" 293 msgid "Erase to end of field"
246 msgstr "" 294 msgstr ""
247 295
248 -#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:324 296 +#: ui/window.xml:212 ui/window.xml:354 ui/application.xml:324
249 msgid "Erase to end of line" 297 msgid "Erase to end of line"
250 msgstr "" 298 msgstr ""
251 299
@@ -253,15 +301,11 @@ msgstr &quot;&quot; @@ -253,15 +301,11 @@ msgstr &quot;&quot;
253 msgid "Field attributes" 301 msgid "Field attributes"
254 msgstr "" 302 msgstr ""
255 303
256 -#: src/objects/windows/savedesktopicon.c:62  
257 -msgid "File name"  
258 -msgstr ""  
259 -  
260 #: ui/application.xml:454 304 #: ui/application.xml:454
261 msgid "Full Screen" 305 msgid "Full Screen"
262 msgstr "" 306 msgstr ""
263 307
264 -#: ui/window.xml:236 ui/window.xml:407 ui/window.xml:497 308 +#: ui/window.xml:246 ui/window.xml:417 ui/window.xml:512
265 msgid "Full screen" 309 msgid "Full screen"
266 msgstr "" 310 msgstr ""
267 311
@@ -269,6 +313,10 @@ msgstr &quot;&quot; @@ -269,6 +313,10 @@ msgstr &quot;&quot;
269 msgid "Function bar" 313 msgid "Function bar"
270 msgstr "" 314 msgstr ""
271 315
  316 +#: src/objects/os/linux/savedesktopicon.c:94
  317 +msgid "Generic name"
  318 +msgstr ""
  319 +
272 #: ui/application.xml:36 ui/application.xml:534 320 #: ui/application.xml:36 ui/application.xml:534
273 msgid "Help" 321 msgid "Help"
274 msgstr "" 322 msgstr ""
@@ -277,11 +325,11 @@ msgstr &quot;&quot; @@ -277,11 +325,11 @@ msgstr &quot;&quot;
277 msgid "Host properties" 325 msgid "Host properties"
278 msgstr "" 326 msgstr ""
279 327
280 -#: src/objects/window/window.c:469 328 +#: src/objects/window/window.c:552 src/objects/os/linux/savedesktopicon.c:102
281 msgid "IBM 3270 Terminal emulator" 329 msgid "IBM 3270 Terminal emulator"
282 msgstr "" 330 msgstr ""
283 331
284 -#: src/objects/actions/view.c:89 332 +#: src/objects/actions/view.c:90
285 msgid "Icon" 333 msgid "Icon"
286 msgstr "" 334 msgstr ""
287 335
@@ -289,19 +337,27 @@ msgstr &quot;&quot; @@ -289,19 +337,27 @@ msgstr &quot;&quot;
289 msgid "Icon Name" 337 msgid "Icon Name"
290 msgstr "" 338 msgstr ""
291 339
292 -#: src/objects/toolbar/settings.c:50 340 +#: src/objects/toolbar/settings.c:54
293 msgid "Icon Size" 341 msgid "Icon Size"
294 msgstr "" 342 msgstr ""
295 343
296 -#: src/objects/toolbar/toolbar.c:262 344 +#: src/objects/toolbar/settings.c:61
  345 +msgid "Icon Style"
  346 +msgstr ""
  347 +
  348 +#: src/objects/toolbar/models.c:52
297 msgid "Icon _size" 349 msgid "Icon _size"
298 msgstr "" 350 msgstr ""
299 351
300 -#: src/objects/toolbar/toolbar.c:84 352 +#: src/objects/toolbar/models.c:108
  353 +msgid "Icon type"
  354 +msgstr ""
  355 +
  356 +#: src/objects/toolbar/models.c:97
301 msgid "Icons & text" 357 msgid "Icons & text"
302 msgstr "" 358 msgstr ""
303 359
304 -#: src/objects/toolbar/toolbar.c:74 360 +#: src/objects/toolbar/models.c:87
305 msgid "Icons only" 361 msgid "Icons only"
306 msgstr "" 362 msgstr ""
307 363
@@ -309,7 +365,7 @@ msgstr &quot;&quot; @@ -309,7 +365,7 @@ msgstr &quot;&quot;
309 msgid "If the action can be activated" 365 msgid "If the action can be activated"
310 msgstr "" 366 msgstr ""
311 367
312 -#: ui/window.xml:469 368 +#: ui/window.xml:484
313 msgid "Insert" 369 msgid "Insert"
314 msgstr "" 370 msgstr ""
315 371
@@ -317,7 +373,15 @@ msgstr &quot;&quot; @@ -317,7 +373,15 @@ msgstr &quot;&quot;
317 msgid "Invalid or unknown property type" 373 msgid "Invalid or unknown property type"
318 msgstr "" 374 msgstr ""
319 375
320 -#: src/objects/toolbar/settings.c:108 376 +#: src/objects/settings/actionview.c:79
  377 +msgid "Items packed from the end to the start"
  378 +msgstr ""
  379 +
  380 +#: src/objects/settings/actionview.c:69
  381 +msgid "Items packed from the start to the end"
  382 +msgstr ""
  383 +
  384 +#: src/objects/toolbar/settings.c:106
321 msgid "Itens" 385 msgid "Itens"
322 msgstr "" 386 msgstr ""
323 387
@@ -345,20 +409,24 @@ msgstr &quot;&quot; @@ -345,20 +409,24 @@ msgstr &quot;&quot;
345 msgid "Keypads" 409 msgid "Keypads"
346 msgstr "" 410 msgstr ""
347 411
348 -#: src/objects/actions/view.c:98 412 +#: src/objects/application/actions/about.c:140
  413 +msgid "LICENSE"
  414 +msgstr ""
  415 +
  416 +#: src/objects/actions/view.c:99
349 msgid "Label" 417 msgid "Label"
350 msgstr "" 418 msgstr ""
351 419
352 -#: src/objects/toolbar/toolbar.c:58 420 +#: src/objects/toolbar/models.c:66
353 msgid "Large" 421 msgid "Large"
354 msgstr "" 422 msgstr ""
355 423
356 -#: src/objects/windows/savedesktopicon.c:67  
357 -msgid "Launcher name" 424 +#: src/objects/toolbar/settings.c:176
  425 +msgid "Layout"
358 msgstr "" 426 msgstr ""
359 427
360 -#: src/objects/toolbar/settings.c:207  
361 -msgid "Layout" 428 +#: src/objects/settings/actionview.c:74
  429 +msgid "List of the available and unpacked actions"
362 msgstr "" 430 msgstr ""
363 431
364 #: ui/application.xml:71 432 #: ui/application.xml:71
@@ -369,11 +437,11 @@ msgstr &quot;&quot; @@ -369,11 +437,11 @@ msgstr &quot;&quot;
369 msgid "Main Toolbar" 437 msgid "Main Toolbar"
370 msgstr "" 438 msgstr ""
371 439
372 -#: ui/window.xml:540 440 +#: ui/window.xml:555
373 msgid "Main menu" 441 msgid "Main menu"
374 msgstr "" 442 msgstr ""
375 443
376 -#: src/objects/application/actions/about.c:125 444 +#: src/objects/application/actions/about.c:128
377 msgid "Maintainers" 445 msgid "Maintainers"
378 msgstr "" 446 msgstr ""
379 447
@@ -381,23 +449,23 @@ msgstr &quot;&quot; @@ -381,23 +449,23 @@ msgstr &quot;&quot;
381 msgid "Menu" 449 msgid "Menu"
382 msgstr "" 450 msgstr ""
383 451
384 -#: ui/window.xml:506 ui/application.xml:403 452 +#: ui/window.xml:521 ui/application.xml:403
385 msgid "Model 2 - 80x24" 453 msgid "Model 2 - 80x24"
386 msgstr "" 454 msgstr ""
387 455
388 -#: ui/window.xml:511 ui/application.xml:408 456 +#: ui/window.xml:526 ui/application.xml:408
389 msgid "Model 3 - 80x32" 457 msgid "Model 3 - 80x32"
390 msgstr "" 458 msgstr ""
391 459
392 -#: ui/window.xml:516 ui/application.xml:413 460 +#: ui/window.xml:531 ui/application.xml:413
393 msgid "Model 4 - 80x43" 461 msgid "Model 4 - 80x43"
394 msgstr "" 462 msgstr ""
395 463
396 -#: ui/window.xml:521 ui/application.xml:418 464 +#: ui/window.xml:536 ui/application.xml:418
397 msgid "Model 5 - 132x27" 465 msgid "Model 5 - 132x27"
398 msgstr "" 466 msgstr ""
399 467
400 -#: ui/window.xml:376 ui/application.xml:444 468 +#: ui/window.xml:386 ui/application.xml:444
401 msgid "Monocase" 469 msgid "Monocase"
402 msgstr "" 470 msgstr ""
403 471
@@ -405,7 +473,7 @@ msgstr &quot;&quot; @@ -405,7 +473,7 @@ msgstr &quot;&quot;
405 msgid "Network keep alive" 473 msgid "Network keep alive"
406 msgstr "" 474 msgstr ""
407 475
408 -#: src/objects/window/page.c:274 476 +#: src/objects/window/page.c:275
409 msgid "New session name" 477 msgid "New session name"
410 msgstr "" 478 msgstr ""
411 479
@@ -453,7 +521,7 @@ msgstr &quot;&quot; @@ -453,7 +521,7 @@ msgstr &quot;&quot;
453 msgid "Open session in New window" 521 msgid "Open session in New window"
454 msgstr "" 522 msgstr ""
455 523
456 -#: ui/window.xml:212 ui/window.xml:354 ui/window.xml:489 ui/application.xml:431 524 +#: ui/window.xml:222 ui/window.xml:364 ui/window.xml:504 ui/application.xml:431
457 msgid "Options" 525 msgid "Options"
458 msgstr "" 526 msgstr ""
459 527
@@ -461,22 +529,26 @@ msgstr &quot;&quot; @@ -461,22 +529,26 @@ msgstr &quot;&quot;
461 msgid "Parameter Type" 529 msgid "Parameter Type"
462 msgstr "" 530 msgstr ""
463 531
464 -#: ui/window.xml:286 ui/application.xml:261 532 +#: ui/window.xml:296 ui/application.xml:261
465 msgid "Paste from clipboard" 533 msgid "Paste from clipboard"
466 msgstr "" 534 msgstr ""
467 535
468 -#: ui/window.xml:296 ui/application.xml:271 536 +#: ui/window.xml:306 ui/application.xml:271
469 msgid "Paste from text file" 537 msgid "Paste from text file"
470 msgstr "" 538 msgstr ""
471 539
472 -#: ui/window.xml:291 ui/application.xml:266 540 +#: ui/window.xml:301 ui/application.xml:266
473 msgid "Paste next" 541 msgid "Paste next"
474 msgstr "" 542 msgstr ""
475 543
476 -#: ui/window.xml:393 ui/application.xml:469 544 +#: ui/window.xml:403 ui/application.xml:469
477 msgid "Paste with left margin" 545 msgid "Paste with left margin"
478 msgstr "" 546 msgstr ""
479 547
  548 +#: src/objects/os/linux/savedesktopicon.c:71
  549 +msgid "Path for the new shortcut"
  550 +msgstr ""
  551 +
480 #: ui/window.xml:129 552 #: ui/window.xml:129
481 msgid "Preferences" 553 msgid "Preferences"
482 msgstr "" 554 msgstr ""
@@ -485,11 +557,11 @@ msgstr &quot;&quot; @@ -485,11 +557,11 @@ msgstr &quot;&quot;
485 msgid "Print" 557 msgid "Print"
486 msgstr "" 558 msgstr ""
487 559
488 -#: ui/window.xml:439 560 +#: ui/window.xml:454
489 msgid "Print screen" 561 msgid "Print screen"
490 msgstr "" 562 msgstr ""
491 563
492 -#: ui/window.xml:252 564 +#: ui/window.xml:262
493 msgid "Print selected" 565 msgid "Print selected"
494 msgstr "" 566 msgstr ""
495 567
@@ -502,15 +574,15 @@ msgstr &quot;&quot; @@ -502,15 +574,15 @@ msgstr &quot;&quot;
502 msgid "Quit" 574 msgid "Quit"
503 msgstr "" 575 msgstr ""
504 576
505 -#: src/objects/window/page.c:261 577 +#: src/objects/window/page.c:262
506 msgid "Rename Session" 578 msgid "Rename Session"
507 msgstr "" 579 msgstr ""
508 580
509 -#: ui/window.xml:315 ui/application.xml:295 581 +#: ui/window.xml:325 ui/application.xml:295
510 msgid "Reselect" 582 msgid "Reselect"
511 msgstr "" 583 msgstr ""
512 584
513 -#: ui/window.xml:364 ui/application.xml:464 585 +#: ui/window.xml:374 ui/application.xml:464
514 msgid "Resize on alternate screen" 586 msgid "Resize on alternate screen"
515 msgstr "" 587 msgstr ""
516 588
@@ -518,55 +590,59 @@ msgstr &quot;&quot; @@ -518,55 +590,59 @@ msgstr &quot;&quot;
518 msgid "Right keypad" 590 msgid "Right keypad"
519 msgstr "" 591 msgstr ""
520 592
521 -#: src/objects/toolbar/toolbar.c:286  
522 -msgid "S_tyle" 593 +#: ui/window.xml:69 ui/application.xml:134
  594 +msgid "Save"
523 msgstr "" 595 msgstr ""
524 596
525 -#: src/objects/actions/save.c:64 ui/window.xml:69 ui/application.xml:134  
526 -msgid "Save" 597 +#: src/objects/actions/save.c:77
  598 +msgid "Save current session preferences to file"
527 msgstr "" 599 msgstr ""
528 600
529 -#: src/objects/actions/save.c:49  
530 -msgid "Save As" 601 +#: ui/window.xml:449
  602 +msgid "Save screen"
531 msgstr "" 603 msgstr ""
532 604
533 -#: src/objects/windows/savedesktopicon.c:78  
534 -msgid "Save desktop icon" 605 +#: ui/window.xml:257
  606 +msgid "Save selected"
535 msgstr "" 607 msgstr ""
536 608
537 -#: ui/window.xml:434  
538 -msgid "Save screen" 609 +#: src/objects/actions/save.c:75 src/objects/actions/save.c:153
  610 +msgid "Save session preferences"
539 msgstr "" 611 msgstr ""
540 612
541 -#: ui/window.xml:247  
542 -msgid "Save selected" 613 +#: src/objects/os/linux/savedesktopicon.c:113
  614 +msgid "Save session shortcut"
  615 +msgstr ""
  616 +
  617 +#: src/objects/os/linux/savedesktopicon.c:264
  618 +msgid "Save to session filename"
543 msgstr "" 619 msgstr ""
544 620
545 -#: src/objects/actions/save.c:51  
546 -msgid "Save session properties" 621 +#: src/objects/os/linux/savedesktopicon.c:236
  622 +msgid "Save to shortcut file"
547 msgstr "" 623 msgstr ""
548 624
549 -#: ui/window.xml:503 ui/application.xml:400 625 +#: ui/window.xml:518 ui/application.xml:400
550 msgid "Screen size" 626 msgid "Screen size"
551 msgstr "" 627 msgstr ""
552 628
553 -#: ui/window.xml:310 ui/application.xml:285 629 +#: ui/window.xml:320 ui/application.xml:285
554 msgid "Select Field" 630 msgid "Select Field"
555 msgstr "" 631 msgstr ""
556 632
557 -#: ui/window.xml:305 ui/application.xml:280 633 +#: ui/window.xml:315 ui/application.xml:280
558 msgid "Select all" 634 msgid "Select all"
559 msgstr "" 635 msgstr ""
560 636
561 -#: ui/window.xml:217 ui/application.xml:479 637 +#: ui/window.xml:227 ui/application.xml:479
562 msgid "Select by rectangles" 638 msgid "Select by rectangles"
563 msgstr "" 639 msgstr ""
564 640
565 -#: src/objects/toolbar/settings.c:108 641 +#: src/objects/toolbar/settings.c:106
566 msgid "Select the toolbar itens" 642 msgid "Select the toolbar itens"
567 msgstr "" 643 msgstr ""
568 644
569 -#: src/objects/toolbar/settings.c:113 645 +#: src/objects/toolbar/settings.c:111
570 msgid "Selected" 646 msgid "Selected"
571 msgstr "" 647 msgstr ""
572 648
@@ -579,12 +655,12 @@ msgstr &quot;&quot; @@ -579,12 +655,12 @@ msgstr &quot;&quot;
579 msgid "Send/Receive" 655 msgid "Send/Receive"
580 msgstr "" 656 msgstr ""
581 657
582 -#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:444 658 +#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:459
583 #: ui/application.xml:195 659 #: ui/application.xml:195
584 msgid "Send/Receive files" 660 msgid "Send/Receive files"
585 msgstr "" 661 msgstr ""
586 662
587 -#: src/objects/toolbar/settings.c:266 src/objects/toolbar/settings.c:276 663 +#: src/objects/toolbar/settings.c:234 src/objects/toolbar/settings.c:244
588 msgid "Separator" 664 msgid "Separator"
589 msgstr "" 665 msgstr ""
590 666
@@ -592,10 +668,14 @@ msgstr &quot;&quot; @@ -592,10 +668,14 @@ msgstr &quot;&quot;
592 msgid "Session" 668 msgid "Session"
593 msgstr "" 669 msgstr ""
594 670
595 -#: ui/application.xml:76 671 +#: ui/window.xml:440 ui/window.xml:560 ui/application.xml:76
596 msgid "Session Trace" 672 msgid "Session Trace"
597 msgstr "" 673 msgstr ""
598 674
  675 +#: src/objects/actions/save.c:63 src/objects/os/linux/savedesktopicon.c:85
  676 +msgid "Session file"
  677 +msgstr ""
  678 +
599 #: ui/window.xml:61 ui/application.xml:126 679 #: ui/window.xml:61 ui/application.xml:126
600 msgid "Session in New Tab" 680 msgid "Session in New Tab"
601 msgstr "" 681 msgstr ""
@@ -604,12 +684,16 @@ msgstr &quot;&quot; @@ -604,12 +684,16 @@ msgstr &quot;&quot;
604 msgid "Session in new window" 684 msgid "Session in new window"
605 msgstr "" 685 msgstr ""
606 686
607 -#: src/objects/window/actions/sessionproperties.c:45 ui/window.xml:98  
608 -#: ui/window.xml:554 ui/application.xml:163  
609 -msgid "Session properties" 687 +#: src/objects/actions/save.c:56 src/objects/os/linux/savedesktopicon.c:77
  688 +msgid "Session name"
  689 +msgstr ""
  690 +
  691 +#: src/objects/window/actions/sessionproperties.c:46 ui/window.xml:98
  692 +#: ui/window.xml:574 ui/application.xml:163
  693 +msgid "Session preferences"
610 msgstr "" 694 msgstr ""
611 695
612 -#: src/objects/application/application.c:221 696 +#: src/objects/application/application.c:219
613 msgid "Set the user-interface type" 697 msgid "Set the user-interface type"
614 msgstr "" 698 msgstr ""
615 699
@@ -617,34 +701,58 @@ msgstr &quot;&quot; @@ -617,34 +701,58 @@ msgstr &quot;&quot;
617 msgid "Settings" 701 msgid "Settings"
618 msgstr "" 702 msgstr ""
619 703
620 -#: src/objects/toolbar/settings.c:207 704 +#: src/objects/toolbar/settings.c:176
621 msgid "Setup the toolbar layout" 705 msgid "Setup the toolbar layout"
622 msgstr "" 706 msgstr ""
623 707
624 -#: src/objects/toolbar/settings.c:90 708 +#: src/objects/window/header-settings.c:87
  709 +msgid "Setup title bar"
  710 +msgstr ""
  711 +
  712 +#: src/objects/toolbar/toolbar.c:214 src/objects/toolbar/settings.c:88
625 msgid "Setup toolbar" 713 msgid "Setup toolbar"
626 msgstr "" 714 msgstr ""
627 715
  716 +#: src/objects/os/linux/savedesktopicon.c:70
  717 +msgid "Shortcut file"
  718 +msgstr ""
  719 +
  720 +#: ui/window.xml:93 ui/application.xml:158
  721 +msgid "Shortcut for this session"
  722 +msgstr ""
  723 +
  724 +#: src/objects/os/linux/savedesktopicon.c:63
  725 +msgid "Shortcut name"
  726 +msgstr ""
  727 +
628 #: ui/application.xml:494 728 #: ui/application.xml:494
629 msgid "Show Underline" 729 msgid "Show Underline"
630 msgstr "" 730 msgstr ""
631 731
632 -#: ui/window.xml:231 732 +#: ui/window.xml:241
633 msgid "Show menu" 733 msgid "Show menu"
634 msgstr "" 734 msgstr ""
635 735
636 -#: ui/window.xml:226 736 +#: ui/window.xml:236
637 msgid "Show toolbar" 737 msgid "Show toolbar"
638 msgstr "" 738 msgstr ""
639 739
640 -#: src/objects/toolbar/toolbar.c:53 740 +#: src/objects/toolbar/models.c:61
641 msgid "Small" 741 msgid "Small"
642 msgstr "" 742 msgstr ""
643 743
644 -#: ui/window.xml:388 ui/application.xml:504 744 +#: ui/window.xml:398 ui/application.xml:504
645 msgid "Smart paste" 745 msgid "Smart paste"
646 msgstr "" 746 msgstr ""
647 747
  748 +#: src/objects/os/linux/savedesktopicon.c:239
  749 +msgid "Standard desktop files"
  750 +msgstr ""
  751 +
  752 +#: src/objects/settings/actionview.c:68
  753 +msgid "Start"
  754 +msgstr ""
  755 +
648 #: src/objects/actions/abstract.c:152 756 #: src/objects/actions/abstract.c:152
649 msgid "State" 757 msgid "State"
650 msgstr "" 758 msgstr ""
@@ -653,11 +761,12 @@ msgstr &quot;&quot; @@ -653,11 +761,12 @@ msgstr &quot;&quot;
653 msgid "State Type" 761 msgid "State Type"
654 msgstr "" 762 msgstr ""
655 763
656 -#: src/objects/toolbar/settings.c:55  
657 -msgid "Style" 764 +#: src/objects/toolbar/models.c:115
  765 +msgid "Symbolic"
658 msgstr "" 766 msgstr ""
659 767
660 -#: src/objects/toolbar/toolbar.c:47 src/objects/toolbar/toolbar.c:69 768 +#: src/objects/toolbar/models.c:55 src/objects/toolbar/models.c:82
  769 +#: src/objects/toolbar/models.c:111
661 msgid "System default" 770 msgid "System default"
662 msgstr "" 771 msgstr ""
663 772
@@ -673,7 +782,7 @@ msgstr &quot;&quot; @@ -673,7 +782,7 @@ msgstr &quot;&quot;
673 msgid "Terminal font" 782 msgid "Terminal font"
674 msgstr "" 783 msgstr ""
675 784
676 -#: src/objects/toolbar/toolbar.c:79 785 +#: src/objects/toolbar/models.c:92
677 msgid "Text only" 786 msgid "Text only"
678 msgstr "" 787 msgstr ""
679 788
@@ -693,6 +802,14 @@ msgstr &quot;&quot; @@ -693,6 +802,14 @@ msgstr &quot;&quot;
693 msgid "The code of the User interface type" 802 msgid "The code of the User interface type"
694 msgstr "" 803 msgstr ""
695 804
  805 +#: src/objects/actions/save.c:64
  806 +msgid "The file to save the current session preferences"
  807 +msgstr ""
  808 +
  809 +#: src/objects/os/linux/savedesktopicon.c:86
  810 +msgid "The file with the session preferences for this shortcut"
  811 +msgstr ""
  812 +
696 #: src/objects/actions/abstract.c:110 813 #: src/objects/actions/abstract.c:110
697 msgid "The label for the action" 814 msgid "The label for the action"
698 msgstr "" 815 msgstr ""
@@ -701,11 +818,11 @@ msgstr &quot;&quot; @@ -701,11 +818,11 @@ msgstr &quot;&quot;
701 msgid "The name of associated action" 818 msgid "The name of associated action"
702 msgstr "" 819 msgstr ""
703 820
704 -#: src/objects/window/window.c:164 821 +#: src/objects/window/window.c:185
705 msgid "The name of the actions in the header bar" 822 msgid "The name of the actions in the header bar"
706 msgstr "" 823 msgstr ""
707 824
708 -#: src/objects/toolbar/toolbar.c:136 825 +#: src/objects/toolbar/toolbar.c:98
709 msgid "The name of the actions in the toolbar" 826 msgid "The name of the actions in the toolbar"
710 msgstr "" 827 msgstr ""
711 828
@@ -729,15 +846,23 @@ msgstr &quot;&quot; @@ -729,15 +846,23 @@ msgstr &quot;&quot;
729 msgid "The position of the keypad" 846 msgid "The position of the keypad"
730 msgstr "" 847 msgstr ""
731 848
  849 +#: src/objects/actions/save.c:57 src/objects/os/linux/savedesktopicon.c:79
  850 +msgid "The session name used in the window/tab title (empty for default)"
  851 +msgstr ""
  852 +
732 #: src/objects/actions/abstract.c:153 853 #: src/objects/actions/abstract.c:153
733 msgid "The state the action is in" 854 msgid "The state the action is in"
734 msgstr "" 855 msgstr ""
735 856
736 -#: src/objects/toolbar/toolbar.c:147 857 +#: src/objects/toolbar/toolbar.c:109
737 msgid "The toolbar icon size" 858 msgid "The toolbar icon size"
738 msgstr "" 859 msgstr ""
739 860
740 -#: src/objects/toolbar/toolbar.c:160 861 +#: src/objects/toolbar/toolbar.c:135
  862 +msgid "The toolbar icon type"
  863 +msgstr ""
  864 +
  865 +#: src/objects/toolbar/toolbar.c:122
741 msgid "The toolbar style" 866 msgid "The toolbar style"
742 msgstr "" 867 msgstr ""
743 868
@@ -753,12 +878,28 @@ msgstr &quot;&quot; @@ -753,12 +878,28 @@ msgstr &quot;&quot;
753 msgid "The type of the state kept by the action" 878 msgid "The type of the state kept by the action"
754 msgstr "" 879 msgstr ""
755 880
756 -#: src/objects/toolbar/settings.c:89 ui/window.xml:420 ui/window.xml:535 881 +#: src/objects/window/header-settings.c:86
  882 +msgid "Title bar"
  883 +msgstr ""
  884 +
  885 +#: src/objects/window/header-settings.c:98
  886 +msgid "Title bar actions"
  887 +msgstr ""
  888 +
  889 +#: src/objects/toolbar/settings.c:87 ui/window.xml:430 ui/window.xml:550
757 #: ui/application.xml:342 890 #: ui/application.xml:342
758 msgid "Toolbar" 891 msgid "Toolbar"
759 msgstr "" 892 msgstr ""
760 893
761 -#: ui/window.xml:425 894 +#: src/objects/toolbar/settings.c:68
  895 +msgid "Toolbar Style"
  896 +msgstr ""
  897 +
  898 +#: src/objects/toolbar/models.c:79
  899 +msgid "Toolbar s_tyle"
  900 +msgstr ""
  901 +
  902 +#: ui/window.xml:435
762 msgid "Top menu" 903 msgid "Top menu"
763 msgstr "" 904 msgstr ""
764 905
@@ -766,7 +907,7 @@ msgstr &quot;&quot; @@ -766,7 +907,7 @@ msgstr &quot;&quot;
766 msgid "Trace" 907 msgid "Trace"
767 msgstr "" 908 msgstr ""
768 909
769 -#: ui/window.xml:474 ui/application.xml:449 910 +#: ui/window.xml:489 ui/application.xml:449
770 msgid "Track Cursor" 911 msgid "Track Cursor"
771 msgstr "" 912 msgstr ""
772 913
@@ -774,7 +915,7 @@ msgstr &quot;&quot; @@ -774,7 +915,7 @@ msgstr &quot;&quot;
774 msgid "UI Type" 915 msgid "UI Type"
775 msgstr "" 916 msgstr ""
776 917
777 -#: ui/window.xml:257 ui/application.xml:290 918 +#: ui/window.xml:267 ui/application.xml:290
778 msgid "Unselect" 919 msgid "Unselect"
779 msgstr "" 920 msgstr ""
780 921
@@ -782,34 +923,38 @@ msgstr &quot;&quot; @@ -782,34 +923,38 @@ msgstr &quot;&quot;
782 msgid "Use +/- for field navigation" 923 msgid "Use +/- for field navigation"
783 msgstr "" 924 msgstr ""
784 925
785 -#: src/objects/application/actions/about.c:86  
786 -#: src/objects/application/actions/about.c:88 926 +#: src/objects/application/actions/about.c:70
787 #, c-format 927 #, c-format
788 msgid "Version %s-%s" 928 msgid "Version %s-%s"
789 msgstr "" 929 msgstr ""
790 930
791 -#: src/objects/window/header.c:66 ui/window.xml:417 ui/window.xml:532 931 +#: src/objects/window/header.c:66 ui/window.xml:427 ui/window.xml:547
792 #: ui/application.xml:63 932 #: ui/application.xml:63
793 msgid "View" 933 msgid "View"
794 msgstr "" 934 msgstr ""
795 935
  936 +#: src/objects/application/actions/about.c:163
  937 +msgid "View this project on github"
  938 +msgstr ""
  939 +
796 #: ui/window.xml:40 ui/application.xml:105 940 #: ui/window.xml:40 ui/application.xml:105
797 msgid "Window with default session" 941 msgid "Window with default session"
798 msgstr "" 942 msgstr ""
799 943
800 -#: src/objects/settings/dialog.c:84 944 +#: src/objects/settings/dialog.c:79
801 msgid "_Apply" 945 msgid "_Apply"
802 msgstr "" 946 msgstr ""
803 947
804 -#: src/objects/settings/dialog.c:83 src/objects/windows/savedesktopicon.c:104 948 +#: src/objects/actions/save.c:102 src/objects/settings/dialog.c:78
  949 +#: src/objects/os/linux/savedesktopicon.c:174
805 msgid "_Cancel" 950 msgid "_Cancel"
806 msgstr "" 951 msgstr ""
807 952
808 -#: src/objects/window/page.c:394 953 +#: src/objects/window/page.c:371
809 msgid "_Close session" 954 msgid "_Close session"
810 msgstr "" 955 msgstr ""
811 956
812 -#: ui/window.xml:549 ui/application.xml:368 957 +#: ui/window.xml:569 ui/application.xml:368
813 msgid "_Connect" 958 msgid "_Connect"
814 msgstr "" 959 msgstr ""
815 960
@@ -817,7 +962,7 @@ msgstr &quot;&quot; @@ -817,7 +962,7 @@ msgstr &quot;&quot;
817 msgid "_Disconnect" 962 msgid "_Disconnect"
818 msgstr "" 963 msgstr ""
819 964
820 -#: ui/window.xml:148 ui/window.xml:281 ui/application.xml:231 965 +#: ui/window.xml:148 ui/window.xml:291 ui/application.xml:231
821 msgid "_Edit" 966 msgid "_Edit"
822 msgstr "" 967 msgstr ""
823 968
@@ -837,15 +982,15 @@ msgstr &quot;&quot; @@ -837,15 +982,15 @@ msgstr &quot;&quot;
837 msgid "_Open" 982 msgid "_Open"
838 msgstr "" 983 msgstr ""
839 984
840 -#: src/objects/toolbar/toolbar.c:308  
841 -msgid "_Properties" 985 +#: src/objects/toolbar/toolbar.c:236
  986 +msgid "_Preferences"
842 msgstr "" 987 msgstr ""
843 988
844 -#: src/objects/window/page.c:388 989 +#: src/objects/window/page.c:365
845 msgid "_Rename session" 990 msgid "_Rename session"
846 msgstr "" 991 msgstr ""
847 992
848 -#: src/objects/windows/savedesktopicon.c:105 993 +#: src/objects/actions/save.c:103 src/objects/os/linux/savedesktopicon.c:175
849 msgid "_Save" 994 msgid "_Save"
850 msgstr "" 995 msgstr ""
851 996
@@ -853,6 +998,10 @@ msgstr &quot;&quot; @@ -853,6 +998,10 @@ msgstr &quot;&quot;
853 msgid "_View" 998 msgid "_View"
854 msgstr "" 999 msgstr ""
855 1000
856 -#: src/objects/application/actions/about.c:145 1001 +#: src/objects/application/actions/about.c:162
  1002 +msgid "https://github.com/PerryWerneck/pw3270"
  1003 +msgstr ""
  1004 +
  1005 +#: src/objects/application/actions/about.c:165
857 msgid "translator-credits" 1006 msgid "translator-credits"
858 msgstr "" 1007 msgstr ""
@@ -43,13 +43,18 @@ @@ -43,13 +43,18 @@
43 <Unit filename="Makefile.in" /> 43 <Unit filename="Makefile.in" />
44 <Unit filename="configure.ac" /> 44 <Unit filename="configure.ac" />
45 <Unit filename="schemas/linux/application.gschema.xml.in" /> 45 <Unit filename="schemas/linux/application.gschema.xml.in" />
  46 + <Unit filename="schemas/linux/window.gschema.xml.in" />
  47 + <Unit filename="schemas/windows/application.gschema.xml.in" />
  48 + <Unit filename="schemas/windows/window.gschema.xml.in" />
46 <Unit filename="src/include/pw3270.h" /> 49 <Unit filename="src/include/pw3270.h" />
47 <Unit filename="src/include/pw3270/actions.h" /> 50 <Unit filename="src/include/pw3270/actions.h" />
48 <Unit filename="src/include/pw3270/application.h" /> 51 <Unit filename="src/include/pw3270/application.h" />
49 <Unit filename="src/include/pw3270/keypad.h" /> 52 <Unit filename="src/include/pw3270/keypad.h" />
50 <Unit filename="src/include/pw3270/settings.h" /> 53 <Unit filename="src/include/pw3270/settings.h" />
51 <Unit filename="src/include/pw3270/toolbar.h" /> 54 <Unit filename="src/include/pw3270/toolbar.h" />
  55 + <Unit filename="src/include/pw3270/tools.h" />
52 <Unit filename="src/include/pw3270/window.h" /> 56 <Unit filename="src/include/pw3270/window.h" />
  57 + <Unit filename="src/include/v3270/keyfile.h" />
53 <Unit filename="src/main/main.c"> 58 <Unit filename="src/main/main.c">
54 <Option compilerVar="CC" /> 59 <Option compilerVar="CC" />
55 </Unit> 60 </Unit>
@@ -126,7 +131,13 @@ @@ -126,7 +131,13 @@
126 <Unit filename="src/objects/keypad/widget.c"> 131 <Unit filename="src/objects/keypad/widget.c">
127 <Option compilerVar="CC" /> 132 <Option compilerVar="CC" />
128 </Unit> 133 </Unit>
129 - <Unit filename="src/objects/linux/savedesktopicon.c"> 134 + <Unit filename="src/objects/os/linux/savedesktopicon.c">
  135 + <Option compilerVar="CC" />
  136 + </Unit>
  137 + <Unit filename="src/objects/os/windows/savedesktopicon.c">
  138 + <Option compilerVar="CC" />
  139 + </Unit>
  140 + <Unit filename="src/objects/settings/actionview.c">
130 <Option compilerVar="CC" /> 141 <Option compilerVar="CC" />
131 </Unit> 142 </Unit>
132 <Unit filename="src/objects/settings/dialog.c"> 143 <Unit filename="src/objects/settings/dialog.c">
@@ -138,6 +149,9 @@ @@ -138,6 +149,9 @@
138 <Unit filename="src/objects/toolbar/actions.c"> 149 <Unit filename="src/objects/toolbar/actions.c">
139 <Option compilerVar="CC" /> 150 <Option compilerVar="CC" />
140 </Unit> 151 </Unit>
  152 + <Unit filename="src/objects/toolbar/models.c">
  153 + <Option compilerVar="CC" />
  154 + </Unit>
141 <Unit filename="src/objects/toolbar/private.h" /> 155 <Unit filename="src/objects/toolbar/private.h" />
142 <Unit filename="src/objects/toolbar/settings.c"> 156 <Unit filename="src/objects/toolbar/settings.c">
143 <Option compilerVar="CC" /> 157 <Option compilerVar="CC" />
@@ -163,9 +177,15 @@ @@ -163,9 +177,15 @@
163 <Unit filename="src/objects/window/actions/setcolors.c"> 177 <Unit filename="src/objects/window/actions/setcolors.c">
164 <Option compilerVar="CC" /> 178 <Option compilerVar="CC" />
165 </Unit> 179 </Unit>
  180 + <Unit filename="src/objects/window/header-settings.c">
  181 + <Option compilerVar="CC" />
  182 + </Unit>
166 <Unit filename="src/objects/window/header.c"> 183 <Unit filename="src/objects/window/header.c">
167 <Option compilerVar="CC" /> 184 <Option compilerVar="CC" />
168 </Unit> 185 </Unit>
  186 + <Unit filename="src/objects/window/keyfile.c">
  187 + <Option compilerVar="CC" />
  188 + </Unit>
169 <Unit filename="src/objects/window/page.c"> 189 <Unit filename="src/objects/window/page.c">
170 <Option compilerVar="CC" /> 190 <Option compilerVar="CC" />
171 </Unit> 191 </Unit>
@@ -179,7 +199,7 @@ @@ -179,7 +199,7 @@
179 <Unit filename="src/objects/window/window.c"> 199 <Unit filename="src/objects/window/window.c">
180 <Option compilerVar="CC" /> 200 <Option compilerVar="CC" />
181 </Unit> 201 </Unit>
182 - <Unit filename="src/objects/windows/savedesktopicon.c"> 202 + <Unit filename="src/tools/entry.c">
183 <Option compilerVar="CC" /> 203 <Option compilerVar="CC" />
184 </Unit> 204 </Unit>
185 <Unit filename="ui/application.xml" /> 205 <Unit filename="ui/application.xml" />
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <param name="changesgenerate">enable</param> 8 <param name="changesgenerate">enable</param>
9 <param name="changesauthor">perry.werneck@gmail.com</param> 9 <param name="changesauthor">perry.werneck@gmail.com</param>
10 10
11 - <param name="versionformat">@PARENT_TAG@</param> 11 + <param name="versionformat">@PARENT_TAG@+git%cd</param>
12 <param name="scm">git</param> 12 <param name="scm">git</param>
13 </service> 13 </service>
14 14
rpm/pw3270.spec
@@ -22,17 +22,17 @@ @@ -22,17 +22,17 @@
22 22
23 #---[ Packaging ]----------------------------------------------------------------------------------------------------- 23 #---[ Packaging ]-----------------------------------------------------------------------------------------------------
24 24
25 -Name: pw3270  
26 -Version: 5.3  
27 -Release: 0  
28 -Summary: IBM 3270 Terminal emulator for GTK  
29 -License: GPL-2.0  
30 -Group: System/X11/Terminals  
31 -Url: https://portal.softwarepublico.gov.br/social/pw3270/ 25 +Name: pw3270
  26 +Version: 5.3
  27 +Release: 0
  28 +Summary: IBM 3270 Terminal emulator for GTK
  29 +License: GPL-2.0
  30 +Group: System/X11/Terminals
  31 +Url: https://github.com/PerryWerneck/pw3270
32 32
33 -Source: pw3270-%{version}.tar.xz 33 +Source: pw3270-%{version}.tar.xz
34 34
35 -BuildRoot: %{_tmppath}/%{name}-%{version}-build 35 +BuildRoot: %{_tmppath}/%{name}-%{version}-build
36 36
37 Requires: shared-mime-info 37 Requires: shared-mime-info
38 Requires: %{name}-branding = %{version} 38 Requires: %{name}-branding = %{version}
@@ -41,7 +41,6 @@ BuildRequires: update-desktop-files @@ -41,7 +41,6 @@ BuildRequires: update-desktop-files
41 41
42 %glib2_gsettings_schema_requires 42 %glib2_gsettings_schema_requires
43 43
44 -  
45 #--[ Setup by distribution ]------------------------------------------------------------------------------------------ 44 #--[ Setup by distribution ]------------------------------------------------------------------------------------------
46 # 45 #
47 # References: 46 # References:
@@ -56,7 +55,7 @@ BuildRequires: update-desktop-files @@ -56,7 +55,7 @@ BuildRequires: update-desktop-files
56 BuildRequires: gtk3-devel 55 BuildRequires: gtk3-devel
57 BuildRequires: glib2-devel 56 BuildRequires: glib2-devel
58 BuildRequires: librsvg2-tools 57 BuildRequires: librsvg2-tools
59 -BuildRequires: libv3270-devel >= %{version} 58 +BuildRequires: libv3270-devel >= 5.3
60 59
61 %endif 60 %endif
62 61
@@ -66,7 +65,7 @@ BuildRequires: libv3270-devel &gt;= %{version} @@ -66,7 +65,7 @@ BuildRequires: libv3270-devel &gt;= %{version}
66 65
67 BuildRequires: gtk3-devel 66 BuildRequires: gtk3-devel
68 BuildRequires: glib2-devel 67 BuildRequires: glib2-devel
69 -BuildRequires: libv3270-devel 68 +BuildRequires: libv3270-devel >= 5.3
70 69
71 # Required for genmarshal 70 # Required for genmarshal
72 BuildRequires: python 71 BuildRequires: python
@@ -79,7 +78,7 @@ BuildRequires: python @@ -79,7 +78,7 @@ BuildRequires: python
79 78
80 BuildRequires: pkgconfig(gtk+-3.0) 79 BuildRequires: pkgconfig(gtk+-3.0)
81 BuildRequires: pkgconfig(glib-2.0) 80 BuildRequires: pkgconfig(glib-2.0)
82 -BuildRequires: pkgconfig(libv3270) >= %{version} 81 +BuildRequires: pkgconfig(libv3270) >= 5.3
83 82
84 %endif 83 %endif
85 84
@@ -89,7 +88,7 @@ BuildRequires: pkgconfig(libv3270) &gt;= %{version} @@ -89,7 +88,7 @@ BuildRequires: pkgconfig(libv3270) &gt;= %{version}
89 88
90 BuildRequires: pkgconfig(gtk+-3.0) 89 BuildRequires: pkgconfig(gtk+-3.0)
91 BuildRequires: pkgconfig(glib-2.0) 90 BuildRequires: pkgconfig(glib-2.0)
92 -BuildRequires: pkgconfig(libv3270) >= %{version} 91 +BuildRequires: pkgconfig(libv3270) >= 5.3
93 92
94 %endif 93 %endif
95 94
@@ -192,6 +191,7 @@ make all -j1 @@ -192,6 +191,7 @@ make all -j1
192 %{_datadir}/%{_product}/*.png 191 %{_datadir}/%{_product}/*.png
193 %{_datadir}/applications/*.desktop 192 %{_datadir}/applications/*.desktop
194 %{_datadir}/pixmaps/*.png 193 %{_datadir}/pixmaps/*.png
  194 +%{_datadir}/mime/packages/*.xml
195 195
196 %files keypads 196 %files keypads
197 %{_datadir}/%{_product}/keypad/* 197 %{_datadir}/%{_product}/keypad/*
schemas/linux/window.gschema.xml.in
@@ -82,19 +82,37 @@ @@ -82,19 +82,37 @@
82 82
83 <key name="toolbar-icon-size" type="i"> 83 <key name="toolbar-icon-size" type="i">
84 <default>0</default> 84 <default>0</default>
85 - <summary>The size of the icons in a toolbar</summary> 85 + <summary>The size of the toolbar icons</summary>
  86 + <description></description>
  87 + </key>
  88 +
  89 + <key name="toolbar-icon-type" type="i">
  90 + <default>0</default>
  91 + <summary>Use symbolic icons on toolbar</summary>
  92 + <description></description>
  93 + </key>
  94 +
  95 + <key name="header-icon-type" type="i">
  96 + <default>0</default>
  97 + <summary>Use symbolic icons on title bar</summary>
  98 + <description></description>
  99 + </key>
  100 +
  101 + <key name="toolbar-position" type="i">
  102 + <default>0</default>
  103 + <summary>The toolbar position</summary>
86 <description></description> 104 <description></description>
87 </key> 105 </key>
88 106
89 <key name="toolbar-action-names" type="s"> 107 <key name="toolbar-action-names" type="s">
90 - <default>'win.copy,win.paste,win.select-all,separator,win.connect,win.disconnect,separator,win.session.properties,win.file.transfer,win.print,win.close'</default> 108 + <default>'win.copy,win.paste,win.select-all,separator,win.clear,win.erase-input,separator,win.print,separator,win.zoom-out,win.zoom-fit-best,win.zoom-in'</default>
91 <summary>The toolbar action list</summary> 109 <summary>The toolbar action list</summary>
92 <description></description> 110 <description></description>
93 </key> 111 </key>
94 112
95 <key name="header-action-names" type="s"> 113 <key name="header-action-names" type="s">
96 - <default>'win.disconnect,win.reconnect,win.file.transfer,win.print:menu.open-menu'</default>  
97 - <summary>The actions in the header bar</summary> 114 + <default>':menu.open-menu,win.disconnect,win.reconnect'</default>
  115 + <summary>The title bar action list</summary>
98 <description></description> 116 <description></description>
99 </key> 117 </key>
100 118
schemas/windows/window.gschema.xml.in
@@ -82,7 +82,25 @@ @@ -82,7 +82,25 @@
82 82
83 <key name="toolbar-icon-size" type="i"> 83 <key name="toolbar-icon-size" type="i">
84 <default>2</default> 84 <default>2</default>
85 - <summary>The size of the icons in a toolbar</summary> 85 + <summary>The size of the toolbar icons</summary>
  86 + <description></description>
  87 + </key>
  88 +
  89 + <key name="toolbar-icon-type" type="i">
  90 + <default>0</default>
  91 + <summary>Use symbolic icons on toolbar</summary>
  92 + <description></description>
  93 + </key>
  94 +
  95 + <key name="header-icon-type" type="i">
  96 + <default>0</default>
  97 + <summary>Use symbolic icons on title bar</summary>
  98 + <description></description>
  99 + </key>
  100 +
  101 + <key name="toolbar-position" type="i">
  102 + <default>0</default>
  103 + <summary>The toolbar position</summary>
86 <description></description> 104 <description></description>
87 </key> 105 </key>
88 106
src/include/pw3270.h
@@ -68,13 +68,6 @@ @@ -68,13 +68,6 @@
68 68
69 void gtk_file_chooser_set_pw3270_filters(GtkFileChooser *chooser); 69 void gtk_file_chooser_set_pw3270_filters(GtkFileChooser *chooser);
70 70
71 - const gchar * v3270_get_session_filename(GtkWidget *widget);  
72 - void v3270_set_session_filename(GtkWidget *widget, const gchar *filename);  
73 - GKeyFile * v3270_get_session_keyfile(GtkWidget *widget);  
74 -  
75 - /// @brief Check if the terminal has a customized session file.  
76 - gboolean v3270_allow_custom_settings(GtkWidget *widget);  
77 -  
78 G_END_DECLS 71 G_END_DECLS
79 72
80 #endif // PW3270_H_INCLUDED 73 #endif // PW3270_H_INCLUDED
src/include/pw3270/actions.h
@@ -90,15 +90,26 @@ @@ -90,15 +90,26 @@
90 // 90 //
91 typedef GSList Pw3270ActionList; 91 typedef GSList Pw3270ActionList;
92 92
  93 + typedef enum _pw3270ActionViewFlag {
  94 + PW3270_ACTION_VIEW_FLAG_FIXED = 0, ///< @brief Don't move to other views.
  95 + PW3270_ACTION_VIEW_FLAG_ALLOW_ADD = 1, ///< @brief Allow add to target view.
  96 + PW3270_ACTION_VIEW_ALLOW_REMOVE = 2, ///< @brief Allow remove from source view.
  97 + PW3270_ACTION_VIEW_ALLOW_MOVE = 3 ///< @brief Allow move from one view to another.
  98 + } PW3270ActionViewFlag;
  99 +
  100 +
93 GtkWidget * pw3270_action_view_new(); 101 GtkWidget * pw3270_action_view_new();
94 - Pw3270ActionList * pw3270_action_list_new(GtkApplication *application);  
95 - void pw3270_action_list_free(Pw3270ActionList *action_list);  
96 void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); 102 void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list);
  103 + void pw3270_action_view_order_by_label(GtkWidget *view);
97 void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); 104 void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to);
98 - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags); 105 + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags);
99 gchar * pw3270_action_view_get_action_names(GtkWidget *widget); 106 gchar * pw3270_action_view_get_action_names(GtkWidget *widget);
  107 + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name);
100 108
  109 + Pw3270ActionList * pw3270_action_list_new(GtkApplication *application);
  110 + Pw3270ActionList * pw3270_action_list_append(Pw3270ActionList *action_list, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags);
101 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); 111 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view);
  112 + void pw3270_action_list_free(Pw3270ActionList *action_list);
102 113
103 // 114 //
104 // Tools 115 // Tools
@@ -109,8 +120,8 @@ @@ -109,8 +120,8 @@
109 120
110 GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags); 121 GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags);
111 122
112 - GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size);  
113 - GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size); 123 + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic);
  124 + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic);
114 125
115 G_END_DECLS 126 G_END_DECLS
116 127
src/include/pw3270/application.h
@@ -73,6 +73,10 @@ @@ -73,6 +73,10 @@
73 73
74 // Plugins 74 // Plugins
75 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); 75 void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data);
  76 +
  77 + /// @brief Call plugin method.
  78 + void pw3270_application_plugin_call(GApplication *app, const gchar *method, gpointer user_data);
  79 +
76 GSList * pw3270_application_get_plugins(GApplication *app); 80 GSList * pw3270_application_get_plugins(GApplication *app);
77 81
78 // Tools 82 // Tools
@@ -84,6 +88,10 @@ @@ -84,6 +88,10 @@
84 void pw3270_application_print_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); 88 void pw3270_application_print_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal);
85 void pw3270_application_save_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); 89 void pw3270_application_save_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal);
86 90
  91 + // Settings
  92 + GtkWidget * pw3270_header_settings_new();
  93 +
  94 +
87 G_END_DECLS 95 G_END_DECLS
88 96
89 97
src/include/pw3270/settings.h
@@ -36,6 +36,7 @@ @@ -36,6 +36,7 @@
36 #endif // _WIN32 36 #endif // _WIN32
37 37
38 #include <gtk/gtk.h> 38 #include <gtk/gtk.h>
  39 + #include <pw3270/actions.h>
39 40
40 G_BEGIN_DECLS 41 G_BEGIN_DECLS
41 42
@@ -87,8 +88,23 @@ @@ -87,8 +88,23 @@
87 typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass; 88 typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass;
88 89
89 GType PW3270SettingsDialog_get_type(void); 90 GType PW3270SettingsDialog_get_type(void);
90 - GtkWidget * pw3270_settings_dialog_new(GAction *action); 91 + GtkWidget * pw3270_settings_dialog_new(GAction *action, gboolean has_subtitle);
91 92
92 G_END_DECLS 93 G_END_DECLS
93 94
  95 +/*--[ PW3270 Action List Editor ]--------------------------------------------------------------------*/
  96 +
  97 + #define GTK_TYPE_PW3270_SETTINGS_ACTIONS (PW3270SettingsActions_get_type())
  98 +
  99 + typedef struct _PW3270SettingsActions PW3270SettingsActions;
  100 + typedef struct _PW3270SettingsActionsClass PW3270SettingsActionsClass;
  101 +
  102 + GType PW3270SettingsActions_get_type(void);
  103 + GtkWidget * pw3270_settings_actions_new();
  104 + Pw3270ActionList * pw3270_settings_action_set(GtkWidget *widget, Pw3270ActionList *available, const gchar *value);
  105 + gchar * pw3270_settings_action_get(GtkWidget *widget);
  106 +
  107 + G_END_DECLS
  108 +
  109 +
94 #endif // V3270SETTINGS_H_INCLUDED 110 #endif // V3270SETTINGS_H_INCLUDED
src/include/pw3270/toolbar.h
@@ -66,9 +66,11 @@ @@ -66,9 +66,11 @@
66 66
67 void pw3270_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style); 67 void pw3270_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style);
68 void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size); 68 void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size);
  69 + void pw3270_toolbar_set_icon_type(GtkToolbar *toolbar, gint icon_type);
69 70
70 GtkToolbarStyle pw3270_toolbar_get_style(GtkToolbar *toolbar); 71 GtkToolbarStyle pw3270_toolbar_get_style(GtkToolbar *toolbar);
71 GtkIconSize pw3270_toolbar_get_icon_size(GtkToolbar *toolbar); 72 GtkIconSize pw3270_toolbar_get_icon_size(GtkToolbar *toolbar);
  73 + gint pw3270_toolbar_get_icon_type(GtkToolbar *toolbar);
72 74
73 G_END_DECLS 75 G_END_DECLS
74 76
src/include/v3270/keyfile.h 0 → 100644
@@ -0,0 +1,68 @@ @@ -0,0 +1,68 @@
  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 +/**
  31 + * @brief Declares the v3270 keyfile object.
  32 + *
  33 + */
  34 +
  35 +#ifndef V3270_KEYFILE_H_INCLUDED
  36 +
  37 + #define V3270_KEYFILE_H_INCLUDED
  38 +
  39 + #include <glib.h>
  40 +
  41 + G_BEGIN_DECLS
  42 +
  43 + typedef struct _V3270KeyFile V3270KeyFile;
  44 +
  45 + gchar * v3270_keyfile_get_default_filename(void);
  46 + gchar * v3270_key_file_get_default_path(GtkWidget *terminal);
  47 +
  48 + V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error);
  49 + void v3270_key_file_close(GtkWidget *terminal);
  50 +
  51 + void v3270_key_file_save(GtkWidget *terminal, GError **error);
  52 + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error);
  53 +
  54 + /// @brief Get current key filename
  55 + const gchar * v3270_key_file_get_filename(GtkWidget *terminal);
  56 +
  57 + /// @brief Build a writable key filename
  58 + gchar * v3270_key_file_build_filename(GtkWidget *terminal);
  59 +
  60 + GKeyFile * v3270_key_file_get(GtkWidget *terminal);
  61 +
  62 + gboolean v3270_key_file_can_write(GtkWidget *widget);
  63 +
  64 + void v3270_key_file_set_boolean(GtkWidget *terminal, const gchar *group_name, const gchar *key, gboolean value);
  65 +
  66 + G_END_DECLS
  67 +
  68 +#endif // PW3270_H_INCLUDED
src/main/main.c
@@ -94,6 +94,7 @@ int main (int argc, char **argv) { @@ -94,6 +94,7 @@ int main (int argc, char **argv) {
94 { 94 {
95 g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL); 95 g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL);
96 g_autofree gchar * locdir = g_build_filename(appdir,"locale",NULL); 96 g_autofree gchar * locdir = g_build_filename(appdir,"locale",NULL);
  97 + debug("Locale from \"%s\"\n",locdir);
97 bindtextdomain( PACKAGE_NAME, locdir ); 98 bindtextdomain( PACKAGE_NAME, locdir );
98 } 99 }
99 #endif // _WIN32 100 #endif // _WIN32
src/main/windows/resources.rc.in
@@ -16,7 +16,7 @@ BEGIN @@ -16,7 +16,7 @@ BEGIN
16 VALUE "CompanyName", "Banco do Brasil S/A.\0" 16 VALUE "CompanyName", "Banco do Brasil S/A.\0"
17 VALUE "FileVersion", "@WIN32_VERSION@\0" 17 VALUE "FileVersion", "@WIN32_VERSION@\0"
18 VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" 18 VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0"
19 - VALUE "OriginalFilename", "@APPLICATION_NAME@.exe_NAME@.exe\0"" 19 + VALUE "OriginalFilename", "@PRODUCT_NAME@.exe_NAME@.exe\0""
20 VALUE "ProductName", "@PRODUCT_NAME@\0" 20 VALUE "ProductName", "@PRODUCT_NAME@\0"
21 VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.@PACKAGE_MINOR_RELEASE@\0" 21 VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.@PACKAGE_MINOR_RELEASE@\0"
22 END 22 END
src/objects/actions/button.c
@@ -35,14 +35,19 @@ @@ -35,14 +35,19 @@
35 #include "private.h" 35 #include "private.h"
36 #include <pw3270/actions.h> 36 #include <pw3270/actions.h>
37 37
38 - GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size) { 38 + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic) {
39 39
40 if(!action) 40 if(!action)
41 return NULL; 41 return NULL;
42 42
43 g_autofree gchar * icon_name = g_action_get_icon_name(action); 43 g_autofree gchar * icon_name = g_action_get_icon_name(action);
44 - if(icon_name) 44 + if(icon_name) {
  45 + if(symbolic && !strstr(icon_name,"-symbolic")) {
  46 + g_autofree gchar * name = g_strconcat(icon_name,"-symbolic",NULL);
  47 + return gtk_button_new_from_icon_name(name,icon_size);
  48 + }
45 return gtk_button_new_from_icon_name(icon_name,icon_size); 49 return gtk_button_new_from_icon_name(icon_name,icon_size);
  50 + }
46 51
47 GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK); 52 GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK);
48 53
@@ -62,7 +67,7 @@ @@ -62,7 +67,7 @@
62 return NULL; 67 return NULL;
63 } 68 }
64 69
65 - GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size) { 70 + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic) {
66 71
67 if(!action) 72 if(!action)
68 return NULL; 73 return NULL;
@@ -75,14 +80,18 @@ @@ -75,14 +80,18 @@
75 } 80 }
76 81
77 g_autofree gchar * icon_name = g_action_get_icon_name(action); 82 g_autofree gchar * icon_name = g_action_get_icon_name(action);
78 -// debug("%s(%s).icon_name=%s",__FUNCTION__,g_action_get_name(action),icon_name);  
79 83
80 if(icon_name) { 84 if(icon_name) {
81 85
82 // Has icon name 86 // Has icon name
83 GtkToolItem * item = gtk_tool_button_new(NULL,label); 87 GtkToolItem * item = gtk_tool_button_new(NULL,label);
84 88
85 - gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name); 89 + if(symbolic && !strstr(icon_name,"-symbolic")) {
  90 + g_autofree gchar * symbolic_name = g_strconcat(icon_name,"-symbolic",NULL);
  91 + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),symbolic_name);
  92 + } else {
  93 + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name);
  94 + }
86 95
87 if(tooltip) 96 if(tooltip)
88 gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); 97 gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip);
src/objects/actions/save.c
@@ -34,21 +34,47 @@ @@ -34,21 +34,47 @@
34 34
35 #include "private.h" 35 #include "private.h"
36 #include <v3270.h> 36 #include <v3270.h>
  37 + #include <v3270/keyfile.h>
37 #include <pw3270.h> 38 #include <pw3270.h>
38 #include <pw3270/application.h> 39 #include <pw3270/application.h>
39 - 40 + #include <v3270/tools.h>
  41 + #include <v3270/settings.h>
40 42
41 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); 43 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
42 static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); 44 static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);
43 45
44 - GAction * pw3270_action_save_session_as_new(void) { 46 + static const struct Entry {
  47 +
  48 + const gchar *label;
  49 + const gchar *tooltip;
  50 + const gint width;
  51 +
  52 + } entries[] = {
  53 +
  54 + // 0 = Session name
  55 + {
  56 + .label = N_("Session name"),
  57 + .tooltip = N_("The session name used in the window/tab title (empty for default)"),
  58 + .width = 15,
  59 + },
  60 +
  61 + // 1 = Session file
  62 + {
  63 + .label = N_("Session file"),
  64 + .tooltip = N_("The file to save the current session preferences"),
  65 + .width = 40,
  66 + }
  67 +
  68 + };
  69 +
  70 + GAction * pw3270_action_save_session_preferences_new(void) {
45 71
46 V3270SimpleAction * action = v3270_dialog_action_new(factory); 72 V3270SimpleAction * action = v3270_dialog_action_new(factory);
47 73
48 - action->name = "save.session.as";  
49 - action->label = _("Save As"); 74 + action->name = "save.session.preferences";
  75 + action->label = _("Save session preferences");
50 action->icon_name = "document-save-as"; 76 action->icon_name = "document-save-as";
51 - action->tooltip = _("Save session properties"); 77 + action->tooltip = _("Save current session preferences to file");
52 78
53 return G_ACTION(action); 79 return G_ACTION(action);
54 80
@@ -56,41 +82,119 @@ @@ -56,41 +82,119 @@
56 82
57 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { 83 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {
58 84
  85 + // Create dialog
  86 + gboolean use_header;
  87 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  88 +
59 GtkWidget * dialog = 89 GtkWidget * dialog =
60 - gtk_file_chooser_dialog_new(  
61 - action->tooltip,  
62 - GTK_WINDOW(gtk_widget_get_toplevel(terminal)),  
63 - GTK_FILE_CHOOSER_ACTION_SAVE,  
64 - _("Save"), GTK_RESPONSE_OK,  
65 - _("Cancel"),GTK_RESPONSE_CANCEL,  
66 - NULL  
67 - ); 90 + GTK_WIDGET(g_object_new(
  91 + GTK_TYPE_DIALOG,
  92 + "use-header-bar", (use_header ? 1 : 0),
  93 + NULL
  94 + ));
  95 +
68 96
69 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); 97 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
70 - gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog)); 98 + gtk_window_set_title(GTK_WINDOW(dialog),action->label);
  99 +
  100 + gtk_dialog_add_buttons(
  101 + GTK_DIALOG(dialog),
  102 + _("_Cancel"), GTK_RESPONSE_CANCEL,
  103 + _("_Save"), GTK_RESPONSE_APPLY,
  104 + NULL
  105 + );
  106 +
  107 +
  108 + // Create entry fields
  109 + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));
  110 + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);
  111 + debug("Dialog=%p inputs=%p",dialog,inputs);
  112 +
  113 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  114 +
  115 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);
  116 +
  117 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  118 + gtk_container_set_border_width(GTK_CONTAINER(grid),18);
  119 + gtk_grid_set_row_spacing(GTK_GRID(grid),6);
  120 + gtk_grid_set_column_spacing(GTK_GRID(grid),12);
  121 +
  122 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  123 + // gtk_box_set_spacing(GTK_BOX(content_area),18);
  124 +
  125 + size_t ix;
  126 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  127 +
  128 + GtkWidget * label = gtk_label_new(gettext(entries[ix].label));
  129 + gtk_label_set_xalign(GTK_LABEL(label),1);
  130 + gtk_grid_attach(grid,label,0,ix,1,1);
  131 +
  132 + inputs[ix] = gtk_entry_new();
  133 +
  134 + if(entries[ix].tooltip) {
  135 + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip));
  136 + }
  137 +
  138 + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);
  139 + gtk_widget_set_hexpand(inputs[ix],FALSE);
  140 + gtk_widget_set_vexpand(inputs[ix],FALSE);
  141 +
  142 + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);
  143 +
  144 + }
  145 +
  146 + {
  147 + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal);
  148 + gtk_entry_set_text(GTK_ENTRY(inputs[1]),session_filename);
  149 +
  150 + gtk_entry_bind_to_filechooser(
  151 + inputs[1],
  152 + GTK_FILE_CHOOSER_ACTION_SAVE,
  153 + _("Save session preferences"),
  154 + NULL,
  155 + "*.3270",
  156 + _("3270 session files")
  157 + );
71 158
72 - if(terminal) {  
73 - const gchar * current_file = v3270_get_session_filename(terminal);  
74 - if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir()))  
75 - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file);  
76 } 159 }
77 160
78 g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); 161 g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
79 162
80 - gtk_widget_show_all(dialog); 163 + gtk_widget_show_all(GTK_WIDGET(grid));
81 return dialog; 164 return dialog;
  165 +
82 } 166 }
83 167
84 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { 168 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
85 169
86 - debug("%s(%d)",__FUNCTION__,response_id); 170 + if(response_id == GTK_RESPONSE_APPLY) {
87 171
88 - g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); 172 + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");
  173 + gtk_widget_hide(dialog);
89 174
90 - gtk_widget_destroy(dialog); 175 + GError * error = NULL;
  176 + v3270_key_file_save_to_file(
  177 + terminal,
  178 + gtk_entry_get_text(GTK_ENTRY(inputs[1])),
  179 + &error
  180 + );
  181 +
  182 + if(error) {
  183 +
  184 + g_message("%s",error->message);
  185 + g_error_free(error);
  186 +
  187 + } else {
  188 +
  189 + // Set session name (after save to avoid changes on the old session file).
  190 + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[0])));
  191 + v3270_emit_save_settings(terminal,NULL);
  192 +
  193 + }
91 194
92 - if(response_id == GTK_RESPONSE_OK) {  
93 - v3270_set_session_filename(terminal, filename);  
94 } 195 }
95 196
  197 +
  198 + gtk_widget_destroy(dialog);
  199 +
96 } 200 }
src/objects/actions/view.c
@@ -45,9 +45,10 @@ @@ -45,9 +45,10 @@
45 }; 45 };
46 46
47 struct ListElement { 47 struct ListElement {
48 - GAction * action; 48 +// GAction * action;
49 GdkPixbuf * pixbuf; 49 GdkPixbuf * pixbuf;
50 - gchar name[1]; 50 + gchar * action_name;
  51 + gchar * action_label;
51 }; 52 };
52 53
53 static void list_element_free(struct ListElement *element); 54 static void list_element_free(struct ListElement *element);
@@ -106,7 +107,7 @@ @@ -106,7 +107,7 @@
106 return view; 107 return view;
107 } 108 }
108 109
109 - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags) { 110 + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, PW3270ActionViewFlag flags) {
110 111
111 GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); 112 GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget)));
112 113
@@ -118,68 +119,38 @@ @@ -118,68 +119,38 @@
118 COLUMN_PIXBUF, pixbuf, 119 COLUMN_PIXBUF, pixbuf,
119 COLUMN_LABEL, label, 120 COLUMN_LABEL, label,
120 COLUMN_ACTION_NAME, action_name, 121 COLUMN_ACTION_NAME, action_name,
121 - COLUMN_FLAGS, flags, 122 + COLUMN_FLAGS, (gint) flags,
122 -1 123 -1
123 ); 124 );
124 125
125 126
126 } 127 }
127 128
128 - static void pw3270_action_view_append_element(GtkListStore * store, struct ListElement * element) {  
129 -  
130 - size_t ix;  
131 -  
132 - struct Properties {  
133 - const gchar * name;  
134 - GType g_type;  
135 - GValue value;  
136 - } properties[] = {  
137 - {  
138 - .name = "label",  
139 - .g_type = G_TYPE_STRING,  
140 - .value = G_VALUE_INIT  
141 - }  
142 - };  
143 -  
144 - for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) {  
145 -  
146 - g_value_init(&properties[ix].value, properties[ix].g_type);  
147 - g_object_get_property(G_OBJECT(element->action), properties[ix].name, &properties[ix].value);  
148 -  
149 - }  
150 -  
151 - // Remove "_"  
152 - g_autofree gchar * label = g_strdup(g_value_get_string(&properties[0].value)); 129 + void pw3270_action_view_order_by_label(GtkWidget *view) {
153 130
154 - if(label) { 131 + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view),FALSE);
155 132
156 - gchar *from, *to;  
157 -  
158 - for(from=to=label;*from;from++) {  
159 - if(*from != '_') {  
160 - *(to++) = *from;  
161 - }  
162 - }  
163 - *to = 0; 133 + gtk_tree_sortable_set_sort_column_id(
  134 + GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(view))),
  135 + COLUMN_LABEL,
  136 + GTK_SORT_ASCENDING
  137 + );
  138 + }
164 139
165 - } 140 + static void pw3270_action_view_append_element(GtkListStore * store, struct ListElement * element) {
166 141
167 GtkTreeIter iter; 142 GtkTreeIter iter;
168 gtk_list_store_append(store, &iter); 143 gtk_list_store_append(store, &iter);
169 gtk_list_store_set( 144 gtk_list_store_set(
170 store, 145 store,
171 &iter, 146 &iter,
172 - COLUMN_PIXBUF, element->pixbuf,  
173 - COLUMN_LABEL, (label ? label : g_action_get_name(element->action)),  
174 - COLUMN_ACTION_NAME, element->name,  
175 - COLUMN_FLAGS, 3, 147 + COLUMN_PIXBUF, element->pixbuf,
  148 + COLUMN_LABEL, element->action_label,
  149 + COLUMN_ACTION_NAME, element->action_name,
  150 + COLUMN_FLAGS, (gint) PW3270_ACTION_VIEW_ALLOW_MOVE,
176 -1 151 -1
177 ); 152 );
178 153
179 - for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) {  
180 - g_value_unset(&properties[ix].value);  
181 - }  
182 -  
183 } 154 }
184 155
185 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { 156 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) {
@@ -190,8 +161,7 @@ @@ -190,8 +161,7 @@
190 while(item) { 161 while(item) {
191 162
192 struct ListElement * element = (struct ListElement *) item->data; 163 struct ListElement * element = (struct ListElement *) item->data;
193 -  
194 - if(!g_ascii_strcasecmp(action_name,element->name)) { 164 + if(!g_ascii_strcasecmp(action_name,element->action_name)) {
195 165
196 pw3270_action_view_append_element(store, element); 166 pw3270_action_view_append_element(store, element);
197 list_element_free(element); 167 list_element_free(element);
@@ -219,36 +189,38 @@ @@ -219,36 +189,38 @@
219 189
220 } 190 }
221 191
222 - static GSList * append_action(GSList * list, const gchar *type, GAction *action) { 192 + static GSList * append_action(GSList * list, const gchar *prefix, GAction *action) {
223 193
224 if(!action) 194 if(!action)
225 return list; 195 return list;
226 196
227 - if(!g_object_class_find_property(G_OBJECT_GET_CLASS(action),"label")) {  
228 - debug("Action \"%s\": Doesn't have a label",g_action_get_name(action));  
229 - return list;  
230 - }  
231 -  
232 GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK); 197 GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK);
233 if(!pixbuf) { 198 if(!pixbuf) {
234 debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action)); 199 debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action));
235 return list; 200 return list;
236 } 201 }
237 202
238 - const gchar *name = g_action_get_name(action);  
239 -  
240 - struct ListElement * element = (struct ListElement *) g_malloc0(sizeof(struct ListElement) + strlen(type) + strlen(name)); 203 + g_autofree gchar *action_name = g_strconcat(prefix,".",g_action_get_name(action),NULL);
241 204
242 - strcpy(element->name,type);  
243 - strcat(element->name,name); 205 + GValue value = G_VALUE_INIT;
  206 + g_value_init(&value, G_TYPE_STRING);
  207 + g_object_get_property(G_OBJECT(action),"label",&value);
244 208
245 - element->action = action; 209 + const gchar * label = g_value_get_string(&value);
  210 + if(!(label && *label))
  211 + label = g_action_get_name(action);
246 212
247 - element->pixbuf = pixbuf;  
248 - g_object_ref_sink(G_OBJECT(element->pixbuf)); 213 + list = pw3270_action_list_append(
  214 + list,
  215 + label,
  216 + pixbuf,
  217 + action_name,
  218 + PW3270_ACTION_VIEW_ALLOW_MOVE
  219 + );
249 220
250 - return g_slist_prepend(list,element); 221 + g_value_unset(&value);
251 222
  223 + return list;
252 } 224 }
253 225
254 Pw3270ActionList * pw3270_action_list_new(GtkApplication *application) { 226 Pw3270ActionList * pw3270_action_list_new(GtkApplication *application) {
@@ -262,7 +234,7 @@ @@ -262,7 +234,7 @@
262 234
263 action_names = g_action_group_list_actions(G_ACTION_GROUP(application)); 235 action_names = g_action_group_list_actions(G_ACTION_GROUP(application));
264 for(ix = 0; action_names[ix];ix++) { 236 for(ix = 0; action_names[ix];ix++) {
265 - list = append_action(list,"app.",g_action_map_lookup_action(G_ACTION_MAP(application),action_names[ix])); 237 + list = append_action(list,"app",g_action_map_lookup_action(G_ACTION_MAP(application),action_names[ix]));
266 } 238 }
267 g_strfreev(action_names); 239 g_strfreev(action_names);
268 240
@@ -274,7 +246,7 @@ @@ -274,7 +246,7 @@
274 // Get window actions. 246 // Get window actions.
275 action_names = g_action_group_list_actions(G_ACTION_GROUP(window)); 247 action_names = g_action_group_list_actions(G_ACTION_GROUP(window));
276 for(ix = 0; action_names[ix];ix++) { 248 for(ix = 0; action_names[ix];ix++) {
277 - list = append_action(list,"win.",g_action_map_lookup_action(G_ACTION_MAP(window),action_names[ix])); 249 + list = append_action(list,"win",g_action_map_lookup_action(G_ACTION_MAP(window),action_names[ix]));
278 } 250 }
279 g_strfreev(action_names); 251 g_strfreev(action_names);
280 252
@@ -283,6 +255,32 @@ @@ -283,6 +255,32 @@
283 return (Pw3270ActionList *) list; 255 return (Pw3270ActionList *) list;
284 } 256 }
285 257
  258 + Pw3270ActionList * pw3270_action_list_append(Pw3270ActionList *action_list, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags) {
  259 +
  260 + struct ListElement * element = (struct ListElement *)
  261 + g_malloc0(
  262 + sizeof(struct ListElement)
  263 + + strlen(action_name)
  264 + + strlen(label)
  265 + + 3
  266 + );
  267 +
  268 + if(pixbuf) {
  269 + element->pixbuf = pixbuf;
  270 + g_object_ref_sink(G_OBJECT(element->pixbuf));
  271 + }
  272 +
  273 + element->action_name = (char *) (element+1);
  274 + strcpy(element->action_name,action_name);
  275 +
  276 + element->action_label = element->action_name + strlen(element->action_name) + 1;
  277 + strcpy(element->action_label,label);
  278 +
  279 + return (Pw3270ActionList *) g_slist_prepend((GSList *) action_list, element);
  280 +
  281 +
  282 + };
  283 +
286 void list_element_free(struct ListElement *element) { 284 void list_element_free(struct ListElement *element) {
287 285
288 if(element->pixbuf) { 286 if(element->pixbuf) {
@@ -338,7 +336,7 @@ @@ -338,7 +336,7 @@
338 gint flags = g_value_get_int(&vFlags); 336 gint flags = g_value_get_int(&vFlags);
339 g_value_unset(&vFlags); 337 g_value_unset(&vFlags);
340 338
341 - if(flags & 1) { 339 + if(flags & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD) {
342 340
343 // Add on target widget. 341 // Add on target widget.
344 GValue pixbuf = G_VALUE_INIT; 342 GValue pixbuf = G_VALUE_INIT;
@@ -369,7 +367,7 @@ @@ -369,7 +367,7 @@
369 367
370 } 368 }
371 369
372 - if(flags & 2) { 370 + if(flags & PW3270_ACTION_VIEW_ALLOW_REMOVE) {
373 371
374 // Remove from source widget. 372 // Remove from source widget.
375 gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); 373 gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter);
@@ -411,3 +409,70 @@ @@ -411,3 +409,70 @@
411 return g_string_free(str,FALSE); 409 return g_string_free(str,FALSE);
412 } 410 }
413 411
  412 + static void check_4_sensitive(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gboolean *sensitive) {
  413 +
  414 + GValue value = { 0, };
  415 + gtk_tree_model_get_value(model,iter,COLUMN_FLAGS,&value);
  416 +
  417 + if(!(g_value_get_int(&value) & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD))
  418 + *sensitive = FALSE;
  419 +
  420 + g_value_unset(&value);
  421 +
  422 + }
  423 +
  424 + static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {
  425 +
  426 + if(!gtk_tree_selection_count_selected_rows(selection)) {
  427 + gtk_widget_set_sensitive(button,FALSE);
  428 + return;
  429 + }
  430 +
  431 + gboolean sensitive = TRUE;
  432 +
  433 + // Scan selected rows
  434 + gtk_tree_selection_selected_foreach(selection,(GtkTreeSelectionForeachFunc) check_4_sensitive,&sensitive);
  435 + gtk_widget_set_sensitive(button,sensitive);
  436 +
  437 + }
  438 +
  439 + struct MoveData {
  440 + GtkWidget *from;
  441 + GtkWidget *to;
  442 + };
  443 +
  444 + static void move_clicked(GtkButton G_GNUC_UNUSED(*button), struct MoveData *args) {
  445 + pw3270_action_view_move_selected(args->from,args->to);
  446 + }
  447 +
  448 + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name) {
  449 +
  450 + GtkWidget * button = gtk_button_new_from_icon_name(icon_name,GTK_ICON_SIZE_DND);
  451 +
  452 + struct MoveData * data = g_new0(struct MoveData,1);
  453 + data->from = from;
  454 + data->to = to;
  455 + g_object_set_data_full(G_OBJECT(button),"move-control-data",data,g_free);
  456 +
  457 + gtk_widget_set_focus_on_click(button,FALSE);
  458 + gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE);
  459 + gtk_widget_set_sensitive(button,FALSE);
  460 + gtk_widget_set_hexpand(button,FALSE);
  461 + gtk_widget_set_vexpand(button,FALSE);
  462 +
  463 + g_signal_connect(
  464 + gtk_tree_view_get_selection(GTK_TREE_VIEW(from)),
  465 + "changed",
  466 + G_CALLBACK(selection_changed),
  467 + button
  468 + );
  469 +
  470 + g_signal_connect(
  471 + button,
  472 + "clicked",
  473 + G_CALLBACK(move_clicked),
  474 + data
  475 + );
  476 +
  477 + return button;
  478 + }
src/objects/application/actions/about.c
@@ -33,22 +33,6 @@ @@ -33,22 +33,6 @@
33 33
34 static GtkWidget * factory(PW3270Action G_GNUC_UNUSED(*action), GtkApplication G_GNUC_UNUSED(*application)) { 34 static GtkWidget * factory(PW3270Action G_GNUC_UNUSED(*action), GtkApplication G_GNUC_UNUSED(*application)) {
35 35
36 - /*  
37 - static const gchar *license =  
38 - N_( "This program is free software; you can redistribute it and/or "  
39 - "modify it under the terms of the GNU General Public License as "  
40 - "published by the Free Software Foundation; either version 2 of the "  
41 - "License, or (at your option) any later version.\n\n"  
42 - "This program is distributed in the hope that it will be useful, "  
43 - "but WITHOUT ANY WARRANTY; without even the implied warranty of "  
44 - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the "  
45 - "GNU General Public License for more details.\n\n"  
46 - "You should have received a copy of the GNU General Public License "  
47 - "along with this program; if not, write to the Free Software "  
48 - "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 "  
49 - "USA" );  
50 - */  
51 -  
52 GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); 36 GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
53 37
54 // Get application logo 38 // Get application logo
@@ -82,18 +66,37 @@ @@ -82,18 +66,37 @@
82 66
83 // Set version 67 // Set version
84 { 68 {
  69 + g_autofree gchar * version = g_strdup_printf(
  70 + _("Version %s-%s"),
  71 + PACKAGE_VERSION,
85 #ifdef PACKAGE_RELEASE 72 #ifdef PACKAGE_RELEASE
86 - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,PACKAGE_RELEASE); 73 + PACKAGE_RELEASE
87 #else 74 #else
88 - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(BUILD_DATE));  
89 -#endif // PACKAGE_REVISION 75 + G_STRINGIFY(BUILD_DATE)
  76 +#endif // PACKAGE_RELEASE
  77 + );
90 78
91 gtk_about_dialog_set_version(dialog,version); 79 gtk_about_dialog_set_version(dialog,version);
92 } 80 }
93 81
94 // Set comments 82 // Set comments
95 { 83 {
96 - g_autofree gchar * comments = g_strdup_printf(_( "3270 terminal emulator for GTK %d.%d" ),GTK_MAJOR_VERSION,GTK_MINOR_VERSION); 84 + g_autofree gchar * comments =
  85 +
  86 + g_strdup_printf(
  87 + _( "3270 terminal emulator for %s." ),
  88 +#if defined(__MINGW64__)
  89 + _( "64 bits Windows" )
  90 +#elif defined(__MINGW32__)
  91 + _( "32 bits Windows" )
  92 +#elif defined(linux) && defined(__i386__)
  93 + _( "32 bits Linux" )
  94 +#elif defined(linux) && defined(__x86_64__)
  95 + _( "64 bits Linux" )
  96 +#else
  97 + "GTK"
  98 +#endif
  99 + );
97 gtk_about_dialog_set_comments(dialog, comments); 100 gtk_about_dialog_set_comments(dialog, comments);
98 } 101 }
99 102
@@ -126,22 +129,39 @@ @@ -126,22 +129,39 @@
126 gtk_about_dialog_add_credit_section(dialog, _("Apple version"), apple); 129 gtk_about_dialog_add_credit_section(dialog, _("Apple version"), apple);
127 gtk_about_dialog_add_credit_section (dialog, _("Contributors"), contributors); 130 gtk_about_dialog_add_credit_section (dialog, _("Contributors"), contributors);
128 131
129 -  
130 gtk_about_dialog_add_credit_section(dialog, _("Based on X3270 from"), references); 132 gtk_about_dialog_add_credit_section(dialog, _("Based on X3270 from"), references);
131 133
132 } 134 }
133 135
134 gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); 136 gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." );
135 137
136 -// gtk_about_dialog_set_license(dialog, gettext( license ) );  
137 -// gtk_about_dialog_set_wrap_license(dialog,TRUE); 138 +#ifdef _WIN32
  139 +
  140 + lib3270_autoptr(char) license = lib3270_build_data_filename(_("LICENSE"),NULL);
138 141
  142 + if(g_file_test(license, G_FILE_TEST_IS_REGULAR)) {
  143 +
  144 + g_autofree gchar * text = NULL;
  145 +
  146 + if(g_file_get_contents(license,&text,NULL,NULL)) {
  147 + gtk_about_dialog_set_license(dialog, text );
  148 + gtk_about_dialog_set_wrap_license(dialog,TRUE);
  149 + }
  150 +
  151 + } else {
  152 + gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0);
  153 + }
  154 +
  155 +#else
139 gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0); 156 gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0);
  157 +#endif // _WIN32
  158 +
  159 +// gtk_about_dialog_set_website(dialog,NC_("ProjectURL","https://portal.softwarepublico.gov.br/social/pw3270/"));
  160 +// gtk_about_dialog_set_website_label(dialog,NC_("ProjectURLLabel","Brazilian Public Software Portal" ));
140 161
141 - gtk_about_dialog_set_website(dialog,"https://portal.softwarepublico.gov.br/social/pw3270/");  
142 - gtk_about_dialog_set_website_label(dialog,_( "Brazilian Public Software Portal" )); 162 + gtk_about_dialog_set_website(dialog,_("https://github.com/PerryWerneck/pw3270"));
  163 + gtk_about_dialog_set_website_label(dialog,_("View this project on github"));
143 164
144 -// gtk_about_dialog_set_authors(dialog,authors);  
145 gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); 165 gtk_about_dialog_set_translator_credits(dialog,_("translator-credits"));
146 166
147 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); 167 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
@@ -149,6 +169,13 @@ @@ -149,6 +169,13 @@
149 g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); 169 g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL);
150 gtk_widget_show_all(GTK_WIDGET(dialog)); 170 gtk_widget_show_all(GTK_WIDGET(dialog));
151 171
  172 + // Call plugins
  173 + pw3270_application_plugin_call(
  174 + g_application_get_default(),
  175 + "pw3270_plugin_set_about_dialog",
  176 + dialog
  177 + );
  178 +
152 return GTK_WIDGET(dialog); 179 return GTK_WIDGET(dialog);
153 180
154 } 181 }
src/objects/application/actions/preferences.c
@@ -34,14 +34,11 @@ @@ -34,14 +34,11 @@
34 #include <pw3270/settings.h> 34 #include <pw3270/settings.h>
35 #include <pw3270/toolbar.h> 35 #include <pw3270/toolbar.h>
36 36
37 -  
38 -// gtk_window_set_title(GTK_WINDOW(dialog),action->label);  
39 -  
40 static GtkWidget * factory(PW3270Action * action, GtkApplication *application) { 37 static GtkWidget * factory(PW3270Action * action, GtkApplication *application) {
41 38
42 size_t ix; 39 size_t ix;
43 GtkWindow * window = gtk_application_get_active_window(application); 40 GtkWindow * window = gtk_application_get_active_window(application);
44 - GtkWidget * dialog = pw3270_settings_dialog_new(G_ACTION(action)); 41 + GtkWidget * dialog = pw3270_settings_dialog_new(G_ACTION(action),TRUE);
45 42
46 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); 43 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
47 gtk_window_set_attached_to(GTK_WINDOW(dialog), GTK_WIDGET(window)); 44 gtk_window_set_attached_to(GTK_WINDOW(dialog), GTK_WIDGET(window));
@@ -55,6 +52,16 @@ @@ -55,6 +52,16 @@
55 gtk_container_add(GTK_CONTAINER(dialog),pages[ix]); 52 gtk_container_add(GTK_CONTAINER(dialog),pages[ix]);
56 } 53 }
57 54
  55 + pw3270_application_plugin_call(
  56 + G_APPLICATION(application),
  57 + "pw3270_plugin_set_application_preferences",
  58 + dialog
  59 + );
  60 +
  61 + if(pw3270_application_get_ui_style(G_APPLICATION(application)) != PW3270_UI_STYLE_CLASSICAL){
  62 + gtk_container_add(GTK_CONTAINER(dialog),pw3270_header_settings_new());
  63 + }
  64 +
58 gtk_widget_show_all(dialog); 65 gtk_widget_show_all(dialog);
59 66
60 return dialog; 67 return dialog;
@@ -68,6 +75,7 @@ @@ -68,6 +75,7 @@
68 action->name = "preferences"; 75 action->name = "preferences";
69 action->label = _("Application preferences"); 76 action->label = _("Application preferences");
70 action->icon_name = "preferences-system"; 77 action->icon_name = "preferences-system";
  78 + action->tooltip = _("Change the application preferences");
71 79
72 return G_ACTION(action); 80 return G_ACTION(action);
73 } 81 }
src/objects/application/actions/window.c
@@ -69,7 +69,7 @@ @@ -69,7 +69,7 @@
69 return G_ACTION(action); 69 return G_ACTION(action);
70 } 70 }
71 71
72 - static void new_tab_activated(GAction *action, GVariant *parameter, GtkApplication *application) { 72 + static void new_tab_activated(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkApplication *application) {
73 73
74 debug("%s",__FUNCTION__); 74 debug("%s",__FUNCTION__);
75 pw3270_application_window_new_tab(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL); 75 pw3270_application_window_new_tab(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL);
src/objects/application/application.c
@@ -173,13 +173,8 @@ @@ -173,13 +173,8 @@
173 173
174 } 174 }
175 175
176 -  
177 static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { 176 static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) {
178 177
179 - GApplication * app = g_application_get_default();  
180 -  
181 - debug("********************* %p",app);  
182 -  
183 g_autoptr(GSettings) app_settings = pw3270_application_settings_new(); 178 g_autoptr(GSettings) app_settings = pw3270_application_settings_new();
184 g_autoptr(GSettings) win_settings = pw3270_application_window_settings_new(); 179 g_autoptr(GSettings) win_settings = pw3270_application_window_settings_new();
185 180
@@ -466,6 +461,33 @@ @@ -466,6 +461,33 @@
466 461
467 } 462 }
468 463
  464 + void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data) {
  465 +
  466 + g_return_if_fail(PW3270_IS_APPLICATION(app));
  467 +
  468 + GSList * item;
  469 + for(item = PW3270_APPLICATION(app)->plugins; item; item = g_slist_next(item)) {
  470 + func(item->data,user_data);
  471 + }
  472 +
  473 + }
  474 +
  475 + void pw3270_application_plugin_call(GApplication *app, const gchar *method, gpointer user_data) {
  476 +
  477 + g_return_if_fail(PW3270_IS_APPLICATION(app));
  478 +
  479 + int (*call)(GtkWidget *);
  480 +
  481 + GSList * item;
  482 + for(item = PW3270_APPLICATION(app)->plugins; item; item = g_slist_next(item)) {
  483 + if(g_module_symbol((GModule *) item->data, method, (gpointer *) &call)) {
  484 + call(user_data);
  485 + }
  486 + }
  487 +
  488 + }
  489 +
  490 +
469 GSettings * pw3270_application_settings_new() { 491 GSettings * pw3270_application_settings_new() {
470 492
471 GSettings *settings = NULL; 493 GSettings *settings = NULL;
@@ -510,3 +532,4 @@ @@ -510,3 +532,4 @@
510 g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); 532 g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL);
511 return PW3270_APPLICATION(app)->keypads; 533 return PW3270_APPLICATION(app)->keypads;
512 } 534 }
  535 +
src/objects/application/open.c
@@ -29,22 +29,54 @@ @@ -29,22 +29,54 @@
29 29
30 #include "private.h" 30 #include "private.h"
31 31
  32 + gchar * v3270_keyfile_find(const gchar *name) {
  33 + //
  34 + // It can be a session file, scans for it
  35 + //
  36 + const gchar * paths[] = {
  37 + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),
  38 + g_get_user_config_dir()
  39 + };
  40 +
  41 + static const gchar *subdirs[] = {
  42 + "3270",
  43 + G_STRINGIFY(PRODUCT_NAME),
  44 + PACKAGE_NAME
  45 + };
  46 +
  47 + size_t path, subdir;
  48 +
  49 + g_autofree gchar * filename = g_strconcat(name,".3270",NULL);
  50 +
  51 + for(path = 0; path < G_N_ELEMENTS(paths); path++) {
  52 +
  53 + for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) {
  54 +
  55 + gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL);
  56 +
  57 + debug("Searching for \"%s\"",fullpath);
  58 +
  59 + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) {
  60 + return fullpath;
  61 + }
  62 + g_free(fullpath);
  63 +
  64 + }
  65 + }
  66 +
  67 + return NULL;
  68 +
  69 + }
  70 +
32 void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) { 71 void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) {
33 72
34 GtkWidget * window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))); 73 GtkWidget * window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application)));
35 - 74 + size_t path, subdir;
36 gint file; 75 gint file;
37 76
38 for(file = 0; file < n_files; file++) { 77 for(file = 0; file < n_files; file++) {
39 78
40 g_autofree gchar *path = g_file_get_path(files[file]); 79 g_autofree gchar *path = g_file_get_path(files[file]);
41 - if(!window) {  
42 - debug("%s: Open in new window",__FUNCTION__);  
43 - window = pw3270_application_window_new(GTK_APPLICATION(application), path);  
44 - } else {  
45 - debug("%s: Open in new tab",__FUNCTION__);  
46 - window = pw3270_application_window_new_tab(window,path);  
47 - }  
48 80
49 if(!path) { 81 if(!path) {
50 82
@@ -63,6 +95,38 @@ @@ -63,6 +95,38 @@
63 95
64 } 96 }
65 97
  98 + continue;
  99 +
  100 + }
  101 +
  102 + if(g_file_test(path,G_FILE_TEST_IS_REGULAR)) {
  103 +
  104 + // The file exists, use it.
  105 +
  106 + if(!window) {
  107 + window = pw3270_application_window_new(GTK_APPLICATION(application), path);
  108 + } else {
  109 + window = pw3270_application_window_new_tab(window,path);
  110 + }
  111 +
  112 + continue;
  113 + }
  114 +
  115 + {
  116 + g_autofree gchar * basename = g_file_get_basename(files[file]);
  117 + g_autofree gchar * filename = v3270_keyfile_find(basename);
  118 +
  119 + if(filename) {
  120 +
  121 + if(!window) {
  122 + window = pw3270_application_window_new(GTK_APPLICATION(application), filename);
  123 + } else {
  124 + window = pw3270_application_window_new_tab(window, filename);
  125 + }
  126 +
  127 + continue;
  128 + }
  129 +
66 } 130 }
67 131
68 } 132 }
src/objects/keypad/element.c
@@ -159,12 +159,12 @@ @@ -159,12 +159,12 @@
159 159
160 } 160 }
161 161
162 - static void KeypadElement_init(KeypadElement *object) { 162 + static void KeypadElement_init(KeypadElement G_GNUC_UNUSED(*object)) {
163 163
164 164
165 } 165 }
166 166
167 - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { 167 + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) {
168 168
169 KeypadElement * element = PW_KEYPAD_ELEMENT(object); 169 KeypadElement * element = PW_KEYPAD_ELEMENT(object);
170 170
@@ -203,7 +203,7 @@ @@ -203,7 +203,7 @@
203 203
204 } 204 }
205 205
206 - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { 206 + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) {
207 207
208 KeypadElement * element = PW_KEYPAD_ELEMENT(object); 208 KeypadElement * element = PW_KEYPAD_ELEMENT(object);
209 209
src/objects/keypad/load.c
@@ -82,7 +82,7 @@ @@ -82,7 +82,7 @@
82 82
83 } 83 }
84 84
85 - static void element_end(GMarkupParseContext *context, const gchar *element_name, GList **keypads, GError **error) { 85 + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList G_GNUC_UNUSED(**keypads), GError G_GNUC_UNUSED(**error)) {
86 86
87 debug("%s(%s)",__FUNCTION__,element_name); 87 debug("%s(%s)",__FUNCTION__,element_name);
88 88
src/objects/linux/savedesktopicon.c
@@ -1,301 +0,0 @@ @@ -1,301 +0,0 @@
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 - /**  
31 - * @brief Implement Linux version of the save desktop icon action.  
32 - *  
33 - */  
34 -  
35 - #include <v3270.h>  
36 - #include <pw3270.h>  
37 - #include <pw3270/application.h>  
38 - #include <v3270/actions.h>  
39 - #include <lib3270.h>  
40 - #include <lib3270/log.h>  
41 -  
42 - static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);  
43 - static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);  
44 -  
45 -/*  
46 -  
47 -[Desktop Entry]  
48 -GenericName=pw3270  
49 -Name=pw3270  
50 -Comment=Comment  
51 -Exec=/usr/bin/sisbb  
52 -Icon=pw3270  
53 -Terminal=false  
54 -Type=Application  
55 -StartupNotify=true  
56 -Categories=GTK;GNOME;TerminalEmulator  
57 -OnlyShowIn=GNOME;Unity  
58 -X-Desktop-File-Install-Version=0.23  
59 -*/  
60 -  
61 - static const struct _entry {  
62 -  
63 - const gchar * key;  
64 - const gchar * label;  
65 - const gchar * tooltip;  
66 - gint width;  
67 -// gint n_chars;  
68 -  
69 - } entries[] = {  
70 -  
71 - {  
72 - .label = N_("File name"),  
73 - .width = 40,  
74 -// .n_chars = 40  
75 - },  
76 -  
77 - {  
78 - .key = "Name",  
79 - .label = N_("Launcher name"),  
80 - .width = 20,  
81 -// .n_chars = 128  
82 - },  
83 -  
84 - {  
85 - .key = "GenericName",  
86 - .label = N_("Generic name"),  
87 - .width = 20,  
88 -// .n_chars = 128  
89 - },  
90 -  
91 - {  
92 - .key = "Comment",  
93 - .label = N_("Comment"),  
94 - .width = 30,  
95 -// .n_chars = 128  
96 - }  
97 -  
98 - };  
99 -  
100 - GAction * pw3270_action_save_desktop_icon_new(void) {  
101 -  
102 - V3270SimpleAction * action = v3270_dialog_action_new(factory);  
103 -  
104 - action->name = "save.launcher";  
105 - action->label = _("Save desktop icon");  
106 - action->tooltip = _("Create a desktop icon for the current session");  
107 -  
108 - return G_ACTION(action);  
109 -  
110 - }  
111 -  
112 - GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {  
113 -  
114 - size_t ix;  
115 -  
116 - gboolean use_header;  
117 - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);  
118 -  
119 - GtkWidget * dialog =  
120 - GTK_WIDGET(g_object_new(  
121 - GTK_TYPE_DIALOG,  
122 - "use-header-bar", (use_header ? 1 : 0),  
123 - NULL  
124 - ));  
125 -  
126 -  
127 - gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);  
128 - gtk_window_set_title(GTK_WINDOW(dialog),action->label);  
129 -  
130 - gtk_dialog_add_buttons(  
131 - GTK_DIALOG(dialog),  
132 - _("_Cancel"), GTK_RESPONSE_CANCEL,  
133 - _("_Save"), GTK_RESPONSE_APPLY,  
134 - NULL  
135 - );  
136 -  
137 - g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);  
138 -  
139 - // Create entry fields  
140 - GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));  
141 - g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);  
142 - debug("Dialog=%p inputs=%p",dialog,inputs);  
143 -  
144 - GtkGrid * grid = GTK_GRID(gtk_grid_new());  
145 -  
146 - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);  
147 -  
148 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
149 - gtk_container_set_border_width(GTK_CONTAINER(grid),18);  
150 - gtk_grid_set_row_spacing(GTK_GRID(grid),6);  
151 - gtk_grid_set_column_spacing(GTK_GRID(grid),12);  
152 -  
153 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
154 - // gtk_box_set_spacing(GTK_BOX(content_area),18);  
155 -  
156 - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {  
157 -  
158 - GtkWidget * label = gtk_label_new(gettext(entries[ix].label));  
159 - gtk_label_set_xalign(GTK_LABEL(label),1);  
160 - gtk_grid_attach(grid,label,0,ix,1,1);  
161 -  
162 - inputs[ix] = gtk_entry_new();  
163 - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);  
164 -  
165 - gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);  
166 -// gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars);  
167 - gtk_widget_set_hexpand(inputs[ix],FALSE);  
168 - gtk_widget_set_vexpand(inputs[ix],FALSE);  
169 -  
170 - gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);  
171 -  
172 - }  
173 -  
174 - g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));  
175 -  
176 - gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename);  
177 -  
178 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
179 - gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
180 -  
181 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
182 - gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
183 -  
184 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
185 - gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
186 - gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK);  
187 -  
188 - gtk_widget_show_all(GTK_WIDGET(grid));  
189 - return dialog;  
190 - }  
191 -  
192 - void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {  
193 -  
194 - debug("%s(%d)",__FUNCTION__,response_id);  
195 -  
196 - if(response_id == GTK_RESPONSE_APPLY) {  
197 -  
198 - static const char * key_file_data =  
199 - "[Desktop Entry]\n" \  
200 - "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \  
201 - "Terminal=false\n" \  
202 - "Type=Application\n" \  
203 - "StartupNotify=true\n" \  
204 - "Categories=GTK;GNOME;TerminalEmulator\n" \  
205 - "OnlyShowIn=GNOME;Unity\n";  
206 -  
207 - GError * error = NULL;  
208 - size_t ix;  
209 -  
210 - GKeyFile * keyfile = g_key_file_new();  
211 - g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL);  
212 -  
213 -#ifdef DEBUG  
214 - {  
215 - g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL);  
216 - debug("\n%s\n",dbg_data);  
217 - }  
218 -#endif // DEBUG  
219 -  
220 -  
221 - GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");  
222 - debug("dialog=%p inputs=%p",dialog,inputs);  
223 -  
224 - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {  
225 - if(entries[ix].key) {  
226 - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);  
227 - g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix])));  
228 - }  
229 - }  
230 -  
231 - // Get session filename  
232 - /*  
233 - const gchar * session_file = v3270_get_session_filename(terminal);  
234 -  
235 - if(!session_file) {  
236 -  
237 - // No session file, create one.  
238 -  
239 - // Check for configdir  
240 - g_autofree gchar * configdir = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),"sessions",NULL);  
241 - g_mkdir_with_parents(configdir,0755);  
242 -  
243 - // Create a base name  
244 - g_autofree gchar * basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(inputs[0])));  
245 -  
246 - gchar *ptr = strrchr(basename,'.');  
247 - if(ptr)  
248 - *ptr = 0;  
249 -  
250 - ix = time(NULL);  
251 - gchar * new_session_file = g_strdup_printf("%s/%s.3270",configdir,basename);  
252 - while(!g_file_test(new_session_file,G_FILE_TEST_EXISTS)) {  
253 - g_free(new_session_file);  
254 - new_session_file = g_strdup_printf("%s/%s_%08lx.3270",configdir,basename,(unsigned long) ix++);  
255 - }  
256 -  
257 - g_message("Saving session to %s",new_session_file);  
258 - v3270_set_session_filename(terminal,new_session_file);  
259 - g_free(new_session_file);  
260 -  
261 - }  
262 - */  
263 -  
264 - // Get program file name  
265 - // https://stackoverflow.com/questions/4517425/how-to-get-program-path  
266 - {  
267 - char buffer[4096];  
268 - g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid());  
269 -  
270 - int bytes = readlink(pidfile,buffer,4095);  
271 -  
272 - if(bytes >= 0)  
273 - buffer[bytes] = '\0';  
274 -  
275 - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_get_session_filename(terminal));  
276 - g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line);  
277 -  
278 - }  
279 -  
280 - g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[0])),&error);  
281 -  
282 - if(error) {  
283 -  
284 - g_message("%s",error->message);  
285 -  
286 -  
287 - g_error_free(error);  
288 -  
289 - } else {  
290 -  
291 - g_message("File \"%s\" was saved",gtk_entry_get_text(GTK_ENTRY(inputs[0])));  
292 -  
293 - }  
294 -  
295 -  
296 - g_key_file_free(keyfile);  
297 - }  
298 -  
299 - gtk_widget_destroy(dialog);  
300 -  
301 -}  
src/objects/os/linux/savedesktopicon.c 0 → 100644
@@ -0,0 +1,378 @@ @@ -0,0 +1,378 @@
  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 + /**
  31 + * @brief Implement Linux version of the save desktop icon action.
  32 + *
  33 + */
  34 +
  35 + #include <v3270.h>
  36 + #include <pw3270.h>
  37 + #include <pw3270/application.h>
  38 + #include <v3270/actions.h>
  39 + #include <v3270/keyfile.h>
  40 + #include <v3270/settings.h>
  41 + #include <lib3270.h>
  42 + #include <lib3270/log.h>
  43 + #include <lib3270/properties.h>
  44 + #include <v3270/tools.h>
  45 +
  46 + static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
  47 + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);
  48 +
  49 + static const struct _entry {
  50 +
  51 + const gchar * key;
  52 + const gchar * label;
  53 + const gchar * tooltip;
  54 + const gchar * default_value;
  55 + gint margin_top;
  56 + gint width;
  57 +
  58 + } entries[] = {
  59 +
  60 + // 0 = Shortcut name
  61 + {
  62 + .key = "Name",
  63 + .label = N_("Shortcut name"),
  64 + .default_value = G_STRINGIFY(PRODUCT_NAME),
  65 + .width = 20,
  66 + },
  67 +
  68 + // 1 = Shortcut file
  69 + {
  70 + .label = N_("Shortcut file"),
  71 + .tooltip = N_("Path for the new shortcut"),
  72 + .width = 40,
  73 + },
  74 +
  75 + // 2 = Session name
  76 + {
  77 + .label = N_("Session name"),
  78 + .margin_top = 12,
  79 + .tooltip = N_("The session name used in the window/tab title (empty for default)"),
  80 + .width = 15,
  81 + },
  82 +
  83 + // 3 = Session file
  84 + {
  85 + .label = N_("Session file"),
  86 + .tooltip = N_("The file with the session preferences for this shortcut"),
  87 + .width = 40,
  88 + },
  89 +
  90 + // 4 = Generic name.
  91 + {
  92 + .key = "GenericName",
  93 + .margin_top = 12,
  94 + .label = N_("Generic name"),
  95 + .default_value = G_STRINGIFY(PRODUCT_NAME),
  96 + .width = 20,
  97 + },
  98 +
  99 + {
  100 + .key = "Comment",
  101 + .label = N_("Comment"),
  102 + .default_value = N_("IBM 3270 Terminal emulator"),
  103 + .width = 30,
  104 + }
  105 +
  106 + };
  107 +
  108 + GAction * pw3270_action_save_desktop_icon_new(void) {
  109 +
  110 + V3270SimpleAction * action = v3270_dialog_action_new(factory);
  111 +
  112 + action->name = "save.launcher";
  113 + action->label = _("Save session shortcut");
  114 + action->tooltip = _("Create shortcut for the current session");
  115 +
  116 + return G_ACTION(action);
  117 +
  118 + }
  119 +
  120 + /*
  121 + static gchar * get_filename(GtkWidget *terminal) {
  122 +
  123 + g_autofree gchar * defname = v3270_keyfile_get_default_filename();
  124 + const gchar * current = v3270_key_file_get_filename(terminal);
  125 +
  126 + // If is not the default name, return it.
  127 + if(strcmp(defname,current)) {
  128 + return g_strdup(current);
  129 + }
  130 +
  131 + // It's the default one, create a new one on the user_config dir
  132 + g_autofree gchar * config_path = v3270_key_file_get_default_path(terminal);
  133 +
  134 + // Use the hostname
  135 + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));
  136 + if(!hostname) {
  137 + hostname = G_STRINGIFY(PRODUCT_NAME);
  138 + }
  139 +
  140 + // Build the filename
  141 + gchar *filename = g_strconcat(config_path,G_DIR_SEPARATOR_S,hostname,".3270",NULL);
  142 +
  143 + unsigned int index = 0;
  144 + while(g_file_test(filename,G_FILE_TEST_EXISTS)) {
  145 + g_free(filename);
  146 + filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",config_path,hostname,++index);
  147 + }
  148 +
  149 + return filename;
  150 +
  151 + }
  152 + */
  153 +
  154 + GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {
  155 +
  156 + size_t ix;
  157 +
  158 + gboolean use_header;
  159 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  160 +
  161 + GtkWidget * dialog =
  162 + GTK_WIDGET(g_object_new(
  163 + GTK_TYPE_DIALOG,
  164 + "use-header-bar", (use_header ? 1 : 0),
  165 + NULL
  166 + ));
  167 +
  168 +
  169 + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
  170 + gtk_window_set_title(GTK_WINDOW(dialog),action->label);
  171 +
  172 + gtk_dialog_add_buttons(
  173 + GTK_DIALOG(dialog),
  174 + _("_Cancel"), GTK_RESPONSE_CANCEL,
  175 + _("_Save"), GTK_RESPONSE_APPLY,
  176 + NULL
  177 + );
  178 +
  179 + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
  180 +
  181 + // Create entry fields
  182 + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));
  183 + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);
  184 + debug("Dialog=%p inputs=%p",dialog,inputs);
  185 +
  186 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  187 +
  188 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);
  189 +
  190 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  191 + gtk_container_set_border_width(GTK_CONTAINER(grid),18);
  192 + gtk_grid_set_row_spacing(GTK_GRID(grid),6);
  193 + gtk_grid_set_column_spacing(GTK_GRID(grid),12);
  194 +
  195 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  196 + // gtk_box_set_spacing(GTK_BOX(content_area),18);
  197 +
  198 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  199 +
  200 + GtkWidget * label = gtk_label_new(gettext(entries[ix].label));
  201 + gtk_label_set_xalign(GTK_LABEL(label),1);
  202 + gtk_grid_attach(grid,label,0,ix,1,1);
  203 +
  204 + inputs[ix] = gtk_entry_new();
  205 + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);
  206 +
  207 + if(entries[ix].margin_top) {
  208 + gtk_widget_set_margin_top(label,entries[ix].margin_top);
  209 + gtk_widget_set_margin_top(inputs[ix],entries[ix].margin_top);
  210 + }
  211 +
  212 + if(entries[ix].default_value) {
  213 + gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value));
  214 + }
  215 +
  216 + if(entries[ix].tooltip) {
  217 + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip));
  218 + }
  219 +
  220 + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);
  221 + gtk_widget_set_hexpand(inputs[ix],FALSE);
  222 + gtk_widget_set_vexpand(inputs[ix],FALSE);
  223 +
  224 + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);
  225 +
  226 + }
  227 +
  228 + g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP));
  229 +
  230 + // 1 = Shortcut filename
  231 + {
  232 + gtk_entry_set_text(GTK_ENTRY(inputs[1]),filename);
  233 + gtk_entry_bind_to_filechooser(
  234 + inputs[1],
  235 + GTK_FILE_CHOOSER_ACTION_SAVE,
  236 + _("Save to shortcut file"),
  237 + NULL,
  238 + "*.desktop",
  239 + _("Standard desktop files")
  240 + );
  241 +
  242 + }
  243 +
  244 + // 2 = Session name
  245 + {
  246 + gchar * session_name = g_strdup(v3270_get_session_name(terminal));
  247 + gchar * ptr = strchr(session_name,':');
  248 + if(ptr)
  249 + *ptr = 0;
  250 +
  251 + if(strcmp(session_name,G_STRINGIFY(PRODUCT_NAME)))
  252 + gtk_entry_set_text(GTK_ENTRY(inputs[2]),session_name);
  253 +
  254 + }
  255 +
  256 + // 3 = Session filename
  257 + {
  258 + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal);
  259 + gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename);
  260 +
  261 + gtk_entry_bind_to_filechooser(
  262 + inputs[3],
  263 + GTK_FILE_CHOOSER_ACTION_SAVE,
  264 + _("Save to session filename"),
  265 + NULL,
  266 + "*.3270",
  267 + _("3270 session files")
  268 + );
  269 +
  270 + }
  271 +
  272 + // 4 = Generic name
  273 + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal));
  274 + gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal));
  275 + gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK);
  276 +
  277 + gtk_widget_show_all(GTK_WIDGET(grid));
  278 + return dialog;
  279 + }
  280 +
  281 + static void apply(GtkWidget *dialog, GtkWidget *terminal) {
  282 +
  283 + GError * error = NULL;
  284 + size_t ix;
  285 +
  286 + static const char * key_file_data =
  287 + "[Desktop Entry]\n" \
  288 + "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \
  289 + "Terminal=false\n" \
  290 + "Type=Application\n" \
  291 + "StartupNotify=true\n" \
  292 + "Categories=GTK;GNOME;TerminalEmulator\n" \
  293 + "OnlyShowIn=GNOME;Unity\n";
  294 +
  295 + GKeyFile * keyfile = g_key_file_new();
  296 + g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL);
  297 +
  298 +#ifdef DEBUG
  299 + {
  300 + g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL);
  301 + debug("\n%s\n",dbg_data);
  302 + }
  303 +#endif // DEBUG
  304 +
  305 +
  306 + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");
  307 + debug("dialog=%p inputs=%p",dialog,inputs);
  308 +
  309 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  310 + if(entries[ix].key) {
  311 + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);
  312 + g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix])));
  313 + }
  314 + }
  315 +
  316 + // Save keyfile
  317 + v3270_key_file_save_to_file(
  318 + terminal,
  319 + gtk_entry_get_text(GTK_ENTRY(inputs[3])),
  320 + &error
  321 + );
  322 +
  323 + // Get program file name
  324 + // https://stackoverflow.com/questions/4517425/how-to-get-program-path
  325 + if(!error) {
  326 + char buffer[4096];
  327 + g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid());
  328 +
  329 + int bytes = readlink(pidfile,buffer,4095);
  330 +
  331 + if(bytes >= 0)
  332 + buffer[bytes] = '\0';
  333 +
  334 + g_autofree gchar * exec_line =
  335 + g_strconcat(
  336 + buffer,
  337 + " \"",gtk_entry_get_text(GTK_ENTRY(inputs[3])),"\"",
  338 + NULL
  339 + );
  340 +
  341 + g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line);
  342 +
  343 + }
  344 +
  345 + // Save shortcut
  346 + g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[1])),&error);
  347 +
  348 + g_key_file_free(keyfile);
  349 +
  350 + if(error) {
  351 +
  352 + g_message("%s",error->message);
  353 + g_error_free(error);
  354 +
  355 + } else {
  356 +
  357 + // Set session name (after save to avoid changes on the old session file).
  358 + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[2])));
  359 + v3270_emit_save_settings(terminal,NULL);
  360 +
  361 + }
  362 +
  363 +}
  364 +
  365 +void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
  366 +
  367 + debug("%s(%d)",__FUNCTION__,response_id);
  368 +
  369 + gtk_widget_hide(dialog);
  370 + if(response_id == GTK_RESPONSE_APPLY) {
  371 + apply(dialog,terminal);
  372 + }
  373 +
  374 + gtk_widget_destroy(dialog);
  375 +
  376 +}
  377 +
  378 +
src/objects/os/windows/savedesktopicon.c 0 → 100644
@@ -0,0 +1,354 @@ @@ -0,0 +1,354 @@
  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 + /**
  31 + * @brief Implement Windows version of the save desktop icon action.
  32 + *
  33 + * References:
  34 + *
  35 + * <https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32>
  36 + * <https://docs.microsoft.com/pt-br/windows/win32/shell/links?redirectedfrom=MSDN>
  37 + *
  38 + */
  39 +
  40 +// #include <stdafx.h>
  41 + #include <winsock2.h>
  42 + #include <windows.h>
  43 + #include <winnls.h>
  44 + #include <shobjidl.h>
  45 + #include <objbase.h>
  46 + #include <objidl.h>
  47 + #include <shlguid.h>
  48 +
  49 + #include <v3270.h>
  50 + #include <pw3270.h>
  51 + #include <pw3270/application.h>
  52 + #include <v3270/actions.h>
  53 + #include <lib3270.h>
  54 + #include <lib3270/log.h>
  55 + #include <v3270/tools.h>
  56 + #include <v3270/keyfile.h>
  57 + #include <v3270/settings.h>
  58 +
  59 + static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
  60 + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);
  61 +
  62 + static const struct _entry {
  63 +
  64 + const gchar * label;
  65 + const gchar * tooltip;
  66 + gint margin_top;
  67 + gint width;
  68 +
  69 + } entries[] = {
  70 +
  71 + // 0 - Shorcut file name
  72 + {
  73 + .label = N_("Shortcut file"),
  74 + .tooltip = N_("Path for the new shortcut"),
  75 + .width = 40,
  76 + },
  77 +
  78 + // 1 - Shortcut description
  79 + {
  80 + .label = N_("Description"),
  81 + .width = 20,
  82 + },
  83 +
  84 + // 2 = Session name
  85 + {
  86 + .label = N_("Session name"),
  87 + .margin_top = 12,
  88 + .tooltip = N_("The session name used in the window/tab title (empty for default)"),
  89 + .width = 15,
  90 + },
  91 +
  92 + // 3 = Session file
  93 + {
  94 + .label = N_("Session file"),
  95 + .tooltip = N_("The file with the session preferences for this shortcut"),
  96 + .width = 40,
  97 + }
  98 +
  99 + };
  100 +
  101 + GAction * pw3270_action_save_desktop_icon_new(void) {
  102 +
  103 + V3270SimpleAction * action = v3270_dialog_action_new(factory);
  104 +
  105 + action->name = "save.launcher";
  106 + action->label = _("Save session shortcut");
  107 + action->tooltip = _("Create shortcut for the current session");
  108 +
  109 + return G_ACTION(action);
  110 +
  111 + }
  112 +
  113 + GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {
  114 +
  115 + size_t ix;
  116 +
  117 + gboolean use_header;
  118 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  119 +
  120 + GtkWidget * dialog =
  121 + GTK_WIDGET(g_object_new(
  122 + GTK_TYPE_DIALOG,
  123 + "use-header-bar", (use_header ? 1 : 0),
  124 + NULL
  125 + ));
  126 +
  127 + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
  128 + gtk_window_set_title(GTK_WINDOW(dialog),action->label);
  129 +
  130 + gtk_dialog_add_buttons(
  131 + GTK_DIALOG(dialog),
  132 + _("_Cancel"), GTK_RESPONSE_CANCEL,
  133 + _("_Save"), GTK_RESPONSE_APPLY,
  134 + NULL
  135 + );
  136 +
  137 + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
  138 +
  139 + // Create entry fields
  140 + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));
  141 + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);
  142 + debug("Dialog=%p inputs=%p",dialog,inputs);
  143 +
  144 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  145 +
  146 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);
  147 +
  148 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  149 + gtk_container_set_border_width(GTK_CONTAINER(grid),18);
  150 + gtk_grid_set_row_spacing(GTK_GRID(grid),6);
  151 + gtk_grid_set_column_spacing(GTK_GRID(grid),12);
  152 +
  153 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  154 +
  155 + GtkWidget * label = gtk_label_new(gettext(entries[ix].label));
  156 + gtk_label_set_xalign(GTK_LABEL(label),1);
  157 + gtk_grid_attach(grid,label,0,ix,1,1);
  158 +
  159 + inputs[ix] = gtk_entry_new();
  160 + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);
  161 +
  162 + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);
  163 + gtk_widget_set_hexpand(inputs[ix],FALSE);
  164 + gtk_widget_set_vexpand(inputs[ix],FALSE);
  165 +
  166 + if(entries[ix].tooltip) {
  167 + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip));
  168 + }
  169 +
  170 + if(entries[ix].margin_top) {
  171 + gtk_widget_set_margin_top(label,entries[ix].margin_top);
  172 + gtk_widget_set_margin_top(inputs[ix],entries[ix].margin_top);
  173 + }
  174 +
  175 + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);
  176 +
  177 + }
  178 +
  179 + // Setup short-cut name entry.
  180 + {
  181 + gtk_entry_bind_to_filechooser(
  182 + inputs[0],
  183 + GTK_FILE_CHOOSER_ACTION_SAVE,
  184 + _("Save to windows shortcut"),
  185 + NULL,
  186 + "*.lnk",
  187 + _("Windows shortcuts")
  188 + );
  189 +
  190 + gchar * filename = g_strdup_printf(
  191 + "%s\\" G_STRINGIFY(PRODUCT_NAME) ".lnk",
  192 + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)
  193 + );
  194 +
  195 + size_t ix = 0;
  196 +
  197 + while(g_file_test(filename,G_FILE_TEST_EXISTS)) {
  198 +
  199 + g_free(filename);
  200 + filename = g_strdup_printf(
  201 + "%s\\" G_STRINGIFY(PRODUCT_NAME) "%u.lnk",
  202 + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP),
  203 + (unsigned int) ++ix
  204 + );
  205 +
  206 + }
  207 +
  208 + gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename);
  209 + g_free(filename);
  210 + }
  211 +
  212 + {
  213 + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal);
  214 + gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename);
  215 +
  216 + gtk_entry_bind_to_filechooser(
  217 + inputs[3],
  218 + GTK_FILE_CHOOSER_ACTION_SAVE,
  219 + _("File for session preferences"),
  220 + NULL,
  221 + "*.3270",
  222 + _("3270 session files")
  223 + );
  224 +
  225 + }
  226 +
  227 + gtk_widget_show_all(GTK_WIDGET(grid));
  228 + return dialog;
  229 + }
  230 +
  231 + static HRESULT CreateShortCut(const char * pszTargetfile, const char * pszTargetargs, const char * pszLinkfile, const char * pszDescription, int iShowmode, const char * pszCurdir, LPSTR pszIconfile, int iIconindex) {
  232 +
  233 + // https://www.codeproject.com/Articles/11467/How-to-create-short-cuts-link-files
  234 + IShellLink* pShellLink; // IShellLink object pointer
  235 + IPersistFile* pPersistFile; // IPersistFile object pointer
  236 + WORD wszLinkfile[MAX_PATH]; // pszLinkfile as Unicode string
  237 + int iWideCharsWritten; // Number of wide characters written
  238 +
  239 + HRESULT hRes =
  240 + CoCreateInstance(
  241 + &CLSID_ShellLink, // predefined CLSID of the IShellLink object
  242 + NULL, // pointer to parent interface if part of aggregate
  243 + CLSCTX_INPROC_SERVER, // caller and called code are in same process
  244 + &IID_IShellLink, // predefined interface of the IShellLink object
  245 + (void **) &pShellLink); // Returns a pointer to the IShellLink object
  246 +
  247 + if(!SUCCEEDED(hRes)) {
  248 + return hRes;
  249 + }
  250 +
  251 + if(pszTargetfile && strlen(pszTargetfile)) {
  252 + hRes = pShellLink->lpVtbl->SetPath(pShellLink,pszTargetfile);
  253 + } else {
  254 + char filename[MAX_PATH+1];
  255 + memset(filename,0,MAX_PATH+1);
  256 + GetModuleFileName(NULL,filename,MAX_PATH);
  257 + hRes = pShellLink->lpVtbl->SetPath(pShellLink,filename);
  258 + }
  259 +
  260 + if(pszTargetargs) {
  261 + hRes = pShellLink->lpVtbl->SetArguments(pShellLink,pszTargetargs);
  262 + } else {
  263 + hRes = pShellLink->lpVtbl->SetArguments(pShellLink,"");
  264 + }
  265 +
  266 + if(pszDescription && strlen(pszDescription) > 0) {
  267 + hRes = pShellLink->lpVtbl->SetDescription(pShellLink,pszDescription);
  268 + } else {
  269 + hRes = pShellLink->lpVtbl->SetDescription(pShellLink,_("IBM 3270 Terminal emulator"));
  270 + }
  271 +
  272 + if(iShowmode > 0) {
  273 + hRes = pShellLink->lpVtbl->SetShowCmd(pShellLink,iShowmode);
  274 + }
  275 +
  276 + if(pszCurdir && strlen(pszCurdir) > 0) {
  277 + hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,pszCurdir);
  278 + } else {
  279 + g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL);
  280 + hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,appdir);
  281 + }
  282 +
  283 + if(pszIconfile && strlen(pszIconfile) > 0 && iIconindex >= 0) {
  284 + hRes = pShellLink->lpVtbl->SetIconLocation(pShellLink, pszIconfile, iIconindex);
  285 + }
  286 +
  287 + // Use the IPersistFile object to save the shell link
  288 + hRes = pShellLink->lpVtbl->QueryInterface(
  289 + pShellLink, // existing IShellLink object
  290 + &IID_IPersistFile, // pre-defined interface of the IPersistFile object
  291 + (void **) &pPersistFile); // returns a pointer to the IPersistFile object
  292 +
  293 +
  294 + if(SUCCEEDED(hRes)){
  295 + iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, pszLinkfile, -1, wszLinkfile, MAX_PATH);
  296 + hRes = pPersistFile->lpVtbl->Save(pPersistFile,wszLinkfile, TRUE);
  297 + pPersistFile->lpVtbl->Release(pPersistFile);
  298 + }
  299 +
  300 + pShellLink->lpVtbl->Release(pShellLink);
  301 +
  302 + return hRes;
  303 + }
  304 +
  305 + void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
  306 +
  307 + debug("%s(%d)",__FUNCTION__,response_id);
  308 +
  309 + if(response_id == GTK_RESPONSE_APPLY) {
  310 +
  311 + // Save desktop icon
  312 + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");
  313 +
  314 + // Save keyfile
  315 + GError * error = NULL;
  316 + v3270_key_file_save_to_file(
  317 + terminal,
  318 + gtk_entry_get_text(GTK_ENTRY(inputs[3])),
  319 + &error
  320 + );
  321 +
  322 + if(!error) {
  323 +
  324 + HRESULT hRes = CreateShortCut(
  325 + NULL, // LPSTR pszTargetfile,
  326 + gtk_entry_get_text(GTK_ENTRY(inputs[3])), // LPSTR pszTargetargs,
  327 + gtk_entry_get_text(GTK_ENTRY(inputs[0])), // LPSTR pszLinkfile,
  328 + gtk_entry_get_text(GTK_ENTRY(inputs[1])), // LPSTR pszDescription,
  329 + 0,
  330 + NULL,
  331 + NULL,
  332 + 0
  333 + );
  334 +
  335 + }
  336 +
  337 + if(error) {
  338 +
  339 + g_message("%s",error->message);
  340 + g_error_free(error);
  341 +
  342 + } else {
  343 +
  344 + // Set session name (after save to avoid changes on the old session file).
  345 + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[2])));
  346 + v3270_emit_save_settings(terminal,NULL);
  347 +
  348 + }
  349 +
  350 + }
  351 +
  352 + gtk_widget_destroy(dialog);
  353 +
  354 +}
src/objects/settings/actionview.c 0 → 100644
@@ -0,0 +1,207 @@ @@ -0,0 +1,207 @@
  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 +#ifdef _WIN32
  31 + #include <winsock2.h>
  32 + #include <windows.h>
  33 +#endif // _WIN32
  34 +
  35 + #include <pw3270.h>
  36 + #include <pw3270/settings.h>
  37 + #include <lib3270.h>
  38 + #include <lib3270/log.h>
  39 + #include <pw3270/actions.h>
  40 +
  41 + struct _PW3270SettingsActions {
  42 + GtkGrid parent;
  43 + GtkWidget * views[3];
  44 + GtkTreeModel * model;
  45 + };
  46 +
  47 + struct _PW3270SettingsActionsClass {
  48 + GtkGridClass parent;
  49 +
  50 + int dunno;
  51 + };
  52 +
  53 + G_DEFINE_TYPE(PW3270SettingsActions, PW3270SettingsActions, GTK_TYPE_GRID);
  54 +
  55 + static void PW3270SettingsActions_class_init(PW3270SettingsActionsClass *klass) {
  56 +
  57 + }
  58 +
  59 + static void PW3270SettingsActions_init(PW3270SettingsActions *grid) {
  60 +
  61 + size_t ix;
  62 +
  63 + static const struct View {
  64 + const gchar *label;
  65 + const gchar *tooltip;
  66 + } views[G_N_ELEMENTS(grid->views)] = {
  67 + {
  68 + .label = N_("Start"),
  69 + .tooltip = N_("Items packed from the start to the end")
  70 + },
  71 +
  72 + {
  73 + .label = N_("Available"),
  74 + .tooltip = N_("List of the available and unpacked actions")
  75 + },
  76 +
  77 + {
  78 + .label = N_("End"),
  79 + .tooltip = N_("Items packed from the end to the start")
  80 + }
  81 + };
  82 +
  83 + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE);
  84 + gtk_grid_set_row_spacing(GTK_GRID(grid),12);
  85 + gtk_grid_set_column_spacing(GTK_GRID(grid),6);
  86 +
  87 + {
  88 + // Create views
  89 + GtkTreeSelection * selection;
  90 + GtkWidget *box;
  91 +
  92 + for(ix = 0; ix < G_N_ELEMENTS(grid->views); ix++) {
  93 +
  94 + // Create label.
  95 + GtkWidget * label = gtk_label_new(gettext(views[ix].label));
  96 + gtk_widget_set_tooltip_markup(label,gettext(views[ix].tooltip));
  97 + gtk_label_set_xalign(GTK_LABEL(label),0);
  98 + gtk_widget_set_hexpand(label,TRUE);
  99 + gtk_widget_set_vexpand(label,FALSE);
  100 +
  101 + gtk_grid_attach(
  102 + GTK_GRID(grid),
  103 + label,
  104 + (ix*2),0,
  105 + 1,1
  106 + );
  107 +
  108 + // Create view
  109 + grid->views[ix] = pw3270_action_view_new();
  110 + gtk_widget_set_hexpand(grid->views[ix],TRUE);
  111 + gtk_widget_set_vexpand(grid->views[ix],TRUE);
  112 +
  113 + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(grid->views[ix]));
  114 + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
  115 +
  116 + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL);
  117 + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  118 + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(box),GTK_SHADOW_ETCHED_IN);
  119 + gtk_container_add(GTK_CONTAINER(box),grid->views[ix]);
  120 +
  121 + gtk_grid_attach(
  122 + GTK_GRID(grid),
  123 + box,
  124 + (ix*2),1,
  125 + 1,5
  126 + );
  127 +
  128 + }
  129 +
  130 + }
  131 +
  132 + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(grid->views[0]),TRUE);
  133 + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(grid->views[2]),TRUE);
  134 + pw3270_action_view_order_by_label(grid->views[1]);
  135 +
  136 + // Create buttons
  137 + {
  138 + GtkWidget *buttons[] = {
  139 + pw3270_action_view_move_button_new(grid->views[1],grid->views[0],"go-previous"),
  140 + pw3270_action_view_move_button_new(grid->views[1],grid->views[2],"go-next"),
  141 + pw3270_action_view_move_button_new(grid->views[0],grid->views[1],"go-next"),
  142 + pw3270_action_view_move_button_new(grid->views[2],grid->views[1],"go-previous")
  143 + };
  144 +
  145 + gtk_grid_attach(GTK_GRID(grid),buttons[0],1,2,1,1);
  146 + gtk_grid_attach(GTK_GRID(grid),buttons[1],3,2,1,1);
  147 +
  148 + gtk_grid_attach(GTK_GRID(grid),buttons[2],1,3,1,1);
  149 + gtk_grid_attach(GTK_GRID(grid),buttons[3],3,3,1,1);
  150 +
  151 + }
  152 +
  153 + }
  154 +
  155 + GtkWidget * pw3270_settings_actions_new() {
  156 +
  157 + return GTK_WIDGET(g_object_new(
  158 + GTK_TYPE_PW3270_SETTINGS_ACTIONS,
  159 + NULL
  160 + ));
  161 +
  162 + }
  163 +
  164 + Pw3270ActionList * pw3270_settings_action_set(GtkWidget *widget, Pw3270ActionList *action_list, const gchar *action_names) {
  165 +
  166 + PW3270SettingsActions *editor = (PW3270SettingsActions *) widget;
  167 +
  168 + static const unsigned short columns[] = { 0, 2 };
  169 + unsigned short column;
  170 + size_t action;
  171 +
  172 + gchar **views = g_strsplit(action_names,":",-1);
  173 +
  174 + for(column = 0; column < G_N_ELEMENTS(columns); column++) {
  175 +
  176 + if(!views[column])
  177 + break;
  178 +
  179 + gchar ** actions = g_strsplit(views[column],",",-1);
  180 +
  181 + for(action = 0; actions[action];action++) {
  182 + action_list = pw3270_action_list_move_action(
  183 + action_list,
  184 + actions[action],
  185 + editor->views[columns[column]]
  186 + );
  187 + }
  188 +
  189 + g_strfreev(actions);
  190 + }
  191 +
  192 + g_strfreev(views);
  193 +
  194 + pw3270_action_view_set_actions(editor->views[1], action_list);
  195 +
  196 + return action_list;
  197 + }
  198 +
  199 + gchar * pw3270_settings_action_get(GtkWidget *widget) {
  200 +
  201 + PW3270SettingsActions *editor = (PW3270SettingsActions *) widget;
  202 +
  203 + g_autofree gchar * left_names = pw3270_action_view_get_action_names(editor->views[0]);
  204 + g_autofree gchar * right_names = pw3270_action_view_get_action_names(editor->views[2]);
  205 + return g_strconcat(left_names,":",right_names,NULL);
  206 +
  207 + }
src/objects/settings/dialog.c
@@ -71,11 +71,6 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) @@ -71,11 +71,6 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog)
71 // Get use of header bar. 71 // Get use of header bar.
72 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL); 72 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL);
73 73
74 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
75 - //gtk_box_set_spacing(GTK_BOX(content_area),18);  
76 - //gtk_container_set_border_width(GTK_CONTAINER(content_area),18);  
77 -  
78 -// gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);  
79 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); 74 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
80 75
81 gtk_dialog_add_buttons( 76 gtk_dialog_add_buttons(
@@ -102,7 +97,7 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) @@ -102,7 +97,7 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog)
102 97
103 } 98 }
104 99
105 -GtkWidget * pw3270_settings_dialog_new(GAction *action) { 100 +GtkWidget * pw3270_settings_dialog_new(GAction *action, gboolean has_subtitle) {
106 101
107 #ifdef _WIN32 102 #ifdef _WIN32
108 103
@@ -115,7 +110,7 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { @@ -115,7 +110,7 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) {
115 110
116 #elif GTK_CHECK_VERSION(3,12,0) 111 #elif GTK_CHECK_VERSION(3,12,0)
117 112
118 - gboolean use_header; 113 + gboolean use_header = FALSE;
119 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); 114 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
120 115
121 GtkWidget * dialog = 116 GtkWidget * dialog =
@@ -131,6 +126,8 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { @@ -131,6 +126,8 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) {
131 126
132 #endif // GTK 3.12 127 #endif // GTK 3.12
133 128
  129 + GTK_PW3270_SETTINGS_DIALOG(dialog)->has_subtitle = has_subtitle;
  130 +
134 if(action) { 131 if(action) {
135 132
136 if(PW3270_IS_ACTION(action)) { 133 if(PW3270_IS_ACTION(action)) {
@@ -202,6 +199,7 @@ void add(GtkContainer *container, GtkWidget *widget) { @@ -202,6 +199,7 @@ void add(GtkContainer *container, GtkWidget *widget) {
202 settings->load(widget,settings->settings); 199 settings->load(widget,settings->settings);
203 } 200 }
204 201
  202 + gtk_widget_show(widget);
205 gtk_notebook_append_page( 203 gtk_notebook_append_page(
206 GTK_PW3270_SETTINGS_DIALOG(container)->tabs, 204 GTK_PW3270_SETTINGS_DIALOG(container)->tabs,
207 widget, 205 widget,
@@ -216,20 +214,11 @@ void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint @@ -216,20 +214,11 @@ void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint
216 214
217 void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) { 215 void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) {
218 216
219 - if(gtk_notebook_get_n_pages(notebook) > 1) {  
220 -  
221 - GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));  
222 -  
223 - if(header_bar) {  
224 - gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),page->title);  
225 - }  
226 -  
227 - } else if(page->title) {  
228 -  
229 - gtk_window_set_title(GTK_WINDOW(dialog),page->title); 217 + GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
230 218
  219 + if(header_bar && dialog->has_subtitle) {
  220 + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),page->title);
231 } 221 }
232 222
233 -  
234 } 223 }
235 224
src/objects/toolbar/actions.c
@@ -65,21 +65,35 @@ @@ -65,21 +65,35 @@
65 65
66 if(!action) { 66 if(!action) {
67 const gchar *ptr = strchr(name,'.'); 67 const gchar *ptr = strchr(name,'.');
68 -  
69 if(ptr) { 68 if(ptr) {
70 action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1); 69 action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1);
71 - debug("action(%s)=%p",ptr+1,action);  
72 } 70 }
  71 + }
73 72
  73 + if(!action) {
  74 + action = g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()),name);
  75 + }
  76 +
  77 + if(!action) {
  78 + const gchar *ptr = strchr(name,'.');
  79 + if(ptr) {
  80 + action = g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()), ptr+1);
  81 + }
74 } 82 }
75 83
76 debug("%s(%s)=%p",__FUNCTION__,name,action); 84 debug("%s(%s)=%p",__FUNCTION__,name,action);
77 85
78 - if(action) {  
79 - debug("Creating button \"%s\" from action \"%s\"",name,g_action_get_name(G_ACTION(action)));  
80 - item = gtk_tool_button_new_from_action(action,GTK_ICON_SIZE_LARGE_TOOLBAR); 86 + if(!action) {
  87 + g_warning("Can't find action \"%s\"",name);
  88 + return NULL;
81 } 89 }
82 90
  91 + item = gtk_tool_button_new_from_action(
  92 + action,
  93 + GTK_ICON_SIZE_LARGE_TOOLBAR,
  94 + pw3270_toolbar_get_icon_type(GTK_TOOLBAR(toolbar)) == 1
  95 + );
  96 +
83 if(item) { 97 if(item) {
84 98
85 gtk_widget_show_all(GTK_WIDGET(item)); 99 gtk_widget_show_all(GTK_WIDGET(item));
src/objects/toolbar/models.c 0 → 100644
@@ -0,0 +1,277 @@ @@ -0,0 +1,277 @@
  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 "private.h"
  31 + #include <pw3270/application.h>
  32 + #include <pw3270/settings.h>
  33 + #include <pw3270/window.h>
  34 +
  35 + #define GTK_TOOLBAR_DEFAULT_STYLE ((GtkToolbarStyle) -1)
  36 +
  37 + struct _contents {
  38 + const gchar * label;
  39 + int value;
  40 + };
  41 +
  42 + static const struct _models {
  43 + const gchar *name;
  44 + const gchar *property;
  45 + const gchar *label;
  46 + const struct _contents *contents;
  47 + } models[] = {
  48 +
  49 + {
  50 + "toolbar-icon-size",
  51 + "icon-size",
  52 + N_("Icon _size"),
  53 + (const struct _contents[]) {
  54 + {
  55 + .label = N_( "System default" ),
  56 + .value = GTK_ICON_SIZE_INVALID
  57 +
  58 + },
  59 +
  60 + {
  61 + .label = N_( "Small" ),
  62 + .value = GTK_ICON_SIZE_SMALL_TOOLBAR
  63 + },
  64 +
  65 + {
  66 + .label = N_( "Large" ),
  67 + .value = GTK_ICON_SIZE_LARGE_TOOLBAR
  68 + },
  69 +
  70 + {
  71 + .label = NULL
  72 + }
  73 + }
  74 + },
  75 +
  76 + {
  77 + "toolbar-style",
  78 + "style",
  79 + N_("Toolbar s_tyle"),
  80 + (const struct _contents[]) {
  81 + {
  82 + .label = N_( "System default" ),
  83 + .value = GTK_TOOLBAR_DEFAULT_STYLE
  84 + },
  85 +
  86 + {
  87 + .label = N_( "Icons only" ),
  88 + .value = GTK_TOOLBAR_ICONS
  89 + },
  90 +
  91 + {
  92 + .label = N_( "Text only" ),
  93 + .value = GTK_TOOLBAR_TEXT
  94 + },
  95 +
  96 + {
  97 + .label = N_( "Icons & text" ),
  98 + .value = GTK_TOOLBAR_BOTH
  99 + },
  100 + {
  101 + .label = NULL
  102 + }
  103 + }
  104 + },
  105 + {
  106 + "toolbar-icon-type",
  107 + "icon-type",
  108 + N_("Icon type"),
  109 + (const struct _contents[]) {
  110 + {
  111 + .label = N_( "System default" ),
  112 + .value = 0
  113 + },
  114 + {
  115 + .label = N_( "Symbolic" ),
  116 + .value = 1
  117 + },
  118 + {
  119 + .label = NULL
  120 + }
  121 + }
  122 + }
  123 +
  124 + };
  125 +
  126 + GtkTreeModel * pw3270_model_from_name(const gchar *name) {
  127 +
  128 + size_t model;
  129 +
  130 + for(model = 0; model < G_N_ELEMENTS(models); model++) {
  131 +
  132 + if(g_ascii_strcasecmp(models[model].name,name))
  133 + continue;
  134 +
  135 + // Create model
  136 + size_t row;
  137 + GtkTreeIter iter;
  138 + GtkListStore * store = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT);
  139 +
  140 + for(row = 0; models[model].contents[row].label; row++) {
  141 + gtk_list_store_append(store,&iter);
  142 + gtk_list_store_set( store,
  143 + &iter,
  144 + 0, gettext(models[model].contents[row].label),
  145 + 1, models[model].contents[row].value,
  146 + -1);
  147 + }
  148 +
  149 + return GTK_TREE_MODEL(store);
  150 +
  151 + }
  152 +
  153 + g_warning("Can't create combobox '%s'",name);
  154 + return NULL;
  155 + }
  156 +
  157 + void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) {
  158 +
  159 + if(gtk_tree_model_get_iter_first(model,iter)) {
  160 +
  161 + do {
  162 +
  163 + GValue gVal = { 0, };
  164 + gtk_tree_model_get_value(model,iter,1,&gVal);
  165 + guint iVal = g_value_get_uint(&gVal);
  166 + g_value_unset(&gVal);
  167 +
  168 + if(iVal == value) {
  169 + return;
  170 + }
  171 +
  172 + } while(gtk_tree_model_iter_next(model,iter));
  173 +
  174 + }
  175 +
  176 + }
  177 +
  178 + guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) {
  179 + GValue gVal = { 0, };
  180 + gtk_tree_model_get_value(model,iter,1,&gVal);
  181 + guint iVal = g_value_get_uint(&gVal);
  182 + g_value_unset(&gVal);
  183 + return iVal;
  184 + }
  185 +
  186 + static void set_property(GObject *menuitem, GObject *widget) {
  187 +
  188 + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) {
  189 +
  190 + const struct _contents *model = (const struct _contents *) g_object_get_data(menuitem, I_("pw3270_model_data"));
  191 + const char *name = (const char *) g_object_get_data(menuitem, I_("pw3270_property_name"));
  192 +
  193 + debug("%s(%s,%d)",__FUNCTION__,name,model->value);
  194 + g_object_set(widget,name,model->value,NULL);
  195 +
  196 + }
  197 +
  198 + }
  199 +
  200 + static void set_toggle_menu_item(GtkCheckMenuItem *item, gint *value) {
  201 + const struct _contents *model = (const struct _contents *) g_object_get_data(G_OBJECT(item), I_("pw3270_model_data"));
  202 + if(model) {
  203 + gtk_check_menu_item_set_active(item,model->value == *value);
  204 + }
  205 + }
  206 +
  207 + static void property_changed(GObject *widget, GParamSpec G_GNUC_UNUSED(*pspec), GtkContainer *menu) {
  208 +
  209 + gint value = -1;
  210 + const gchar * name = g_object_get_data(G_OBJECT(menu), I_("pw3270_property_name"));
  211 + g_object_get(widget,name,&value,NULL);
  212 +
  213 + debug("%s(%p,%s)=%d",__FUNCTION__,widget,name,value);
  214 +
  215 + gtk_container_foreach(menu,(GtkCallback) set_toggle_menu_item,&value);
  216 +
  217 +
  218 + }
  219 +
  220 + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *name) {
  221 +
  222 + size_t model;
  223 +
  224 +
  225 + for(model = 0; model < G_N_ELEMENTS(models); model++) {
  226 +
  227 + if(g_ascii_strcasecmp(models[model].name,name))
  228 + continue;
  229 +
  230 + // Create submenu
  231 + size_t row;
  232 + GtkWidget * item;
  233 + GtkWidget * menu = gtk_menu_item_new_with_mnemonic(gettext(models[model].label));
  234 +
  235 + GtkWidget * submenu = gtk_menu_new();
  236 + g_object_set_data(G_OBJECT(submenu),I_("pw3270_property_name"),(gpointer) models[model].property);
  237 + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu),submenu);
  238 +
  239 + gint selected = -1;
  240 + if(widget) {
  241 + g_object_get(G_OBJECT(widget),models[model].property,&selected,NULL);
  242 + g_autofree gchar * signame = g_strconcat("notify::",models[model].property,NULL);
  243 + g_signal_connect(G_OBJECT(widget),signame,G_CALLBACK(property_changed),submenu);
  244 + }
  245 +
  246 + for(row = 0; models[model].contents[row].label; row++) {
  247 +
  248 + item = gtk_check_menu_item_new_with_mnemonic(gettext(models[model].contents[row].label));
  249 + gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE);
  250 +
  251 + g_object_set_data(G_OBJECT(item),I_("pw3270_property_name"),(gpointer) models[model].property);
  252 + g_object_set_data(G_OBJECT(item),I_("pw3270_model_data"),(gpointer) &models[model].contents[row]);
  253 +
  254 + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),selected == models[model].contents[row].value);
  255 +
  256 + if(widget) {
  257 + g_signal_connect(item, "toggled", G_CALLBACK(set_property), widget);
  258 + }
  259 +
  260 + gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item);
  261 +
  262 + }
  263 +
  264 + gtk_widget_show_all(menu);
  265 +
  266 + return menu;
  267 + }
  268 +
  269 + return NULL;
  270 + }
  271 +
  272 + void pw3270_menu_item_set_value(GtkWidget *menu, guint value) {
  273 +
  274 + debug("%s(%p,%d)",__FUNCTION__,menu,value);
  275 +
  276 + }
  277 +
src/objects/toolbar/private.h
@@ -37,6 +37,9 @@ @@ -37,6 +37,9 @@
37 #define GETTEXT_PACKAGE PACKAGE_NAME 37 #define GETTEXT_PACKAGE PACKAGE_NAME
38 #endif 38 #endif
39 39
  40 + /* not really I18N-related, but also a string marker macro */
  41 + #define I_(string) g_intern_static_string (string)
  42 +
40 #include <libintl.h> 43 #include <libintl.h>
41 #include <glib/gi18n.h> 44 #include <glib/gi18n.h>
42 #include <gtk/gtk.h> 45 #include <gtk/gtk.h>
@@ -47,8 +50,9 @@ @@ -47,8 +50,9 @@
47 G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action); 50 G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action);
48 G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name); 51 G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name);
49 52
50 - G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new();  
51 - G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_icon_size_model_new(); 53 + GtkTreeModel * pw3270_model_from_name(const gchar *name);
  54 + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *model_name);
  55 + void pw3270_menu_item_set_value(GtkWidget *menu, guint value);
52 56
53 G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value); 57 G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value);
54 G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter); 58 G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter);
src/objects/toolbar/settings.c
@@ -41,45 +41,43 @@ @@ -41,45 +41,43 @@
41 /*--[ Constants ]------------------------------------------------------------------------------------*/ 41 /*--[ Constants ]------------------------------------------------------------------------------------*/
42 42
43 static const struct _comboboxes { 43 static const struct _comboboxes {
44 - const gchar * name;  
45 - const gchar * label; 44 + const gchar * name; ///< @brief The gsettings name.
  45 + const gchar * label; ///< @brief The combo name.
  46 + guint left;
  47 + guint top;
46 } comboboxes[] = { 48 } comboboxes[] = {
47 49
48 { 50 {
  51 + .left = 0,
  52 + .top = 0,
49 .name = "toolbar-icon-size", 53 .name = "toolbar-icon-size",
50 .label = N_("Icon Size"), 54 .label = N_("Icon Size"),
51 }, 55 },
52 56
53 { 57 {
  58 + .left = 3,
  59 + .top = 0,
  60 + .name = "toolbar-icon-type",
  61 + .label = N_("Icon Style")
  62 + },
  63 +
  64 + {
  65 + .left = 0,
  66 + .top = 1,
54 .name = "toolbar-style", 67 .name = "toolbar-style",
55 - .label = N_("Style") 68 + .label = N_("Toolbar Style")
56 } 69 }
57 70
58 }; 71 };
59 72
60 struct _PW3270SettingsPrivate { 73 struct _PW3270SettingsPrivate {
61 GtkWidget * views[2]; 74 GtkWidget * views[2];
62 - GtkWidget * buttons[2];  
63 - GtkTreeModel * models[2]; 75 +// GtkTreeModel * models[G_N_ELEMENTS(comboboxes)];
64 GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; 76 GtkWidget * combos[G_N_ELEMENTS(comboboxes)];
65 }; 77 };
66 78
67 /*--[ Implement ]------------------------------------------------------------------------------------*/ 79 /*--[ Implement ]------------------------------------------------------------------------------------*/
68 80
69 - static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) {  
70 - gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0);  
71 - }  
72 -  
73 - void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) {  
74 - debug("%s(%p)",__FUNCTION__,settings);  
75 - pw3270_action_view_move_selected(settings->views[1],settings->views[0]);  
76 - }  
77 -  
78 - void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) {  
79 - debug("%s(%p)",__FUNCTION__,settings);  
80 - pw3270_action_view_move_selected(settings->views[0],settings->views[1]);  
81 - }  
82 -  
83 GtkWidget * pw3270_toolbar_settings_new() { 81 GtkWidget * pw3270_toolbar_settings_new() {
84 82
85 size_t ix; 83 size_t ix;
@@ -132,6 +130,7 @@ @@ -132,6 +130,7 @@
132 130
133 GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); 131 GtkWidget * box = gtk_scrolled_window_new(NULL,NULL);
134 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); 132 gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC);
  133 + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(box),GTK_SHADOW_ETCHED_IN);
135 gtk_container_add(GTK_CONTAINER(box),page->views[ix]); 134 gtk_container_add(GTK_CONTAINER(box),page->views[ix]);
136 135
137 gtk_grid_attach( 136 gtk_grid_attach(
@@ -143,50 +142,20 @@ @@ -143,50 +142,20 @@
143 } 142 }
144 143
145 gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE); 144 gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE);
146 - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); 145 + pw3270_action_view_order_by_label(page->views[1]);
147 146
148 // Create buttons 147 // Create buttons
149 - static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = {  
150 - "go-next",  
151 - "go-previous"  
152 - };  
153 -  
154 GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); 148 GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL);
155 gtk_widget_set_hexpand(box,FALSE); 149 gtk_widget_set_hexpand(box,FALSE);
156 gtk_widget_set_vexpand(box,FALSE); 150 gtk_widget_set_vexpand(box,FALSE);
157 151
158 - for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) {  
159 - page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND);  
160 -  
161 - gtk_widget_set_focus_on_click(page->buttons[ix],FALSE);  
162 - gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE);  
163 - gtk_widget_set_sensitive(page->buttons[ix],FALSE);  
164 -  
165 - g_signal_connect(  
166 - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])),  
167 - "changed",  
168 - G_CALLBACK(selection_changed),  
169 - page->buttons[ix]  
170 - );  
171 -  
172 - }  
173 -  
174 - gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0);  
175 - gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0);  
176 -  
177 - g_signal_connect(  
178 - page->buttons[0],  
179 - "clicked",  
180 - G_CALLBACK(toolbar_remove),  
181 - page  
182 - ); 152 + GtkWidget * buttons[] = {
  153 + pw3270_action_view_move_button_new(page->views[0],page->views[1],"go-next"),
  154 + pw3270_action_view_move_button_new(page->views[1],page->views[0],"go-previous"),
  155 + };
183 156
184 - g_signal_connect(  
185 - page->buttons[1],  
186 - "clicked",  
187 - G_CALLBACK(toolbar_insert),  
188 - page  
189 - ); 157 + gtk_box_pack_start(GTK_BOX(box),buttons[0],FALSE,FALSE,0);
  158 + gtk_box_pack_end(GTK_BOX(box),buttons[1],FALSE,FALSE,0);
190 159
191 gtk_grid_attach( 160 gtk_grid_attach(
192 grid, 161 grid,
@@ -197,7 +166,7 @@ @@ -197,7 +166,7 @@
197 } 166 }
198 167
199 // 168 //
200 - // Create style & icon size settings. 169 + // Create Combos.
201 // 170 //
202 { 171 {
203 GtkGrid * grid = GTK_GRID(gtk_grid_new()); 172 GtkGrid * grid = GTK_GRID(gtk_grid_new());
@@ -213,25 +182,24 @@ @@ -213,25 +182,24 @@
213 gtk_grid_set_column_spacing(grid,12); 182 gtk_grid_set_column_spacing(grid,12);
214 gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE); 183 gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE);
215 184
216 - page->models[0] = pw3270_toolbar_icon_size_model_new();  
217 - page->models[1] = pw3270_toolbar_style_model_new();  
218 -  
219 GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); 185 GtkCellRenderer * renderer = gtk_cell_renderer_text_new();
220 186
221 - for(ix = 0; ix < G_N_ELEMENTS(page->models); ix++) { 187 + for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
  188 +
  189 + GtkTreeModel *model = pw3270_model_from_name(comboboxes[ix].name);
222 190
223 GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label)); 191 GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label));
224 gtk_label_set_xalign(GTK_LABEL(label),1); 192 gtk_label_set_xalign(GTK_LABEL(label),1);
225 193
226 - gtk_grid_attach(grid,label,(ix*3),0,1,1); 194 + gtk_grid_attach(grid,label,comboboxes[ix].left,comboboxes[ix].top,1,1);
227 195
228 - page->combos[ix] = gtk_combo_box_new_with_model(page->models[ix]);  
229 - gtk_widget_set_hexpand(page->combos[ix],TRUE); 196 + page->combos[ix] = gtk_combo_box_new_with_model(model);
  197 + gtk_widget_set_hexpand(page->combos[ix],FALSE);
230 198
231 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE); 199 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE);
232 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL); 200 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL);
233 201
234 - gtk_grid_attach(grid,page->combos[ix],(ix*3)+1,0,2,1); 202 + gtk_grid_attach(grid,page->combos[ix],comboboxes[ix].left+1,comboboxes[ix].top,2,1);
235 203
236 } 204 }
237 205
@@ -273,12 +241,11 @@ @@ -273,12 +241,11 @@
273 241
274 // Load available actions. 242 // Load available actions.
275 pw3270_action_view_set_actions(page->views[1], action_list); 243 pw3270_action_view_set_actions(page->views[1], action_list);
276 - pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", 1); 244 + pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", PW3270_ACTION_VIEW_FLAG_ALLOW_ADD);
277 245
278 pw3270_action_list_free(action_list); 246 pw3270_action_list_free(action_list);
279 247
280 GtkTreeIter iter; 248 GtkTreeIter iter;
281 -  
282 for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { 249 for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
283 250
284 pw3270_model_get_iter_from_value( 251 pw3270_model_get_iter_from_value(
@@ -298,13 +265,9 @@ @@ -298,13 +265,9 @@
298 size_t ix; 265 size_t ix;
299 g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); 266 g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
300 267
301 - debug("%s",__FUNCTION__);  
302 -  
303 g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]); 268 g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]);
304 g_settings_set_string(settings,"toolbar-action-names",action_names); 269 g_settings_set_string(settings,"toolbar-action-names",action_names);
305 270
306 - debug("[%s]",action_names);  
307 -  
308 GtkTreeIter iter; 271 GtkTreeIter iter;
309 for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { 272 for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) {
310 273
@@ -322,48 +285,3 @@ @@ -322,48 +285,3 @@
322 285
323 } 286 }
324 287
325 - /*  
326 -  
327 - typedef struct _ToolbarSettingsPage {  
328 - Pw3270SettingsPage parent;  
329 - GtkWidget * views[2];  
330 - GtkWidget * buttons[2];  
331 - GtkTreeModel * models[2];  
332 - GtkWidget * combos[G_N_ELEMENTS(comboboxes)];  
333 -  
334 - } ToolbarSettingsPage;  
335 -  
336 - static void load(Pw3270SettingsPage *pg, GtkApplication *application) {  
337 -  
338 - size_t ix;  
339 - ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg;  
340 - g_autoptr(GSettings) settings = pw3270_application_window_settings_new();  
341 -  
342 - debug("%s",__FUNCTION__);  
343 -  
344 -  
345 - }  
346 -  
347 - static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application)) {  
348 -  
349 - }  
350 -  
351 -  
352 - Pw3270SettingsPage * pw3270_toolbar_settings_new() {  
353 -  
354 - size_t ix;  
355 -  
356 - ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1);  
357 -  
358 - page->parent.load = load;  
359 - page->parent.apply = apply;  
360 - page->parent.label = _("Toolbar");  
361 - page->parent.title = _("Setup toolbar");  
362 -  
363 - page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0);  
364 -  
365 -  
366 -  
367 - return (Pw3270SettingsPage *) page;  
368 - }  
369 - */  
src/objects/toolbar/toolbar.c
@@ -38,71 +38,33 @@ @@ -38,71 +38,33 @@
38 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); 38 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
39 static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); 39 static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
40 40
41 - const struct icon_size {  
42 - const gchar * label;  
43 - GtkIconSize icon_size;  
44 - } icon_sizes[] = {  
45 -  
46 - {  
47 - .label = N_( "System default" ),  
48 - .icon_size = GTK_ICON_SIZE_INVALID  
49 -  
50 - },  
51 -  
52 - {  
53 - .label = N_( "Small" ),  
54 - .icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR  
55 - },  
56 -  
57 - {  
58 - .label = N_( "Large" ),  
59 - .icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR  
60 - },  
61 - };  
62 -  
63 - static const struct style {  
64 - const gchar * label;  
65 - GtkToolbarStyle style;  
66 - } styles[] = {  
67 -  
68 - {  
69 - .label = N_( "System default" ),  
70 - .style = GTK_TOOLBAR_DEFAULT_STYLE  
71 - },  
72 -  
73 - {  
74 - .label = N_( "Icons only" ),  
75 - .style = GTK_TOOLBAR_ICONS  
76 - },  
77 -  
78 - {  
79 - .label = N_( "Text only" ),  
80 - .style = GTK_TOOLBAR_TEXT  
81 - },  
82 -  
83 - {  
84 - .label = N_( "Icons & text" ),  
85 - .style = GTK_TOOLBAR_BOTH  
86 - },  
87 - };  
88 -  
89 enum { 41 enum {
90 PROP_NONE, 42 PROP_NONE,
91 PROP_ACTION_NAMES, 43 PROP_ACTION_NAMES,
92 PROP_ICON_SIZE, 44 PROP_ICON_SIZE,
  45 + PROP_ICON_TYPE,
93 PROP_STYLE 46 PROP_STYLE
94 }; 47 };
95 48
  49 + enum {
  50 + TOOLBAR_MENU_STYLE,
  51 + TOOLBAR_MENU_ICON_SIZE,
  52 + TOOLBAR_MENU_ICON_TYPE
  53 + };
  54 +
  55 + static const gchar * toolbar_menus[] = {
  56 + "toolbar-style",
  57 + "toolbar-icon-size",
  58 + "toolbar-icon-type"
  59 + };
  60 +
96 struct _pw3270ToolBar { 61 struct _pw3270ToolBar {
97 GtkToolbar parent; 62 GtkToolbar parent;
98 GtkToolbarStyle style; 63 GtkToolbarStyle style;
  64 + int icon_type;
99 65
100 - /// @brief Popup Menu  
101 - struct {  
102 - GtkWidget * menu;  
103 - GtkWidget * styles[G_N_ELEMENTS(styles)];  
104 - GtkWidget * icon_sizes[G_N_ELEMENTS(icon_sizes)];  
105 - } popup; 66 + GtkWidget *menu;
  67 + GtkWidget *submenu[G_N_ELEMENTS(toolbar_menus)];
106 68
107 }; 69 };
108 70
@@ -131,9 +93,9 @@ @@ -131,9 +93,9 @@
131 object_class, 93 object_class,
132 PROP_ACTION_NAMES, 94 PROP_ACTION_NAMES,
133 g_param_spec_string ( 95 g_param_spec_string (
134 - "action-names",  
135 - N_("Action Names"),  
136 - N_("The name of the actions in the toolbar"), 96 + I_("action-names"),
  97 + "Action Names",
  98 + _("The name of the actions in the toolbar"),
137 NULL, 99 NULL,
138 G_PARAM_READABLE|G_PARAM_WRITABLE) 100 G_PARAM_READABLE|G_PARAM_WRITABLE)
139 ); 101 );
@@ -142,8 +104,8 @@ @@ -142,8 +104,8 @@
142 object_class, 104 object_class,
143 PROP_ICON_SIZE, 105 PROP_ICON_SIZE,
144 g_param_spec_int( 106 g_param_spec_int(
145 - "icon-size",  
146 - "icon-size", 107 + I_("icon-size"),
  108 + "icon size",
147 _("The toolbar icon size"), 109 _("The toolbar icon size"),
148 INT_MIN, 110 INT_MIN,
149 INT_MAX, 111 INT_MAX,
@@ -155,7 +117,7 @@ @@ -155,7 +117,7 @@
155 object_class, 117 object_class,
156 PROP_STYLE, 118 PROP_STYLE,
157 g_param_spec_int( 119 g_param_spec_int(
158 - "style", 120 + I_("style"),
159 "style", 121 "style",
160 _("The toolbar style"), 122 _("The toolbar style"),
161 INT_MIN, 123 INT_MIN,
@@ -164,6 +126,19 @@ @@ -164,6 +126,19 @@
164 G_PARAM_READABLE|G_PARAM_WRITABLE) 126 G_PARAM_READABLE|G_PARAM_WRITABLE)
165 ); 127 );
166 128
  129 + g_object_class_install_property(
  130 + object_class,
  131 + PROP_ICON_TYPE,
  132 + g_param_spec_int(
  133 + I_("icon-type"),
  134 + I_("icon-type"),
  135 + _("The toolbar icon type"),
  136 + 0,
  137 + 1,
  138 + 0,
  139 + G_PARAM_READABLE|G_PARAM_WRITABLE)
  140 + );
  141 +
167 } 142 }
168 143
169 void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { 144 void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) {
@@ -181,6 +156,10 @@ @@ -181,6 +156,10 @@
181 g_value_set_int(value,pw3270_toolbar_get_style(GTK_TOOLBAR(object))); 156 g_value_set_int(value,pw3270_toolbar_get_style(GTK_TOOLBAR(object)));
182 break; 157 break;
183 158
  159 + case PROP_ICON_TYPE:
  160 + g_value_set_int(value,pw3270_toolbar_get_icon_type(GTK_TOOLBAR(object)));
  161 + break;
  162 +
184 default: 163 default:
185 g_assert_not_reached (); 164 g_assert_not_reached ();
186 } 165 }
@@ -203,42 +182,27 @@ @@ -203,42 +182,27 @@
203 pw3270_toolbar_set_style(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value)); 182 pw3270_toolbar_set_style(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value));
204 break; 183 break;
205 184
  185 + case PROP_ICON_TYPE:
  186 + pw3270_toolbar_set_icon_type(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value));
  187 + break;
  188 +
206 default: 189 default:
207 g_assert_not_reached (); 190 g_assert_not_reached ();
208 } 191 }
209 192
210 } 193 }
211 194
212 -  
213 static void detacher(GtkWidget *attach_widget, GtkMenu G_GNUC_UNUSED(*menu)) { 195 static void detacher(GtkWidget *attach_widget, GtkMenu G_GNUC_UNUSED(*menu)) {
214 196
215 pw3270ToolBar * toolbar = PW3270_TOOLBAR(attach_widget); 197 pw3270ToolBar * toolbar = PW3270_TOOLBAR(attach_widget);
216 - toolbar->popup.menu = NULL;  
217 -  
218 - }  
219 -  
220 - static void set_icon_size(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) {  
221 -  
222 - if(gtk_check_menu_item_get_active(menuitem)) {  
223 - const struct icon_size * size = g_object_get_data(G_OBJECT(menuitem),"icon_size");  
224 - pw3270_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), size->icon_size);  
225 - } 198 + toolbar->menu = NULL;
226 199
227 } 200 }
228 201
229 - static void set_style(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) {  
230 -  
231 - if(gtk_check_menu_item_get_active(menuitem)) {  
232 - struct style * style = g_object_get_data(G_OBJECT(menuitem),"toolbar_style");  
233 - pw3270_toolbar_set_style(GTK_TOOLBAR(toolbar), style->style);  
234 - }  
235 -  
236 - }  
237 -  
238 - static void open_properties(GtkMenuItem G_GNUC_UNUSED(*menuitem), GtkWidget *toolbar) { 202 + static void open_preferences(GtkMenuItem G_GNUC_UNUSED(*menuitem), GtkWidget *toolbar) {
239 203
240 GtkWidget * window = gtk_widget_get_toplevel(toolbar); 204 GtkWidget * window = gtk_widget_get_toplevel(toolbar);
241 - GtkWidget * dialog = pw3270_settings_dialog_new(NULL); 205 + GtkWidget * dialog = pw3270_settings_dialog_new(NULL,FALSE);
242 206
243 gtk_container_add(GTK_CONTAINER(dialog),pw3270_toolbar_settings_new()); 207 gtk_container_add(GTK_CONTAINER(dialog),pw3270_toolbar_settings_new());
244 208
@@ -247,72 +211,36 @@ @@ -247,72 +211,36 @@
247 gtk_window_set_attached_to(GTK_WINDOW(dialog), window); 211 gtk_window_set_attached_to(GTK_WINDOW(dialog), window);
248 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(window)); 212 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(window));
249 213
  214 + gtk_window_set_title(GTK_WINDOW(dialog),_("Setup toolbar"));
  215 +
250 gtk_widget_show_all(dialog); 216 gtk_widget_show_all(dialog);
251 217
252 } 218 }
253 219
254 static void pw3270ToolBar_init(pw3270ToolBar *widget) { 220 static void pw3270ToolBar_init(pw3270ToolBar *widget) {
255 221
256 - widget->popup.menu = gtk_menu_new();  
257 -  
258 - // Size options  
259 - {  
260 - size_t ix;  
261 -  
262 - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("Icon _size") );  
263 - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item);  
264 -  
265 - GtkWidget * submenu = gtk_menu_new();  
266 - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu);  
267 -  
268 - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) {  
269 -  
270 - widget->popup.icon_sizes[ix] = item = gtk_check_menu_item_new_with_mnemonic(gettext(icon_sizes[ix].label));  
271 - gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE);  
272 -  
273 - g_object_set_data(G_OBJECT(item),"icon_size", (gpointer) &icon_sizes[ix]);  
274 - g_signal_connect(item, "toggled", G_CALLBACK(set_icon_size), widget); 222 + size_t ix;
275 223
276 - gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item); 224 + widget->menu = gtk_menu_new();
277 225
278 - }  
279 -  
280 - }  
281 -  
282 - // Style option 226 + // Create menus.
283 { 227 {
284 - size_t ix;  
285 -  
286 - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("S_tyle") );  
287 - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item);  
288 -  
289 - GtkWidget * submenu = gtk_menu_new();  
290 - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu);  
291 -  
292 - for(ix = 0; ix < G_N_ELEMENTS(styles); ix++) {  
293 -  
294 - widget->popup.styles[ix] = item = gtk_check_menu_item_new_with_mnemonic(gettext(styles[ix].label));  
295 - gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE);  
296 -  
297 - g_object_set_data(G_OBJECT(item),"toolbar_style", (gpointer) &styles[ix]);  
298 - g_signal_connect(item, "toggled", G_CALLBACK(set_style), widget);  
299 -  
300 - gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item);  
301 - 228 + for(ix = 0; ix < G_N_ELEMENTS(widget->submenu); ix++) {
  229 + widget->submenu[ix] = pw3270_menu_item_from_model(GTK_WIDGET(widget),toolbar_menus[ix]);
  230 + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),widget->submenu[ix]);
302 } 231 }
303 -  
304 } 232 }
305 233
306 - // Toolbar properties. 234 + // Toolbar preferences.
307 { 235 {
308 - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("_Properties") );  
309 - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item);  
310 - g_signal_connect(item, "activate", G_CALLBACK(open_properties), widget); 236 + GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("_Preferences") );
  237 + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),gtk_separator_menu_item_new());
  238 + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),item);
  239 + g_signal_connect(item, "activate", G_CALLBACK(open_preferences), widget);
311 } 240 }
312 241
313 - // gtk_container_set_border_width(GTK_CONTAINER(widget->popup_menu),6);  
314 - gtk_widget_show_all(widget->popup.menu);  
315 - gtk_menu_attach_to_widget(GTK_MENU(widget->popup.menu),GTK_WIDGET(widget),detacher); 242 + gtk_widget_show_all(widget->menu);
  243 + gtk_menu_attach_to_widget(GTK_MENU(widget->menu),GTK_WIDGET(widget),detacher);
316 244
317 } 245 }
318 246
@@ -332,11 +260,11 @@ @@ -332,11 +260,11 @@
332 260
333 debug("%s button_number=%d",__FUNCTION__,button_number); 261 debug("%s button_number=%d",__FUNCTION__,button_number);
334 262
335 - if(toolbar->popup.menu) { 263 + if(toolbar->menu) {
336 #if GTK_CHECK_VERSION(3,22,0) 264 #if GTK_CHECK_VERSION(3,22,0)
337 - gtk_menu_popup_at_pointer(GTK_MENU(toolbar->popup.menu),NULL); 265 + gtk_menu_popup_at_pointer(GTK_MENU(toolbar->menu),NULL);
338 #else 266 #else
339 - gtk_menu_popup(GTK_MENU(toolbar->popup.menu), NULL, NULL, NULL, NULL, 0, 0); 267 + gtk_menu_popup(GTK_MENU(toolbar->menu), NULL, NULL, NULL, NULL, 0, 0);
340 #endif 268 #endif
341 } 269 }
342 270
@@ -355,22 +283,6 @@ @@ -355,22 +283,6 @@
355 else 283 else
356 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),style); 284 gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),style);
357 285
358 - // Update menu  
359 - pw3270ToolBar * tb = PW3270_TOOLBAR(toolbar);  
360 - if(tb && tb->popup.menu) {  
361 - size_t ix;  
362 - for(ix = 0; ix < G_N_ELEMENTS(styles); ix++) {  
363 -  
364 - gtk_check_menu_item_set_active(  
365 - GTK_CHECK_MENU_ITEM(tb->popup.styles[ix]),  
366 - styles[ix].style == style  
367 - );  
368 - }  
369 - }  
370 -  
371 - // Store value  
372 -// pw3270_settings_set_int("toolbar-style",(int) style);  
373 -  
374 g_object_notify(G_OBJECT(toolbar), "style"); 286 g_object_notify(G_OBJECT(toolbar), "style");
375 287
376 } 288 }
@@ -379,6 +291,46 @@ @@ -379,6 +291,46 @@
379 return PW3270_TOOLBAR(toolbar)->style; 291 return PW3270_TOOLBAR(toolbar)->style;
380 } 292 }
381 293
  294 + gint pw3270_toolbar_get_icon_type(GtkToolbar *toolbar) {
  295 + return PW3270_TOOLBAR(toolbar)->icon_type;
  296 + }
  297 +
  298 + void pw3270_toolbar_set_icon_type(GtkToolbar *toolbar, gint icon_type) {
  299 +
  300 + if(PW3270_TOOLBAR(toolbar)->icon_type == icon_type)
  301 + return;
  302 +
  303 + PW3270_TOOLBAR(toolbar)->icon_type = icon_type;
  304 +
  305 + // Redefine icon types
  306 + GList * children = gtk_container_get_children(GTK_CONTAINER(toolbar));
  307 + GList * item;
  308 +
  309 + for(item = children;item;item = g_list_next(item)) {
  310 +
  311 + if(GTK_IS_TOOL_BUTTON(item->data)) {
  312 +
  313 + g_autofree gchar * icon_name = g_strdup(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(item->data)));
  314 + if(g_str_has_suffix(icon_name,"-symbolic")) {
  315 + icon_name[strlen(icon_name)-9] = 0;
  316 + }
  317 +
  318 + if(icon_type) {
  319 + g_autofree gchar * new_name = g_strconcat(icon_name,"-symbolic",NULL);
  320 + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item->data),new_name);
  321 + } else {
  322 + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item->data),icon_name);
  323 + }
  324 +
  325 + }
  326 +
  327 + }
  328 +
  329 + g_list_free(children);
  330 + g_object_notify(G_OBJECT(toolbar), "icon-type");
  331 +
  332 + }
  333 +
382 void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size) { 334 void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size) {
383 335
384 debug("%s(%d)",__FUNCTION__,(int) icon_size); 336 debug("%s(%d)",__FUNCTION__,(int) icon_size);
@@ -388,19 +340,6 @@ @@ -388,19 +340,6 @@
388 else 340 else
389 gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),icon_size); 341 gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),icon_size);
390 342
391 - // Update menu  
392 - pw3270ToolBar * tb = PW3270_TOOLBAR(toolbar);  
393 - if(tb && tb->popup.menu) {  
394 - size_t ix;  
395 - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) {  
396 -  
397 - gtk_check_menu_item_set_active(  
398 - GTK_CHECK_MENU_ITEM(tb->popup.icon_sizes[ix]),  
399 - icon_sizes[ix].icon_size == icon_size  
400 - );  
401 - }  
402 - }  
403 -  
404 // Store value 343 // Store value
405 g_object_notify(G_OBJECT(toolbar), "icon-size"); 344 g_object_notify(G_OBJECT(toolbar), "icon-size");
406 345
@@ -424,16 +363,46 @@ @@ -424,16 +363,46 @@
424 363
425 void pw3270_toolbar_set_actions(GtkWidget *toolbar, const gchar *action_names) { 364 void pw3270_toolbar_set_actions(GtkWidget *toolbar, const gchar *action_names) {
426 365
427 - gchar ** actions = g_strsplit(action_names,",",-1);  
428 - size_t ix; 366 + size_t ix;
  367 + gint pos = 0;
  368 +
  369 + gchar ** blocks = g_strsplit(action_names,":",-1);
429 370
430 gtk_container_remove_all(GTK_CONTAINER(toolbar)); 371 gtk_container_remove_all(GTK_CONTAINER(toolbar));
431 372
432 - for(ix = 0; actions[ix]; ix++) {  
433 - pw3270_toolbar_insert_action(toolbar,actions[ix],-1); 373 + // Left block
  374 + {
  375 + gchar ** actions = g_strsplit(blocks[0],",",-1);
  376 +
  377 + for(ix = 0; actions[ix]; ix++) {
  378 + pw3270_toolbar_insert_action(toolbar,actions[ix],pos++);
  379 + }
  380 +
  381 + g_strfreev(actions);
  382 +
  383 + }
  384 +
  385 + // Right block
  386 + if(blocks[1]) {
  387 +
  388 + GtkToolItem * item = gtk_separator_tool_item_new();
  389 +
  390 + gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(item),FALSE);
  391 + gtk_tool_item_set_expand(item,TRUE);
  392 + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item,pos++);
  393 +
  394 + gchar ** actions = g_strsplit(blocks[1],",",-1);
  395 +
  396 + for(ix = 0; actions[ix]; ix++) {
  397 + pw3270_toolbar_insert_action(toolbar,actions[ix],pos++);
  398 + }
  399 +
  400 + g_strfreev(actions);
  401 +
434 } 402 }
435 403
436 - g_strfreev(actions); 404 + g_strfreev(blocks);
  405 +
437 406
438 g_object_notify(G_OBJECT(toolbar), "action-names"); 407 g_object_notify(G_OBJECT(toolbar), "action-names");
439 408
@@ -464,71 +433,3 @@ @@ -464,71 +433,3 @@
464 return g_string_free(str,FALSE); 433 return g_string_free(str,FALSE);
465 } 434 }
466 435
467 - GtkTreeModel * pw3270_toolbar_style_model_new() {  
468 -  
469 - size_t ix;  
470 - GtkTreeIter iter;  
471 - GtkListStore * model = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT);  
472 -  
473 - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) {  
474 - gtk_list_store_append(model,&iter);  
475 - gtk_list_store_set( model,  
476 - &iter,  
477 - 0, gettext(styles[ix].label),  
478 - 1, (guint) styles[ix].style,  
479 - -1);  
480 -  
481 - }  
482 -  
483 - return GTK_TREE_MODEL(model);  
484 -  
485 - }  
486 -  
487 - GtkTreeModel * pw3270_toolbar_icon_size_model_new() {  
488 -  
489 - size_t ix;  
490 - GtkTreeIter iter;  
491 - GtkListStore * model = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT);  
492 -  
493 - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) {  
494 - gtk_list_store_append(model,&iter);  
495 - gtk_list_store_set( model,  
496 - &iter,  
497 - 0, gettext(icon_sizes[ix].label),  
498 - 1, (guint) icon_sizes[ix].icon_size,  
499 - -1);  
500 -  
501 - }  
502 -  
503 - return GTK_TREE_MODEL(model);  
504 - }  
505 -  
506 - void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) {  
507 -  
508 - if(gtk_tree_model_get_iter_first(model,iter)) {  
509 -  
510 - do {  
511 -  
512 - GValue gVal = { 0, };  
513 - gtk_tree_model_get_value(model,iter,1,&gVal);  
514 - guint iVal = g_value_get_uint(&gVal);  
515 - g_value_unset(&gVal);  
516 -  
517 - if(iVal == value) {  
518 - return;  
519 - }  
520 -  
521 - } while(gtk_tree_model_iter_next(model,iter));  
522 -  
523 - }  
524 -  
525 - }  
526 -  
527 - guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) {  
528 - GValue gVal = { 0, };  
529 - gtk_tree_model_get_value(model,iter,1,&gVal);  
530 - guint iVal = g_value_get_uint(&gVal);  
531 - g_value_unset(&gVal);  
532 - return iVal;  
533 -}  
534 -  
src/objects/window/actions/sessionproperties.c
@@ -33,6 +33,7 @@ @@ -33,6 +33,7 @@
33 #include <v3270/settings.h> 33 #include <v3270/settings.h>
34 #include <v3270/dialogs.h> 34 #include <v3270/dialogs.h>
35 #include <v3270/colorscheme.h> 35 #include <v3270/colorscheme.h>
  36 + #include <pw3270/application.h>
36 37
37 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); 38 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
38 39
@@ -42,7 +43,8 @@ @@ -42,7 +43,8 @@
42 43
43 action->name = "session.properties"; 44 action->name = "session.properties";
44 action->icon_name = "preferences-other"; 45 action->icon_name = "preferences-other";
45 - action->label = _("Session properties"); 46 + action->label = _("Session preferences");
  47 + action->tooltip = _("Change the preferences for the active session");
46 48
47 return G_ACTION(action); 49 return G_ACTION(action);
48 } 50 }
@@ -52,7 +54,6 @@ @@ -52,7 +54,6 @@
52 size_t ix; 54 size_t ix;
53 55
54 GtkWidget * dialog = v3270_settings_dialog_new(); 56 GtkWidget * dialog = v3270_settings_dialog_new();
55 -  
56 gtk_window_set_title(GTK_WINDOW(dialog), action->label); 57 gtk_window_set_title(GTK_WINDOW(dialog), action->label);
57 58
58 // Add settings pages. 59 // Add settings pages.
@@ -68,6 +69,12 @@ @@ -68,6 +69,12 @@
68 gtk_container_add(GTK_CONTAINER(dialog), elements[ix]); 69 gtk_container_add(GTK_CONTAINER(dialog), elements[ix]);
69 } 70 }
70 71
  72 + pw3270_application_plugin_call(
  73 + g_application_get_default(),
  74 + "pw3270_plugin_set_session_properties",
  75 + dialog
  76 + );
  77 +
71 // Setup dialog box 78 // Setup dialog box
72 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal))); 79 gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal)));
73 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); 80 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
src/objects/window/header-settings.c 0 → 100644
@@ -0,0 +1,174 @@ @@ -0,0 +1,174 @@
  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 "private.h"
  31 + #include <pw3270.h>
  32 + #include <pw3270/actions.h>
  33 + #include <pw3270/settings.h>
  34 + #include <pw3270/application.h>
  35 + #include <v3270/dialogs.h>
  36 +
  37 + static void load(GtkWidget *widget, PW3270SettingsPrivate *settings);
  38 + static void apply(GtkWidget *widget, PW3270SettingsPrivate *settings);
  39 +
  40 +/*--[ Constants ]------------------------------------------------------------------------------------*/
  41 +
  42 + struct _PW3270SettingsPrivate {
  43 + GtkWidget * editor;
  44 + /*
  45 + GtkWidget * views[3];
  46 + GtkTreeModel * model;
  47 + */
  48 + };
  49 +
  50 + /*
  51 + static const struct _views {
  52 + const char * label;
  53 + gint left;
  54 + gint top;
  55 + gint height;
  56 + } views[] = {
  57 + {
  58 + .label = N_("Left"),
  59 + .left = 0,
  60 + .top = 0,
  61 + .height = 4
  62 + },
  63 + {
  64 + .label = N_("Right"),
  65 + .left = 0,
  66 + .top = 6,
  67 + .height = 4
  68 + },
  69 + {
  70 + .label = N_("Available"),
  71 + .left = 2,
  72 + .top = 0,
  73 + .height = 10
  74 + }
  75 + };
  76 + */
  77 +
  78 + /*--[ Implement ]------------------------------------------------------------------------------------*/
  79 +
  80 + GtkWidget * pw3270_header_settings_new() {
  81 +
  82 + size_t ix;
  83 +
  84 + // Create page widget.
  85 + PW3270Settings * settings = pw3270_settings_new();
  86 + settings->label = _("Title bar");
  87 + settings->title = _("Setup title bar");
  88 + settings->apply = apply;
  89 + settings->load = load;
  90 +
  91 + // Create private data.
  92 + PW3270SettingsPrivate * page = settings->settings = g_new0(PW3270SettingsPrivate,1);
  93 +
  94 + page->editor = pw3270_settings_actions_new();
  95 +
  96 + gtk_grid_attach(
  97 + GTK_GRID(settings),
  98 + v3270_dialog_section_new(_("Title bar actions"), _("Change the position of the title bar icons"), page->editor),
  99 + 0,0,4,3
  100 + );
  101 +
  102 +
  103 + gtk_widget_show_all(GTK_WIDGET(settings));
  104 + return GTK_WIDGET(settings);
  105 + }
  106 +
  107 + void load(GtkWidget *widget, PW3270SettingsPrivate *page) {
  108 +
  109 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  110 +
  111 + // Get avaliable actions.
  112 + Pw3270ActionList * action_list = pw3270_action_list_new(GTK_APPLICATION(g_application_get_default()));
  113 +
  114 + // Add standard menus
  115 + {
  116 + static const struct menu {
  117 + const gchar * action_name;
  118 + const gchar * label;
  119 + const gchar * icon_name;
  120 + } menus[] = {
  121 + {
  122 + .action_name = "menu.open-menu",
  123 + .label = N_("Application menu"),
  124 + .icon_name = "open-menu-symbolic"
  125 + }
  126 + };
  127 +
  128 + size_t ix;
  129 +
  130 + for(ix = 0; ix < G_N_ELEMENTS(menus); ix++) {
  131 +
  132 + GError *error = NULL;
  133 +
  134 + GdkPixbuf * pixbuf = gtk_icon_theme_load_icon(
  135 + gtk_icon_theme_get_default(),
  136 + menus[ix].icon_name,
  137 + GTK_ICON_SIZE_MENU,
  138 + GTK_ICON_LOOKUP_GENERIC_FALLBACK,
  139 + &error
  140 + );
  141 +
  142 + if(error) {
  143 + g_warning(error->message);
  144 + g_error_free(error);
  145 + error = NULL;
  146 + }
  147 +
  148 + action_list = pw3270_action_list_append(
  149 + action_list,
  150 + gettext(menus[ix].label),
  151 + pixbuf,
  152 + menus[ix].action_name,
  153 + PW3270_ACTION_VIEW_ALLOW_MOVE
  154 + );
  155 + }
  156 +
  157 + }
  158 +
  159 + // Load settings
  160 + g_autofree gchar * action_names = g_settings_get_string(settings,"header-action-names");
  161 +
  162 + action_list = pw3270_settings_action_set(page->editor, action_list, action_names);
  163 +
  164 + pw3270_action_list_free(action_list);
  165 + }
  166 +
  167 + void apply(GtkWidget *widget, PW3270SettingsPrivate *page) {
  168 +
  169 + g_autofree gchar * action_names = pw3270_settings_action_get(page->editor);
  170 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  171 + g_settings_set_string(settings,"header-action-names",action_names);
  172 +
  173 + }
  174 +
src/objects/window/header.c
@@ -112,9 +112,20 @@ @@ -112,9 +112,20 @@
112 112
113 } 113 }
114 114
  115 + static GAction * get_action_from_name(GtkWidget *widget, const gchar *action_name) {
  116 +
  117 + if(g_str_has_prefix(action_name,"app.")) {
  118 + return g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()),action_name+4);
  119 + }
  120 +
  121 + return g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4);
  122 + }
  123 +
115 GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) { 124 GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) {
116 125
117 GtkWidget * button = NULL; 126 GtkWidget * button = NULL;
  127 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  128 + gboolean symbolic = g_settings_get_int(settings,"header-icon-type") == 1;
118 129
119 if(g_str_has_prefix(action_name,"menu.")) { 130 if(g_str_has_prefix(action_name,"menu.")) {
120 131
@@ -127,45 +138,33 @@ @@ -127,45 +138,33 @@
127 gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); 138 gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5)));
128 gtk_widget_set_visible(button,TRUE); 139 gtk_widget_set_visible(button,TRUE);
129 140
130 - } else if(g_str_has_prefix(action_name,"app.")) {  
131 -  
132 - // It's an application action  
133 -  
134 - } else if(g_str_has_prefix(action_name,"win.")) {  
135 -  
136 - // It's a window action.  
137 - GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4);  
138 -  
139 - if(action) {  
140 141
141 - button = gtk_button_new_from_action(action,GTK_ICON_SIZE_BUTTON);  
142 -  
143 - gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name);  
144 - gtk_widget_set_visible(button,g_action_get_enabled(action));  
145 -  
146 -  
147 - } else { 142 + } else {
148 143
149 - g_warning("Can't find action \"%s\"",action_name+4); 144 + GAction * action = get_action_from_name(widget,action_name);
150 145
  146 + if(!action) {
  147 + g_warning("Can't find action %s",action_name);
  148 + return NULL;
151 } 149 }
152 150
153 - } 151 + button = gtk_button_new_from_action(action,GTK_ICON_SIZE_BUTTON,symbolic);
154 152
155 - if(button) { 153 + gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name);
  154 + gtk_widget_set_visible(button,g_action_get_enabled(action));
156 155
157 - g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget);  
158 - gtk_widget_set_focus_on_click(button,FALSE);  
159 - gtk_widget_set_can_focus(button,FALSE);  
160 - gtk_widget_set_can_default(button,FALSE);  
161 - gtk_widget_set_name(button,action_name);  
162 -  
163 - } else {  
164 -  
165 - g_warning("Can't create button for action \"%s\"",action_name); 156 + g_autofree gchar * tooltip = g_action_get_tooltip(action);
  157 + if(tooltip)
  158 + gtk_widget_set_tooltip_markup(GTK_WIDGET(button),tooltip);
166 159
167 } 160 }
168 161
  162 + g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget);
  163 + gtk_widget_set_focus_on_click(button,FALSE);
  164 + gtk_widget_set_can_focus(button,FALSE);
  165 + gtk_widget_set_can_default(button,FALSE);
  166 + gtk_widget_set_name(button,action_name);
  167 +
169 return button; 168 return button;
170 } 169 }
171 170
src/objects/window/keyfile.c 0 → 100644
@@ -0,0 +1,366 @@ @@ -0,0 +1,366 @@
  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 <config.h>
  31 + #include <glib.h>
  32 + #include <glib/gstdio.h>
  33 + #include <fcntl.h>
  34 + #include <sys/types.h>
  35 + #include <sys/stat.h>
  36 + #include <lib3270.h>
  37 + #include <lib3270/log.h>
  38 + #include <v3270.h>
  39 + #include <v3270/settings.h>
  40 + #include <v3270/keyfile.h>
  41 + #include <v3270/actions.h>
  42 + #include <lib3270/properties.h>
  43 + #include <string.h>
  44 + #include <stdlib.h>
  45 +
  46 + struct _V3270KeyFile
  47 + {
  48 + gboolean changed; ///< @brief Save file?
  49 + GKeyFile * key_file;
  50 + gchar filename[1];
  51 + };
  52 +
  53 + static V3270KeyFile * v3270_get_session_descriptor(GtkWidget *terminal) {
  54 +
  55 + return (V3270KeyFile *) g_object_get_data(G_OBJECT(terminal),"session-descriptor");
  56 +
  57 + }
  58 +
  59 + static void close_keyfile(V3270KeyFile * session) {
  60 +
  61 + if(session->key_file) {
  62 +
  63 + if(session->changed) {
  64 + g_message("Saving file %s",session->filename);
  65 + g_key_file_save_to_file(session->key_file,session->filename,NULL);
  66 + session->changed = FALSE;
  67 + } else {
  68 + g_message("Closing file %s",session->filename);
  69 + }
  70 +
  71 + g_key_file_free(session->key_file);
  72 + session->key_file = NULL;
  73 + }
  74 +
  75 + g_free(session);
  76 + }
  77 +
  78 + V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *filename, GError **error) {
  79 +
  80 + g_return_val_if_fail(GTK_IS_V3270(terminal),FALSE);
  81 + g_return_val_if_fail(*error == NULL,FALSE);
  82 +
  83 + V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename));
  84 + V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor");
  85 +
  86 + // Clone session
  87 + if(old_session) {
  88 + *new_session = *old_session;
  89 + }
  90 +
  91 + strcpy(new_session->filename,filename);
  92 + new_session->key_file = g_key_file_new();
  93 +
  94 + // Load file
  95 + if(g_file_test(new_session->filename,G_FILE_TEST_IS_REGULAR)) {
  96 +
  97 + // Found session file, open it.
  98 + if(!g_key_file_load_from_file(new_session->key_file,new_session->filename,G_KEY_FILE_NONE,error)) {
  99 + g_warning("Can't load \"%s\"",new_session->filename);
  100 + } else {
  101 + g_message("Loading session preferences from %s",new_session->filename);
  102 + }
  103 +
  104 + } else {
  105 +
  106 + // No session file, load the defaults (if available) and save file
  107 + lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL);
  108 +
  109 + if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) {
  110 + if(!g_key_file_load_from_file(new_session->key_file,default_settings,G_KEY_FILE_NONE,error)) {
  111 + g_warning("Can't load \"%s\"",default_settings);
  112 + } else {
  113 + g_message("Loading session preferences from %s",default_settings);
  114 + }
  115 + } else {
  116 +#ifdef DEBUG
  117 + g_message("Can't find default settings file \"%s\"",default_settings);
  118 +#else
  119 + g_warning("Can't find default settings file \"%s\"",default_settings);
  120 +#endif // DEBUG
  121 + }
  122 +
  123 + new_session->changed = TRUE;
  124 +
  125 + }
  126 +
  127 + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile);
  128 + if(new_session->changed) {
  129 + v3270_key_file_save(terminal,error);
  130 + }
  131 +
  132 + if(!*error) {
  133 +
  134 + // Got key file, load it.
  135 + v3270_load_key_file(terminal,new_session->key_file,NULL);
  136 + v3270_accelerator_map_load_key_file(terminal,new_session->key_file,NULL);
  137 +
  138 + if(g_key_file_has_group(new_session->key_file,"environment")) {
  139 +
  140 + // Has environment group, set values.
  141 + gchar **keys = g_key_file_get_keys(new_session->key_file,"environment",NULL,NULL);
  142 +
  143 + if(keys) {
  144 + size_t ix;
  145 + for(ix=0;keys[ix];ix++) {
  146 + g_autofree gchar * value = g_key_file_get_string(new_session->key_file,"environment",keys[ix],NULL);
  147 + if(value) {
  148 +#ifdef _WIN32
  149 + g_autofree gchar * env = g_strconcat(keys[ix],"=",value,NULL);
  150 + putenv(env);
  151 +#else
  152 + if(setenv(keys[ix],value,1)) {
  153 + g_warning("Can't set \"%s\" to \"%s\"",keys[ix],value);
  154 + }
  155 +#endif // _WIN32
  156 + }
  157 + }
  158 +
  159 + g_strfreev(keys);
  160 + }
  161 + }
  162 +
  163 + }
  164 +
  165 + return new_session;
  166 +}
  167 +
  168 +void v3270_key_file_close(GtkWidget *terminal) {
  169 +
  170 + V3270KeyFile *session = g_object_get_data(G_OBJECT(terminal),"session-descriptor");
  171 +
  172 + if(session->key_file) {
  173 +
  174 + if(session->changed) {
  175 + g_message("Saving file %s",session->filename);
  176 + g_key_file_save_to_file(session->key_file,session->filename,NULL);
  177 + session->changed = FALSE;
  178 + } else {
  179 + g_message("Closing file %s",session->filename);
  180 + }
  181 +
  182 + g_key_file_free(session->key_file);
  183 + session->key_file = NULL;
  184 + }
  185 +
  186 + }
  187 +
  188 + GKeyFile * v3270_key_file_get(GtkWidget *terminal) {
  189 + return v3270_get_session_descriptor(terminal)->key_file;
  190 + }
  191 +
  192 + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error) {
  193 +
  194 + if(error && *error)
  195 + return;
  196 +
  197 + V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename));
  198 + V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor");
  199 +
  200 + if(old_session) {
  201 + *new_session = *old_session;
  202 + }
  203 +
  204 + strcpy(new_session->filename,filename);
  205 + new_session->key_file = g_key_file_new();
  206 +
  207 + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile);
  208 + v3270_key_file_save(terminal,error);
  209 +
  210 + }
  211 +
  212 + void v3270_key_file_save(GtkWidget *terminal, GError **error) {
  213 +
  214 + if(error && *error)
  215 + return;
  216 +
  217 + V3270KeyFile *session = v3270_get_session_descriptor(terminal);
  218 +
  219 + session->changed = FALSE;
  220 +
  221 + debug("%s: terminal=%p session=%p key-file=%p)",__FUNCTION__,terminal,session,session->key_file);
  222 +
  223 + v3270_to_key_file(terminal,session->key_file,"terminal");
  224 + v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators");
  225 +
  226 + g_key_file_save_to_file(session->key_file,session->filename,NULL);
  227 +
  228 + }
  229 +
  230 + /// @brief Search standard paths.
  231 + gchar * v3270_key_file_get_default_path(GtkWidget *terminal) {
  232 +
  233 + size_t folder;
  234 + const gchar *folders[] = {
  235 + g_get_user_data_dir(),
  236 + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),
  237 + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)
  238 + };
  239 +
  240 + size_t application;
  241 + const gchar *applications[] = {
  242 + G_STRINGIFY(PRODUCT_NAME),
  243 + PACKAGE_NAME,
  244 + "3270",
  245 + "tn3270"
  246 + };
  247 +
  248 + for(folder = 0; folder < G_N_ELEMENTS(folders); folder++) {
  249 +
  250 + if(!(folders[folder] && g_file_test(folders[folder],G_FILE_TEST_IS_DIR)))
  251 + continue;
  252 +
  253 + for(application = 0; application < G_N_ELEMENTS(applications); application++) {
  254 +
  255 + gchar * appdir = g_build_filename(folder[folders],application[applications],NULL);
  256 +
  257 + debug("Testing for \"%s\"",appdir);
  258 + if(g_file_test(appdir,G_FILE_TEST_IS_DIR)) {
  259 + return appdir;
  260 + }
  261 + g_free(appdir);
  262 +
  263 + }
  264 +
  265 + }
  266 +
  267 + // Not found, try the current session path.
  268 + const gchar * filename = v3270_key_file_get_filename(terminal);
  269 + debug("Testing for \"%s\"",filename);
  270 + if(filename
  271 + && g_file_test(filename,G_FILE_TEST_IS_REGULAR)
  272 + && g_str_has_prefix(filename,g_get_user_data_dir())
  273 + && !g_str_has_prefix(filename,g_get_user_config_dir())
  274 + ) {
  275 + return g_path_get_dirname(filename);
  276 + }
  277 +
  278 + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS));
  279 +
  280 + }
  281 +
  282 + gchar * v3270_keyfile_get_default_filename(void) {
  283 +
  284 + gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL);
  285 +
  286 + g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL);
  287 + if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR))
  288 + g_rename(compatible,filename);
  289 +
  290 + return filename;
  291 + }
  292 +
  293 + gchar * v3270_key_file_build_filename(GtkWidget *terminal) {
  294 +
  295 + g_autofree gchar * defname = v3270_keyfile_get_default_filename();
  296 + const gchar * current = v3270_key_file_get_filename(terminal);
  297 +
  298 + // If is not the default name, return it.
  299 + if(current && *current && g_file_test(current,G_FILE_TEST_IS_REGULAR) && strcmp(defname,current)) {
  300 + return g_strdup(current);
  301 + }
  302 +
  303 + g_autofree gchar * folder = v3270_key_file_get_default_path(terminal);
  304 +
  305 + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal));
  306 + debug("Hostname=\"%s\"",hostname);
  307 +
  308 + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,(hostname ? hostname : "session"),".3270",NULL);
  309 + unsigned int index = 0;
  310 + while(g_file_test(name,G_FILE_TEST_EXISTS)) {
  311 + g_free(name);
  312 + name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",folder,hostname,++index);
  313 + }
  314 +
  315 + debug("%s returns \"%s\"",__FUNCTION__,name);
  316 +
  317 + return name;
  318 + }
  319 +
  320 + const gchar * v3270_key_file_get_filename(GtkWidget *terminal) {
  321 +
  322 + V3270KeyFile *session = v3270_get_session_descriptor(terminal);
  323 +
  324 + if(session && *session->filename)
  325 + return session->filename;
  326 +
  327 + return NULL;
  328 +
  329 + }
  330 +
  331 + void v3270_key_file_set_boolean(GtkWidget *terminal, const gchar *group_name, const gchar *key, gboolean value) {
  332 +
  333 + V3270KeyFile *session = v3270_get_session_descriptor(terminal);
  334 + g_key_file_set_boolean(session->key_file,group_name ? group_name : "terminal",key,value);
  335 + session->changed = TRUE;
  336 +
  337 +}
  338 +
  339 + gboolean v3270_key_file_can_write(GtkWidget *widget) {
  340 +
  341 +#if defined(DEBUG)
  342 +
  343 + return TRUE;
  344 +
  345 +#else
  346 +
  347 + const V3270KeyFile * descriptor = v3270_get_session_descriptor(widget);
  348 +
  349 + if(!(descriptor && *descriptor->filename))
  350 + return FALSE;
  351 +
  352 + if(g_access(descriptor->filename,W_OK))
  353 + return FALSE;
  354 +
  355 +#ifdef _WIN32
  356 + return TRUE;
  357 +#else
  358 + return !g_str_has_prefix(descriptor->filename,g_get_user_config_dir());
  359 +#endif // _WIN32
  360 +
  361 +#endif // DEBUG
  362 +
  363 + }
  364 +
  365 +
  366 +
src/objects/window/page.c
@@ -35,6 +35,7 @@ @@ -35,6 +35,7 @@
35 #include <v3270/dialogs.h> 35 #include <v3270/dialogs.h>
36 #include <v3270/actions.h> 36 #include <v3270/actions.h>
37 #include <v3270/print.h> 37 #include <v3270/print.h>
  38 + #include <v3270/keyfile.h>
38 #include <pw3270.h> 39 #include <pw3270.h>
39 40
40 //---[ Gtk Label with customized popup-menu ]--------------------------------------------------------------------------------------- 41 //---[ Gtk Label with customized popup-menu ]---------------------------------------------------------------------------------------
@@ -302,30 +303,6 @@ @@ -302,30 +303,6 @@
302 // Show dialog. 303 // Show dialog.
303 gtk_widget_show_all(dialog); 304 gtk_widget_show_all(dialog);
304 305
305 -  
306 -  
307 - /*  
308 - GtkWidget * dialog = pw3270_settings_dialog_new(  
309 - _("Rename session"),  
310 - GTK_WINDOW(gtk_widget_get_toplevel(terminal))  
311 - );  
312 -  
313 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
314 - gtk_container_set_border_width(GTK_CONTAINER(content),18);  
315 -  
316 -  
317 - gtk_widget_show_all(dialog);  
318 -  
319 - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_APPLY) {  
320 -  
321 - v3270_set_session_name(terminal, gtk_entry_get_text(GTK_ENTRY(entry)));  
322 - g_signal_emit_by_name(terminal,"save-settings");  
323 -  
324 - }  
325 -  
326 - gtk_widget_destroy(dialog);  
327 - */  
328 -  
329 } 306 }
330 307
331 static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) { 308 static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) {
@@ -387,7 +364,7 @@ @@ -387,7 +364,7 @@
387 { 364 {
388 .label = N_("_Rename session"), 365 .label = N_("_Rename session"),
389 .callback = G_CALLBACK(rename_session), 366 .callback = G_CALLBACK(rename_session),
390 - .check_permission = v3270_allow_custom_settings 367 + .check_permission = v3270_key_file_can_write
391 }, 368 },
392 369
393 { 370 {
src/objects/window/private.h
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void); 90 G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void);
91 G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void); 91 G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void);
92 G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void); 92 G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void);
93 - G_GNUC_INTERNAL GAction * pw3270_action_save_session_as_new(void); 93 + G_GNUC_INTERNAL GAction * pw3270_action_save_session_preferences_new(void);
94 G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void); 94 G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void);
95 95
96 GAction * pw3270_action_session_properties_new(void); 96 GAction * pw3270_action_session_properties_new(void);
src/objects/window/terminal.c
@@ -40,82 +40,24 @@ @@ -40,82 +40,24 @@
40 #include <lib3270/toggle.h> 40 #include <lib3270/toggle.h>
41 #include <v3270/settings.h> 41 #include <v3270/settings.h>
42 #include <v3270/actions.h> 42 #include <v3270/actions.h>
  43 + #include <v3270/keyfile.h>
43 #include <v3270/print.h> 44 #include <v3270/print.h>
  45 + #include <lib3270/os.h>
44 46
45 - struct SessionDescriptor  
46 - {  
47 - gboolean changed; ///< @brief Save file?  
48 - GKeyFile * key_file;  
49 - gchar filename[1];  
50 - };  
51 -  
52 - static void destroy(GtkWidget G_GNUC_UNUSED(*terminal), struct SessionDescriptor * session) {  
53 -  
54 - if(session->changed) {  
55 -  
56 - session->changed = FALSE;  
57 -  
58 - GError * error = NULL;  
59 - g_key_file_save_to_file(session->key_file,session->filename,&error);  
60 -  
61 - if(error) {  
62 -  
63 - g_warning("Can't save \"%s\": %s",session->filename,error->message);  
64 - g_error_free(error);  
65 -  
66 - } else {  
67 -  
68 - g_message("Session was saved to %s",session->filename);  
69 -  
70 - }  
71 -  
72 - }  
73 - 47 + static void destroy(GtkWidget *terminal, gpointer G_GNUC_UNUSED(dunno)) {
  48 + v3270_key_file_close(terminal);
74 } 49 }
75 50
76 - static void save_settings(GtkWidget *terminal, struct SessionDescriptor * session) {  
77 -  
78 - session->changed = FALSE;  
79 -  
80 - debug("%s(%p,%p)",__FUNCTION__,terminal,session);  
81 -  
82 - v3270_to_key_file(terminal,session->key_file,"terminal");  
83 - v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators");  
84 -  
85 - /*  
86 - GtkWidget * window = gtk_widget_get_toplevel(terminal);  
87 -  
88 - if(PW3270_IS_APPLICATION_WINDOW(window) && pw3270_application_window_get_active_terminal(window) == terminal) {  
89 -  
90 - debug("%s on active terminal, saving window settings",__FUNCTION__);  
91 - GList * keypad = pw3270_application_window_get_keypads(window);  
92 -  
93 - while(keypad) {  
94 -  
95 - g_key_file_set_boolean(  
96 - session->key_file,  
97 - "keypads",  
98 - gtk_widget_get_name(GTK_WIDGET(keypad->data)),  
99 - gtk_widget_get_visible(GTK_WIDGET(keypad->data))  
100 - );  
101 - keypad = g_list_next(keypad);  
102 -  
103 - }  
104 -  
105 - }  
106 - */  
107 -  
108 - g_key_file_save_to_file(session->key_file,session->filename,NULL);  
109 - 51 + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE_ID G_GNUC_UNUSED(toggle_id), gboolean toggle_state, const gchar *toggle_name, gpointer G_GNUC_UNUSED(dunno)) {
  52 + debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF");
  53 + v3270_key_file_set_boolean(widget,"terminal",toggle_name,toggle_state);
110 } 54 }
111 55
112 - static void toggle_changed(G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED LIB3270_TOGGLE_ID toggle_id, gboolean toggle_state, const gchar *toggle_name, struct SessionDescriptor * session) {  
113 - debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF");  
114 - g_key_file_set_boolean(session->key_file,"terminal",toggle_name,toggle_state);  
115 - session->changed = TRUE; 56 + static void save_settings(GtkWidget *terminal, gpointer G_GNUC_UNUSED(dunno)) {
  57 + v3270_key_file_save(terminal,NULL);
116 } 58 }
117 59
118 - static void print_done(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, GtkPrintOperationResult result, struct SessionDescriptor * session) { 60 + static void print_done(GtkWidget *widget, GtkPrintOperation *operation, GtkPrintOperationResult result, gpointer G_GNUC_UNUSED(dunno)) {
119 debug("%s(%u)",__FUNCTION__,(unsigned int) result); 61 debug("%s(%u)",__FUNCTION__,(unsigned int) result);
120 62
121 if(result != GTK_PRINT_OPERATION_RESULT_APPLY) 63 if(result != GTK_PRINT_OPERATION_RESULT_APPLY)
@@ -123,250 +65,113 @@ @@ -123,250 +65,113 @@
123 65
124 debug("%s: Saving print settings",__FUNCTION__); 66 debug("%s: Saving print settings",__FUNCTION__);
125 67
126 - v3270_print_operation_to_key_file(operation,session->key_file); 68 + v3270_print_operation_to_key_file(operation,v3270_key_file_get(widget));
  69 + v3270_emit_save_settings(widget,NULL);
127 70
128 - g_key_file_save_to_file(session->key_file,session->filename,NULL);  
129 - session->changed = FALSE;  
130 } 71 }
131 72
132 - static void print_setup(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, struct SessionDescriptor * session) { 73 + static void print_setup(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, gpointer G_GNUC_UNUSED(dunno) ) {
133 74
134 debug("%s(%p)",__FUNCTION__,operation); 75 debug("%s(%p)",__FUNCTION__,operation);
135 - v3270_print_operation_load_key_file(operation,session->key_file); 76 + v3270_print_operation_load_key_file(operation,v3270_key_file_get(widget));
136 77
137 } 78 }
138 79
139 - static void close_settings(struct SessionDescriptor * session) { 80 + static GtkResponseType load_popup_response(GtkWidget *widget, const gchar *popup_name, gpointer G_GNUC_UNUSED(dunno)) {
140 81
141 - if(session->key_file) { 82 + GKeyFile * key_file = v3270_key_file_get(widget);
142 83
143 - if(session->changed) {  
144 - g_message("Saving file %s",session->filename);  
145 - g_key_file_save_to_file(session->key_file,session->filename,NULL);  
146 - session->changed = FALSE;  
147 - } else {  
148 - g_message("Closing file %s",session->filename);  
149 - } 84 + if(key_file && g_key_file_has_key(key_file,"dialogs",popup_name,NULL))
  85 + return (GtkResponseType) g_key_file_get_integer(key_file,"dialogs",popup_name,NULL);
150 86
151 - g_key_file_free(session->key_file);  
152 - session->key_file = NULL;  
153 - }  
154 -  
155 - g_free(session);  
156 - }  
157 -  
158 - const gchar * v3270_get_session_filename(GtkWidget *widget) {  
159 -  
160 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
161 -  
162 - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor");  
163 -  
164 - if(descriptor)  
165 - return descriptor->filename;  
166 -  
167 - return NULL;  
168 - }  
169 -  
170 - void v3270_set_session_filename(GtkWidget *terminal, const gchar *filename) {  
171 -  
172 - struct SessionDescriptor * old_session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor");  
173 - struct SessionDescriptor * new_session = (struct SessionDescriptor *) g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename));  
174 -  
175 - if(old_session) {  
176 - memcpy(new_session,old_session,sizeof(struct SessionDescriptor));  
177 - }  
178 -  
179 - strcpy(new_session->filename,filename);  
180 - new_session->key_file = g_key_file_new();  
181 -  
182 - v3270_to_key_file(terminal,new_session->key_file,NULL);  
183 - v3270_accelerator_map_to_key_file(terminal,new_session->key_file,NULL);  
184 -  
185 - GError *error = NULL;  
186 - g_key_file_save_to_file(new_session->key_file,new_session->filename,&error);  
187 -  
188 - if(error) {  
189 -  
190 - g_message("Can't save file \"%s\": %s",new_session->filename,error->message);  
191 -  
192 - GtkWidget * dialog = gtk_message_dialog_new_with_markup(  
193 - GTK_WINDOW(gtk_widget_get_toplevel(terminal)),  
194 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
195 - GTK_MESSAGE_ERROR,  
196 - GTK_BUTTONS_CANCEL,  
197 - _("Can't save file \"%s\""),new_session->filename  
198 - );  
199 -  
200 - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message);  
201 -  
202 - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't save session file"));  
203 -  
204 - gtk_widget_show_all(dialog);  
205 -  
206 - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);  
207 - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); 87 +#ifdef _WIN32
  88 + {
  89 + // Windows - Check predefined responses on system registry.
  90 + lib3270_auto_cleanup(HKEY) hKey;
208 91
209 - g_error_free(error);  
210 - g_key_file_free(new_session->key_file);  
211 - g_free(new_session); 92 + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,G_STRINGIFY(PRODUCT_NAME)"\\dialogs",0,KEY_READ,&hKey) == ERROR_SUCCESS) {
212 93
213 - } else { 94 + DWORD val = 0;
  95 + DWORD cbData = sizeof(DWORD);
214 96
215 - new_session->changed = FALSE;  
216 - g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_settings); 97 + if(RegQueryValueEx(hKey, popup_name, NULL, NULL, (LPBYTE) &val, &cbData) == ERROR_SUCCESS) {
  98 + return (GtkResponseType) val;
  99 + }
217 100
  101 + }
218 } 102 }
  103 +#endif // _WIN32
219 104
220 -  
221 - }  
222 -  
223 - GKeyFile * v3270_get_session_keyfile(GtkWidget *widget) {  
224 -  
225 - g_return_val_if_fail(GTK_IS_V3270(widget),NULL);  
226 -  
227 - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor");  
228 -  
229 - if(descriptor)  
230 - return descriptor->key_file;  
231 -  
232 - return NULL; 105 + return key_file ? GTK_RESPONSE_NONE : 0;
233 } 106 }
234 107
235 - static GtkResponseType load_popup_response(v3270 G_GNUC_UNUSED(*widget), const gchar *popup_name, struct SessionDescriptor * session) { 108 + static gboolean save_popup_response(GtkWidget *widget, const gchar *popup_name, GtkResponseType response, gpointer G_GNUC_UNUSED(dunno)) {
236 109
237 - if(!session->key_file)  
238 - return 0; 110 + GKeyFile * key_file = v3270_key_file_get(widget);
239 111
240 - if(g_key_file_has_key(session->key_file,"dialogs",popup_name,NULL))  
241 - return (GtkResponseType) g_key_file_get_integer(session->key_file,"dialogs",popup_name,NULL);  
242 -  
243 - return GTK_RESPONSE_NONE;  
244 - } 112 + debug("%s(%s)",__FUNCTION__,popup_name);
245 113
246 - static gboolean save_popup_response(GtkWidget *widget, const gchar *popup_name, GtkResponseType response, struct SessionDescriptor * session) {  
247 - debug("%s(%s)",__FUNCTION__,popup_name);  
248 -  
249 - if(!session->key_file)  
250 - return FALSE; 114 + if(!key_file)
  115 + return FALSE;
251 116
252 - g_key_file_set_integer(session->key_file,"dialogs",popup_name,(gint) response);  
253 - v3270_emit_save_settings(widget,NULL); 117 + g_key_file_set_integer(key_file,"dialogs",popup_name,(gint) response);
  118 + v3270_emit_save_settings(widget,NULL);
254 119
255 - return TRUE; 120 + return TRUE;
256 } 121 }
257 122
258 GtkWidget * pw3270_terminal_new(const gchar *session_file) { 123 GtkWidget * pw3270_terminal_new(const gchar *session_file) {
259 124
260 - GtkWidget * terminal = v3270_new(); 125 + GtkWidget * terminal = v3270_new();
  126 + GError * error = NULL;
261 127
262 gtk_widget_show_all(terminal); 128 gtk_widget_show_all(terminal);
263 129
264 - struct SessionDescriptor * descriptor = NULL;  
265 -  
266 if(session_file) { 130 if(session_file) {
267 131
268 // Use the supplied session file 132 // Use the supplied session file
269 - descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(session_file));  
270 - strcpy(descriptor->filename,session_file); 133 + v3270_key_file_open(terminal,session_file,&error);
271 134
272 } else { 135 } else {
273 136
274 // No session file, use the default one. 137 // No session file, use the default one.
275 - g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL);  
276 - g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL);  
277 -  
278 - if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR))  
279 - {  
280 - g_rename(compatible,filename);  
281 - }  
282 -  
283 - descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename));  
284 - strcpy(descriptor->filename,filename); 138 + gchar * filename = v3270_keyfile_get_default_filename();
  139 + v3270_key_file_open(terminal,filename,&error);
  140 + g_free(filename);
285 141
286 } 142 }
287 143
288 - // Setup session file;  
289 - GError *error = NULL;  
290 - g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",descriptor,(GDestroyNotify) close_settings);  
291 -  
292 - descriptor->key_file = g_key_file_new(); 144 + // Setup signals.
  145 + g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),NULL);
  146 + g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),NULL);
  147 + g_signal_connect(G_OBJECT(terminal),"print-done",G_CALLBACK(print_done),NULL);
  148 + g_signal_connect(G_OBJECT(terminal),"print-setup",G_CALLBACK(print_setup),NULL);
  149 + g_signal_connect(G_OBJECT(terminal),"destroy", G_CALLBACK(destroy),NULL);
  150 + g_signal_connect(G_OBJECT(terminal),"load-popup-response",G_CALLBACK(load_popup_response),NULL);
  151 + g_signal_connect(G_OBJECT(terminal),"save-popup-response",G_CALLBACK(save_popup_response),NULL);
293 152
294 - if(g_file_test(descriptor->filename,G_FILE_TEST_IS_REGULAR)) { 153 + if(error) {
295 154
296 - // Found session file, open it.  
297 - if(!g_key_file_load_from_file(descriptor->key_file,descriptor->filename,G_KEY_FILE_NONE,&error)) {  
298 - g_warning("Can't load \"%s\"",descriptor->filename);  
299 - } else {  
300 - g_message("Loading session properties from %s",descriptor->filename);  
301 - } 155 + GtkWidget * dialog = gtk_message_dialog_new_with_markup(
  156 + GTK_WINDOW(gtk_widget_get_toplevel(terminal)),
  157 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  158 + GTK_MESSAGE_ERROR,
  159 + GTK_BUTTONS_CANCEL,
  160 + _("Can't use \"%s\""),session_file
  161 + );
302 162
303 - } else { 163 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message);
304 164
305 - // No session file, load the defaults (if available).  
306 - lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL);  
307 - if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) {  
308 - if(!g_key_file_load_from_file(descriptor->key_file,default_settings,G_KEY_FILE_NONE,&error)) {  
309 - g_warning("Can't load \"%s\"",default_settings);  
310 - } else {  
311 - g_message("Loading session properties from %s",default_settings);  
312 - }  
313 - } else {  
314 -#ifdef DEBUG  
315 - g_message("Can't find default settings file \"%s\"",default_settings);  
316 -#else  
317 - g_warning("Can't find default settings file \"%s\"",default_settings);  
318 -#endif // DEBUG  
319 - } 165 + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't load session file"));
320 166
321 - } 167 + gtk_widget_show_all(dialog);
322 168
323 - if(error) { 169 + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);
  170 + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL);
324 171
325 - g_warning(error->message);  
326 g_error_free(error); 172 g_error_free(error);
327 - error = NULL;  
328 -  
329 - } else {  
330 -  
331 - // Got key file, load it.  
332 - v3270_load_key_file(terminal,descriptor->key_file,NULL);  
333 - v3270_accelerator_map_load_key_file(terminal,descriptor->key_file,NULL);  
334 -  
335 - if(g_key_file_has_group(descriptor->key_file,"environment")) {  
336 -  
337 - // Has environment group, set values.  
338 - gchar **keys = g_key_file_get_keys(descriptor->key_file,"environment",NULL,NULL);  
339 -  
340 - if(keys) {  
341 - size_t ix;  
342 - for(ix=0;keys[ix];ix++) {  
343 - g_autofree gchar * value = g_key_file_get_string(descriptor->key_file,"environment",keys[ix],NULL);  
344 - if(value) {  
345 -#ifdef _WIN32  
346 - g_autofree gchar * env = g_strconcat(keys[ix],"=",value,NULL);  
347 - putenv(env);  
348 -#else  
349 - if(setenv(keys[ix],value,1)) {  
350 - g_warning("Can't set \"%s\" to \"%s\"",keys[ix],value);  
351 - }  
352 -#endif // _WIN32  
353 - }  
354 - }  
355 -  
356 - g_strfreev(keys);  
357 - }  
358 - }  
359 } 173 }
360 174
361 - // Setup signals.  
362 - g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),descriptor);  
363 - g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),descriptor);  
364 - g_signal_connect(G_OBJECT(terminal),"print-done",G_CALLBACK(print_done),descriptor);  
365 - g_signal_connect(G_OBJECT(terminal),"print-setup",G_CALLBACK(print_setup),descriptor);  
366 - g_signal_connect(G_OBJECT(terminal),"destroy", G_CALLBACK(destroy),descriptor);  
367 - g_signal_connect(G_OBJECT(terminal),"load-popup-response",G_CALLBACK(load_popup_response),descriptor);  
368 - g_signal_connect(G_OBJECT(terminal),"save-popup-response",G_CALLBACK(save_popup_response),descriptor);  
369 -  
370 return terminal; 175 return terminal;
371 } 176 }
372 177
@@ -382,30 +187,4 @@ @@ -382,30 +187,4 @@
382 187
383 } 188 }
384 189
385 - gboolean v3270_allow_custom_settings(GtkWidget *widget) {  
386 -  
387 -#if defined(DEBUG)  
388 -  
389 - return TRUE;  
390 -  
391 -#else  
392 -  
393 - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor");  
394 -  
395 - if(!(descriptor && *descriptor->filename))  
396 - return FALSE;  
397 -  
398 - if(g_access(descriptor->filename,W_OK))  
399 - return FALSE;  
400 -  
401 -#ifdef _WIN32  
402 - return TRUE;  
403 -#else  
404 - return !g_str_has_prefix(descriptor->filename,g_get_user_config_dir());  
405 -#endif // _WIN32  
406 -  
407 -#endif // DEBUG  
408 -  
409 - }  
410 -  
411 190
src/objects/window/window.c
@@ -34,6 +34,7 @@ @@ -34,6 +34,7 @@
34 #include <pw3270/actions.h> 34 #include <pw3270/actions.h>
35 #include <pw3270/keypad.h> 35 #include <pw3270/keypad.h>
36 #include <v3270/settings.h> 36 #include <v3270/settings.h>
  37 + #include <v3270/keyfile.h>
37 38
38 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); 39 static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
39 static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); 40 static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
@@ -142,6 +143,26 @@ @@ -142,6 +143,26 @@
142 143
143 static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) { 144 static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) {
144 145
  146 +#ifdef DEBUG
  147 + {
  148 + gtk_icon_theme_append_search_path(
  149 + gtk_icon_theme_get_default(),
  150 + "./icons"
  151 + );
  152 + }
  153 +#else
  154 + {
  155 + lib3270_autoptr(char) path = lib3270_build_data_filename("icons",NULL);
  156 + if(g_file_test(path,G_FILE_TEST_IS_DIR)) {
  157 + gtk_icon_theme_append_search_path(
  158 + gtk_icon_theme_get_default(),
  159 + path
  160 + );
  161 + }
  162 + }
  163 +#endif // DEBUG
  164 +
  165 +
145 { 166 {
146 GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass); 167 GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass);
147 widget->destroy = destroy; 168 widget->destroy = destroy;
@@ -191,8 +212,8 @@ @@ -191,8 +212,8 @@
191 if(!terminal) 212 if(!terminal)
192 return; 213 return;
193 214
194 - GKeyFile * keyfile = v3270_get_session_keyfile(terminal);  
195 - if(!terminal) 215 + GKeyFile * keyfile = v3270_key_file_get(terminal);
  216 + if(!keyfile)
196 return; 217 return;
197 218
198 g_key_file_set_boolean( 219 g_key_file_set_boolean(
@@ -251,6 +272,16 @@ @@ -251,6 +272,16 @@
251 272
252 static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { 273 static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) {
253 274
  275 + // Get settings
  276 + g_autoptr(GSettings) settings = pw3270_application_window_settings_new();
  277 +
  278 + // Override defaults
  279 + {
  280 + // https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/gtksettings.c
  281 + GtkSettings *settings = gtk_widget_get_settings(GTK_WIDGET (widget));
  282 + g_object_set(settings,"gtk-menu-bar-accel","",NULL);
  283 + }
  284 +
254 // Setup defaults 285 // Setup defaults
255 widget->state.width = 800; 286 widget->state.width = 800;
256 widget->state.height = 500; 287 widget->state.height = 500;
@@ -282,17 +313,86 @@ @@ -282,17 +313,86 @@
282 gtk_notebook_set_action_widget(widget->notebook,new_tab,GTK_PACK_START); 313 gtk_notebook_set_action_widget(widget->notebook,new_tab,GTK_PACK_START);
283 } 314 }
284 315
285 - widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new());  
286 - gtk_box_pack_start(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); 316 + // Create boxes
  317 + GtkBox * hBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0));
  318 + GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0));
  319 +
  320 + gtk_widget_show(GTK_WIDGET(hBox));
  321 + gtk_widget_show(GTK_WIDGET(vBox));
  322 +
  323 + // Create toolbar
  324 + {
  325 + widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new());
  326 +
  327 + g_action_map_add_action(
  328 + G_ACTION_MAP(widget),
  329 + G_ACTION(g_property_action_new("toolbar", widget->toolbar, "visible"))
  330 + );
  331 +
  332 + switch(g_settings_get_int(settings,"toolbar-position")) {
  333 + case 1:
  334 + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_HORIZONTAL);
  335 + gtk_box_pack_end(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0);
  336 + break;
  337 +
  338 + case 2:
  339 + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_VERTICAL);
  340 + gtk_box_pack_end(hBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0);
  341 + break;
  342 +
  343 + case 3:
  344 + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_VERTICAL);
  345 + gtk_box_pack_start(hBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0);
  346 + break;
  347 +
  348 + default:
  349 + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_HORIZONTAL);
  350 + gtk_box_pack_start(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0);
  351 + break;
  352 +
  353 + }
  354 +
  355 + g_settings_bind(
  356 + settings,
  357 + "toolbar-visible",
  358 + widget->toolbar,
  359 + "visible",
  360 + G_SETTINGS_BIND_DEFAULT
  361 + );
  362 +
  363 + g_settings_bind(
  364 + settings,
  365 + "toolbar-icon-type",
  366 + widget->toolbar,
  367 + "icon-type",
  368 + G_SETTINGS_BIND_DEFAULT
  369 + );
  370 +
  371 + g_settings_bind(
  372 + settings,
  373 + "toolbar-style",
  374 + widget->toolbar,
  375 + "style",
  376 + G_SETTINGS_BIND_DEFAULT
  377 + );
  378 +
  379 + g_settings_bind(
  380 + settings,
  381 + "toolbar-icon-size",
  382 + widget->toolbar,
  383 + "icon-size",
  384 + G_SETTINGS_BIND_DEFAULT
  385 + );
  386 +
  387 + }
  388 +
  389 + gtk_box_pack_start(container,GTK_WIDGET(hBox),TRUE,TRUE,0);
287 390
288 // 391 //
289 - // Do we have keypads? 392 + // Create and pack keypads?
290 // 393 //
291 - GList * keypads = pw3270_application_get_keypad_models(g_application_get_default());  
292 - if(keypads) {  
293 -  
294 - GtkBox * hBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0));  
295 - GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); 394 + {
  395 + GList * keypads = pw3270_application_get_keypad_models(g_application_get_default());
296 GList * keypad; 396 GList * keypad;
297 397
298 // Add top Keypads 398 // Add top Keypads
@@ -349,15 +449,6 @@ @@ -349,15 +449,6 @@
349 } 449 }
350 } 450 }
351 451
352 - // Add it to the container  
353 - gtk_widget_show(GTK_WIDGET(hBox));  
354 - gtk_widget_show(GTK_WIDGET(vBox));  
355 - gtk_box_pack_start(container,GTK_WIDGET(hBox),TRUE,TRUE,0);  
356 -  
357 - } else {  
358 -  
359 - gtk_box_pack_start(container,GTK_WIDGET(widget->notebook),TRUE,TRUE,0);  
360 -  
361 } 452 }
362 453
363 gtk_widget_show_all(GTK_WIDGET(widget->notebook)); 454 gtk_widget_show_all(GTK_WIDGET(widget->notebook));
@@ -381,7 +472,7 @@ @@ -381,7 +472,7 @@
381 pw3270_action_session_properties_new(), 472 pw3270_action_session_properties_new(),
382 pw3270_set_color_action_new(), 473 pw3270_set_color_action_new(),
383 474
384 - pw3270_action_save_session_as_new(), 475 + pw3270_action_save_session_preferences_new(),
385 476
386 pw3270_file_transfer_action_new(), 477 pw3270_file_transfer_action_new(),
387 478
@@ -409,22 +500,21 @@ @@ -409,22 +500,21 @@
409 } 500 }
410 501
411 // 502 //
412 - // Setup toolbar 503 + // Bind properties
413 // 504 //
  505 + g_action_map_add_action(
  506 + G_ACTION_MAP(widget),
  507 + G_ACTION(g_property_action_new("menubar", widget, "show-menubar"))
  508 + );
414 509
415 - {  
416 -  
417 - g_action_map_add_action(  
418 - G_ACTION_MAP(widget),  
419 - G_ACTION(g_property_action_new("toolbar", widget->toolbar, "visible"))  
420 - );  
421 -  
422 - g_action_map_add_action(  
423 - G_ACTION_MAP(widget),  
424 - G_ACTION(g_property_action_new("menubar", widget, "show-menubar"))  
425 - ); 510 + g_settings_bind(
  511 + settings,
  512 + "toolbar-action-names",
  513 + widget->toolbar,
  514 + "action-names",
  515 + G_SETTINGS_BIND_DEFAULT
  516 + );
426 517
427 - }  
428 518
429 } 519 }
430 520
@@ -567,38 +657,6 @@ @@ -567,38 +657,6 @@
567 G_SETTINGS_BIND_DEFAULT 657 G_SETTINGS_BIND_DEFAULT
568 ); 658 );
569 659
570 - g_settings_bind(  
571 - settings,  
572 - "toolbar-visible",  
573 - window->toolbar,  
574 - "visible",  
575 - G_SETTINGS_BIND_DEFAULT  
576 - );  
577 -  
578 - g_settings_bind(  
579 - settings,  
580 - "toolbar-action-names",  
581 - window->toolbar,  
582 - "action-names",  
583 - G_SETTINGS_BIND_DEFAULT  
584 - );  
585 -  
586 - g_settings_bind(  
587 - settings,  
588 - "toolbar-style",  
589 - window->toolbar,  
590 - "style",  
591 - G_SETTINGS_BIND_DEFAULT  
592 - );  
593 -  
594 - g_settings_bind(  
595 - settings,  
596 - "toolbar-icon-size",  
597 - window->toolbar,  
598 - "icon-size",  
599 - G_SETTINGS_BIND_DEFAULT  
600 - );  
601 -  
602 } 660 }
603 661
604 // Setup default position and size 662 // Setup default position and size
@@ -704,7 +762,7 @@ @@ -704,7 +762,7 @@
704 // Setup keypads 762 // Setup keypads
705 if(window->keypads) { 763 if(window->keypads) {
706 764
707 - GKeyFile * keyfile = v3270_get_session_keyfile(terminal); 765 + GKeyFile * keyfile = v3270_key_file_get(terminal);
708 766
709 if(keyfile) { 767 if(keyfile) {
710 768
src/objects/windows/savedesktopicon.c
@@ -1,176 +0,0 @@ @@ -1,176 +0,0 @@
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 - /**  
31 - * @brief Implement Windows version of the save desktop icon action.  
32 - *  
33 - * References:  
34 - *  
35 - * <https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32>  
36 - * <https://docs.microsoft.com/pt-br/windows/win32/shell/links?redirectedfrom=MSDN>  
37 - *  
38 - */  
39 -  
40 - #include <winsock2.h>  
41 - #include <windows.h>  
42 -  
43 - #include <v3270.h>  
44 - #include <pw3270.h>  
45 - #include <pw3270/application.h>  
46 - #include <v3270/actions.h>  
47 - #include <lib3270.h>  
48 - #include <lib3270/log.h>  
49 -  
50 - static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);  
51 - static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);  
52 -  
53 - static const struct _entry {  
54 -  
55 - const gchar * label;  
56 - const gchar * tooltip;  
57 - gint width;  
58 -  
59 - } entries[] = {  
60 -  
61 - {  
62 - .label = N_("File name"),  
63 - .width = 40,  
64 - },  
65 -  
66 - {  
67 - .label = N_("Launcher name"),  
68 - .width = 20,  
69 - }  
70 -  
71 - };  
72 -  
73 - GAction * pw3270_action_save_desktop_icon_new(void) {  
74 -  
75 - V3270SimpleAction * action = v3270_dialog_action_new(factory);  
76 -  
77 - action->name = "save.launcher";  
78 - action->label = _("Save desktop icon");  
79 - action->tooltip = _("Create a desktop icon for the current session");  
80 -  
81 - return G_ACTION(action);  
82 -  
83 - }  
84 -  
85 - GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {  
86 -  
87 - size_t ix;  
88 -  
89 - gboolean use_header;  
90 - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);  
91 -  
92 - GtkWidget * dialog =  
93 - GTK_WIDGET(g_object_new(  
94 - GTK_TYPE_DIALOG,  
95 - "use-header-bar", (use_header ? 1 : 0),  
96 - NULL  
97 - ));  
98 -  
99 - gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);  
100 - gtk_window_set_title(GTK_WINDOW(dialog),action->label);  
101 -  
102 - gtk_dialog_add_buttons(  
103 - GTK_DIALOG(dialog),  
104 - _("_Cancel"), GTK_RESPONSE_CANCEL,  
105 - _("_Save"), GTK_RESPONSE_APPLY,  
106 - NULL  
107 - );  
108 -  
109 - g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);  
110 -  
111 - // Create entry fields  
112 - GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));  
113 - g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);  
114 - debug("Dialog=%p inputs=%p",dialog,inputs);  
115 -  
116 - GtkGrid * grid = GTK_GRID(gtk_grid_new());  
117 -  
118 - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);  
119 -  
120 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
121 - gtk_container_set_border_width(GTK_CONTAINER(grid),18);  
122 - gtk_grid_set_row_spacing(GTK_GRID(grid),6);  
123 - gtk_grid_set_column_spacing(GTK_GRID(grid),12);  
124 -  
125 - // https://developer.gnome.org/hig/stable/visual-layout.html.en  
126 - // gtk_box_set_spacing(GTK_BOX(content_area),18);  
127 -  
128 - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {  
129 -  
130 - GtkWidget * label = gtk_label_new(gettext(entries[ix].label));  
131 - gtk_label_set_xalign(GTK_LABEL(label),1);  
132 - gtk_grid_attach(grid,label,0,ix,1,1);  
133 -  
134 - inputs[ix] = gtk_entry_new();  
135 - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]);  
136 -  
137 - gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);  
138 -// gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars);  
139 - gtk_widget_set_hexpand(inputs[ix],FALSE);  
140 - gtk_widget_set_vexpand(inputs[ix],FALSE);  
141 -  
142 - gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);  
143 -  
144 - }  
145 -  
146 - /*  
147 -  
148 - gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename);  
149 -  
150 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
151 - gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME));  
152 -  
153 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
154 - gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME));  
155 -  
156 - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
157 - gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal));  
158 - gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK);  
159 -  
160 - */  
161 -  
162 - gtk_widget_show_all(GTK_WIDGET(grid));  
163 - return dialog;  
164 - }  
165 -  
166 - void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {  
167 -  
168 - debug("%s(%d)",__FUNCTION__,response_id);  
169 -  
170 - if(response_id == GTK_RESPONSE_APPLY) {  
171 -  
172 - }  
173 -  
174 - gtk_widget_destroy(dialog);  
175 -  
176 -}  
ui/application.xml
@@ -155,12 +155,12 @@ @@ -155,12 +155,12 @@
155 <section> 155 <section>
156 156
157 <item> 157 <item>
158 - <attribute name="label" translatable="yes">Desktop icon</attribute> 158 + <attribute name="label" translatable="yes">Shortcut for this session</attribute>
159 <attribute name="action">win.save.launcher</attribute> 159 <attribute name="action">win.save.launcher</attribute>
160 </item> 160 </item>
161 161
162 <item> 162 <item>
163 - <attribute name="label" translatable="yes">Session properties</attribute> 163 + <attribute name="label" translatable="yes">Session preferences</attribute>
164 <attribute name="action">win.save.session.as</attribute> 164 <attribute name="action">win.save.session.as</attribute>
165 </item> 165 </item>
166 166
@@ -90,13 +90,13 @@ @@ -90,13 +90,13 @@
90 <section> 90 <section>
91 91
92 <item> 92 <item>
93 - <attribute name="label" translatable="yes">Desktop icon</attribute> 93 + <attribute name="label" translatable="yes">Shortcut for this session</attribute>
94 <attribute name="action">win.save.launcher</attribute> 94 <attribute name="action">win.save.launcher</attribute>
95 </item> 95 </item>
96 96
97 <item> 97 <item>
98 - <attribute name="label" translatable="yes">Session properties</attribute>  
99 - <attribute name="action">win.save.session.as</attribute> 98 + <attribute name="label" translatable="yes">Session preferences</attribute>
  99 + <attribute name="action">win.save.session.preferences</attribute>
100 </item> 100 </item>
101 101
102 </section> 102 </section>
@@ -165,6 +165,16 @@ @@ -165,6 +165,16 @@
165 </item> 165 </item>
166 166
167 <item> 167 <item>
  168 + <attribute name="label" translatable="yes">Copy as HTML</attribute>
  169 + <attribute name="action">win.copy-html</attribute>
  170 + </item>
  171 +
  172 + <item>
  173 + <attribute name="label" translatable="yes">Copy as image</attribute>
  174 + <attribute name="action">win.copy-pixbuff</attribute>
  175 + </item>
  176 +
  177 + <item>
168 <attribute name="label" translatable="yes">Append to copy</attribute> 178 <attribute name="label" translatable="yes">Append to copy</attribute>
169 <attribute name="action">win.copy-append</attribute> 179 <attribute name="action">win.copy-append</attribute>
170 </item> 180 </item>
@@ -361,6 +371,11 @@ @@ -361,6 +371,11 @@
361 </item> 371 </item>
362 372
363 <item> 373 <item>
  374 + <attribute name="label" translatable="yes">Use +/- for field navigation</attribute>
  375 + <attribute name="action">win.kpalternative</attribute>
  376 + </item>
  377 +
  378 + <item>
364 <attribute name="label" translatable="yes">Resize on alternate screen</attribute> 379 <attribute name="label" translatable="yes">Resize on alternate screen</attribute>
365 <attribute name="action">win.altscreen</attribute> 380 <attribute name="action">win.altscreen</attribute>
366 </item> 381 </item>
@@ -381,7 +396,7 @@ @@ -381,7 +396,7 @@
381 <attribute name="label" translatable="yes">Dynamic font spacing</attribute> 396 <attribute name="label" translatable="yes">Dynamic font spacing</attribute>
382 <attribute name="action">win.dynamic-font-spacing</attribute> 397 <attribute name="action">win.dynamic-font-spacing</attribute>
383 </item> 398 </item>
384 - 399 +
385 <section> 400 <section>
386 401
387 <item> 402 <item>
@@ -426,6 +441,11 @@ @@ -426,6 +441,11 @@
426 <attribute name="action">win.menubar</attribute> 441 <attribute name="action">win.menubar</attribute>
427 </item> 442 </item>
428 443
  444 + <item>
  445 + <attribute name="label" translatable="yes">Session Trace</attribute>
  446 + <attribute name="action">win.trace</attribute>
  447 + </item>
  448 +
429 </submenu> 449 </submenu>
430 450
431 <section> 451 <section>
@@ -460,7 +480,7 @@ @@ -460,7 +480,7 @@
460 </item> 480 </item>
461 481
462 </section> 482 </section>
463 - 483 +
464 </menu> 484 </menu>
465 485
466 <menu id="popup-over-oia"> 486 <menu id="popup-over-oia">
@@ -527,7 +547,7 @@ @@ -527,7 +547,7 @@
527 547
528 </submenu> 548 </submenu>
529 549
530 - <submenu id="view-when-offline-placeholder"> 550 + <submenu id="view-when-offline-placeholder">
531 551
532 <attribute name='label' translatable='yes'>View</attribute> 552 <attribute name='label' translatable='yes'>View</attribute>
533 553
@@ -541,6 +561,11 @@ @@ -541,6 +561,11 @@
541 <attribute name="action">win.menubar</attribute> 561 <attribute name="action">win.menubar</attribute>
542 </item> 562 </item>
543 563
  564 + <item>
  565 + <attribute name="label" translatable="yes">Session Trace</attribute>
  566 + <attribute name="action">win.trace</attribute>
  567 + </item>
  568 +
544 </submenu> 569 </submenu>
545 570
546 <section> 571 <section>
@@ -551,7 +576,7 @@ @@ -551,7 +576,7 @@
551 </item> 576 </item>
552 577
553 <item> 578 <item>
554 - <attribute name="label" translatable="yes">Session properties</attribute> 579 + <attribute name="label" translatable="yes">Session preferences</attribute>
555 <attribute name="action">win.session.properties</attribute> 580 <attribute name="action">win.session.properties</attribute>
556 </item> 581 </item>
557 582
win/gtk.css 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +/* Disable F10 */
  2 +@binding-set NoKeyboardNavigation {
  3 + unbind "<shift>F10"
  4 + unbind "F10"
  5 +}
  6 +
  7 +* {
  8 + -gtk-key-bindings: NoKeyboardNavigation
  9 +}
  10 +
win/makeruntime.sh.in
@@ -25,6 +25,9 @@ @@ -25,6 +25,9 @@
25 # erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) 25 # erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça)
26 # 26 #
27 27
  28 +# Get myDIR
  29 +myDIR=$(dirname $(readlink -f "${0}"))
  30 +
28 # Disable i18n 31 # Disable i18n
29 export LANG=C 32 export LANG=C
30 33
@@ -286,6 +289,11 @@ copy_theme() { @@ -286,6 +289,11 @@ copy_theme() {
286 exit -1 289 exit -1
287 fi 290 fi
288 291
  292 + echo "${myDIR}/gtk.css"
  293 + if [ -e "${myDIR}/gtk.css" ]; then
  294 + cp "${myDIR}/gtk.css" "${TARGET}/share/themes/${1}/gtk-3.0/gtk.css"
  295 + fi
  296 +
289 } 297 }
290 298
291 # 299 #
@@ -31,10 +31,14 @@ LIBRARY_NAME=&quot;lib3270&quot; @@ -31,10 +31,14 @@ LIBRARY_NAME=&quot;lib3270&quot;
31 CORE_LIBRARIES="lib3270 libv3270 libipc3270" 31 CORE_LIBRARIES="lib3270 libv3270 libipc3270"
32 PACKAGE_PLUGINS="" 32 PACKAGE_PLUGINS=""
33 PACKAGE_EXTRAS="libhllapi" 33 PACKAGE_EXTRAS="libhllapi"
34 -TARGET_ARCHS="x86_64 x86_32" 34 +
  35 +#TARGET_ARCHS="x86_64 x86_32"
  36 +TARGET_ARCHS="x86_64"
  37 +
35 GIT_URL="https://github.com/PerryWerneck" 38 GIT_URL="https://github.com/PerryWerneck"
36 BUILD_UNSTABLE=0 39 BUILD_UNSTABLE=0
37 MAKE_ZIP=0 40 MAKE_ZIP=0
  41 +CLEAR_TARGET_PATH=0
38 42
39 PROJECTDIR=$(dirname $(dirname $(readlink -f ${0}))) 43 PROJECTDIR=$(dirname $(dirname $(readlink -f ${0})))
40 WORKDIR=$(mktemp -d) 44 WORKDIR=$(mktemp -d)
@@ -80,7 +84,6 @@ failed() @@ -80,7 +84,6 @@ failed()
80 clone() 84 clone()
81 { 85 {
82 echo -e "\e]2;Cloning ${1}\a" 86 echo -e "\e]2;Cloning ${1}\a"
83 - echo "Cloning ${1}"  
84 87
85 mkdir -p ${WORKDIR}/sources 88 mkdir -p ${WORKDIR}/sources
86 89
@@ -552,27 +555,40 @@ makeRuntime() @@ -552,27 +555,40 @@ makeRuntime()
552 # 555 #
553 copy_install_file() { 556 copy_install_file() {
554 557
555 - FILENAME=${PROJECTDIR}/$(basename ${1})  
556 -  
557 - rm -f "${FILENAME}"  
558 - cp -v "${1}" "${FILENAME}"  
559 -  
560 if [ "$?" != "0" ]; then 558 if [ "$?" != "0" ]; then
561 failed "Can't copy ${1} to ${FILENAME}" 559 failed "Can't copy ${1} to ${FILENAME}"
562 fi 560 fi
563 561
564 if [ ${BUILD_UNSTABLE} == "1" ]; then 562 if [ ${BUILD_UNSTABLE} == "1" ]; then
565 TARGET_PATH="/${PRODUCT_NAME}/unstable/${ARCH}" 563 TARGET_PATH="/${PRODUCT_NAME}/unstable/${ARCH}"
  564 + FILENAME=${PROJECTDIR}/dist/unstable/${ARCH}/$(basename ${1})
566 else 565 else
567 TARGET_PATH="/${PRODUCT_NAME}/stable/${ARCH}" 566 TARGET_PATH="/${PRODUCT_NAME}/stable/${ARCH}"
  567 + FILENAME=${PROJECTDIR}/dist/stable/${ARCH}/$(basename ${1})
568 fi 568 fi
569 569
  570 + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then
  571 + rm -fr "$(dirname ${FILENAME})/*"
  572 + fi
  573 +
  574 + mkdir -p $(dirname ${FILENAME})
  575 + ln -f -v "${1}" "${FILENAME}"
  576 + if [ "$?" != "0" ]; then
  577 + cp -v "${1}" "${FILENAME}"
  578 + fi
  579 +
570 if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then 580 if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then
571 - mkdir -p ~/public_html/win/${TARGET_PATH}  
572 - ln -f -v "${FILENAME}" ~/public_html/win/${TARGET_PATH} 581 +
  582 + mkdir -p "~/public_html/win/${TARGET_PATH}"
573 if [ "$?" != "0" ]; then 583 if [ "$?" != "0" ]; then
574 - failed "Can't link ${1} to ~/public_html/win/${TARGET_PATH}" 584 + failed "Can't create ~/public_html/win/${TARGET_PATH}"
  585 + fi
  586 +
  587 + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then
  588 + rm -fr ~/public_html/win/${TARGET_PATH}/*
575 fi 589 fi
  590 +
  591 + ln -f -v "${FILENAME}" ~/public_html/win/${TARGET_PATH}
576 fi 592 fi
577 593
578 if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then 594 if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then
@@ -582,18 +598,21 @@ copy_install_file() { @@ -582,18 +598,21 @@ copy_install_file() {
582 failed "Can't create ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" 598 failed "Can't create ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}"
583 fi 599 fi
584 600
585 - ln -f -v "${FILENAME}" ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}  
586 - if [ "$?" != "0" ]; then  
587 - failed "Can't link ${1} to ~/${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" 601 + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then
  602 + rm -fr ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}/*
588 fi 603 fi
589 604
  605 + ln -f -v "${FILENAME}" ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}
  606 +
590 fi 607 fi
591 608
592 - if [ "${PUBLISH}" == "1" ] && [ ! -z ${WIN_PACKAGE_SERVER} ]; then 609 + if [ "${PUBLISH}" == "1" ] && [ ! -z "${WIN_PACKAGE_SERVER}" ]; then
593 610
594 - scp "${FILENAME}" ${WIN_PACKAGE_SERVER}/${TARGET_PATH} 611 + scp "${FILENAME}" "${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})"
595 if [ "$?" != "0" ]; then 612 if [ "$?" != "0" ]; then
596 - failed "Can't publish ${1} to ${WIN_PACKAGE_SERVER}/${TARGET_PATH}" 613 + failed "Can't publish ${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})"
  614 + else
  615 + echo "Published to ${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})"
597 fi 616 fi
598 617
599 fi 618 fi
@@ -768,13 +787,21 @@ do @@ -768,13 +787,21 @@ do
768 ;; 787 ;;
769 788
770 CLEAR) 789 CLEAR)
771 - if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then  
772 - rm -fr ~/public_html/win/${PRODUCT_NAME}/{x86_32,x86_64}  
773 - fi 790 + CLEAR_TARGET_PATH=1
774 791
775 - if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then  
776 - rm -fr ${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}/{x86_32,x86_64}  
777 - fi 792 +# if [ ${BUILD_UNSTABLE} == "1" ]; then
  793 +# CLEAR_TARGET="${PRODUCT_NAME}/unstable"
  794 +# else
  795 +# CLEAR_TARGET="${PRODUCT_NAME}/stable"
  796 +# fi
  797 +#
  798 +# if [ -d ~/public_html/win/${STORAGE_PATH} ]; then
  799 +# echo rm -fr ~/public_html/win/${CLEAR_TARGET}/{x86_32,x86_64}
  800 +# fi
  801 +#
  802 +# if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${CLEAR_TARGET}" ]; then
  803 +# echo rm -fr ${XDG_PUBLICSHARE_DIR}/${CLEAR_TARGET}/{x86_32,x86_64}
  804 +# fi
778 805
779 ;; 806 ;;
780 807
@@ -783,7 +810,7 @@ do @@ -783,7 +810,7 @@ do
783 ;; 810 ;;
784 811
785 TARGET-ARCHS) 812 TARGET-ARCHS)
786 - TARGET_ARCHS=${value} 813 + TARGET_ARCHS=$(echo ${value} | sed "s@,@ @g")
787 ;; 814 ;;
788 815
789 NO-PRE-REQS) 816 NO-PRE-REQS)
@@ -855,9 +882,7 @@ do @@ -855,9 +882,7 @@ do
855 882
856 fi 883 fi
857 884
858 - if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then  
859 - echo " --clear Replace the contents of public folders"  
860 - fi 885 + echo " --clear Replace the contents of public folders"
861 886
862 echo "" 887 echo ""
863 exit 0 888 exit 0
win/pw3270.nsi.in
@@ -133,10 +133,15 @@ SubSection &quot;@PRODUCT_NAME@&quot; SecMain @@ -133,10 +133,15 @@ SubSection &quot;@PRODUCT_NAME@&quot; SecMain
133 133
134 # Locale files 134 # Locale files
135 CreateDirectory "$INSTDIR\locale\pt_BR\LC_MESSAGES" 135 CreateDirectory "$INSTDIR\locale\pt_BR\LC_MESSAGES"
136 - file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\@PACKAGE@.mo" "share\locale\pt_BR\LC_MESSAGES\@PACKAGE@.mo" 136 + file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\@PACKAGE_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\@PACKAGE_NAME@.mo"
137 file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" 137 file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo"
138 file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\libv3270.mo" "share\locale\pt_BR\LC_MESSAGES\libv3270.mo" 138 file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\libv3270.mo" "share\locale\pt_BR\LC_MESSAGES\libv3270.mo"
139 139
  140 + # Customized icons
  141 + CreateDirectory "$INSTDIR\icons"
  142 + file "/oname=$INSTDIR\icons\gtk-connect-symbolic.svg" "share\@PRODUCT_NAME@\icons\gtk-connect-symbolic.svg"
  143 + file "/oname=$INSTDIR\icons\gtk-disconnect-symbolic.svg" "share\@PRODUCT_NAME@\icons\gtk-disconnect-symbolic.svg"
  144 +
140 # define uninstaller name 145 # define uninstaller name
141 SetRegView 32 146 SetRegView 32
142 147