Commit cad6def6474ad8b9765ef6b6eb039e146c75a278
Committed by
GitHub
Exists in
master
and in
2 other branches
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
.gitignore
Makefile.in
| ... | ... | @@ -38,8 +38,9 @@ SOURCES= \ |
| 38 | 38 | $(wildcard src/objects/terminal/*.c) \ |
| 39 | 39 | $(wildcard src/objects/toolbar/*.c) \ |
| 40 | 40 | $(wildcard src/objects/settings/*.c) \ |
| 41 | - $(wildcard src/objects/@OSNAME@/*.c) \ | |
| 41 | + $(wildcard src/objects/os/@OSNAME@/*.c) \ | |
| 42 | 42 | $(wildcard src/main/*.c) \ |
| 43 | + $(wildcard src/tools/*.c) \ | |
| 43 | 44 | $(wildcard src/main/@OSNAME@/*.c) \ |
| 44 | 45 | $(wildcard src/main/@OSNAME@/*.rc) \ |
| 45 | 46 | $(wildcard src/objects/keypad/*.c) |
| ... | ... | @@ -63,6 +64,7 @@ WINDRES=@WINDRES@ |
| 63 | 64 | AR=@AR@ |
| 64 | 65 | VALGRIND=@VALGRIND@ |
| 65 | 66 | CONVERT=@CONVERT@ |
| 67 | +STRIP=@STRIP@ | |
| 66 | 68 | |
| 67 | 69 | #---[ Paths ]---------------------------------------------------------------------------- |
| 68 | 70 | |
| ... | ... | @@ -127,6 +129,11 @@ $(OBJDBG)/%.o: \ |
| 127 | 129 | |
| 128 | 130 | @$(CC) \ |
| 129 | 131 | $(CFLAGS) \ |
| 132 | + -DDEBUG=1 \ | |
| 133 | + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $< | |
| 134 | + | |
| 135 | + @$(CC) \ | |
| 136 | + $(CFLAGS) \ | |
| 130 | 137 | -Wall -Wextra -fstack-check \ |
| 131 | 138 | -DDEBUG=1 \ |
| 132 | 139 | -o $@ -c $< |
| ... | ... | @@ -154,6 +161,12 @@ $(OBJRLS)/%.o: \ |
| 154 | 161 | |
| 155 | 162 | @echo $< ... |
| 156 | 163 | @$(MKDIR) $(dir $@) |
| 164 | + | |
| 165 | + @$(CC) \ | |
| 166 | + $(CFLAGS) \ | |
| 167 | + -DNDEBUG=1 \ | |
| 168 | + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $< | |
| 169 | + | |
| 157 | 170 | @$(CC) \ |
| 158 | 171 | $(CFLAGS) \ |
| 159 | 172 | -DNDEBUG=1 \ |
| ... | ... | @@ -179,6 +192,7 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \ |
| 179 | 192 | --keyword=_ \ |
| 180 | 193 | --keyword=N_ \ |
| 181 | 194 | --keyword=MSG_:2 \ |
| 195 | + --keyword=NC_:1c,2 \ | |
| 182 | 196 | --output=$@ \ |
| 183 | 197 | $< |
| 184 | 198 | @touch $@ |
| ... | ... | @@ -258,6 +272,10 @@ $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@: \ |
| 258 | 272 | $^ \ |
| 259 | 273 | $(LIBS) |
| 260 | 274 | |
| 275 | +strip: \ | |
| 276 | + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ | |
| 277 | + | |
| 278 | + @$(STRIP) --discard-all $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ | |
| 261 | 279 | |
| 262 | 280 | #---[ Install Targets ]------------------------------------------------------------------ |
| 263 | 281 | |
| ... | ... | @@ -266,18 +284,11 @@ install: \ |
| 266 | 284 | install-keypads |
| 267 | 285 | |
| 268 | 286 | install-application: \ |
| 269 | - $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ | |
| 287 | + install-@OSNAME@-application \ | |
| 270 | 288 | install-locale \ |
| 271 | 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 | 293 | @$(MKDIR) \ |
| 283 | 294 | $(DESTDIR)/$(libdir)/$(PRODUCT_NAME)-plugins |
| ... | ... | @@ -292,6 +303,28 @@ install-application: \ |
| 292 | 303 | @$(MKDIR) \ |
| 293 | 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 | 328 | install-keypads: |
| 296 | 329 | |
| 297 | 330 | @$(MKDIR) \ |
| ... | ... | @@ -301,6 +334,15 @@ install-keypads: |
| 301 | 334 | keypad/*.xml \ |
| 302 | 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 | 346 | #---[ Misc Targets ]--------------------------------------------------------------------- |
| 305 | 347 | |
| 306 | 348 | locale/$(PACKAGE_NAME).pot: \ |
| ... | ... | @@ -335,6 +377,14 @@ run: \ |
| 335 | 377 | @G_DEBUG=fatal-warnings \ |
| 336 | 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 | 388 | mem-check: \ |
| 339 | 389 | $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ |
| 340 | 390 | |
| ... | ... | @@ -382,4 +432,6 @@ clean: \ |
| 382 | 432 | cleanDebug \ |
| 383 | 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 | 44 | CONVERT=@CONVERT@ |
| 45 | 45 | OPTIPNG=@OPTIPNG@ |
| 46 | 46 | DESKTOP_INSTALL=@DESKTOP_INSTALL@ |
| 47 | +SCOUR=@SCOUR@ | |
| 48 | +APPSTREAMCLI=@APPSTREAMCLI@ | |
| 47 | 49 | |
| 48 | 50 | #---[ Rules ]---------------------------------------------------------------------------- |
| 49 | 51 | |
| ... | ... | @@ -107,6 +109,20 @@ $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/%.png: \ |
| 107 | 109 | @$(MKDIR) `dirname $@` |
| 108 | 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 | 126 | $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ |
| 111 | 127 | $(BINDIR)/%.png |
| 112 | 128 | |
| ... | ... | @@ -114,11 +130,19 @@ $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ |
| 114 | 130 | @$(MKDIR) `dirname $@` |
| 115 | 131 | @$(INSTALL_DATA) $< $@ |
| 116 | 132 | |
| 133 | +validate: | |
| 134 | + | |
| 135 | +ifneq ($(SCOUR),no) | |
| 136 | + @$(APPSTREAMCLI) validate appdata.xml | |
| 137 | +endif | |
| 138 | + | |
| 139 | + | |
| 117 | 140 | install: \ |
| 118 | 141 | install-@OSNAME@ |
| 119 | 142 | |
| 120 | 143 | install-linux: \ |
| 121 | 144 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ |
| 145 | + $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/icons/$(PRODUCT_NAME).svg \ | |
| 122 | 146 | $(DESTDIR)$(datarootdir)/pixmaps/$(PRODUCT_NAME).png \ |
| 123 | 147 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png |
| 124 | 148 | |
| ... | ... | @@ -138,6 +162,12 @@ install-linux: \ |
| 138 | 162 | mime.xml \ |
| 139 | 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 | 171 | install-windows: \ |
| 142 | 172 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ |
| 143 | 173 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png \ | ... | ... |
| ... | ... | @@ -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 | 3 | GenericName=@PRODUCT_NAME@ |
| 4 | 4 | Name=3270 Terminal |
| 5 | 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 | 8 | Exec=@PRODUCT_NAME@ %u |
| 8 | -Icon=@PRODUCT_NAME@ | |
| 9 | +Icon=/usr/share/@PRODUCT_NAME@/icons/@PRODUCT_NAME@.svg | |
| 9 | 10 | Terminal=false |
| 10 | 11 | Type=Application |
| 11 | 12 | StartupNotify=true | ... | ... |
configure.ac
| ... | ... | @@ -67,7 +67,7 @@ case "$host" in |
| 67 | 67 | |
| 68 | 68 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" |
| 69 | 69 | LDFLAGS="$LDFLAGS -pthread" |
| 70 | - LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32" | |
| 70 | + LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32 -lole32 -luuid" | |
| 71 | 71 | |
| 72 | 72 | app_win32_revision=$(date +%-y.%-m.%-d.%-H) |
| 73 | 73 | AC_SUBST(WIN32_VERSION,$app_win32_revision) |
| ... | ... | @@ -141,6 +141,10 @@ AC_PATH_TOOL([MSGMERGE], [msgmerge], [no]) |
| 141 | 141 | AC_PATH_TOOL([MSGFMT], [msgfmt], [no]) |
| 142 | 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 | 148 | AC_PATH_TOOL([DESKTOP_INSTALL],[desktop-file-install],[no]) |
| 145 | 149 | |
| 146 | 150 | PKG_CHECK_EXISTS |
| ... | ... | @@ -245,6 +249,7 @@ AC_CONFIG_FILES(locale/Makefile) |
| 245 | 249 | AC_CONFIG_FILES(branding/Makefile) |
| 246 | 250 | AC_CONFIG_FILES(branding/launcher.desktop) |
| 247 | 251 | AC_CONFIG_FILES(branding/mime.xml) |
| 252 | +AC_CONFIG_FILES(branding/appdata.xml) | |
| 248 | 253 | |
| 249 | 254 | dnl --------------------------------------------------------------------------- |
| 250 | 255 | dnl Output the generated config.status script. | ... | ... |
| ... | ... | @@ -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> | ... | ... |
| ... | ... | @@ -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 "" |
| 5 | 5 | msgstr "" |
| 6 | 6 | "Project-Id-Version: pw3270 5.0\n" |
| 7 | 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 | 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" |
| 11 | 11 | "Language-Team: Português <>\n" |
| 12 | 12 | "Language: pt_BR\n" |
| ... | ... | @@ -20,17 +20,37 @@ msgstr "" |
| 20 | 20 | "11) ? 2 : 3;\n" |
| 21 | 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 | 24 | #, c-format |
| 25 | 25 | msgid "\"%s\" is not a valid user interface name" |
| 26 | 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 | 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 | 54 | #: ui/application.xml:537 |
| 35 | 55 | msgid "About PW3270" |
| 36 | 56 | msgstr "Sobre o PW3270" |
| ... | ... | @@ -39,23 +59,23 @@ msgstr "Sobre o PW3270" |
| 39 | 59 | msgid "Action Name" |
| 40 | 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 | 63 | msgid "Action Names" |
| 44 | 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 | 67 | msgid "Alert sound" |
| 48 | 68 | msgstr "Aviso sonoro" |
| 49 | 69 | |
| 50 | -#: src/main/tools.c:99 | |
| 70 | +#: src/main/tools.c:99 src/tools/entry.c:88 | |
| 51 | 71 | msgid "All files" |
| 52 | 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 | 75 | msgid "Append to copy" |
| 56 | 76 | msgstr "Adicionar à cópia" |
| 57 | 77 | |
| 58 | -#: src/objects/application/actions/about.c:126 | |
| 78 | +#: src/objects/application/actions/about.c:129 | |
| 59 | 79 | msgid "Apple version" |
| 60 | 80 | msgstr "Versão Apple" |
| 61 | 81 | |
| ... | ... | @@ -63,11 +83,15 @@ msgstr "Versão Apple" |
| 63 | 83 | msgid "Application" |
| 64 | 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 | 91 | msgid "Application preferences" |
| 68 | 92 | msgstr "Preferências da aplicação" |
| 69 | 93 | |
| 70 | -#: src/objects/window/page.c:263 | |
| 94 | +#: src/objects/window/page.c:264 | |
| 71 | 95 | msgid "Apply" |
| 72 | 96 | msgstr "Aplicar" |
| 73 | 97 | |
| ... | ... | @@ -75,15 +99,15 @@ msgstr "Aplicar" |
| 75 | 99 | msgid "Auto-Reconnect" |
| 76 | 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 | 103 | msgid "Available" |
| 80 | 104 | msgstr "Disponível" |
| 81 | 105 | |
| 82 | -#: src/objects/application/actions/about.c:130 | |
| 106 | +#: src/objects/application/actions/about.c:132 | |
| 83 | 107 | msgid "Based on X3270 from" |
| 84 | 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 | 111 | msgid "Blank Fill" |
| 88 | 112 | msgstr "Completar com espaços" |
| 89 | 113 | |
| ... | ... | @@ -95,21 +119,17 @@ msgstr "Cursor piscante" |
| 95 | 119 | msgid "Bold" |
| 96 | 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 | 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 | 133 | msgid "Cancel" |
| 114 | 134 | msgstr "_Cancelar" |
| 115 | 135 | |
| ... | ... | @@ -117,7 +137,19 @@ msgstr "_Cancelar" |
| 117 | 137 | msgid "Change terminal colors" |
| 118 | 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 | 153 | msgid "Clear" |
| 122 | 154 | msgstr "Limpar" |
| 123 | 155 | |
| ... | ... | @@ -134,8 +166,8 @@ msgstr "Fecha todas as janelas e encerra a aplicação" |
| 134 | 166 | msgid "Close the window" |
| 135 | 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 | 171 | msgid "Close window" |
| 140 | 172 | msgstr "Fechar janela" |
| 141 | 173 | |
| ... | ... | @@ -143,6 +175,10 @@ msgstr "Fechar janela" |
| 143 | 175 | msgid "Colors" |
| 144 | 176 | msgstr "Cores" |
| 145 | 177 | |
| 178 | +#: src/objects/os/linux/savedesktopicon.c:101 | |
| 179 | +msgid "Comment" | |
| 180 | +msgstr "Comentário" | |
| 181 | + | |
| 146 | 182 | #: src/objects/window/actions/connect.c:59 |
| 147 | 183 | msgid "Connect" |
| 148 | 184 | msgstr "Conectar" |
| ... | ... | @@ -155,11 +191,15 @@ msgstr "Conectar ao iniciar" |
| 155 | 191 | msgid "Connect to host" |
| 156 | 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 | 195 | msgid "Connected to host" |
| 160 | 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 | 203 | msgid "Contributors" |
| 164 | 204 | msgstr "Contribuidores" |
| 165 | 205 | |
| ... | ... | @@ -167,6 +207,14 @@ msgstr "Contribuidores" |
| 167 | 207 | msgid "Copy" |
| 168 | 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 | 218 | #: ui/window.xml:163 ui/application.xml:246 |
| 171 | 219 | msgid "Copy as table" |
| 172 | 220 | msgstr "Copiar como tabela" |
| ... | ... | @@ -175,11 +223,11 @@ msgstr "Copiar como tabela" |
| 175 | 223 | msgid "Copy as text" |
| 176 | 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 | 231 | msgid "Cross hair cursor" |
| 184 | 232 | msgstr "Cursor mira" |
| 185 | 233 | |
| ... | ... | @@ -195,28 +243,24 @@ msgstr "Tela atual" |
| 195 | 243 | msgid "Current session" |
| 196 | 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 | 247 | msgid "Cut" |
| 200 | 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 | 251 | msgid "Delete Field" |
| 204 | 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 | 255 | msgid "Disconnect" |
| 212 | 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 | 260 | msgid "Disconnected from host" |
| 217 | 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 | 264 | msgid "Dynamic font spacing" |
| 221 | 265 | msgstr "Espaçamento dinâmico" |
| 222 | 266 | |
| ... | ... | @@ -240,15 +284,19 @@ msgstr "Largura do elemento em colunas" |
| 240 | 284 | msgid "Enabled" |
| 241 | 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 | 292 | msgid "Erase input" |
| 245 | 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 | 296 | msgid "Erase to end of field" |
| 249 | 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 | 300 | msgid "Erase to end of line" |
| 253 | 301 | msgstr "Apagar até o final da linha" |
| 254 | 302 | |
| ... | ... | @@ -256,15 +304,11 @@ msgstr "Apagar até o final da linha" |
| 256 | 304 | msgid "Field attributes" |
| 257 | 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 | 307 | #: ui/application.xml:454 |
| 264 | 308 | msgid "Full Screen" |
| 265 | 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 | 312 | msgid "Full screen" |
| 269 | 313 | msgstr "Tela cheia" |
| 270 | 314 | |
| ... | ... | @@ -272,6 +316,10 @@ msgstr "Tela cheia" |
| 272 | 316 | msgid "Function bar" |
| 273 | 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 | 323 | #: ui/application.xml:36 ui/application.xml:534 |
| 276 | 324 | msgid "Help" |
| 277 | 325 | msgstr "Ajuda" |
| ... | ... | @@ -280,11 +328,11 @@ msgstr "Ajuda" |
| 280 | 328 | msgid "Host properties" |
| 281 | 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 | 332 | msgid "IBM 3270 Terminal emulator" |
| 285 | 333 | msgstr "Emulador 3270" |
| 286 | 334 | |
| 287 | -#: src/objects/actions/view.c:89 | |
| 335 | +#: src/objects/actions/view.c:90 | |
| 288 | 336 | msgid "Icon" |
| 289 | 337 | msgstr "Ícone" |
| 290 | 338 | |
| ... | ... | @@ -292,19 +340,27 @@ msgstr "Ícone" |
| 292 | 340 | msgid "Icon Name" |
| 293 | 341 | msgstr "Nome do ícone" |
| 294 | 342 | |
| 295 | -#: src/objects/toolbar/settings.c:50 | |
| 343 | +#: src/objects/toolbar/settings.c:54 | |
| 296 | 344 | msgid "Icon Size" |
| 297 | 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 | 352 | msgid "Icon _size" |
| 301 | 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 | 360 | msgid "Icons & text" |
| 305 | 361 | msgstr "Ícones e texto" |
| 306 | 362 | |
| 307 | -#: src/objects/toolbar/toolbar.c:74 | |
| 363 | +#: src/objects/toolbar/models.c:87 | |
| 308 | 364 | msgid "Icons only" |
| 309 | 365 | msgstr "Apenas ícones" |
| 310 | 366 | |
| ... | ... | @@ -312,7 +368,7 @@ msgstr "Apenas ícones" |
| 312 | 368 | msgid "If the action can be activated" |
| 313 | 369 | msgstr "Se a ação pode ser ativada" |
| 314 | 370 | |
| 315 | -#: ui/window.xml:469 | |
| 371 | +#: ui/window.xml:484 | |
| 316 | 372 | msgid "Insert" |
| 317 | 373 | msgstr "Inserção" |
| 318 | 374 | |
| ... | ... | @@ -320,7 +376,15 @@ msgstr "Inserção" |
| 320 | 376 | msgid "Invalid or unknown property type" |
| 321 | 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 | 388 | msgid "Itens" |
| 325 | 389 | msgstr "Itens" |
| 326 | 390 | |
| ... | ... | @@ -348,22 +412,26 @@ msgstr "Largura do painel em colunas" |
| 348 | 412 | msgid "Keypads" |
| 349 | 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 | 420 | msgid "Label" |
| 353 | 421 | msgstr "Etiqueta" |
| 354 | 422 | |
| 355 | -#: src/objects/toolbar/toolbar.c:58 | |
| 423 | +#: src/objects/toolbar/models.c:66 | |
| 356 | 424 | msgid "Large" |
| 357 | 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 | 428 | msgid "Layout" |
| 365 | 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 | 435 | #: ui/application.xml:71 |
| 368 | 436 | msgid "Main Menu" |
| 369 | 437 | msgstr "Menu principal" |
| ... | ... | @@ -372,11 +440,11 @@ msgstr "Menu principal" |
| 372 | 440 | msgid "Main Toolbar" |
| 373 | 441 | msgstr "Barra de ferramentas" |
| 374 | 442 | |
| 375 | -#: ui/window.xml:540 | |
| 443 | +#: ui/window.xml:555 | |
| 376 | 444 | msgid "Main menu" |
| 377 | 445 | msgstr "Menu principal" |
| 378 | 446 | |
| 379 | -#: src/objects/application/actions/about.c:125 | |
| 447 | +#: src/objects/application/actions/about.c:128 | |
| 380 | 448 | msgid "Maintainers" |
| 381 | 449 | msgstr "Mantenedores" |
| 382 | 450 | |
| ... | ... | @@ -384,23 +452,23 @@ msgstr "Mantenedores" |
| 384 | 452 | msgid "Menu" |
| 385 | 453 | msgstr "Menu" |
| 386 | 454 | |
| 387 | -#: ui/window.xml:506 ui/application.xml:403 | |
| 455 | +#: ui/window.xml:521 ui/application.xml:403 | |
| 388 | 456 | msgid "Model 2 - 80x24" |
| 389 | 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 | 460 | msgid "Model 3 - 80x32" |
| 393 | 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 | 464 | msgid "Model 4 - 80x43" |
| 397 | 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 | 468 | msgid "Model 5 - 132x27" |
| 401 | 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 | 472 | msgid "Monocase" |
| 405 | 473 | msgstr "Só Maiúsculas" |
| 406 | 474 | |
| ... | ... | @@ -408,7 +476,7 @@ msgstr "Só Maiúsculas" |
| 408 | 476 | msgid "Network keep alive" |
| 409 | 477 | msgstr "Network keep alive" |
| 410 | 478 | |
| 411 | -#: src/objects/window/page.c:274 | |
| 479 | +#: src/objects/window/page.c:275 | |
| 412 | 480 | msgid "New session name" |
| 413 | 481 | msgstr "Novo nome de sessão" |
| 414 | 482 | |
| ... | ... | @@ -456,7 +524,7 @@ msgstr "Abrir sessão em nova aba" |
| 456 | 524 | msgid "Open session in New window" |
| 457 | 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 | 528 | msgid "Options" |
| 461 | 529 | msgstr "Opções" |
| 462 | 530 | |
| ... | ... | @@ -464,22 +532,26 @@ msgstr "Opções" |
| 464 | 532 | msgid "Parameter Type" |
| 465 | 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 | 536 | msgid "Paste from clipboard" |
| 469 | 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 | 540 | msgid "Paste from text file" |
| 473 | 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 | 544 | msgid "Paste next" |
| 477 | 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 | 548 | msgid "Paste with left margin" |
| 481 | 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 | 555 | #: ui/window.xml:129 |
| 484 | 556 | msgid "Preferences" |
| 485 | 557 | msgstr "Preferências" |
| ... | ... | @@ -488,11 +560,11 @@ msgstr "Preferências" |
| 488 | 560 | msgid "Print" |
| 489 | 561 | msgstr "Imprimir" |
| 490 | 562 | |
| 491 | -#: ui/window.xml:439 | |
| 563 | +#: ui/window.xml:454 | |
| 492 | 564 | msgid "Print screen" |
| 493 | 565 | msgstr "Imrpimir o conteúdo da tela" |
| 494 | 566 | |
| 495 | -#: ui/window.xml:252 | |
| 567 | +#: ui/window.xml:262 | |
| 496 | 568 | msgid "Print selected" |
| 497 | 569 | msgstr "Imprimir seleção" |
| 498 | 570 | |
| ... | ... | @@ -505,15 +577,15 @@ msgstr "Propriedade \"%s\" é inválida para este objeto" |
| 505 | 577 | msgid "Quit" |
| 506 | 578 | msgstr "Sair" |
| 507 | 579 | |
| 508 | -#: src/objects/window/page.c:261 | |
| 580 | +#: src/objects/window/page.c:262 | |
| 509 | 581 | msgid "Rename Session" |
| 510 | 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 | 585 | msgid "Reselect" |
| 514 | 586 | msgstr "Reselecionar" |
| 515 | 587 | |
| 516 | -#: ui/window.xml:364 ui/application.xml:464 | |
| 588 | +#: ui/window.xml:374 ui/application.xml:464 | |
| 517 | 589 | msgid "Resize on alternate screen" |
| 518 | 590 | msgstr "Mudar tamanho do terminal em tela alternativa" |
| 519 | 591 | |
| ... | ... | @@ -521,55 +593,59 @@ msgstr "Mudar tamanho do terminal em tela alternativa" |
| 521 | 593 | msgid "Right keypad" |
| 522 | 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 | 597 | msgid "Save" |
| 530 | 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 | 605 | msgid "Save screen" |
| 542 | 606 | msgstr "Salvar tela" |
| 543 | 607 | |
| 544 | -#: ui/window.xml:247 | |
| 608 | +#: ui/window.xml:257 | |
| 545 | 609 | msgid "Save selected" |
| 546 | 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 | 629 | msgid "Screen size" |
| 554 | 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 | 633 | msgid "Select Field" |
| 558 | 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 | 637 | msgid "Select all" |
| 562 | 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 | 641 | msgid "Select by rectangles" |
| 566 | 642 | msgstr "Seleção retangular" |
| 567 | 643 | |
| 568 | -#: src/objects/toolbar/settings.c:108 | |
| 644 | +#: src/objects/toolbar/settings.c:106 | |
| 569 | 645 | msgid "Select the toolbar itens" |
| 570 | 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 | 649 | msgid "Selected" |
| 574 | 650 | msgstr "Selecionado" |
| 575 | 651 | |
| ... | ... | @@ -582,12 +658,12 @@ msgstr "Área selecionada" |
| 582 | 658 | msgid "Send/Receive" |
| 583 | 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 | 662 | #: ui/application.xml:195 |
| 587 | 663 | msgid "Send/Receive files" |
| 588 | 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 | 667 | msgid "Separator" |
| 592 | 668 | msgstr "Separador" |
| 593 | 669 | |
| ... | ... | @@ -595,10 +671,14 @@ msgstr "Separador" |
| 595 | 671 | msgid "Session" |
| 596 | 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 | 675 | msgid "Session Trace" |
| 600 | 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 | 682 | #: ui/window.xml:61 ui/application.xml:126 |
| 603 | 683 | msgid "Session in New Tab" |
| 604 | 684 | msgstr "Sessão em nova aba" |
| ... | ... | @@ -607,12 +687,16 @@ msgstr "Sessão em nova aba" |
| 607 | 687 | msgid "Session in new window" |
| 608 | 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 | 700 | msgid "Set the user-interface type" |
| 617 | 701 | msgstr "Define o tipo de interface do usuário" |
| 618 | 702 | |
| ... | ... | @@ -620,34 +704,58 @@ msgstr "Define o tipo de interface do usuário" |
| 620 | 704 | msgid "Settings" |
| 621 | 705 | msgstr "Configurações" |
| 622 | 706 | |
| 623 | -#: src/objects/toolbar/settings.c:207 | |
| 707 | +#: src/objects/toolbar/settings.c:176 | |
| 624 | 708 | msgid "Setup the toolbar layout" |
| 625 | 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 | 716 | msgid "Setup toolbar" |
| 629 | 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 | 731 | #: ui/application.xml:494 |
| 632 | 732 | msgid "Show Underline" |
| 633 | 733 | msgstr "Mostrar sublinhado" |
| 634 | 734 | |
| 635 | -#: ui/window.xml:231 | |
| 735 | +#: ui/window.xml:241 | |
| 636 | 736 | msgid "Show menu" |
| 637 | 737 | msgstr "Mostrar menu" |
| 638 | 738 | |
| 639 | -#: ui/window.xml:226 | |
| 739 | +#: ui/window.xml:236 | |
| 640 | 740 | msgid "Show toolbar" |
| 641 | 741 | msgstr "Mostrar barra de ferramentas" |
| 642 | 742 | |
| 643 | -#: src/objects/toolbar/toolbar.c:53 | |
| 743 | +#: src/objects/toolbar/models.c:61 | |
| 644 | 744 | msgid "Small" |
| 645 | 745 | msgstr "Pequeno" |
| 646 | 746 | |
| 647 | -#: ui/window.xml:388 ui/application.xml:504 | |
| 747 | +#: ui/window.xml:398 ui/application.xml:504 | |
| 648 | 748 | msgid "Smart paste" |
| 649 | 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 | 759 | #: src/objects/actions/abstract.c:152 |
| 652 | 760 | msgid "State" |
| 653 | 761 | msgstr "Estado" |
| ... | ... | @@ -656,11 +764,12 @@ msgstr "Estado" |
| 656 | 764 | msgid "State Type" |
| 657 | 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 | 773 | msgid "System default" |
| 665 | 774 | msgstr "Padrão do sistema" |
| 666 | 775 | |
| ... | ... | @@ -676,7 +785,7 @@ msgstr "Aba com a sessão padrão" |
| 676 | 785 | msgid "Terminal font" |
| 677 | 786 | msgstr "Fonte do terminal" |
| 678 | 787 | |
| 679 | -#: src/objects/toolbar/toolbar.c:79 | |
| 788 | +#: src/objects/toolbar/models.c:92 | |
| 680 | 789 | msgid "Text only" |
| 681 | 790 | msgstr "Apenas texto" |
| 682 | 791 | |
| ... | ... | @@ -696,6 +805,14 @@ msgstr "A dica da ação" |
| 696 | 805 | msgid "The code of the User interface type" |
| 697 | 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 | 816 | #: src/objects/actions/abstract.c:110 |
| 700 | 817 | msgid "The label for the action" |
| 701 | 818 | msgstr "A etiqueta da ação" |
| ... | ... | @@ -704,11 +821,11 @@ msgstr "A etiqueta da ação" |
| 704 | 821 | msgid "The name of associated action" |
| 705 | 822 | msgstr "Nome da ação associada" |
| 706 | 823 | |
| 707 | -#: src/objects/window/window.c:164 | |
| 824 | +#: src/objects/window/window.c:185 | |
| 708 | 825 | msgid "The name of the actions in the header bar" |
| 709 | 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 | 829 | msgid "The name of the actions in the toolbar" |
| 713 | 830 | msgstr "O nome das ações na barra de ferramentas" |
| 714 | 831 | |
| ... | ... | @@ -732,15 +849,25 @@ msgstr "O nome usado para ativar a ação" |
| 732 | 849 | msgid "The position of the keypad" |
| 733 | 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 | 858 | #: src/objects/actions/abstract.c:153 |
| 736 | 859 | msgid "The state the action is in" |
| 737 | 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 | 863 | msgid "The toolbar icon size" |
| 741 | 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 | 871 | msgid "The toolbar style" |
| 745 | 872 | msgstr "Estilo da barra de ferramentas" |
| 746 | 873 | |
| ... | ... | @@ -756,12 +883,28 @@ msgstr "The type of GVariant passed to activate()" |
| 756 | 883 | msgid "The type of the state kept by the action" |
| 757 | 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 | 895 | #: ui/application.xml:342 |
| 761 | 896 | msgid "Toolbar" |
| 762 | 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 | 908 | msgid "Top menu" |
| 766 | 909 | msgstr "Menu principal" |
| 767 | 910 | |
| ... | ... | @@ -769,7 +912,7 @@ msgstr "Menu principal" |
| 769 | 912 | msgid "Trace" |
| 770 | 913 | msgstr "Trace" |
| 771 | 914 | |
| 772 | -#: ui/window.xml:474 ui/application.xml:449 | |
| 915 | +#: ui/window.xml:489 ui/application.xml:449 | |
| 773 | 916 | msgid "Track Cursor" |
| 774 | 917 | msgstr "Mostrar posição do cursor" |
| 775 | 918 | |
| ... | ... | @@ -777,7 +920,7 @@ msgstr "Mostrar posição do cursor" |
| 777 | 920 | msgid "UI Type" |
| 778 | 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 | 924 | msgid "Unselect" |
| 782 | 925 | msgstr "Remover seleção" |
| 783 | 926 | |
| ... | ... | @@ -785,34 +928,38 @@ msgstr "Remover seleção" |
| 785 | 928 | msgid "Use +/- for field navigation" |
| 786 | 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 | 932 | #, c-format |
| 791 | 933 | msgid "Version %s-%s" |
| 792 | 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 | 937 | #: ui/application.xml:63 |
| 796 | 938 | msgid "View" |
| 797 | 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 | 945 | #: ui/window.xml:40 ui/application.xml:105 |
| 800 | 946 | msgid "Window with default session" |
| 801 | 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 | 950 | msgid "_Apply" |
| 805 | 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 | 955 | msgid "_Cancel" |
| 809 | 956 | msgstr "_Cancelar" |
| 810 | 957 | |
| 811 | -#: src/objects/window/page.c:394 | |
| 958 | +#: src/objects/window/page.c:371 | |
| 812 | 959 | msgid "_Close session" |
| 813 | 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 | 963 | msgid "_Connect" |
| 817 | 964 | msgstr "_Conectar" |
| 818 | 965 | |
| ... | ... | @@ -820,7 +967,7 @@ msgstr "_Conectar" |
| 820 | 967 | msgid "_Disconnect" |
| 821 | 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 | 971 | msgid "_Edit" |
| 825 | 972 | msgstr "_Editar" |
| 826 | 973 | |
| ... | ... | @@ -840,15 +987,15 @@ msgstr "_Nova" |
| 840 | 987 | msgid "_Open" |
| 841 | 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 | 995 | msgid "_Rename session" |
| 849 | 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 | 999 | msgid "_Save" |
| 853 | 1000 | msgstr "_Salvar" |
| 854 | 1001 | |
| ... | ... | @@ -856,7 +1003,11 @@ msgstr "_Salvar" |
| 856 | 1003 | msgid "_View" |
| 857 | 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 | 1011 | msgid "translator-credits" |
| 861 | 1012 | msgstr "translator-credits" |
| 862 | 1013 | |
| ... | ... | @@ -1165,6 +1316,10 @@ msgstr "translator-credits" |
| 1165 | 1316 | #~ msgid "Blue" |
| 1166 | 1317 | #~ msgstr "Azul" |
| 1167 | 1318 | |
| 1319 | +#~ msgctxt "ProjectURLTitle" | |
| 1320 | +#~ msgid "Brazilian Public Software Portal" | |
| 1321 | +#~ msgstr "Portal do Software Público Brasileiro" | |
| 1322 | + | |
| 1168 | 1323 | #~ msgid "Break" |
| 1169 | 1324 | #~ msgstr "Break" |
| 1170 | 1325 | |
| ... | ... | @@ -1287,7 +1442,7 @@ msgstr "translator-credits" |
| 1287 | 1442 | #~ msgid "Can't load plugin %s" |
| 1288 | 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 | 1446 | #~ msgstr "Não foi possível abrir %s" |
| 1292 | 1447 | |
| 1293 | 1448 | #~ msgid "Can't open CRL File" |
| ... | ... | @@ -1335,9 +1490,6 @@ msgstr "translator-credits" |
| 1335 | 1490 | #~ msgid "Can't save \"%s\": %s" |
| 1336 | 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 | 1493 | #~ msgid "" |
| 1342 | 1494 | #~ "Can't save copy to file\n" |
| 1343 | 1495 | #~ "%s" |
| ... | ... | @@ -1345,6 +1497,9 @@ msgstr "translator-credits" |
| 1345 | 1497 | #~ "Não foi possível salvar cópia para o arquivo\n" |
| 1346 | 1498 | #~ "%s" |
| 1347 | 1499 | |
| 1500 | +#~ msgid "Can't save file \"%s\"" | |
| 1501 | +#~ msgstr "Não foi possível salvar arquivo \"%s\"" | |
| 1502 | + | |
| 1348 | 1503 | #~ msgid "" |
| 1349 | 1504 | #~ "Can't save screen to file\n" |
| 1350 | 1505 | #~ "%s" |
| ... | ... | @@ -1508,9 +1663,6 @@ msgstr "translator-credits" |
| 1508 | 1663 | #~ msgid "Command to execute" |
| 1509 | 1664 | #~ msgstr "Comando a executar" |
| 1510 | 1665 | |
| 1511 | -#~ msgid "Comment" | |
| 1512 | -#~ msgstr "Comentário" | |
| 1513 | - | |
| 1514 | 1666 | #~ msgid "Complete" |
| 1515 | 1667 | #~ msgstr "Completo" |
| 1516 | 1668 | |
| ... | ... | @@ -1532,9 +1684,6 @@ msgstr "translator-credits" |
| 1532 | 1684 | #~ msgid "Copiar tudo" |
| 1533 | 1685 | #~ msgstr "Copiar tudo" |
| 1534 | 1686 | |
| 1535 | -#~ msgid "Copy as HTML" | |
| 1536 | -#~ msgstr "Copiar como HTML" | |
| 1537 | - | |
| 1538 | 1687 | #~ msgid "Creates a file with fixed-length records." |
| 1539 | 1688 | #~ msgstr "Cria arquivo com registros de tamanho fixo." |
| 1540 | 1689 | |
| ... | ... | @@ -1620,9 +1769,15 @@ msgstr "translator-credits" |
| 1620 | 1769 | #~ msgid "Default host URL" |
| 1621 | 1770 | #~ msgstr "URL parão para acesso ao host" |
| 1622 | 1771 | |
| 1772 | +#~ msgid "Description" | |
| 1773 | +#~ msgstr "Descrição" | |
| 1774 | + | |
| 1623 | 1775 | #~ msgid "Description of the current security state" |
| 1624 | 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 | 1781 | #~ msgid "Device type rejected" |
| 1627 | 1782 | #~ msgstr "Tipo de dispositivo rejeitado" |
| 1628 | 1783 | |
| ... | ... | @@ -1766,6 +1921,9 @@ msgstr "translator-credits" |
| 1766 | 1921 | #~ msgid "File _Format" |
| 1767 | 1922 | #~ msgstr "_Formato do arquivo" |
| 1768 | 1923 | |
| 1924 | +#~ msgid "File name" | |
| 1925 | +#~ msgstr "Nome do arquivo" | |
| 1926 | + | |
| 1769 | 1927 | #~ msgid "File transfer complete" |
| 1770 | 1928 | #~ msgstr "Transferência completa" |
| 1771 | 1929 | |
| ... | ... | @@ -1836,9 +1994,6 @@ msgstr "translator-credits" |
| 1836 | 1994 | #~ msgid "GTK Version mismatch" |
| 1837 | 1995 | #~ msgstr "Divergência de versão GTK" |
| 1838 | 1996 | |
| 1839 | -#~ msgid "Generic name" | |
| 1840 | -#~ msgstr "Nome genérico" | |
| 1841 | - | |
| 1842 | 1997 | #~ msgid "Get transfer queue from an external XML file" |
| 1843 | 1998 | #~ msgstr "Obtém a fila de transferência de um arquivo XML externo" |
| 1844 | 1999 | |
| ... | ... | @@ -2142,6 +2297,12 @@ msgstr "translator-credits" |
| 2142 | 2297 | #~ msgid "Latest program message" |
| 2143 | 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 | 2306 | #~ msgid "Load" |
| 2146 | 2307 | #~ msgstr "Load" |
| 2147 | 2308 | |
| ... | ... | @@ -2459,6 +2620,10 @@ msgstr "translator-credits" |
| 2459 | 2620 | #~ msgid "Port or service name (empty for \"telnet\")." |
| 2460 | 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 | 2627 | #~ msgid "Predefined color schemes" |
| 2463 | 2628 | #~ msgstr "Esquemas de cor pré-definidos" |
| 2464 | 2629 | |
| ... | ... | @@ -2645,6 +2810,9 @@ msgstr "translator-credits" |
| 2645 | 2810 | #~ msgid "Revocation list" |
| 2646 | 2811 | #~ msgstr "Lista de revogados" |
| 2647 | 2812 | |
| 2813 | +#~ msgid "Right" | |
| 2814 | +#~ msgstr "Direita" | |
| 2815 | + | |
| 2648 | 2816 | #~ msgid "SOCKS4 Proxy: client is not reachable" |
| 2649 | 2817 | #~ msgstr "SOCKS4 Proxy: client is not reachable" |
| 2650 | 2818 | |
| ... | ... | @@ -2773,6 +2941,12 @@ msgstr "translator-credits" |
| 2773 | 2941 | #~ msgid "SSLv2/v3 read server hello A" |
| 2774 | 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 | 2950 | #~ msgid "Save copied data" |
| 2777 | 2951 | #~ msgstr "Salvar cópia" |
| 2778 | 2952 | |
| ... | ... | @@ -2782,6 +2956,9 @@ msgstr "translator-credits" |
| 2782 | 2956 | #~ msgid "Save copy to file" |
| 2783 | 2957 | #~ msgstr "Salvar cópia para arquivo" |
| 2784 | 2958 | |
| 2959 | +#~ msgid "Save desktop icon" | |
| 2960 | +#~ msgstr "Salvar ícone da área de trabalho" | |
| 2961 | + | |
| 2785 | 2962 | #~ msgid "Save desktop launcher" |
| 2786 | 2963 | #~ msgstr "Salvar lançador para área de trabalho" |
| 2787 | 2964 | |
| ... | ... | @@ -2800,9 +2977,6 @@ msgstr "translator-credits" |
| 2800 | 2977 | #~ msgid "Save terminal contents" |
| 2801 | 2978 | #~ msgstr "Salvar conteúdo da tela" |
| 2802 | 2979 | |
| 2803 | -#~ msgid "Save trace file" | |
| 2804 | -#~ msgstr "Salvar arquivo de trace" | |
| 2805 | - | |
| 2806 | 2980 | #~ msgid "Save trace to file" |
| 2807 | 2981 | #~ msgstr "Salvar trace para arquivo" |
| 2808 | 2982 | |
| ... | ... | @@ -2865,12 +3039,12 @@ msgstr "translator-credits" |
| 2865 | 3039 | #~ msgid "Security warning" |
| 2866 | 3040 | #~ msgstr "Alerta de segurança" |
| 2867 | 3041 | |
| 3042 | +#~ msgid "Select" | |
| 3043 | +#~ msgstr "Selecionar" | |
| 3044 | + | |
| 2868 | 3045 | #~ msgid "Select destination file" |
| 2869 | 3046 | #~ msgstr "Selecionar arquivo destino" |
| 2870 | 3047 | |
| 2871 | -#~ msgid "Select file" | |
| 2872 | -#~ msgstr "Selecionar arquivo" | |
| 2873 | - | |
| 2874 | 3048 | #~ msgid "Select file to receive" |
| 2875 | 3049 | #~ msgstr "Selecione arquivo a receber" |
| 2876 | 3050 | |
| ... | ... | @@ -2895,6 +3069,9 @@ msgstr "translator-credits" |
| 2895 | 3069 | #~ msgid "Select previous file" |
| 2896 | 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 | 3075 | #~ msgid "Select() failed when processing for events." |
| 2899 | 3076 | #~ msgstr "Select() falhou ao processar eventos." |
| 2900 | 3077 | |
| ... | ... | @@ -2913,9 +3090,6 @@ msgstr "translator-credits" |
| 2913 | 3090 | #~ msgid "Send an \"Enter\" action." |
| 2914 | 3091 | #~ msgstr "Envia um \"Enter\"." |
| 2915 | 3092 | |
| 2916 | -#~ msgid "Send file" | |
| 2917 | -#~ msgstr "Enviar arquivo" | |
| 2918 | - | |
| 2919 | 3093 | #~ msgid "Send file to host" |
| 2920 | 3094 | #~ msgstr "Enviar arquivo para o servidor" |
| 2921 | 3095 | |
| ... | ... | @@ -3048,9 +3222,6 @@ msgstr "translator-credits" |
| 3048 | 3222 | #~ msgid "Start upload." |
| 3049 | 3223 | #~ msgstr "Iniciar envio." |
| 3050 | 3224 | |
| 3051 | -#~ msgid "Starting" | |
| 3052 | -#~ msgstr "Iniciando" | |
| 3053 | - | |
| 3054 | 3225 | #~ msgid "Starting transfer" |
| 3055 | 3226 | #~ msgstr "Iniciando transferência" |
| 3056 | 3227 | |
| ... | ... | @@ -3060,6 +3231,9 @@ msgstr "translator-credits" |
| 3060 | 3231 | #~ msgid "State is 3270, TN3270e or SSCP" |
| 3061 | 3232 | #~ msgstr "Estado do terminal é 3270, TN3270e or SSCP" |
| 3062 | 3233 | |
| 3234 | +#~ msgid "Style" | |
| 3235 | +#~ msgstr "Estilo" | |
| 3236 | + | |
| 3063 | 3237 | #~ msgid "Subject issuer mismatch" |
| 3064 | 3238 | #~ msgstr "Divergência na identidade do emissor" |
| 3065 | 3239 | |
| ... | ... | @@ -3847,6 +4021,9 @@ msgstr "translator-credits" |
| 3847 | 4021 | #~ msgid "_Port:" |
| 3848 | 4022 | #~ msgstr "_Porta:" |
| 3849 | 4023 | |
| 4024 | +#~ msgid "_Properties" | |
| 4025 | +#~ msgstr "_Propriedades" | |
| 4026 | + | |
| 3850 | 4027 | #~ msgid "_Receive" |
| 3851 | 4028 | #~ msgstr "_Receber" |
| 3852 | 4029 | |
| ... | ... | @@ -3895,6 +4072,19 @@ msgstr "translator-credits" |
| 3895 | 4072 | #~ msgid "fcntl() error when getting socket state." |
| 3896 | 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 | 4088 | #~ msgid "ioctl(%s)" |
| 3899 | 4089 | #~ msgstr "ioctl(%s)" |
| 3900 | 4090 | ... | ... |
locale/pw3270.pot
| ... | ... | @@ -8,7 +8,7 @@ msgid "" |
| 8 | 8 | msgstr "" |
| 9 | 9 | "Project-Id-Version: PACKAGE VERSION\n" |
| 10 | 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 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
| 13 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
| 14 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
| ... | ... | @@ -17,17 +17,37 @@ msgstr "" |
| 17 | 17 | "Content-Type: text/plain; charset=CHARSET\n" |
| 18 | 18 | "Content-Transfer-Encoding: 8bit\n" |
| 19 | 19 | |
| 20 | -#: src/objects/application/application.c:208 | |
| 20 | +#: src/objects/application/application.c:206 | |
| 21 | 21 | #, c-format |
| 22 | 22 | msgid "\"%s\" is not a valid user interface name" |
| 23 | 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 | 38 | #, c-format |
| 27 | -msgid "3270 terminal emulator for GTK %d.%d" | |
| 39 | +msgid "3270 terminal emulator for %s." | |
| 28 | 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 | 51 | #: ui/application.xml:537 |
| 32 | 52 | msgid "About PW3270" |
| 33 | 53 | msgstr "" |
| ... | ... | @@ -36,23 +56,23 @@ msgstr "" |
| 36 | 56 | msgid "Action Name" |
| 37 | 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 | 60 | msgid "Action Names" |
| 41 | 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 | 64 | msgid "Alert sound" |
| 45 | 65 | msgstr "" |
| 46 | 66 | |
| 47 | -#: src/main/tools.c:99 | |
| 67 | +#: src/main/tools.c:99 src/tools/entry.c:88 | |
| 48 | 68 | msgid "All files" |
| 49 | 69 | msgstr "" |
| 50 | 70 | |
| 51 | -#: ui/window.xml:168 ui/application.xml:251 | |
| 71 | +#: ui/window.xml:178 ui/application.xml:251 | |
| 52 | 72 | msgid "Append to copy" |
| 53 | 73 | msgstr "" |
| 54 | 74 | |
| 55 | -#: src/objects/application/actions/about.c:126 | |
| 75 | +#: src/objects/application/actions/about.c:129 | |
| 56 | 76 | msgid "Apple version" |
| 57 | 77 | msgstr "" |
| 58 | 78 | |
| ... | ... | @@ -60,11 +80,15 @@ msgstr "" |
| 60 | 80 | msgid "Application" |
| 61 | 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 | 88 | msgid "Application preferences" |
| 65 | 89 | msgstr "" |
| 66 | 90 | |
| 67 | -#: src/objects/window/page.c:263 | |
| 91 | +#: src/objects/window/page.c:264 | |
| 68 | 92 | msgid "Apply" |
| 69 | 93 | msgstr "" |
| 70 | 94 | |
| ... | ... | @@ -72,15 +96,15 @@ msgstr "" |
| 72 | 96 | msgid "Auto-Reconnect" |
| 73 | 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 | 100 | msgid "Available" |
| 77 | 101 | msgstr "" |
| 78 | 102 | |
| 79 | -#: src/objects/application/actions/about.c:130 | |
| 103 | +#: src/objects/application/actions/about.c:132 | |
| 80 | 104 | msgid "Based on X3270 from" |
| 81 | 105 | msgstr "" |
| 82 | 106 | |
| 83 | -#: ui/window.xml:398 ui/application.xml:474 | |
| 107 | +#: ui/window.xml:408 ui/application.xml:474 | |
| 84 | 108 | msgid "Blank Fill" |
| 85 | 109 | msgstr "" |
| 86 | 110 | |
| ... | ... | @@ -92,21 +116,17 @@ msgstr "" |
| 92 | 116 | msgid "Bold" |
| 93 | 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 | 121 | msgstr "" |
| 98 | 122 | |
| 99 | -#: src/objects/window/terminal.c:197 | |
| 123 | +#: src/objects/window/terminal.c:160 | |
| 100 | 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 | 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 | 130 | msgid "Cancel" |
| 111 | 131 | msgstr "" |
| 112 | 132 | |
| ... | ... | @@ -114,7 +134,19 @@ msgstr "" |
| 114 | 134 | msgid "Change terminal colors" |
| 115 | 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 | 150 | msgid "Clear" |
| 119 | 151 | msgstr "" |
| 120 | 152 | |
| ... | ... | @@ -131,8 +163,8 @@ msgstr "" |
| 131 | 163 | msgid "Close the window" |
| 132 | 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 | 168 | msgid "Close window" |
| 137 | 169 | msgstr "" |
| 138 | 170 | |
| ... | ... | @@ -140,6 +172,10 @@ msgstr "" |
| 140 | 172 | msgid "Colors" |
| 141 | 173 | msgstr "" |
| 142 | 174 | |
| 175 | +#: src/objects/os/linux/savedesktopicon.c:101 | |
| 176 | +msgid "Comment" | |
| 177 | +msgstr "" | |
| 178 | + | |
| 143 | 179 | #: src/objects/window/actions/connect.c:59 |
| 144 | 180 | msgid "Connect" |
| 145 | 181 | msgstr "" |
| ... | ... | @@ -152,11 +188,15 @@ msgstr "" |
| 152 | 188 | msgid "Connect to host" |
| 153 | 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 | 192 | msgid "Connected to host" |
| 157 | 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 | 200 | msgid "Contributors" |
| 161 | 201 | msgstr "" |
| 162 | 202 | |
| ... | ... | @@ -164,6 +204,14 @@ msgstr "" |
| 164 | 204 | msgid "Copy" |
| 165 | 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 | 215 | #: ui/window.xml:163 ui/application.xml:246 |
| 168 | 216 | msgid "Copy as table" |
| 169 | 217 | msgstr "" |
| ... | ... | @@ -172,11 +220,11 @@ msgstr "" |
| 172 | 220 | msgid "Copy as text" |
| 173 | 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 | 225 | msgstr "" |
| 178 | 226 | |
| 179 | -#: ui/window.xml:359 ui/application.xml:459 | |
| 227 | +#: ui/window.xml:369 ui/application.xml:459 | |
| 180 | 228 | msgid "Cross hair cursor" |
| 181 | 229 | msgstr "" |
| 182 | 230 | |
| ... | ... | @@ -192,28 +240,24 @@ msgstr "" |
| 192 | 240 | msgid "Current session" |
| 193 | 241 | msgstr "" |
| 194 | 242 | |
| 195 | -#: ui/window.xml:173 ui/application.xml:256 | |
| 243 | +#: ui/window.xml:183 ui/application.xml:256 | |
| 196 | 244 | msgid "Cut" |
| 197 | 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 | 248 | msgid "Delete Field" |
| 201 | 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 | 252 | msgid "Disconnect" |
| 209 | 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 | 257 | msgid "Disconnected from host" |
| 214 | 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 | 261 | msgid "Dynamic font spacing" |
| 218 | 262 | msgstr "" |
| 219 | 263 | |
| ... | ... | @@ -237,15 +281,19 @@ msgstr "" |
| 237 | 281 | msgid "Enabled" |
| 238 | 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 | 289 | msgid "Erase input" |
| 242 | 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 | 293 | msgid "Erase to end of field" |
| 246 | 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 | 297 | msgid "Erase to end of line" |
| 250 | 298 | msgstr "" |
| 251 | 299 | |
| ... | ... | @@ -253,15 +301,11 @@ msgstr "" |
| 253 | 301 | msgid "Field attributes" |
| 254 | 302 | msgstr "" |
| 255 | 303 | |
| 256 | -#: src/objects/windows/savedesktopicon.c:62 | |
| 257 | -msgid "File name" | |
| 258 | -msgstr "" | |
| 259 | - | |
| 260 | 304 | #: ui/application.xml:454 |
| 261 | 305 | msgid "Full Screen" |
| 262 | 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 | 309 | msgid "Full screen" |
| 266 | 310 | msgstr "" |
| 267 | 311 | |
| ... | ... | @@ -269,6 +313,10 @@ msgstr "" |
| 269 | 313 | msgid "Function bar" |
| 270 | 314 | msgstr "" |
| 271 | 315 | |
| 316 | +#: src/objects/os/linux/savedesktopicon.c:94 | |
| 317 | +msgid "Generic name" | |
| 318 | +msgstr "" | |
| 319 | + | |
| 272 | 320 | #: ui/application.xml:36 ui/application.xml:534 |
| 273 | 321 | msgid "Help" |
| 274 | 322 | msgstr "" |
| ... | ... | @@ -277,11 +325,11 @@ msgstr "" |
| 277 | 325 | msgid "Host properties" |
| 278 | 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 | 329 | msgid "IBM 3270 Terminal emulator" |
| 282 | 330 | msgstr "" |
| 283 | 331 | |
| 284 | -#: src/objects/actions/view.c:89 | |
| 332 | +#: src/objects/actions/view.c:90 | |
| 285 | 333 | msgid "Icon" |
| 286 | 334 | msgstr "" |
| 287 | 335 | |
| ... | ... | @@ -289,19 +337,27 @@ msgstr "" |
| 289 | 337 | msgid "Icon Name" |
| 290 | 338 | msgstr "" |
| 291 | 339 | |
| 292 | -#: src/objects/toolbar/settings.c:50 | |
| 340 | +#: src/objects/toolbar/settings.c:54 | |
| 293 | 341 | msgid "Icon Size" |
| 294 | 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 | 349 | msgid "Icon _size" |
| 298 | 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 | 357 | msgid "Icons & text" |
| 302 | 358 | msgstr "" |
| 303 | 359 | |
| 304 | -#: src/objects/toolbar/toolbar.c:74 | |
| 360 | +#: src/objects/toolbar/models.c:87 | |
| 305 | 361 | msgid "Icons only" |
| 306 | 362 | msgstr "" |
| 307 | 363 | |
| ... | ... | @@ -309,7 +365,7 @@ msgstr "" |
| 309 | 365 | msgid "If the action can be activated" |
| 310 | 366 | msgstr "" |
| 311 | 367 | |
| 312 | -#: ui/window.xml:469 | |
| 368 | +#: ui/window.xml:484 | |
| 313 | 369 | msgid "Insert" |
| 314 | 370 | msgstr "" |
| 315 | 371 | |
| ... | ... | @@ -317,7 +373,15 @@ msgstr "" |
| 317 | 373 | msgid "Invalid or unknown property type" |
| 318 | 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 | 385 | msgid "Itens" |
| 322 | 386 | msgstr "" |
| 323 | 387 | |
| ... | ... | @@ -345,20 +409,24 @@ msgstr "" |
| 345 | 409 | msgid "Keypads" |
| 346 | 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 | 417 | msgid "Label" |
| 350 | 418 | msgstr "" |
| 351 | 419 | |
| 352 | -#: src/objects/toolbar/toolbar.c:58 | |
| 420 | +#: src/objects/toolbar/models.c:66 | |
| 353 | 421 | msgid "Large" |
| 354 | 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 | 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 | 430 | msgstr "" |
| 363 | 431 | |
| 364 | 432 | #: ui/application.xml:71 |
| ... | ... | @@ -369,11 +437,11 @@ msgstr "" |
| 369 | 437 | msgid "Main Toolbar" |
| 370 | 438 | msgstr "" |
| 371 | 439 | |
| 372 | -#: ui/window.xml:540 | |
| 440 | +#: ui/window.xml:555 | |
| 373 | 441 | msgid "Main menu" |
| 374 | 442 | msgstr "" |
| 375 | 443 | |
| 376 | -#: src/objects/application/actions/about.c:125 | |
| 444 | +#: src/objects/application/actions/about.c:128 | |
| 377 | 445 | msgid "Maintainers" |
| 378 | 446 | msgstr "" |
| 379 | 447 | |
| ... | ... | @@ -381,23 +449,23 @@ msgstr "" |
| 381 | 449 | msgid "Menu" |
| 382 | 450 | msgstr "" |
| 383 | 451 | |
| 384 | -#: ui/window.xml:506 ui/application.xml:403 | |
| 452 | +#: ui/window.xml:521 ui/application.xml:403 | |
| 385 | 453 | msgid "Model 2 - 80x24" |
| 386 | 454 | msgstr "" |
| 387 | 455 | |
| 388 | -#: ui/window.xml:511 ui/application.xml:408 | |
| 456 | +#: ui/window.xml:526 ui/application.xml:408 | |
| 389 | 457 | msgid "Model 3 - 80x32" |
| 390 | 458 | msgstr "" |
| 391 | 459 | |
| 392 | -#: ui/window.xml:516 ui/application.xml:413 | |
| 460 | +#: ui/window.xml:531 ui/application.xml:413 | |
| 393 | 461 | msgid "Model 4 - 80x43" |
| 394 | 462 | msgstr "" |
| 395 | 463 | |
| 396 | -#: ui/window.xml:521 ui/application.xml:418 | |
| 464 | +#: ui/window.xml:536 ui/application.xml:418 | |
| 397 | 465 | msgid "Model 5 - 132x27" |
| 398 | 466 | msgstr "" |
| 399 | 467 | |
| 400 | -#: ui/window.xml:376 ui/application.xml:444 | |
| 468 | +#: ui/window.xml:386 ui/application.xml:444 | |
| 401 | 469 | msgid "Monocase" |
| 402 | 470 | msgstr "" |
| 403 | 471 | |
| ... | ... | @@ -405,7 +473,7 @@ msgstr "" |
| 405 | 473 | msgid "Network keep alive" |
| 406 | 474 | msgstr "" |
| 407 | 475 | |
| 408 | -#: src/objects/window/page.c:274 | |
| 476 | +#: src/objects/window/page.c:275 | |
| 409 | 477 | msgid "New session name" |
| 410 | 478 | msgstr "" |
| 411 | 479 | |
| ... | ... | @@ -453,7 +521,7 @@ msgstr "" |
| 453 | 521 | msgid "Open session in New window" |
| 454 | 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 | 525 | msgid "Options" |
| 458 | 526 | msgstr "" |
| 459 | 527 | |
| ... | ... | @@ -461,22 +529,26 @@ msgstr "" |
| 461 | 529 | msgid "Parameter Type" |
| 462 | 530 | msgstr "" |
| 463 | 531 | |
| 464 | -#: ui/window.xml:286 ui/application.xml:261 | |
| 532 | +#: ui/window.xml:296 ui/application.xml:261 | |
| 465 | 533 | msgid "Paste from clipboard" |
| 466 | 534 | msgstr "" |
| 467 | 535 | |
| 468 | -#: ui/window.xml:296 ui/application.xml:271 | |
| 536 | +#: ui/window.xml:306 ui/application.xml:271 | |
| 469 | 537 | msgid "Paste from text file" |
| 470 | 538 | msgstr "" |
| 471 | 539 | |
| 472 | -#: ui/window.xml:291 ui/application.xml:266 | |
| 540 | +#: ui/window.xml:301 ui/application.xml:266 | |
| 473 | 541 | msgid "Paste next" |
| 474 | 542 | msgstr "" |
| 475 | 543 | |
| 476 | -#: ui/window.xml:393 ui/application.xml:469 | |
| 544 | +#: ui/window.xml:403 ui/application.xml:469 | |
| 477 | 545 | msgid "Paste with left margin" |
| 478 | 546 | msgstr "" |
| 479 | 547 | |
| 548 | +#: src/objects/os/linux/savedesktopicon.c:71 | |
| 549 | +msgid "Path for the new shortcut" | |
| 550 | +msgstr "" | |
| 551 | + | |
| 480 | 552 | #: ui/window.xml:129 |
| 481 | 553 | msgid "Preferences" |
| 482 | 554 | msgstr "" |
| ... | ... | @@ -485,11 +557,11 @@ msgstr "" |
| 485 | 557 | msgid "Print" |
| 486 | 558 | msgstr "" |
| 487 | 559 | |
| 488 | -#: ui/window.xml:439 | |
| 560 | +#: ui/window.xml:454 | |
| 489 | 561 | msgid "Print screen" |
| 490 | 562 | msgstr "" |
| 491 | 563 | |
| 492 | -#: ui/window.xml:252 | |
| 564 | +#: ui/window.xml:262 | |
| 493 | 565 | msgid "Print selected" |
| 494 | 566 | msgstr "" |
| 495 | 567 | |
| ... | ... | @@ -502,15 +574,15 @@ msgstr "" |
| 502 | 574 | msgid "Quit" |
| 503 | 575 | msgstr "" |
| 504 | 576 | |
| 505 | -#: src/objects/window/page.c:261 | |
| 577 | +#: src/objects/window/page.c:262 | |
| 506 | 578 | msgid "Rename Session" |
| 507 | 579 | msgstr "" |
| 508 | 580 | |
| 509 | -#: ui/window.xml:315 ui/application.xml:295 | |
| 581 | +#: ui/window.xml:325 ui/application.xml:295 | |
| 510 | 582 | msgid "Reselect" |
| 511 | 583 | msgstr "" |
| 512 | 584 | |
| 513 | -#: ui/window.xml:364 ui/application.xml:464 | |
| 585 | +#: ui/window.xml:374 ui/application.xml:464 | |
| 514 | 586 | msgid "Resize on alternate screen" |
| 515 | 587 | msgstr "" |
| 516 | 588 | |
| ... | ... | @@ -518,55 +590,59 @@ msgstr "" |
| 518 | 590 | msgid "Right keypad" |
| 519 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 623 | msgstr "" |
| 548 | 624 | |
| 549 | -#: ui/window.xml:503 ui/application.xml:400 | |
| 625 | +#: ui/window.xml:518 ui/application.xml:400 | |
| 550 | 626 | msgid "Screen size" |
| 551 | 627 | msgstr "" |
| 552 | 628 | |
| 553 | -#: ui/window.xml:310 ui/application.xml:285 | |
| 629 | +#: ui/window.xml:320 ui/application.xml:285 | |
| 554 | 630 | msgid "Select Field" |
| 555 | 631 | msgstr "" |
| 556 | 632 | |
| 557 | -#: ui/window.xml:305 ui/application.xml:280 | |
| 633 | +#: ui/window.xml:315 ui/application.xml:280 | |
| 558 | 634 | msgid "Select all" |
| 559 | 635 | msgstr "" |
| 560 | 636 | |
| 561 | -#: ui/window.xml:217 ui/application.xml:479 | |
| 637 | +#: ui/window.xml:227 ui/application.xml:479 | |
| 562 | 638 | msgid "Select by rectangles" |
| 563 | 639 | msgstr "" |
| 564 | 640 | |
| 565 | -#: src/objects/toolbar/settings.c:108 | |
| 641 | +#: src/objects/toolbar/settings.c:106 | |
| 566 | 642 | msgid "Select the toolbar itens" |
| 567 | 643 | msgstr "" |
| 568 | 644 | |
| 569 | -#: src/objects/toolbar/settings.c:113 | |
| 645 | +#: src/objects/toolbar/settings.c:111 | |
| 570 | 646 | msgid "Selected" |
| 571 | 647 | msgstr "" |
| 572 | 648 | |
| ... | ... | @@ -579,12 +655,12 @@ msgstr "" |
| 579 | 655 | msgid "Send/Receive" |
| 580 | 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 | 659 | #: ui/application.xml:195 |
| 584 | 660 | msgid "Send/Receive files" |
| 585 | 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 | 664 | msgid "Separator" |
| 589 | 665 | msgstr "" |
| 590 | 666 | |
| ... | ... | @@ -592,10 +668,14 @@ msgstr "" |
| 592 | 668 | msgid "Session" |
| 593 | 669 | msgstr "" |
| 594 | 670 | |
| 595 | -#: ui/application.xml:76 | |
| 671 | +#: ui/window.xml:440 ui/window.xml:560 ui/application.xml:76 | |
| 596 | 672 | msgid "Session Trace" |
| 597 | 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 | 679 | #: ui/window.xml:61 ui/application.xml:126 |
| 600 | 680 | msgid "Session in New Tab" |
| 601 | 681 | msgstr "" |
| ... | ... | @@ -604,12 +684,16 @@ msgstr "" |
| 604 | 684 | msgid "Session in new window" |
| 605 | 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 | 694 | msgstr "" |
| 611 | 695 | |
| 612 | -#: src/objects/application/application.c:221 | |
| 696 | +#: src/objects/application/application.c:219 | |
| 613 | 697 | msgid "Set the user-interface type" |
| 614 | 698 | msgstr "" |
| 615 | 699 | |
| ... | ... | @@ -617,34 +701,58 @@ msgstr "" |
| 617 | 701 | msgid "Settings" |
| 618 | 702 | msgstr "" |
| 619 | 703 | |
| 620 | -#: src/objects/toolbar/settings.c:207 | |
| 704 | +#: src/objects/toolbar/settings.c:176 | |
| 621 | 705 | msgid "Setup the toolbar layout" |
| 622 | 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 | 713 | msgid "Setup toolbar" |
| 626 | 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 | 728 | #: ui/application.xml:494 |
| 629 | 729 | msgid "Show Underline" |
| 630 | 730 | msgstr "" |
| 631 | 731 | |
| 632 | -#: ui/window.xml:231 | |
| 732 | +#: ui/window.xml:241 | |
| 633 | 733 | msgid "Show menu" |
| 634 | 734 | msgstr "" |
| 635 | 735 | |
| 636 | -#: ui/window.xml:226 | |
| 736 | +#: ui/window.xml:236 | |
| 637 | 737 | msgid "Show toolbar" |
| 638 | 738 | msgstr "" |
| 639 | 739 | |
| 640 | -#: src/objects/toolbar/toolbar.c:53 | |
| 740 | +#: src/objects/toolbar/models.c:61 | |
| 641 | 741 | msgid "Small" |
| 642 | 742 | msgstr "" |
| 643 | 743 | |
| 644 | -#: ui/window.xml:388 ui/application.xml:504 | |
| 744 | +#: ui/window.xml:398 ui/application.xml:504 | |
| 645 | 745 | msgid "Smart paste" |
| 646 | 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 | 756 | #: src/objects/actions/abstract.c:152 |
| 649 | 757 | msgid "State" |
| 650 | 758 | msgstr "" |
| ... | ... | @@ -653,11 +761,12 @@ msgstr "" |
| 653 | 761 | msgid "State Type" |
| 654 | 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 | 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 | 770 | msgid "System default" |
| 662 | 771 | msgstr "" |
| 663 | 772 | |
| ... | ... | @@ -673,7 +782,7 @@ msgstr "" |
| 673 | 782 | msgid "Terminal font" |
| 674 | 783 | msgstr "" |
| 675 | 784 | |
| 676 | -#: src/objects/toolbar/toolbar.c:79 | |
| 785 | +#: src/objects/toolbar/models.c:92 | |
| 677 | 786 | msgid "Text only" |
| 678 | 787 | msgstr "" |
| 679 | 788 | |
| ... | ... | @@ -693,6 +802,14 @@ msgstr "" |
| 693 | 802 | msgid "The code of the User interface type" |
| 694 | 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 | 813 | #: src/objects/actions/abstract.c:110 |
| 697 | 814 | msgid "The label for the action" |
| 698 | 815 | msgstr "" |
| ... | ... | @@ -701,11 +818,11 @@ msgstr "" |
| 701 | 818 | msgid "The name of associated action" |
| 702 | 819 | msgstr "" |
| 703 | 820 | |
| 704 | -#: src/objects/window/window.c:164 | |
| 821 | +#: src/objects/window/window.c:185 | |
| 705 | 822 | msgid "The name of the actions in the header bar" |
| 706 | 823 | msgstr "" |
| 707 | 824 | |
| 708 | -#: src/objects/toolbar/toolbar.c:136 | |
| 825 | +#: src/objects/toolbar/toolbar.c:98 | |
| 709 | 826 | msgid "The name of the actions in the toolbar" |
| 710 | 827 | msgstr "" |
| 711 | 828 | |
| ... | ... | @@ -729,15 +846,23 @@ msgstr "" |
| 729 | 846 | msgid "The position of the keypad" |
| 730 | 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 | 853 | #: src/objects/actions/abstract.c:153 |
| 733 | 854 | msgid "The state the action is in" |
| 734 | 855 | msgstr "" |
| 735 | 856 | |
| 736 | -#: src/objects/toolbar/toolbar.c:147 | |
| 857 | +#: src/objects/toolbar/toolbar.c:109 | |
| 737 | 858 | msgid "The toolbar icon size" |
| 738 | 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 | 866 | msgid "The toolbar style" |
| 742 | 867 | msgstr "" |
| 743 | 868 | |
| ... | ... | @@ -753,12 +878,28 @@ msgstr "" |
| 753 | 878 | msgid "The type of the state kept by the action" |
| 754 | 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 | 890 | #: ui/application.xml:342 |
| 758 | 891 | msgid "Toolbar" |
| 759 | 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 | 903 | msgid "Top menu" |
| 763 | 904 | msgstr "" |
| 764 | 905 | |
| ... | ... | @@ -766,7 +907,7 @@ msgstr "" |
| 766 | 907 | msgid "Trace" |
| 767 | 908 | msgstr "" |
| 768 | 909 | |
| 769 | -#: ui/window.xml:474 ui/application.xml:449 | |
| 910 | +#: ui/window.xml:489 ui/application.xml:449 | |
| 770 | 911 | msgid "Track Cursor" |
| 771 | 912 | msgstr "" |
| 772 | 913 | |
| ... | ... | @@ -774,7 +915,7 @@ msgstr "" |
| 774 | 915 | msgid "UI Type" |
| 775 | 916 | msgstr "" |
| 776 | 917 | |
| 777 | -#: ui/window.xml:257 ui/application.xml:290 | |
| 918 | +#: ui/window.xml:267 ui/application.xml:290 | |
| 778 | 919 | msgid "Unselect" |
| 779 | 920 | msgstr "" |
| 780 | 921 | |
| ... | ... | @@ -782,34 +923,38 @@ msgstr "" |
| 782 | 923 | msgid "Use +/- for field navigation" |
| 783 | 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 | 927 | #, c-format |
| 788 | 928 | msgid "Version %s-%s" |
| 789 | 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 | 932 | #: ui/application.xml:63 |
| 793 | 933 | msgid "View" |
| 794 | 934 | msgstr "" |
| 795 | 935 | |
| 936 | +#: src/objects/application/actions/about.c:163 | |
| 937 | +msgid "View this project on github" | |
| 938 | +msgstr "" | |
| 939 | + | |
| 796 | 940 | #: ui/window.xml:40 ui/application.xml:105 |
| 797 | 941 | msgid "Window with default session" |
| 798 | 942 | msgstr "" |
| 799 | 943 | |
| 800 | -#: src/objects/settings/dialog.c:84 | |
| 944 | +#: src/objects/settings/dialog.c:79 | |
| 801 | 945 | msgid "_Apply" |
| 802 | 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 | 950 | msgid "_Cancel" |
| 806 | 951 | msgstr "" |
| 807 | 952 | |
| 808 | -#: src/objects/window/page.c:394 | |
| 953 | +#: src/objects/window/page.c:371 | |
| 809 | 954 | msgid "_Close session" |
| 810 | 955 | msgstr "" |
| 811 | 956 | |
| 812 | -#: ui/window.xml:549 ui/application.xml:368 | |
| 957 | +#: ui/window.xml:569 ui/application.xml:368 | |
| 813 | 958 | msgid "_Connect" |
| 814 | 959 | msgstr "" |
| 815 | 960 | |
| ... | ... | @@ -817,7 +962,7 @@ msgstr "" |
| 817 | 962 | msgid "_Disconnect" |
| 818 | 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 | 966 | msgid "_Edit" |
| 822 | 967 | msgstr "" |
| 823 | 968 | |
| ... | ... | @@ -837,15 +982,15 @@ msgstr "" |
| 837 | 982 | msgid "_Open" |
| 838 | 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 | 987 | msgstr "" |
| 843 | 988 | |
| 844 | -#: src/objects/window/page.c:388 | |
| 989 | +#: src/objects/window/page.c:365 | |
| 845 | 990 | msgid "_Rename session" |
| 846 | 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 | 994 | msgid "_Save" |
| 850 | 995 | msgstr "" |
| 851 | 996 | |
| ... | ... | @@ -853,6 +998,10 @@ msgstr "" |
| 853 | 998 | msgid "_View" |
| 854 | 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 | 1006 | msgid "translator-credits" |
| 858 | 1007 | msgstr "" | ... | ... |
pw3270.cbp
| ... | ... | @@ -43,13 +43,18 @@ |
| 43 | 43 | <Unit filename="Makefile.in" /> |
| 44 | 44 | <Unit filename="configure.ac" /> |
| 45 | 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 | 49 | <Unit filename="src/include/pw3270.h" /> |
| 47 | 50 | <Unit filename="src/include/pw3270/actions.h" /> |
| 48 | 51 | <Unit filename="src/include/pw3270/application.h" /> |
| 49 | 52 | <Unit filename="src/include/pw3270/keypad.h" /> |
| 50 | 53 | <Unit filename="src/include/pw3270/settings.h" /> |
| 51 | 54 | <Unit filename="src/include/pw3270/toolbar.h" /> |
| 55 | + <Unit filename="src/include/pw3270/tools.h" /> | |
| 52 | 56 | <Unit filename="src/include/pw3270/window.h" /> |
| 57 | + <Unit filename="src/include/v3270/keyfile.h" /> | |
| 53 | 58 | <Unit filename="src/main/main.c"> |
| 54 | 59 | <Option compilerVar="CC" /> |
| 55 | 60 | </Unit> |
| ... | ... | @@ -126,7 +131,13 @@ |
| 126 | 131 | <Unit filename="src/objects/keypad/widget.c"> |
| 127 | 132 | <Option compilerVar="CC" /> |
| 128 | 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 | 141 | <Option compilerVar="CC" /> |
| 131 | 142 | </Unit> |
| 132 | 143 | <Unit filename="src/objects/settings/dialog.c"> |
| ... | ... | @@ -138,6 +149,9 @@ |
| 138 | 149 | <Unit filename="src/objects/toolbar/actions.c"> |
| 139 | 150 | <Option compilerVar="CC" /> |
| 140 | 151 | </Unit> |
| 152 | + <Unit filename="src/objects/toolbar/models.c"> | |
| 153 | + <Option compilerVar="CC" /> | |
| 154 | + </Unit> | |
| 141 | 155 | <Unit filename="src/objects/toolbar/private.h" /> |
| 142 | 156 | <Unit filename="src/objects/toolbar/settings.c"> |
| 143 | 157 | <Option compilerVar="CC" /> |
| ... | ... | @@ -163,9 +177,15 @@ |
| 163 | 177 | <Unit filename="src/objects/window/actions/setcolors.c"> |
| 164 | 178 | <Option compilerVar="CC" /> |
| 165 | 179 | </Unit> |
| 180 | + <Unit filename="src/objects/window/header-settings.c"> | |
| 181 | + <Option compilerVar="CC" /> | |
| 182 | + </Unit> | |
| 166 | 183 | <Unit filename="src/objects/window/header.c"> |
| 167 | 184 | <Option compilerVar="CC" /> |
| 168 | 185 | </Unit> |
| 186 | + <Unit filename="src/objects/window/keyfile.c"> | |
| 187 | + <Option compilerVar="CC" /> | |
| 188 | + </Unit> | |
| 169 | 189 | <Unit filename="src/objects/window/page.c"> |
| 170 | 190 | <Option compilerVar="CC" /> |
| 171 | 191 | </Unit> |
| ... | ... | @@ -179,7 +199,7 @@ |
| 179 | 199 | <Unit filename="src/objects/window/window.c"> |
| 180 | 200 | <Option compilerVar="CC" /> |
| 181 | 201 | </Unit> |
| 182 | - <Unit filename="src/objects/windows/savedesktopicon.c"> | |
| 202 | + <Unit filename="src/tools/entry.c"> | |
| 183 | 203 | <Option compilerVar="CC" /> |
| 184 | 204 | </Unit> |
| 185 | 205 | <Unit filename="ui/application.xml" /> | ... | ... |
rpm/_service
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | <param name="changesgenerate">enable</param> |
| 9 | 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 | 12 | <param name="scm">git</param> |
| 13 | 13 | </service> |
| 14 | 14 | ... | ... |
rpm/pw3270.spec
| ... | ... | @@ -22,17 +22,17 @@ |
| 22 | 22 | |
| 23 | 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 | 37 | Requires: shared-mime-info |
| 38 | 38 | Requires: %{name}-branding = %{version} |
| ... | ... | @@ -41,7 +41,6 @@ BuildRequires: update-desktop-files |
| 41 | 41 | |
| 42 | 42 | %glib2_gsettings_schema_requires |
| 43 | 43 | |
| 44 | - | |
| 45 | 44 | #--[ Setup by distribution ]------------------------------------------------------------------------------------------ |
| 46 | 45 | # |
| 47 | 46 | # References: |
| ... | ... | @@ -56,7 +55,7 @@ BuildRequires: update-desktop-files |
| 56 | 55 | BuildRequires: gtk3-devel |
| 57 | 56 | BuildRequires: glib2-devel |
| 58 | 57 | BuildRequires: librsvg2-tools |
| 59 | -BuildRequires: libv3270-devel >= %{version} | |
| 58 | +BuildRequires: libv3270-devel >= 5.3 | |
| 60 | 59 | |
| 61 | 60 | %endif |
| 62 | 61 | |
| ... | ... | @@ -66,7 +65,7 @@ BuildRequires: libv3270-devel >= %{version} |
| 66 | 65 | |
| 67 | 66 | BuildRequires: gtk3-devel |
| 68 | 67 | BuildRequires: glib2-devel |
| 69 | -BuildRequires: libv3270-devel | |
| 68 | +BuildRequires: libv3270-devel >= 5.3 | |
| 70 | 69 | |
| 71 | 70 | # Required for genmarshal |
| 72 | 71 | BuildRequires: python |
| ... | ... | @@ -79,7 +78,7 @@ BuildRequires: python |
| 79 | 78 | |
| 80 | 79 | BuildRequires: pkgconfig(gtk+-3.0) |
| 81 | 80 | BuildRequires: pkgconfig(glib-2.0) |
| 82 | -BuildRequires: pkgconfig(libv3270) >= %{version} | |
| 81 | +BuildRequires: pkgconfig(libv3270) >= 5.3 | |
| 83 | 82 | |
| 84 | 83 | %endif |
| 85 | 84 | |
| ... | ... | @@ -89,7 +88,7 @@ BuildRequires: pkgconfig(libv3270) >= %{version} |
| 89 | 88 | |
| 90 | 89 | BuildRequires: pkgconfig(gtk+-3.0) |
| 91 | 90 | BuildRequires: pkgconfig(glib-2.0) |
| 92 | -BuildRequires: pkgconfig(libv3270) >= %{version} | |
| 91 | +BuildRequires: pkgconfig(libv3270) >= 5.3 | |
| 93 | 92 | |
| 94 | 93 | %endif |
| 95 | 94 | |
| ... | ... | @@ -192,6 +191,7 @@ make all -j1 |
| 192 | 191 | %{_datadir}/%{_product}/*.png |
| 193 | 192 | %{_datadir}/applications/*.desktop |
| 194 | 193 | %{_datadir}/pixmaps/*.png |
| 194 | +%{_datadir}/mime/packages/*.xml | |
| 195 | 195 | |
| 196 | 196 | %files keypads |
| 197 | 197 | %{_datadir}/%{_product}/keypad/* | ... | ... |
schemas/linux/window.gschema.xml.in
| ... | ... | @@ -82,19 +82,37 @@ |
| 82 | 82 | |
| 83 | 83 | <key name="toolbar-icon-size" type="i"> |
| 84 | 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 | 104 | <description></description> |
| 87 | 105 | </key> |
| 88 | 106 | |
| 89 | 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 | 109 | <summary>The toolbar action list</summary> |
| 92 | 110 | <description></description> |
| 93 | 111 | </key> |
| 94 | 112 | |
| 95 | 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 | 116 | <description></description> |
| 99 | 117 | </key> |
| 100 | 118 | ... | ... |
schemas/windows/window.gschema.xml.in
| ... | ... | @@ -82,7 +82,25 @@ |
| 82 | 82 | |
| 83 | 83 | <key name="toolbar-icon-size" type="i"> |
| 84 | 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 | 104 | <description></description> |
| 87 | 105 | </key> |
| 88 | 106 | ... | ... |
src/include/pw3270.h
| ... | ... | @@ -68,13 +68,6 @@ |
| 68 | 68 | |
| 69 | 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 | 71 | G_END_DECLS |
| 79 | 72 | |
| 80 | 73 | #endif // PW3270_H_INCLUDED | ... | ... |
src/include/pw3270/actions.h
| ... | ... | @@ -90,15 +90,26 @@ |
| 90 | 90 | // |
| 91 | 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 | 101 | GtkWidget * pw3270_action_view_new(); |
| 94 | - Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); | |
| 95 | - void pw3270_action_list_free(Pw3270ActionList *action_list); | |
| 96 | 102 | void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); |
| 103 | + void pw3270_action_view_order_by_label(GtkWidget *view); | |
| 97 | 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 | 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 | 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 | 115 | // Tools |
| ... | ... | @@ -109,8 +120,8 @@ |
| 109 | 120 | |
| 110 | 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 | 126 | G_END_DECLS |
| 116 | 127 | ... | ... |
src/include/pw3270/application.h
| ... | ... | @@ -73,6 +73,10 @@ |
| 73 | 73 | |
| 74 | 74 | // Plugins |
| 75 | 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 | 80 | GSList * pw3270_application_get_plugins(GApplication *app); |
| 77 | 81 | |
| 78 | 82 | // Tools |
| ... | ... | @@ -84,6 +88,10 @@ |
| 84 | 88 | void pw3270_application_print_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); |
| 85 | 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 | 95 | G_END_DECLS |
| 88 | 96 | |
| 89 | 97 | ... | ... |
src/include/pw3270/settings.h
| ... | ... | @@ -36,6 +36,7 @@ |
| 36 | 36 | #endif // _WIN32 |
| 37 | 37 | |
| 38 | 38 | #include <gtk/gtk.h> |
| 39 | + #include <pw3270/actions.h> | |
| 39 | 40 | |
| 40 | 41 | G_BEGIN_DECLS |
| 41 | 42 | |
| ... | ... | @@ -87,8 +88,23 @@ |
| 87 | 88 | typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass; |
| 88 | 89 | |
| 89 | 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 | 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 | 110 | #endif // V3270SETTINGS_H_INCLUDED | ... | ... |
src/include/pw3270/toolbar.h
| ... | ... | @@ -66,9 +66,11 @@ |
| 66 | 66 | |
| 67 | 67 | void pw3270_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style); |
| 68 | 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 | 71 | GtkToolbarStyle pw3270_toolbar_get_style(GtkToolbar *toolbar); |
| 71 | 72 | GtkIconSize pw3270_toolbar_get_icon_size(GtkToolbar *toolbar); |
| 73 | + gint pw3270_toolbar_get_icon_type(GtkToolbar *toolbar); | |
| 72 | 74 | |
| 73 | 75 | G_END_DECLS |
| 74 | 76 | ... | ... |
| ... | ... | @@ -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 | 94 | { |
| 95 | 95 | g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL); |
| 96 | 96 | g_autofree gchar * locdir = g_build_filename(appdir,"locale",NULL); |
| 97 | + debug("Locale from \"%s\"\n",locdir); | |
| 97 | 98 | bindtextdomain( PACKAGE_NAME, locdir ); |
| 98 | 99 | } |
| 99 | 100 | #endif // _WIN32 | ... | ... |
src/main/windows/resources.rc.in
| ... | ... | @@ -16,7 +16,7 @@ BEGIN |
| 16 | 16 | VALUE "CompanyName", "Banco do Brasil S/A.\0" |
| 17 | 17 | VALUE "FileVersion", "@WIN32_VERSION@\0" |
| 18 | 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 | 20 | VALUE "ProductName", "@PRODUCT_NAME@\0" |
| 21 | 21 | VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.@PACKAGE_MINOR_RELEASE@\0" |
| 22 | 22 | END | ... | ... |
src/objects/actions/button.c
| ... | ... | @@ -35,14 +35,19 @@ |
| 35 | 35 | #include "private.h" |
| 36 | 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 | 40 | if(!action) |
| 41 | 41 | return NULL; |
| 42 | 42 | |
| 43 | 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 | 49 | return gtk_button_new_from_icon_name(icon_name,icon_size); |
| 50 | + } | |
| 46 | 51 | |
| 47 | 52 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK); |
| 48 | 53 | |
| ... | ... | @@ -62,7 +67,7 @@ |
| 62 | 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 | 72 | if(!action) |
| 68 | 73 | return NULL; |
| ... | ... | @@ -75,14 +80,18 @@ |
| 75 | 80 | } |
| 76 | 81 | |
| 77 | 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 | 84 | if(icon_name) { |
| 81 | 85 | |
| 82 | 86 | // Has icon name |
| 83 | 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 | 96 | if(tooltip) |
| 88 | 97 | gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); | ... | ... |
src/objects/actions/save.c
| ... | ... | @@ -34,21 +34,47 @@ |
| 34 | 34 | |
| 35 | 35 | #include "private.h" |
| 36 | 36 | #include <v3270.h> |
| 37 | + #include <v3270/keyfile.h> | |
| 37 | 38 | #include <pw3270.h> |
| 38 | 39 | #include <pw3270/application.h> |
| 39 | - | |
| 40 | + #include <v3270/tools.h> | |
| 41 | + #include <v3270/settings.h> | |
| 40 | 42 | |
| 41 | 43 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 42 | 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 | 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 | 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 | 79 | return G_ACTION(action); |
| 54 | 80 | |
| ... | ... | @@ -56,41 +82,119 @@ |
| 56 | 82 | |
| 57 | 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 | 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 | 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 | 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 | 164 | return dialog; |
| 165 | + | |
| 82 | 166 | } |
| 83 | 167 | |
| 84 | 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 | 45 | }; |
| 46 | 46 | |
| 47 | 47 | struct ListElement { |
| 48 | - GAction * action; | |
| 48 | +// GAction * action; | |
| 49 | 49 | GdkPixbuf * pixbuf; |
| 50 | - gchar name[1]; | |
| 50 | + gchar * action_name; | |
| 51 | + gchar * action_label; | |
| 51 | 52 | }; |
| 52 | 53 | |
| 53 | 54 | static void list_element_free(struct ListElement *element); |
| ... | ... | @@ -106,7 +107,7 @@ |
| 106 | 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 | 112 | GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); |
| 112 | 113 | |
| ... | ... | @@ -118,68 +119,38 @@ |
| 118 | 119 | COLUMN_PIXBUF, pixbuf, |
| 119 | 120 | COLUMN_LABEL, label, |
| 120 | 121 | COLUMN_ACTION_NAME, action_name, |
| 121 | - COLUMN_FLAGS, flags, | |
| 122 | + COLUMN_FLAGS, (gint) flags, | |
| 122 | 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 | 142 | GtkTreeIter iter; |
| 168 | 143 | gtk_list_store_append(store, &iter); |
| 169 | 144 | gtk_list_store_set( |
| 170 | 145 | store, |
| 171 | 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 | 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 | 156 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { |
| ... | ... | @@ -190,8 +161,7 @@ |
| 190 | 161 | while(item) { |
| 191 | 162 | |
| 192 | 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 | 166 | pw3270_action_view_append_element(store, element); |
| 197 | 167 | list_element_free(element); |
| ... | ... | @@ -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 | 194 | if(!action) |
| 225 | 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 | 197 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK); |
| 233 | 198 | if(!pixbuf) { |
| 234 | 199 | debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action)); |
| 235 | 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 | 226 | Pw3270ActionList * pw3270_action_list_new(GtkApplication *application) { |
| ... | ... | @@ -262,7 +234,7 @@ |
| 262 | 234 | |
| 263 | 235 | action_names = g_action_group_list_actions(G_ACTION_GROUP(application)); |
| 264 | 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 | 239 | g_strfreev(action_names); |
| 268 | 240 | |
| ... | ... | @@ -274,7 +246,7 @@ |
| 274 | 246 | // Get window actions. |
| 275 | 247 | action_names = g_action_group_list_actions(G_ACTION_GROUP(window)); |
| 276 | 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 | 251 | g_strfreev(action_names); |
| 280 | 252 | |
| ... | ... | @@ -283,6 +255,32 @@ |
| 283 | 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 | 284 | void list_element_free(struct ListElement *element) { |
| 287 | 285 | |
| 288 | 286 | if(element->pixbuf) { |
| ... | ... | @@ -338,7 +336,7 @@ |
| 338 | 336 | gint flags = g_value_get_int(&vFlags); |
| 339 | 337 | g_value_unset(&vFlags); |
| 340 | 338 | |
| 341 | - if(flags & 1) { | |
| 339 | + if(flags & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD) { | |
| 342 | 340 | |
| 343 | 341 | // Add on target widget. |
| 344 | 342 | GValue pixbuf = G_VALUE_INIT; |
| ... | ... | @@ -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 | 372 | // Remove from source widget. |
| 375 | 373 | gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); |
| ... | ... | @@ -411,3 +409,70 @@ |
| 411 | 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 | 33 | |
| 34 | 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 | 36 | GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); |
| 53 | 37 | |
| 54 | 38 | // Get application logo |
| ... | ... | @@ -82,18 +66,37 @@ |
| 82 | 66 | |
| 83 | 67 | // Set version |
| 84 | 68 | { |
| 69 | + g_autofree gchar * version = g_strdup_printf( | |
| 70 | + _("Version %s-%s"), | |
| 71 | + PACKAGE_VERSION, | |
| 85 | 72 | #ifdef PACKAGE_RELEASE |
| 86 | - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,PACKAGE_RELEASE); | |
| 73 | + PACKAGE_RELEASE | |
| 87 | 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 | 79 | gtk_about_dialog_set_version(dialog,version); |
| 92 | 80 | } |
| 93 | 81 | |
| 94 | 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 | 100 | gtk_about_dialog_set_comments(dialog, comments); |
| 98 | 101 | } |
| 99 | 102 | |
| ... | ... | @@ -126,22 +129,39 @@ |
| 126 | 129 | gtk_about_dialog_add_credit_section(dialog, _("Apple version"), apple); |
| 127 | 130 | gtk_about_dialog_add_credit_section (dialog, _("Contributors"), contributors); |
| 128 | 131 | |
| 129 | - | |
| 130 | 132 | gtk_about_dialog_add_credit_section(dialog, _("Based on X3270 from"), references); |
| 131 | 133 | |
| 132 | 134 | } |
| 133 | 135 | |
| 134 | 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 | 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 | 165 | gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); |
| 146 | 166 | |
| 147 | 167 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); |
| ... | ... | @@ -149,6 +169,13 @@ |
| 149 | 169 | g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); |
| 150 | 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 | 179 | return GTK_WIDGET(dialog); |
| 153 | 180 | |
| 154 | 181 | } | ... | ... |
src/objects/application/actions/preferences.c
| ... | ... | @@ -34,14 +34,11 @@ |
| 34 | 34 | #include <pw3270/settings.h> |
| 35 | 35 | #include <pw3270/toolbar.h> |
| 36 | 36 | |
| 37 | - | |
| 38 | -// gtk_window_set_title(GTK_WINDOW(dialog),action->label); | |
| 39 | - | |
| 40 | 37 | static GtkWidget * factory(PW3270Action * action, GtkApplication *application) { |
| 41 | 38 | |
| 42 | 39 | size_t ix; |
| 43 | 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 | 43 | gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); |
| 47 | 44 | gtk_window_set_attached_to(GTK_WINDOW(dialog), GTK_WIDGET(window)); |
| ... | ... | @@ -55,6 +52,16 @@ |
| 55 | 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 | 65 | gtk_widget_show_all(dialog); |
| 59 | 66 | |
| 60 | 67 | return dialog; |
| ... | ... | @@ -68,6 +75,7 @@ |
| 68 | 75 | action->name = "preferences"; |
| 69 | 76 | action->label = _("Application preferences"); |
| 70 | 77 | action->icon_name = "preferences-system"; |
| 78 | + action->tooltip = _("Change the application preferences"); | |
| 71 | 79 | |
| 72 | 80 | return G_ACTION(action); |
| 73 | 81 | } | ... | ... |
src/objects/application/actions/window.c
| ... | ... | @@ -69,7 +69,7 @@ |
| 69 | 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 | 74 | debug("%s",__FUNCTION__); |
| 75 | 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 | 173 | |
| 174 | 174 | } |
| 175 | 175 | |
| 176 | - | |
| 177 | 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 | 178 | g_autoptr(GSettings) app_settings = pw3270_application_settings_new(); |
| 184 | 179 | g_autoptr(GSettings) win_settings = pw3270_application_window_settings_new(); |
| 185 | 180 | |
| ... | ... | @@ -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 | 491 | GSettings * pw3270_application_settings_new() { |
| 470 | 492 | |
| 471 | 493 | GSettings *settings = NULL; |
| ... | ... | @@ -510,3 +532,4 @@ |
| 510 | 532 | g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); |
| 511 | 533 | return PW3270_APPLICATION(app)->keypads; |
| 512 | 534 | } |
| 535 | + | ... | ... |
src/objects/application/open.c
| ... | ... | @@ -29,22 +29,54 @@ |
| 29 | 29 | |
| 30 | 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 | 71 | void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) { |
| 33 | 72 | |
| 34 | 73 | GtkWidget * window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))); |
| 35 | - | |
| 74 | + size_t path, subdir; | |
| 36 | 75 | gint file; |
| 37 | 76 | |
| 38 | 77 | for(file = 0; file < n_files; file++) { |
| 39 | 78 | |
| 40 | 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 | 81 | if(!path) { |
| 50 | 82 | |
| ... | ... | @@ -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 | 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 | 169 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); |
| 170 | 170 | |
| ... | ... | @@ -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 | 208 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); |
| 209 | 209 | ... | ... |
src/objects/keypad/load.c
| ... | ... | @@ -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 | 87 | debug("%s(%s)",__FUNCTION__,element_name); |
| 88 | 88 | ... | ... |
src/objects/linux/savedesktopicon.c
| ... | ... | @@ -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 | -} |
| ... | ... | @@ -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 | + | ... | ... |
| ... | ... | @@ -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 | +} | ... | ... |
| ... | ... | @@ -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 | 71 | // Get use of header bar. |
| 72 | 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 | 74 | gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); |
| 80 | 75 | |
| 81 | 76 | gtk_dialog_add_buttons( |
| ... | ... | @@ -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 | 102 | #ifdef _WIN32 |
| 108 | 103 | |
| ... | ... | @@ -115,7 +110,7 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { |
| 115 | 110 | |
| 116 | 111 | #elif GTK_CHECK_VERSION(3,12,0) |
| 117 | 112 | |
| 118 | - gboolean use_header; | |
| 113 | + gboolean use_header = FALSE; | |
| 119 | 114 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); |
| 120 | 115 | |
| 121 | 116 | GtkWidget * dialog = |
| ... | ... | @@ -131,6 +126,8 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { |
| 131 | 126 | |
| 132 | 127 | #endif // GTK 3.12 |
| 133 | 128 | |
| 129 | + GTK_PW3270_SETTINGS_DIALOG(dialog)->has_subtitle = has_subtitle; | |
| 130 | + | |
| 134 | 131 | if(action) { |
| 135 | 132 | |
| 136 | 133 | if(PW3270_IS_ACTION(action)) { |
| ... | ... | @@ -202,6 +199,7 @@ void add(GtkContainer *container, GtkWidget *widget) { |
| 202 | 199 | settings->load(widget,settings->settings); |
| 203 | 200 | } |
| 204 | 201 | |
| 202 | + gtk_widget_show(widget); | |
| 205 | 203 | gtk_notebook_append_page( |
| 206 | 204 | GTK_PW3270_SETTINGS_DIALOG(container)->tabs, |
| 207 | 205 | widget, |
| ... | ... | @@ -216,20 +214,11 @@ void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint |
| 216 | 214 | |
| 217 | 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 | 65 | |
| 66 | 66 | if(!action) { |
| 67 | 67 | const gchar *ptr = strchr(name,'.'); |
| 68 | - | |
| 69 | 68 | if(ptr) { |
| 70 | 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 | 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 | 97 | if(item) { |
| 84 | 98 | |
| 85 | 99 | gtk_widget_show_all(GTK_WIDGET(item)); | ... | ... |
| ... | ... | @@ -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 | 37 | #define GETTEXT_PACKAGE PACKAGE_NAME |
| 38 | 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 | 43 | #include <libintl.h> |
| 41 | 44 | #include <glib/gi18n.h> |
| 42 | 45 | #include <gtk/gtk.h> |
| ... | ... | @@ -47,8 +50,9 @@ |
| 47 | 50 | G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action); |
| 48 | 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 | 57 | G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value); |
| 54 | 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 | 41 | /*--[ Constants ]------------------------------------------------------------------------------------*/ |
| 42 | 42 | |
| 43 | 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 | 48 | } comboboxes[] = { |
| 47 | 49 | |
| 48 | 50 | { |
| 51 | + .left = 0, | |
| 52 | + .top = 0, | |
| 49 | 53 | .name = "toolbar-icon-size", |
| 50 | 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 | 67 | .name = "toolbar-style", |
| 55 | - .label = N_("Style") | |
| 68 | + .label = N_("Toolbar Style") | |
| 56 | 69 | } |
| 57 | 70 | |
| 58 | 71 | }; |
| 59 | 72 | |
| 60 | 73 | struct _PW3270SettingsPrivate { |
| 61 | 74 | GtkWidget * views[2]; |
| 62 | - GtkWidget * buttons[2]; | |
| 63 | - GtkTreeModel * models[2]; | |
| 75 | +// GtkTreeModel * models[G_N_ELEMENTS(comboboxes)]; | |
| 64 | 76 | GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; |
| 65 | 77 | }; |
| 66 | 78 | |
| 67 | 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 | 81 | GtkWidget * pw3270_toolbar_settings_new() { |
| 84 | 82 | |
| 85 | 83 | size_t ix; |
| ... | ... | @@ -132,6 +130,7 @@ |
| 132 | 130 | |
| 133 | 131 | GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); |
| 134 | 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 | 134 | gtk_container_add(GTK_CONTAINER(box),page->views[ix]); |
| 136 | 135 | |
| 137 | 136 | gtk_grid_attach( |
| ... | ... | @@ -143,50 +142,20 @@ |
| 143 | 142 | } |
| 144 | 143 | |
| 145 | 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 | 147 | // Create buttons |
| 149 | - static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = { | |
| 150 | - "go-next", | |
| 151 | - "go-previous" | |
| 152 | - }; | |
| 153 | - | |
| 154 | 148 | GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); |
| 155 | 149 | gtk_widget_set_hexpand(box,FALSE); |
| 156 | 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 | 160 | gtk_grid_attach( |
| 192 | 161 | grid, |
| ... | ... | @@ -197,7 +166,7 @@ |
| 197 | 166 | } |
| 198 | 167 | |
| 199 | 168 | // |
| 200 | - // Create style & icon size settings. | |
| 169 | + // Create Combos. | |
| 201 | 170 | // |
| 202 | 171 | { |
| 203 | 172 | GtkGrid * grid = GTK_GRID(gtk_grid_new()); |
| ... | ... | @@ -213,25 +182,24 @@ |
| 213 | 182 | gtk_grid_set_column_spacing(grid,12); |
| 214 | 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 | 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 | 191 | GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label)); |
| 224 | 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 | 199 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE); |
| 232 | 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 | 241 | |
| 274 | 242 | // Load available actions. |
| 275 | 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 | 246 | pw3270_action_list_free(action_list); |
| 279 | 247 | |
| 280 | 248 | GtkTreeIter iter; |
| 281 | - | |
| 282 | 249 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { |
| 283 | 250 | |
| 284 | 251 | pw3270_model_get_iter_from_value( |
| ... | ... | @@ -298,13 +265,9 @@ |
| 298 | 265 | size_t ix; |
| 299 | 266 | g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); |
| 300 | 267 | |
| 301 | - debug("%s",__FUNCTION__); | |
| 302 | - | |
| 303 | 268 | g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]); |
| 304 | 269 | g_settings_set_string(settings,"toolbar-action-names",action_names); |
| 305 | 270 | |
| 306 | - debug("[%s]",action_names); | |
| 307 | - | |
| 308 | 271 | GtkTreeIter iter; |
| 309 | 272 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { |
| 310 | 273 | |
| ... | ... | @@ -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 | 38 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| 39 | 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 | 41 | enum { |
| 90 | 42 | PROP_NONE, |
| 91 | 43 | PROP_ACTION_NAMES, |
| 92 | 44 | PROP_ICON_SIZE, |
| 45 | + PROP_ICON_TYPE, | |
| 93 | 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 | 61 | struct _pw3270ToolBar { |
| 97 | 62 | GtkToolbar parent; |
| 98 | 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 | 93 | object_class, |
| 132 | 94 | PROP_ACTION_NAMES, |
| 133 | 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 | 99 | NULL, |
| 138 | 100 | G_PARAM_READABLE|G_PARAM_WRITABLE) |
| 139 | 101 | ); |
| ... | ... | @@ -142,8 +104,8 @@ |
| 142 | 104 | object_class, |
| 143 | 105 | PROP_ICON_SIZE, |
| 144 | 106 | g_param_spec_int( |
| 145 | - "icon-size", | |
| 146 | - "icon-size", | |
| 107 | + I_("icon-size"), | |
| 108 | + "icon size", | |
| 147 | 109 | _("The toolbar icon size"), |
| 148 | 110 | INT_MIN, |
| 149 | 111 | INT_MAX, |
| ... | ... | @@ -155,7 +117,7 @@ |
| 155 | 117 | object_class, |
| 156 | 118 | PROP_STYLE, |
| 157 | 119 | g_param_spec_int( |
| 158 | - "style", | |
| 120 | + I_("style"), | |
| 159 | 121 | "style", |
| 160 | 122 | _("The toolbar style"), |
| 161 | 123 | INT_MIN, |
| ... | ... | @@ -164,6 +126,19 @@ |
| 164 | 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 | 144 | void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { |
| ... | ... | @@ -181,6 +156,10 @@ |
| 181 | 156 | g_value_set_int(value,pw3270_toolbar_get_style(GTK_TOOLBAR(object))); |
| 182 | 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 | 163 | default: |
| 185 | 164 | g_assert_not_reached (); |
| 186 | 165 | } |
| ... | ... | @@ -203,42 +182,27 @@ |
| 203 | 182 | pw3270_toolbar_set_style(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value)); |
| 204 | 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 | 189 | default: |
| 207 | 190 | g_assert_not_reached (); |
| 208 | 191 | } |
| 209 | 192 | |
| 210 | 193 | } |
| 211 | 194 | |
| 212 | - | |
| 213 | 195 | static void detacher(GtkWidget *attach_widget, GtkMenu G_GNUC_UNUSED(*menu)) { |
| 214 | 196 | |
| 215 | 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 | 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 | 207 | gtk_container_add(GTK_CONTAINER(dialog),pw3270_toolbar_settings_new()); |
| 244 | 208 | |
| ... | ... | @@ -247,72 +211,36 @@ |
| 247 | 211 | gtk_window_set_attached_to(GTK_WINDOW(dialog), window); |
| 248 | 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 | 216 | gtk_widget_show_all(dialog); |
| 251 | 217 | |
| 252 | 218 | } |
| 253 | 219 | |
| 254 | 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 | 260 | |
| 333 | 261 | debug("%s button_number=%d",__FUNCTION__,button_number); |
| 334 | 262 | |
| 335 | - if(toolbar->popup.menu) { | |
| 263 | + if(toolbar->menu) { | |
| 336 | 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 | 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 | 268 | #endif |
| 341 | 269 | } |
| 342 | 270 | |
| ... | ... | @@ -355,22 +283,6 @@ |
| 355 | 283 | else |
| 356 | 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 | 286 | g_object_notify(G_OBJECT(toolbar), "style"); |
| 375 | 287 | |
| 376 | 288 | } |
| ... | ... | @@ -379,6 +291,46 @@ |
| 379 | 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 | 334 | void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size) { |
| 383 | 335 | |
| 384 | 336 | debug("%s(%d)",__FUNCTION__,(int) icon_size); |
| ... | ... | @@ -388,19 +340,6 @@ |
| 388 | 340 | else |
| 389 | 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 | 343 | // Store value |
| 405 | 344 | g_object_notify(G_OBJECT(toolbar), "icon-size"); |
| 406 | 345 | |
| ... | ... | @@ -424,16 +363,46 @@ |
| 424 | 363 | |
| 425 | 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 | 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 | 407 | g_object_notify(G_OBJECT(toolbar), "action-names"); |
| 439 | 408 | |
| ... | ... | @@ -464,71 +433,3 @@ |
| 464 | 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 | 33 | #include <v3270/settings.h> |
| 34 | 34 | #include <v3270/dialogs.h> |
| 35 | 35 | #include <v3270/colorscheme.h> |
| 36 | + #include <pw3270/application.h> | |
| 36 | 37 | |
| 37 | 38 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 38 | 39 | |
| ... | ... | @@ -42,7 +43,8 @@ |
| 42 | 43 | |
| 43 | 44 | action->name = "session.properties"; |
| 44 | 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 | 49 | return G_ACTION(action); |
| 48 | 50 | } |
| ... | ... | @@ -52,7 +54,6 @@ |
| 52 | 54 | size_t ix; |
| 53 | 55 | |
| 54 | 56 | GtkWidget * dialog = v3270_settings_dialog_new(); |
| 55 | - | |
| 56 | 57 | gtk_window_set_title(GTK_WINDOW(dialog), action->label); |
| 57 | 58 | |
| 58 | 59 | // Add settings pages. |
| ... | ... | @@ -68,6 +69,12 @@ |
| 68 | 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 | 78 | // Setup dialog box |
| 72 | 79 | gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal))); |
| 73 | 80 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | ... | ... |
| ... | ... | @@ -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 | 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 | 124 | GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) { |
| 116 | 125 | |
| 117 | 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 | 130 | if(g_str_has_prefix(action_name,"menu.")) { |
| 120 | 131 | |
| ... | ... | @@ -127,45 +138,33 @@ |
| 127 | 138 | gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); |
| 128 | 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 | 168 | return button; |
| 170 | 169 | } |
| 171 | 170 | ... | ... |
| ... | ... | @@ -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 | 35 | #include <v3270/dialogs.h> |
| 36 | 36 | #include <v3270/actions.h> |
| 37 | 37 | #include <v3270/print.h> |
| 38 | + #include <v3270/keyfile.h> | |
| 38 | 39 | #include <pw3270.h> |
| 39 | 40 | |
| 40 | 41 | //---[ Gtk Label with customized popup-menu ]--------------------------------------------------------------------------------------- |
| ... | ... | @@ -302,30 +303,6 @@ |
| 302 | 303 | // Show dialog. |
| 303 | 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 | 308 | static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) { |
| ... | ... | @@ -387,7 +364,7 @@ |
| 387 | 364 | { |
| 388 | 365 | .label = N_("_Rename session"), |
| 389 | 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 | 90 | G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void); |
| 91 | 91 | G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void); |
| 92 | 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 | 94 | G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void); |
| 95 | 95 | |
| 96 | 96 | GAction * pw3270_action_session_properties_new(void); | ... | ... |
src/objects/window/terminal.c
| ... | ... | @@ -40,82 +40,24 @@ |
| 40 | 40 | #include <lib3270/toggle.h> |
| 41 | 41 | #include <v3270/settings.h> |
| 42 | 42 | #include <v3270/actions.h> |
| 43 | + #include <v3270/keyfile.h> | |
| 43 | 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 | 61 | debug("%s(%u)",__FUNCTION__,(unsigned int) result); |
| 120 | 62 | |
| 121 | 63 | if(result != GTK_PRINT_OPERATION_RESULT_APPLY) |
| ... | ... | @@ -123,250 +65,113 @@ |
| 123 | 65 | |
| 124 | 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 | 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 | 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 | 128 | gtk_widget_show_all(terminal); |
| 263 | 129 | |
| 264 | - struct SessionDescriptor * descriptor = NULL; | |
| 265 | - | |
| 266 | 130 | if(session_file) { |
| 267 | 131 | |
| 268 | 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 | 135 | } else { |
| 273 | 136 | |
| 274 | 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 | 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 | 175 | return terminal; |
| 371 | 176 | } |
| 372 | 177 | |
| ... | ... | @@ -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 | 34 | #include <pw3270/actions.h> |
| 35 | 35 | #include <pw3270/keypad.h> |
| 36 | 36 | #include <v3270/settings.h> |
| 37 | + #include <v3270/keyfile.h> | |
| 37 | 38 | |
| 38 | 39 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| 39 | 40 | static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| ... | ... | @@ -142,6 +143,26 @@ |
| 142 | 143 | |
| 143 | 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 | 167 | GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass); |
| 147 | 168 | widget->destroy = destroy; |
| ... | ... | @@ -191,8 +212,8 @@ |
| 191 | 212 | if(!terminal) |
| 192 | 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 | 217 | return; |
| 197 | 218 | |
| 198 | 219 | g_key_file_set_boolean( |
| ... | ... | @@ -251,6 +272,16 @@ |
| 251 | 272 | |
| 252 | 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 | 285 | // Setup defaults |
| 255 | 286 | widget->state.width = 800; |
| 256 | 287 | widget->state.height = 500; |
| ... | ... | @@ -282,17 +313,86 @@ |
| 282 | 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 | 396 | GList * keypad; |
| 297 | 397 | |
| 298 | 398 | // Add top Keypads |
| ... | ... | @@ -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 | 454 | gtk_widget_show_all(GTK_WIDGET(widget->notebook)); |
| ... | ... | @@ -381,7 +472,7 @@ |
| 381 | 472 | pw3270_action_session_properties_new(), |
| 382 | 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 | 477 | pw3270_file_transfer_action_new(), |
| 387 | 478 | |
| ... | ... | @@ -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 | 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 | 662 | // Setup default position and size |
| ... | ... | @@ -704,7 +762,7 @@ |
| 704 | 762 | // Setup keypads |
| 705 | 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 | 767 | if(keyfile) { |
| 710 | 768 | ... | ... |
src/objects/windows/savedesktopicon.c
| ... | ... | @@ -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 | 155 | <section> |
| 156 | 156 | |
| 157 | 157 | <item> |
| 158 | - <attribute name="label" translatable="yes">Desktop icon</attribute> | |
| 158 | + <attribute name="label" translatable="yes">Shortcut for this session</attribute> | |
| 159 | 159 | <attribute name="action">win.save.launcher</attribute> |
| 160 | 160 | </item> |
| 161 | 161 | |
| 162 | 162 | <item> |
| 163 | - <attribute name="label" translatable="yes">Session properties</attribute> | |
| 163 | + <attribute name="label" translatable="yes">Session preferences</attribute> | |
| 164 | 164 | <attribute name="action">win.save.session.as</attribute> |
| 165 | 165 | </item> |
| 166 | 166 | ... | ... |
ui/window.xml
| ... | ... | @@ -90,13 +90,13 @@ |
| 90 | 90 | <section> |
| 91 | 91 | |
| 92 | 92 | <item> |
| 93 | - <attribute name="label" translatable="yes">Desktop icon</attribute> | |
| 93 | + <attribute name="label" translatable="yes">Shortcut for this session</attribute> | |
| 94 | 94 | <attribute name="action">win.save.launcher</attribute> |
| 95 | 95 | </item> |
| 96 | 96 | |
| 97 | 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 | 100 | </item> |
| 101 | 101 | |
| 102 | 102 | </section> |
| ... | ... | @@ -165,6 +165,16 @@ |
| 165 | 165 | </item> |
| 166 | 166 | |
| 167 | 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 | 178 | <attribute name="label" translatable="yes">Append to copy</attribute> |
| 169 | 179 | <attribute name="action">win.copy-append</attribute> |
| 170 | 180 | </item> |
| ... | ... | @@ -361,6 +371,11 @@ |
| 361 | 371 | </item> |
| 362 | 372 | |
| 363 | 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 | 379 | <attribute name="label" translatable="yes">Resize on alternate screen</attribute> |
| 365 | 380 | <attribute name="action">win.altscreen</attribute> |
| 366 | 381 | </item> |
| ... | ... | @@ -381,7 +396,7 @@ |
| 381 | 396 | <attribute name="label" translatable="yes">Dynamic font spacing</attribute> |
| 382 | 397 | <attribute name="action">win.dynamic-font-spacing</attribute> |
| 383 | 398 | </item> |
| 384 | - | |
| 399 | + | |
| 385 | 400 | <section> |
| 386 | 401 | |
| 387 | 402 | <item> |
| ... | ... | @@ -426,6 +441,11 @@ |
| 426 | 441 | <attribute name="action">win.menubar</attribute> |
| 427 | 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 | 449 | </submenu> |
| 430 | 450 | |
| 431 | 451 | <section> |
| ... | ... | @@ -460,7 +480,7 @@ |
| 460 | 480 | </item> |
| 461 | 481 | |
| 462 | 482 | </section> |
| 463 | - | |
| 483 | + | |
| 464 | 484 | </menu> |
| 465 | 485 | |
| 466 | 486 | <menu id="popup-over-oia"> |
| ... | ... | @@ -527,7 +547,7 @@ |
| 527 | 547 | |
| 528 | 548 | </submenu> |
| 529 | 549 | |
| 530 | - <submenu id="view-when-offline-placeholder"> | |
| 550 | + <submenu id="view-when-offline-placeholder"> | |
| 531 | 551 | |
| 532 | 552 | <attribute name='label' translatable='yes'>View</attribute> |
| 533 | 553 | |
| ... | ... | @@ -541,6 +561,11 @@ |
| 541 | 561 | <attribute name="action">win.menubar</attribute> |
| 542 | 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 | 569 | </submenu> |
| 545 | 570 | |
| 546 | 571 | <section> |
| ... | ... | @@ -551,7 +576,7 @@ |
| 551 | 576 | </item> |
| 552 | 577 | |
| 553 | 578 | <item> |
| 554 | - <attribute name="label" translatable="yes">Session properties</attribute> | |
| 579 | + <attribute name="label" translatable="yes">Session preferences</attribute> | |
| 555 | 580 | <attribute name="action">win.session.properties</attribute> |
| 556 | 581 | </item> |
| 557 | 582 | ... | ... |
win/makeruntime.sh.in
| ... | ... | @@ -25,6 +25,9 @@ |
| 25 | 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 | 31 | # Disable i18n |
| 29 | 32 | export LANG=C |
| 30 | 33 | |
| ... | ... | @@ -286,6 +289,11 @@ copy_theme() { |
| 286 | 289 | exit -1 |
| 287 | 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 | # | ... | ... |
win/pack.sh
| ... | ... | @@ -31,10 +31,14 @@ LIBRARY_NAME="lib3270" |
| 31 | 31 | CORE_LIBRARIES="lib3270 libv3270 libipc3270" |
| 32 | 32 | PACKAGE_PLUGINS="" |
| 33 | 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 | 38 | GIT_URL="https://github.com/PerryWerneck" |
| 36 | 39 | BUILD_UNSTABLE=0 |
| 37 | 40 | MAKE_ZIP=0 |
| 41 | +CLEAR_TARGET_PATH=0 | |
| 38 | 42 | |
| 39 | 43 | PROJECTDIR=$(dirname $(dirname $(readlink -f ${0}))) |
| 40 | 44 | WORKDIR=$(mktemp -d) |
| ... | ... | @@ -80,7 +84,6 @@ failed() |
| 80 | 84 | clone() |
| 81 | 85 | { |
| 82 | 86 | echo -e "\e]2;Cloning ${1}\a" |
| 83 | - echo "Cloning ${1}" | |
| 84 | 87 | |
| 85 | 88 | mkdir -p ${WORKDIR}/sources |
| 86 | 89 | |
| ... | ... | @@ -552,27 +555,40 @@ makeRuntime() |
| 552 | 555 | # |
| 553 | 556 | copy_install_file() { |
| 554 | 557 | |
| 555 | - FILENAME=${PROJECTDIR}/$(basename ${1}) | |
| 556 | - | |
| 557 | - rm -f "${FILENAME}" | |
| 558 | - cp -v "${1}" "${FILENAME}" | |
| 559 | - | |
| 560 | 558 | if [ "$?" != "0" ]; then |
| 561 | 559 | failed "Can't copy ${1} to ${FILENAME}" |
| 562 | 560 | fi |
| 563 | 561 | |
| 564 | 562 | if [ ${BUILD_UNSTABLE} == "1" ]; then |
| 565 | 563 | TARGET_PATH="/${PRODUCT_NAME}/unstable/${ARCH}" |
| 564 | + FILENAME=${PROJECTDIR}/dist/unstable/${ARCH}/$(basename ${1}) | |
| 566 | 565 | else |
| 567 | 566 | TARGET_PATH="/${PRODUCT_NAME}/stable/${ARCH}" |
| 567 | + FILENAME=${PROJECTDIR}/dist/stable/${ARCH}/$(basename ${1}) | |
| 568 | 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 | 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 | 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 | 589 | fi |
| 590 | + | |
| 591 | + ln -f -v "${FILENAME}" ~/public_html/win/${TARGET_PATH} | |
| 576 | 592 | fi |
| 577 | 593 | |
| 578 | 594 | if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then |
| ... | ... | @@ -582,18 +598,21 @@ copy_install_file() { |
| 582 | 598 | failed "Can't create ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" |
| 583 | 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 | 603 | fi |
| 589 | 604 | |
| 605 | + ln -f -v "${FILENAME}" ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH} | |
| 606 | + | |
| 590 | 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 | 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 | 616 | fi |
| 598 | 617 | |
| 599 | 618 | fi |
| ... | ... | @@ -768,13 +787,21 @@ do |
| 768 | 787 | ;; |
| 769 | 788 | |
| 770 | 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 | 810 | ;; |
| 784 | 811 | |
| 785 | 812 | TARGET-ARCHS) |
| 786 | - TARGET_ARCHS=${value} | |
| 813 | + TARGET_ARCHS=$(echo ${value} | sed "s@,@ @g") | |
| 787 | 814 | ;; |
| 788 | 815 | |
| 789 | 816 | NO-PRE-REQS) |
| ... | ... | @@ -855,9 +882,7 @@ do |
| 855 | 882 | |
| 856 | 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 | 887 | echo "" |
| 863 | 888 | exit 0 | ... | ... |
win/pw3270.nsi.in
| ... | ... | @@ -133,10 +133,15 @@ SubSection "@PRODUCT_NAME@" SecMain |
| 133 | 133 | |
| 134 | 134 | # Locale files |
| 135 | 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 | 137 | file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" |
| 138 | 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 | 145 | # define uninstaller name |
| 141 | 146 | SetRegView 32 |
| 142 | 147 | ... | ... |