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,8 +38,9 @@ SOURCES= \ | ||
| 38 | $(wildcard src/objects/terminal/*.c) \ | 38 | $(wildcard src/objects/terminal/*.c) \ |
| 39 | $(wildcard src/objects/toolbar/*.c) \ | 39 | $(wildcard src/objects/toolbar/*.c) \ |
| 40 | $(wildcard src/objects/settings/*.c) \ | 40 | $(wildcard src/objects/settings/*.c) \ |
| 41 | - $(wildcard src/objects/@OSNAME@/*.c) \ | 41 | + $(wildcard src/objects/os/@OSNAME@/*.c) \ |
| 42 | $(wildcard src/main/*.c) \ | 42 | $(wildcard src/main/*.c) \ |
| 43 | + $(wildcard src/tools/*.c) \ | ||
| 43 | $(wildcard src/main/@OSNAME@/*.c) \ | 44 | $(wildcard src/main/@OSNAME@/*.c) \ |
| 44 | $(wildcard src/main/@OSNAME@/*.rc) \ | 45 | $(wildcard src/main/@OSNAME@/*.rc) \ |
| 45 | $(wildcard src/objects/keypad/*.c) | 46 | $(wildcard src/objects/keypad/*.c) |
| @@ -63,6 +64,7 @@ WINDRES=@WINDRES@ | @@ -63,6 +64,7 @@ WINDRES=@WINDRES@ | ||
| 63 | AR=@AR@ | 64 | AR=@AR@ |
| 64 | VALGRIND=@VALGRIND@ | 65 | VALGRIND=@VALGRIND@ |
| 65 | CONVERT=@CONVERT@ | 66 | CONVERT=@CONVERT@ |
| 67 | +STRIP=@STRIP@ | ||
| 66 | 68 | ||
| 67 | #---[ Paths ]---------------------------------------------------------------------------- | 69 | #---[ Paths ]---------------------------------------------------------------------------- |
| 68 | 70 | ||
| @@ -127,6 +129,11 @@ $(OBJDBG)/%.o: \ | @@ -127,6 +129,11 @@ $(OBJDBG)/%.o: \ | ||
| 127 | 129 | ||
| 128 | @$(CC) \ | 130 | @$(CC) \ |
| 129 | $(CFLAGS) \ | 131 | $(CFLAGS) \ |
| 132 | + -DDEBUG=1 \ | ||
| 133 | + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $< | ||
| 134 | + | ||
| 135 | + @$(CC) \ | ||
| 136 | + $(CFLAGS) \ | ||
| 130 | -Wall -Wextra -fstack-check \ | 137 | -Wall -Wextra -fstack-check \ |
| 131 | -DDEBUG=1 \ | 138 | -DDEBUG=1 \ |
| 132 | -o $@ -c $< | 139 | -o $@ -c $< |
| @@ -154,6 +161,12 @@ $(OBJRLS)/%.o: \ | @@ -154,6 +161,12 @@ $(OBJRLS)/%.o: \ | ||
| 154 | 161 | ||
| 155 | @echo $< ... | 162 | @echo $< ... |
| 156 | @$(MKDIR) $(dir $@) | 163 | @$(MKDIR) $(dir $@) |
| 164 | + | ||
| 165 | + @$(CC) \ | ||
| 166 | + $(CFLAGS) \ | ||
| 167 | + -DNDEBUG=1 \ | ||
| 168 | + -MM -MT $@ -MF $(patsubst %.o,%.d,$@) $< | ||
| 169 | + | ||
| 157 | @$(CC) \ | 170 | @$(CC) \ |
| 158 | $(CFLAGS) \ | 171 | $(CFLAGS) \ |
| 159 | -DNDEBUG=1 \ | 172 | -DNDEBUG=1 \ |
| @@ -179,6 +192,7 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \ | @@ -179,6 +192,7 @@ $(POTDIR)/$(PACKAGE_NAME)/%.pot: \ | ||
| 179 | --keyword=_ \ | 192 | --keyword=_ \ |
| 180 | --keyword=N_ \ | 193 | --keyword=N_ \ |
| 181 | --keyword=MSG_:2 \ | 194 | --keyword=MSG_:2 \ |
| 195 | + --keyword=NC_:1c,2 \ | ||
| 182 | --output=$@ \ | 196 | --output=$@ \ |
| 183 | $< | 197 | $< |
| 184 | @touch $@ | 198 | @touch $@ |
| @@ -258,6 +272,10 @@ $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@: \ | @@ -258,6 +272,10 @@ $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@: \ | ||
| 258 | $^ \ | 272 | $^ \ |
| 259 | $(LIBS) | 273 | $(LIBS) |
| 260 | 274 | ||
| 275 | +strip: \ | ||
| 276 | + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ | ||
| 277 | + | ||
| 278 | + @$(STRIP) --discard-all $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ | ||
| 261 | 279 | ||
| 262 | #---[ Install Targets ]------------------------------------------------------------------ | 280 | #---[ Install Targets ]------------------------------------------------------------------ |
| 263 | 281 | ||
| @@ -266,18 +284,11 @@ install: \ | @@ -266,18 +284,11 @@ install: \ | ||
| 266 | install-keypads | 284 | install-keypads |
| 267 | 285 | ||
| 268 | install-application: \ | 286 | install-application: \ |
| 269 | - $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ | 287 | + install-@OSNAME@-application \ |
| 270 | install-locale \ | 288 | install-locale \ |
| 271 | install-schemas \ | 289 | install-schemas \ |
| 272 | - install-branding | ||
| 273 | - | ||
| 274 | - @$(MKDIR) \ | ||
| 275 | - $(DESTDIR)/$(bindir) | ||
| 276 | - | ||
| 277 | - @$(INSTALL_PROGRAM) \ | ||
| 278 | - $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ | ||
| 279 | - $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@ | ||
| 280 | - | 290 | + install-branding \ |
| 291 | + install-icons | ||
| 281 | 292 | ||
| 282 | @$(MKDIR) \ | 293 | @$(MKDIR) \ |
| 283 | $(DESTDIR)/$(libdir)/$(PRODUCT_NAME)-plugins | 294 | $(DESTDIR)/$(libdir)/$(PRODUCT_NAME)-plugins |
| @@ -292,6 +303,28 @@ install-application: \ | @@ -292,6 +303,28 @@ install-application: \ | ||
| 292 | @$(MKDIR) \ | 303 | @$(MKDIR) \ |
| 293 | $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad | 304 | $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad |
| 294 | 305 | ||
| 306 | +install-linux-application: \ | ||
| 307 | + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ | ||
| 308 | + | ||
| 309 | + @$(MKDIR) \ | ||
| 310 | + $(DESTDIR)/$(bindir) | ||
| 311 | + | ||
| 312 | + @$(INSTALL_PROGRAM) \ | ||
| 313 | + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ | ||
| 314 | + $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@ | ||
| 315 | + | ||
| 316 | + | ||
| 317 | +install-windows-application: \ | ||
| 318 | + strip | ||
| 319 | + | ||
| 320 | + @$(MKDIR) \ | ||
| 321 | + $(DESTDIR)/$(bindir) | ||
| 322 | + | ||
| 323 | + @$(INSTALL_PROGRAM) \ | ||
| 324 | + $(BINRLS)/$(PACKAGE_NAME)@EXEEXT@ \ | ||
| 325 | + $(DESTDIR)/$(bindir)/$(PRODUCT_NAME)@EXEEXT@ | ||
| 326 | + | ||
| 327 | + | ||
| 295 | install-keypads: | 328 | install-keypads: |
| 296 | 329 | ||
| 297 | @$(MKDIR) \ | 330 | @$(MKDIR) \ |
| @@ -301,6 +334,15 @@ install-keypads: | @@ -301,6 +334,15 @@ install-keypads: | ||
| 301 | keypad/*.xml \ | 334 | keypad/*.xml \ |
| 302 | $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad | 335 | $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/keypad |
| 303 | 336 | ||
| 337 | +install-icons: | ||
| 338 | + | ||
| 339 | + @$(MKDIR) \ | ||
| 340 | + $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/icons | ||
| 341 | + | ||
| 342 | + @$(INSTALL_DATA) \ | ||
| 343 | + icons/*.svg \ | ||
| 344 | + $(DESTDIR)/$(datarootdir)/$(PRODUCT_NAME)/icons | ||
| 345 | + | ||
| 304 | #---[ Misc Targets ]--------------------------------------------------------------------- | 346 | #---[ Misc Targets ]--------------------------------------------------------------------- |
| 305 | 347 | ||
| 306 | locale/$(PACKAGE_NAME).pot: \ | 348 | locale/$(PACKAGE_NAME).pot: \ |
| @@ -335,6 +377,14 @@ run: \ | @@ -335,6 +377,14 @@ run: \ | ||
| 335 | @G_DEBUG=fatal-warnings \ | 377 | @G_DEBUG=fatal-warnings \ |
| 336 | $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ | 378 | $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ |
| 337 | 379 | ||
| 380 | + | ||
| 381 | +run-inspector: \ | ||
| 382 | + $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ \ | ||
| 383 | + gschemas.compiled | ||
| 384 | + | ||
| 385 | + @GTK_DEBUG=interactive \ | ||
| 386 | + $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ | ||
| 387 | + | ||
| 338 | mem-check: \ | 388 | mem-check: \ |
| 339 | $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ | 389 | $(BINDBG)/$(PACKAGE_NAME)@EXEEXT@ |
| 340 | 390 | ||
| @@ -382,4 +432,6 @@ clean: \ | @@ -382,4 +432,6 @@ clean: \ | ||
| 382 | cleanDebug \ | 432 | cleanDebug \ |
| 383 | cleanRelease | 433 | cleanRelease |
| 384 | 434 | ||
| 435 | +-include $(foreach SRC, $(basename $(SOURCES)), $(OBJDBG)/$(SRC).d) | ||
| 436 | +-include $(foreach SRC, $(basename $(SOURCES)), $(OBJRLS)/$(SRC).d) | ||
| 385 | 437 |
branding/Makefile.in
| @@ -44,6 +44,8 @@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ | @@ -44,6 +44,8 @@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ | ||
| 44 | CONVERT=@CONVERT@ | 44 | CONVERT=@CONVERT@ |
| 45 | OPTIPNG=@OPTIPNG@ | 45 | OPTIPNG=@OPTIPNG@ |
| 46 | DESKTOP_INSTALL=@DESKTOP_INSTALL@ | 46 | DESKTOP_INSTALL=@DESKTOP_INSTALL@ |
| 47 | +SCOUR=@SCOUR@ | ||
| 48 | +APPSTREAMCLI=@APPSTREAMCLI@ | ||
| 47 | 49 | ||
| 48 | #---[ Rules ]---------------------------------------------------------------------------- | 50 | #---[ Rules ]---------------------------------------------------------------------------- |
| 49 | 51 | ||
| @@ -107,6 +109,20 @@ $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/%.png: \ | @@ -107,6 +109,20 @@ $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/%.png: \ | ||
| 107 | @$(MKDIR) `dirname $@` | 109 | @$(MKDIR) `dirname $@` |
| 108 | @$(INSTALL_DATA) $< $@ | 110 | @$(INSTALL_DATA) $< $@ |
| 109 | 111 | ||
| 112 | +$(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/icons/%.svg: \ | ||
| 113 | + %.svg | ||
| 114 | + | ||
| 115 | + @echo $@ ... | ||
| 116 | + @$(MKDIR) `dirname $@` | ||
| 117 | + | ||
| 118 | +ifeq ($(SCOUR),no) | ||
| 119 | + @$(INSTALL_DATA) $< $@ | ||
| 120 | +else | ||
| 121 | + @$(SCOUR) -i $< -o $@ | ||
| 122 | +endif | ||
| 123 | + | ||
| 124 | + @chmod 644 $@ | ||
| 125 | + | ||
| 110 | $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ | 126 | $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ |
| 111 | $(BINDIR)/%.png | 127 | $(BINDIR)/%.png |
| 112 | 128 | ||
| @@ -114,11 +130,19 @@ $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ | @@ -114,11 +130,19 @@ $(DESTDIR)$(datarootdir)/pixmaps/%.png: \ | ||
| 114 | @$(MKDIR) `dirname $@` | 130 | @$(MKDIR) `dirname $@` |
| 115 | @$(INSTALL_DATA) $< $@ | 131 | @$(INSTALL_DATA) $< $@ |
| 116 | 132 | ||
| 133 | +validate: | ||
| 134 | + | ||
| 135 | +ifneq ($(SCOUR),no) | ||
| 136 | + @$(APPSTREAMCLI) validate appdata.xml | ||
| 137 | +endif | ||
| 138 | + | ||
| 139 | + | ||
| 117 | install: \ | 140 | install: \ |
| 118 | install-@OSNAME@ | 141 | install-@OSNAME@ |
| 119 | 142 | ||
| 120 | install-linux: \ | 143 | install-linux: \ |
| 121 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ | 144 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ |
| 145 | + $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/icons/$(PRODUCT_NAME).svg \ | ||
| 122 | $(DESTDIR)$(datarootdir)/pixmaps/$(PRODUCT_NAME).png \ | 146 | $(DESTDIR)$(datarootdir)/pixmaps/$(PRODUCT_NAME).png \ |
| 123 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png | 147 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png |
| 124 | 148 | ||
| @@ -138,6 +162,12 @@ install-linux: \ | @@ -138,6 +162,12 @@ install-linux: \ | ||
| 138 | mime.xml \ | 162 | mime.xml \ |
| 139 | $(DESTDIR)$(datarootdir)/mime/packages/$(PRODUCT_NAME).xml | 163 | $(DESTDIR)$(datarootdir)/mime/packages/$(PRODUCT_NAME).xml |
| 140 | 164 | ||
| 165 | + @$(MKDIR) $(DESTDIR)$(datarootdir)/appdata | ||
| 166 | + | ||
| 167 | + @$(INSTALL_DATA) \ | ||
| 168 | + appdata.xml \ | ||
| 169 | + $(DESTDIR)$(datarootdir)/appdata/$(PRODUCT_NAME).appdata.xml | ||
| 170 | + | ||
| 141 | install-windows: \ | 171 | install-windows: \ |
| 142 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ | 172 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME).png \ |
| 143 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png \ | 173 | $(DESTDIR)$(datarootdir)/$(PRODUCT_NAME)/$(PRODUCT_NAME)-logo.png \ |
| @@ -0,0 +1,39 @@ | @@ -0,0 +1,39 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | +<component type="desktop"> | ||
| 3 | + <id>br.com.bb.pw3270</id> | ||
| 4 | + <name>3270 Terminal</name> | ||
| 5 | + <name xml:lang="pt_BR">Terminal 3270</name> | ||
| 6 | + <summary>IBM 3270 Terminal emulator</summary> | ||
| 7 | + <summary xml:lang="pt_BR">Emulador de terminal IBM 3270</summary> | ||
| 8 | + <developer_name>perry.werneck@gmail.com</developer_name> | ||
| 9 | + <description> | ||
| 10 | + <p> | ||
| 11 | + GTK Based 3270 terminal emulator | ||
| 12 | + pw3270 is a modern, GTK-based, completely free tn3270 emulator. | ||
| 13 | + | ||
| 14 | + Created originally for Banco do Brasil, it's now an official Brazilian Government Public Software project, and is used worldwide. | ||
| 15 | + </p> | ||
| 16 | + </description> | ||
| 17 | + | ||
| 18 | + <metadata_license>CC0-1.0</metadata_license> | ||
| 19 | + <project_license>LGPL-3.0</project_license> | ||
| 20 | + | ||
| 21 | + <url type="bugtracker">https://github.com/PerryWerneck/pw3270/issues</url> | ||
| 22 | + <url type="homepage">https://github.com/PerryWerneck/pw3270</url> | ||
| 23 | + <project_group>GNOME</project_group> | ||
| 24 | + | ||
| 25 | + <launchable type="desktop-id">@PRODUCT_NAME@.desktop</launchable> | ||
| 26 | + | ||
| 27 | + <screenshots> | ||
| 28 | + <screenshot type="default"> | ||
| 29 | + <caption>@PRODUCT_NAME@</caption> | ||
| 30 | + <image height="600" width="600">https://raw.githubusercontent.com/PerryWerneck/pw3270/master/branding/pw3270-logo.svg</image> | ||
| 31 | + </screenshot> | ||
| 32 | + </screenshots> | ||
| 33 | + | ||
| 34 | + <update_contact>perry.werneck@gmail.com</update_contact> | ||
| 35 | + | ||
| 36 | + <provides> | ||
| 37 | + <id>@PRODUCT_NAME@pw32.desktop</id> | ||
| 38 | + </provides> | ||
| 39 | +</component> |
branding/launcher.desktop.in
| @@ -3,9 +3,10 @@ X-SuSE-translate=true | @@ -3,9 +3,10 @@ X-SuSE-translate=true | ||
| 3 | GenericName=@PRODUCT_NAME@ | 3 | GenericName=@PRODUCT_NAME@ |
| 4 | Name=3270 Terminal | 4 | Name=3270 Terminal |
| 5 | Name[pt_BR]=Terminal 3270 | 5 | Name[pt_BR]=Terminal 3270 |
| 6 | -Comment=@PACKAGE_DESCRIPTION@ | 6 | +Comment=IBM 3270 Terminal emulator |
| 7 | +Comment[pt_BR]=Emulador de terminal IBM 3270 | ||
| 7 | Exec=@PRODUCT_NAME@ %u | 8 | Exec=@PRODUCT_NAME@ %u |
| 8 | -Icon=@PRODUCT_NAME@ | 9 | +Icon=/usr/share/@PRODUCT_NAME@/icons/@PRODUCT_NAME@.svg |
| 9 | Terminal=false | 10 | Terminal=false |
| 10 | Type=Application | 11 | Type=Application |
| 11 | StartupNotify=true | 12 | StartupNotify=true |
configure.ac
| @@ -67,7 +67,7 @@ case "$host" in | @@ -67,7 +67,7 @@ case "$host" in | ||
| 67 | 67 | ||
| 68 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" | 68 | CFLAGS="$CFLAGS -pthread -D_WIN32_WINNT=0x0600" |
| 69 | LDFLAGS="$LDFLAGS -pthread" | 69 | LDFLAGS="$LDFLAGS -pthread" |
| 70 | - LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32" | 70 | + LIBS="$LIBS -lws2_32 -lwtsapi32 -lcomdlg32 -lole32 -luuid" |
| 71 | 71 | ||
| 72 | app_win32_revision=$(date +%-y.%-m.%-d.%-H) | 72 | app_win32_revision=$(date +%-y.%-m.%-d.%-H) |
| 73 | AC_SUBST(WIN32_VERSION,$app_win32_revision) | 73 | AC_SUBST(WIN32_VERSION,$app_win32_revision) |
| @@ -141,6 +141,10 @@ AC_PATH_TOOL([MSGMERGE], [msgmerge], [no]) | @@ -141,6 +141,10 @@ AC_PATH_TOOL([MSGMERGE], [msgmerge], [no]) | ||
| 141 | AC_PATH_TOOL([MSGFMT], [msgfmt], [no]) | 141 | AC_PATH_TOOL([MSGFMT], [msgfmt], [no]) |
| 142 | AC_PATH_TOOL([VALGRIND], [valgrind], [no]) | 142 | AC_PATH_TOOL([VALGRIND], [valgrind], [no]) |
| 143 | 143 | ||
| 144 | +AC_PATH_TOOL([SCOUR], [scour], [no]) | ||
| 145 | +AC_PATH_TOOL([APPSTREAMCLI],[appstreamcli], [no]) | ||
| 146 | +AC_PATH_TOOL([STRIP], [strip], [true]) | ||
| 147 | + | ||
| 144 | AC_PATH_TOOL([DESKTOP_INSTALL],[desktop-file-install],[no]) | 148 | AC_PATH_TOOL([DESKTOP_INSTALL],[desktop-file-install],[no]) |
| 145 | 149 | ||
| 146 | PKG_CHECK_EXISTS | 150 | PKG_CHECK_EXISTS |
| @@ -245,6 +249,7 @@ AC_CONFIG_FILES(locale/Makefile) | @@ -245,6 +249,7 @@ AC_CONFIG_FILES(locale/Makefile) | ||
| 245 | AC_CONFIG_FILES(branding/Makefile) | 249 | AC_CONFIG_FILES(branding/Makefile) |
| 246 | AC_CONFIG_FILES(branding/launcher.desktop) | 250 | AC_CONFIG_FILES(branding/launcher.desktop) |
| 247 | AC_CONFIG_FILES(branding/mime.xml) | 251 | AC_CONFIG_FILES(branding/mime.xml) |
| 252 | +AC_CONFIG_FILES(branding/appdata.xml) | ||
| 248 | 253 | ||
| 249 | dnl --------------------------------------------------------------------------- | 254 | dnl --------------------------------------------------------------------------- |
| 250 | dnl Output the generated config.status script. | 255 | dnl Output the generated config.status script. |
| @@ -0,0 +1,84 @@ | @@ -0,0 +1,84 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<svg | ||
| 3 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
| 4 | + xmlns:cc="http://creativecommons.org/ns#" | ||
| 5 | + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
| 6 | + xmlns:svg="http://www.w3.org/2000/svg" | ||
| 7 | + xmlns="http://www.w3.org/2000/svg" | ||
| 8 | + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 9 | + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 10 | + version="1.1" | ||
| 11 | + id="svg851" | ||
| 12 | + width="256" | ||
| 13 | + height="256" | ||
| 14 | + viewBox="0 0 256 256" | ||
| 15 | + sodipodi:docname="gtk-connect-symbolic.svg" | ||
| 16 | + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> | ||
| 17 | + <metadata | ||
| 18 | + id="metadata857"> | ||
| 19 | + <rdf:RDF> | ||
| 20 | + <cc:Work | ||
| 21 | + rdf:about=""> | ||
| 22 | + <dc:format>image/svg+xml</dc:format> | ||
| 23 | + <dc:type | ||
| 24 | + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||
| 25 | + <dc:title></dc:title> | ||
| 26 | + </cc:Work> | ||
| 27 | + </rdf:RDF> | ||
| 28 | + </metadata> | ||
| 29 | + <defs | ||
| 30 | + id="defs855"> | ||
| 31 | + <marker | ||
| 32 | + style="overflow:visible" | ||
| 33 | + id="Arrow1Lstart" | ||
| 34 | + refX="0.0" | ||
| 35 | + refY="0.0" | ||
| 36 | + orient="auto" | ||
| 37 | + inkscape:stockid="Arrow1Lstart" | ||
| 38 | + inkscape:isstock="true"> | ||
| 39 | + <path | ||
| 40 | + transform="scale(0.8) translate(12.5,0)" | ||
| 41 | + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" | ||
| 42 | + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||
| 43 | + id="path1007" /> | ||
| 44 | + </marker> | ||
| 45 | + </defs> | ||
| 46 | + <sodipodi:namedview | ||
| 47 | + pagecolor="#ffffff" | ||
| 48 | + bordercolor="#666666" | ||
| 49 | + borderopacity="1" | ||
| 50 | + objecttolerance="10" | ||
| 51 | + gridtolerance="10" | ||
| 52 | + guidetolerance="10" | ||
| 53 | + inkscape:pageopacity="0" | ||
| 54 | + inkscape:pageshadow="2" | ||
| 55 | + inkscape:window-width="1366" | ||
| 56 | + inkscape:window-height="713" | ||
| 57 | + id="namedview853" | ||
| 58 | + showgrid="false" | ||
| 59 | + inkscape:zoom="1.3921165" | ||
| 60 | + inkscape:cx="99.069109" | ||
| 61 | + inkscape:cy="184.6652" | ||
| 62 | + inkscape:window-x="0" | ||
| 63 | + inkscape:window-y="25" | ||
| 64 | + inkscape:window-maximized="1" | ||
| 65 | + inkscape:current-layer="g859" | ||
| 66 | + inkscape:document-rotation="0" /> | ||
| 67 | + <g | ||
| 68 | + inkscape:groupmode="layer" | ||
| 69 | + inkscape:label="Image" | ||
| 70 | + id="g859"> | ||
| 71 | + <g | ||
| 72 | + id="g923" | ||
| 73 | + transform="matrix(3.7795276,0,0,3.7795276,-118.40429,8.6123775)"> | ||
| 74 | + <path | ||
| 75 | + id="rect883-3" | ||
| 76 | + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.858311;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||
| 77 | + d="m 92.554935,8.5779117 c -1.798383,-0.1481724 -3.650627,1.2722474 -3.264892,3.1739583 0,13.525103 0,27.050206 0,40.575309 -0.01033,1.949711 3.647396,3.05186 4.472053,1.706431 0,-15.097123 0,-30.194245 0,-45.2913683 -0.392532,-0.1087998 -0.799794,-0.1644515 -1.207161,-0.16433 z m 4.073796,-9.29504033 c -2.07079,-0.0714654 -3.476923,2.03267503 -3.165182,3.95774393 0.01085,19.2643707 -0.0217,38.5298257 0.01628,57.7935187 0.126716,2.110405 2.653929,3.534377 4.522972,2.533701 0,-21.322901 0,-42.645803 0,-63.96870376 -0.426607,-0.20655366 -0.89981,-0.31703838 -1.374071,-0.31625987 z" /> | ||
| 78 | + <path | ||
| 79 | + id="path930-7" | ||
| 80 | + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.11486;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||
| 81 | + d="M 82.489067,12.90927 A 15.467497,18.678622 0 0 0 68.038271,24.929209 H 52.736878 c -1.91384,0 -3.45457,1.540729 -3.45457,3.454569 v 6.097817 c 0,1.913843 1.54073,3.454572 3.45457,3.454572 h 15.205791 a 15.467497,18.678622 0 0 0 14.546398,12.330512 15.467497,18.678622 0 0 0 7.232118,-2.168342 V 15.077612 A 15.467497,18.678622 0 0 0 82.489067,12.90927 Z" /> | ||
| 82 | + </g> | ||
| 83 | + </g> | ||
| 84 | +</svg> |
| @@ -0,0 +1,84 @@ | @@ -0,0 +1,84 @@ | ||
| 1 | +<?xml version="1.0" encoding="UTF-8" standalone="no"?> | ||
| 2 | +<svg | ||
| 3 | + xmlns:dc="http://purl.org/dc/elements/1.1/" | ||
| 4 | + xmlns:cc="http://creativecommons.org/ns#" | ||
| 5 | + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" | ||
| 6 | + xmlns:svg="http://www.w3.org/2000/svg" | ||
| 7 | + xmlns="http://www.w3.org/2000/svg" | ||
| 8 | + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" | ||
| 9 | + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" | ||
| 10 | + version="1.1" | ||
| 11 | + id="svg851" | ||
| 12 | + width="256" | ||
| 13 | + height="256" | ||
| 14 | + viewBox="0 0 256 256" | ||
| 15 | + sodipodi:docname="gtk-disconnect-symbolic.svg" | ||
| 16 | + inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)"> | ||
| 17 | + <metadata | ||
| 18 | + id="metadata857"> | ||
| 19 | + <rdf:RDF> | ||
| 20 | + <cc:Work | ||
| 21 | + rdf:about=""> | ||
| 22 | + <dc:format>image/svg+xml</dc:format> | ||
| 23 | + <dc:type | ||
| 24 | + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> | ||
| 25 | + <dc:title></dc:title> | ||
| 26 | + </cc:Work> | ||
| 27 | + </rdf:RDF> | ||
| 28 | + </metadata> | ||
| 29 | + <defs | ||
| 30 | + id="defs855"> | ||
| 31 | + <marker | ||
| 32 | + style="overflow:visible" | ||
| 33 | + id="Arrow1Lstart" | ||
| 34 | + refX="0.0" | ||
| 35 | + refY="0.0" | ||
| 36 | + orient="auto" | ||
| 37 | + inkscape:stockid="Arrow1Lstart" | ||
| 38 | + inkscape:isstock="true"> | ||
| 39 | + <path | ||
| 40 | + transform="scale(0.8) translate(12.5,0)" | ||
| 41 | + style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt" | ||
| 42 | + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " | ||
| 43 | + id="path1007" /> | ||
| 44 | + </marker> | ||
| 45 | + </defs> | ||
| 46 | + <sodipodi:namedview | ||
| 47 | + pagecolor="#ffffff" | ||
| 48 | + bordercolor="#666666" | ||
| 49 | + borderopacity="1" | ||
| 50 | + objecttolerance="10" | ||
| 51 | + gridtolerance="10" | ||
| 52 | + guidetolerance="10" | ||
| 53 | + inkscape:pageopacity="0" | ||
| 54 | + inkscape:pageshadow="2" | ||
| 55 | + inkscape:window-width="1366" | ||
| 56 | + inkscape:window-height="713" | ||
| 57 | + id="namedview853" | ||
| 58 | + showgrid="false" | ||
| 59 | + inkscape:zoom="1.3921165" | ||
| 60 | + inkscape:cx="108.83539" | ||
| 61 | + inkscape:cy="125.36992" | ||
| 62 | + inkscape:window-x="0" | ||
| 63 | + inkscape:window-y="25" | ||
| 64 | + inkscape:window-maximized="1" | ||
| 65 | + inkscape:current-layer="g859" | ||
| 66 | + inkscape:document-rotation="0" /> | ||
| 67 | + <g | ||
| 68 | + inkscape:groupmode="layer" | ||
| 69 | + inkscape:label="Image" | ||
| 70 | + id="g859"> | ||
| 71 | + <g | ||
| 72 | + id="g927" | ||
| 73 | + transform="matrix(3.7795276,0,0,3.7795276,-161.57965,-402.67362)"> | ||
| 74 | + <path | ||
| 75 | + id="rect883-3-6" | ||
| 76 | + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.858311;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||
| 77 | + d="m 103.7142,117.39733 c -1.79838,-0.14817 -3.65063,1.27225 -3.26489,3.17396 0,13.5251 0,27.0502 0,40.5753 -0.0103,1.94971 3.6474,3.05189 4.47205,1.70644 0,-15.09713 0,-30.19425 0,-45.29137 -0.39253,-0.1088 -0.79979,-0.16445 -1.20716,-0.16433 z m 4.0738,-9.29504 c -2.07079,-0.0715 -3.47692,2.03267 -3.16518,3.95774 0.0108,19.26437 -0.0217,38.52983 0.0163,57.79352 0.12672,2.11041 2.65393,3.53439 4.52297,2.5337 0,-21.3229 0,-42.6458 0,-63.9687 -0.42661,-0.20656 -0.89981,-0.31704 -1.37407,-0.31626 z" /> | ||
| 78 | + <path | ||
| 79 | + id="path930" | ||
| 80 | + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.11486;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" | ||
| 81 | + d="M 77.280561,122.17098 A 15.467497,18.678622 0 0 0 62.829766,134.19091 H 47.528374 c -1.913834,0 -3.45457,1.54073 -3.45457,3.45457 v 6.09782 c 0,1.91384 1.540736,3.45457 3.45457,3.45457 h 15.20579 a 15.467497,18.678622 0 0 0 14.546397,12.33051 15.467497,18.678622 0 0 0 7.463112,-2.3182 v -4.08812 h 8.846487 c 1.75914,0 3.175,-1.41638 3.175,-3.17552 v -2.35489 c 0,-1.75914 -1.41586,-3.17552 -3.175,-3.17552 h -8.846487 v -7.1329 h 8.901264 c 1.759143,0 3.175518,-1.41638 3.175518,-3.17552 v -2.35489 c 0,-1.75914 -1.416375,-3.17552 -3.175518,-3.17552 h -8.901264 v -4.0876 a 15.467497,18.678622 0 0 0 -7.463112,-2.31872 z" /> | ||
| 82 | + </g> | ||
| 83 | + </g> | ||
| 84 | +</svg> |
locale/pt_BR.po
| @@ -5,8 +5,8 @@ msgid "" | @@ -5,8 +5,8 @@ msgid "" | ||
| 5 | msgstr "" | 5 | msgstr "" |
| 6 | "Project-Id-Version: pw3270 5.0\n" | 6 | "Project-Id-Version: pw3270 5.0\n" |
| 7 | "Report-Msgid-Bugs-To: \n" | 7 | "Report-Msgid-Bugs-To: \n" |
| 8 | -"POT-Creation-Date: 2020-08-05 16:03-0300\n" | ||
| 9 | -"PO-Revision-Date: 2020-06-06 11:11-0300\n" | 8 | +"POT-Creation-Date: 2020-10-15 13:43-0300\n" |
| 9 | +"PO-Revision-Date: 2020-10-15 13:45-0300\n" | ||
| 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" | 10 | "Last-Translator: Perry Werneck <perry.werneck@gmail.com>\n" |
| 11 | "Language-Team: Português <>\n" | 11 | "Language-Team: Português <>\n" |
| 12 | "Language: pt_BR\n" | 12 | "Language: pt_BR\n" |
| @@ -20,17 +20,37 @@ msgstr "" | @@ -20,17 +20,37 @@ msgstr "" | ||
| 20 | "11) ? 2 : 3;\n" | 20 | "11) ? 2 : 3;\n" |
| 21 | "X-Generator: Gtranslator 2.91.7\n" | 21 | "X-Generator: Gtranslator 2.91.7\n" |
| 22 | 22 | ||
| 23 | -#: src/objects/application/application.c:208 | 23 | +#: src/objects/application/application.c:206 |
| 24 | #, c-format | 24 | #, c-format |
| 25 | msgid "\"%s\" is not a valid user interface name" | 25 | msgid "\"%s\" is not a valid user interface name" |
| 26 | msgstr "\"%s\" não é um nome válido para interface de usuário" | 26 | msgstr "\"%s\" não é um nome válido para interface de usuário" |
| 27 | 27 | ||
| 28 | -#: src/objects/application/actions/about.c:96 | 28 | +#: src/objects/application/actions/about.c:93 |
| 29 | +msgid "32 bits Linux" | ||
| 30 | +msgstr "Linux 32 bits" | ||
| 31 | + | ||
| 32 | +#: src/objects/application/actions/about.c:91 | ||
| 33 | +msgid "32 bits Windows" | ||
| 34 | +msgstr "Windows 32 bits" | ||
| 35 | + | ||
| 36 | +#: src/objects/actions/save.c:156 src/objects/os/linux/savedesktopicon.c:267 | ||
| 37 | +msgid "3270 session files" | ||
| 38 | +msgstr "Arquivos de sessão TN3270" | ||
| 39 | + | ||
| 40 | +#: src/objects/application/actions/about.c:87 | ||
| 29 | #, c-format | 41 | #, c-format |
| 30 | -msgid "3270 terminal emulator for GTK %d.%d" | ||
| 31 | -msgstr "Emulador 3270 para GTK+ %d.%d" | 42 | +msgid "3270 terminal emulator for %s." |
| 43 | +msgstr "Emulador 3270 para %s" | ||
| 44 | + | ||
| 45 | +#: src/objects/application/actions/about.c:95 | ||
| 46 | +msgid "64 bits Linux" | ||
| 47 | +msgstr "Linux 64 bits" | ||
| 48 | + | ||
| 49 | +#: src/objects/application/actions/about.c:89 | ||
| 50 | +msgid "64 bits Windows" | ||
| 51 | +msgstr "Windows 64 bits" | ||
| 32 | 52 | ||
| 33 | -#: src/objects/application/actions/about.c:161 ui/application.xml:39 | 53 | +#: src/objects/application/actions/about.c:188 ui/application.xml:39 |
| 34 | #: ui/application.xml:537 | 54 | #: ui/application.xml:537 |
| 35 | msgid "About PW3270" | 55 | msgid "About PW3270" |
| 36 | msgstr "Sobre o PW3270" | 56 | msgstr "Sobre o PW3270" |
| @@ -39,23 +59,23 @@ msgstr "Sobre o PW3270" | @@ -39,23 +59,23 @@ msgstr "Sobre o PW3270" | ||
| 39 | msgid "Action Name" | 59 | msgid "Action Name" |
| 40 | msgstr "Nome da ação" | 60 | msgstr "Nome da ação" |
| 41 | 61 | ||
| 42 | -#: src/objects/window/window.c:163 src/objects/toolbar/toolbar.c:135 | 62 | +#: src/objects/window/window.c:184 |
| 43 | msgid "Action Names" | 63 | msgid "Action Names" |
| 44 | msgstr "Nome das ações" | 64 | msgstr "Nome das ações" |
| 45 | 65 | ||
| 46 | -#: ui/window.xml:369 ui/window.xml:479 ui/application.xml:509 | 66 | +#: ui/window.xml:379 ui/window.xml:494 ui/application.xml:509 |
| 47 | msgid "Alert sound" | 67 | msgid "Alert sound" |
| 48 | msgstr "Aviso sonoro" | 68 | msgstr "Aviso sonoro" |
| 49 | 69 | ||
| 50 | -#: src/main/tools.c:99 | 70 | +#: src/main/tools.c:99 src/tools/entry.c:88 |
| 51 | msgid "All files" | 71 | msgid "All files" |
| 52 | msgstr "Todos os arquivos" | 72 | msgstr "Todos os arquivos" |
| 53 | 73 | ||
| 54 | -#: ui/window.xml:168 ui/application.xml:251 | 74 | +#: ui/window.xml:178 ui/application.xml:251 |
| 55 | msgid "Append to copy" | 75 | msgid "Append to copy" |
| 56 | msgstr "Adicionar à cópia" | 76 | msgstr "Adicionar à cópia" |
| 57 | 77 | ||
| 58 | -#: src/objects/application/actions/about.c:126 | 78 | +#: src/objects/application/actions/about.c:129 |
| 59 | msgid "Apple version" | 79 | msgid "Apple version" |
| 60 | msgstr "Versão Apple" | 80 | msgstr "Versão Apple" |
| 61 | 81 | ||
| @@ -63,11 +83,15 @@ msgstr "Versão Apple" | @@ -63,11 +83,15 @@ msgstr "Versão Apple" | ||
| 63 | msgid "Application" | 83 | msgid "Application" |
| 64 | msgstr "Aplicação" | 84 | msgstr "Aplicação" |
| 65 | 85 | ||
| 66 | -#: src/objects/application/actions/preferences.c:69 ui/application.xml:83 | 86 | +#: src/objects/window/header-settings.c:123 |
| 87 | +msgid "Application menu" | ||
| 88 | +msgstr "Menu da aplicação" | ||
| 89 | + | ||
| 90 | +#: src/objects/application/actions/preferences.c:76 ui/application.xml:83 | ||
| 67 | msgid "Application preferences" | 91 | msgid "Application preferences" |
| 68 | msgstr "Preferências da aplicação" | 92 | msgstr "Preferências da aplicação" |
| 69 | 93 | ||
| 70 | -#: src/objects/window/page.c:263 | 94 | +#: src/objects/window/page.c:264 |
| 71 | msgid "Apply" | 95 | msgid "Apply" |
| 72 | msgstr "Aplicar" | 96 | msgstr "Aplicar" |
| 73 | 97 | ||
| @@ -75,15 +99,15 @@ msgstr "Aplicar" | @@ -75,15 +99,15 @@ msgstr "Aplicar" | ||
| 75 | msgid "Auto-Reconnect" | 99 | msgid "Auto-Reconnect" |
| 76 | msgstr "Reconectar automaticamente" | 100 | msgstr "Reconectar automaticamente" |
| 77 | 101 | ||
| 78 | -#: src/objects/toolbar/settings.c:114 | 102 | +#: src/objects/toolbar/settings.c:112 src/objects/settings/actionview.c:73 |
| 79 | msgid "Available" | 103 | msgid "Available" |
| 80 | msgstr "Disponível" | 104 | msgstr "Disponível" |
| 81 | 105 | ||
| 82 | -#: src/objects/application/actions/about.c:130 | 106 | +#: src/objects/application/actions/about.c:132 |
| 83 | msgid "Based on X3270 from" | 107 | msgid "Based on X3270 from" |
| 84 | msgstr "Baseado no X3270 por" | 108 | msgstr "Baseado no X3270 por" |
| 85 | 109 | ||
| 86 | -#: ui/window.xml:398 ui/application.xml:474 | 110 | +#: ui/window.xml:408 ui/application.xml:474 |
| 87 | msgid "Blank Fill" | 111 | msgid "Blank Fill" |
| 88 | msgstr "Completar com espaços" | 112 | msgstr "Completar com espaços" |
| 89 | 113 | ||
| @@ -95,21 +119,17 @@ msgstr "Cursor piscante" | @@ -95,21 +119,17 @@ msgstr "Cursor piscante" | ||
| 95 | msgid "Bold" | 119 | msgid "Bold" |
| 96 | msgstr "Negrito" | 120 | msgstr "Negrito" |
| 97 | 121 | ||
| 98 | -#: src/objects/application/actions/about.c:142 | ||
| 99 | -msgid "Brazilian Public Software Portal" | ||
| 100 | -msgstr "Portal do Software Público Brasileiro" | 122 | +#: src/objects/window/terminal.c:165 |
| 123 | +msgid "Can't load session file" | ||
| 124 | +msgstr "Não foi possível carregar arquivo de sessão" | ||
| 101 | 125 | ||
| 102 | -#: src/objects/window/terminal.c:197 | 126 | +#: src/objects/window/terminal.c:160 |
| 103 | #, c-format | 127 | #, c-format |
| 104 | -msgid "Can't save file \"%s\"" | ||
| 105 | -msgstr "Não foi possível salvar arquivo \"%s\"" | ||
| 106 | - | ||
| 107 | -#: src/objects/window/terminal.c:202 | ||
| 108 | -msgid "Can't save session file" | ||
| 109 | -msgstr "Não foi possível salvar arquivo de sessão" | 128 | +msgid "Can't use \"%s\"" |
| 129 | +msgstr "Não posso usar %s" | ||
| 110 | 130 | ||
| 111 | -#: src/objects/actions/save.c:65 src/objects/application/actions/open.c:49 | ||
| 112 | -#: src/objects/window/page.c:264 | 131 | +#: src/objects/application/actions/open.c:49 src/objects/window/page.c:265 |
| 132 | +#: src/tools/entry.c:71 | ||
| 113 | msgid "Cancel" | 133 | msgid "Cancel" |
| 114 | msgstr "_Cancelar" | 134 | msgstr "_Cancelar" |
| 115 | 135 | ||
| @@ -117,7 +137,19 @@ msgstr "_Cancelar" | @@ -117,7 +137,19 @@ msgstr "_Cancelar" | ||
| 117 | msgid "Change terminal colors" | 137 | msgid "Change terminal colors" |
| 118 | msgstr "Mudar cores do terminal" | 138 | msgstr "Mudar cores do terminal" |
| 119 | 139 | ||
| 120 | -#: ui/window.xml:182 ui/window.xml:324 ui/application.xml:304 | 140 | +#: src/objects/application/actions/preferences.c:78 |
| 141 | +msgid "Change the application preferences" | ||
| 142 | +msgstr "Modificar preferências da aplicação" | ||
| 143 | + | ||
| 144 | +#: src/objects/window/header-settings.c:98 | ||
| 145 | +msgid "Change the position of the title bar icons" | ||
| 146 | +msgstr "Modificar posição dos ícones da barra de título" | ||
| 147 | + | ||
| 148 | +#: src/objects/window/actions/sessionproperties.c:47 | ||
| 149 | +msgid "Change the preferences for the active session" | ||
| 150 | +msgstr "Modificar preferências da sessão ativa" | ||
| 151 | + | ||
| 152 | +#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:304 | ||
| 121 | msgid "Clear" | 153 | msgid "Clear" |
| 122 | msgstr "Limpar" | 154 | msgstr "Limpar" |
| 123 | 155 | ||
| @@ -134,8 +166,8 @@ msgstr "Fecha todas as janelas e encerra a aplicação" | @@ -134,8 +166,8 @@ msgstr "Fecha todas as janelas e encerra a aplicação" | ||
| 134 | msgid "Close the window" | 166 | msgid "Close the window" |
| 135 | msgstr "Fechar a janela" | 167 | msgstr "Fechar a janela" |
| 136 | 168 | ||
| 137 | -#: src/objects/window/actions/close.c:60 ui/window.xml:270 ui/window.xml:458 | ||
| 138 | -#: ui/window.xml:560 ui/application.xml:216 | 169 | +#: src/objects/window/actions/close.c:60 ui/window.xml:280 ui/window.xml:473 |
| 170 | +#: ui/window.xml:580 ui/application.xml:216 | ||
| 139 | msgid "Close window" | 171 | msgid "Close window" |
| 140 | msgstr "Fechar janela" | 172 | msgstr "Fechar janela" |
| 141 | 173 | ||
| @@ -143,6 +175,10 @@ msgstr "Fechar janela" | @@ -143,6 +175,10 @@ msgstr "Fechar janela" | ||
| 143 | msgid "Colors" | 175 | msgid "Colors" |
| 144 | msgstr "Cores" | 176 | msgstr "Cores" |
| 145 | 177 | ||
| 178 | +#: src/objects/os/linux/savedesktopicon.c:101 | ||
| 179 | +msgid "Comment" | ||
| 180 | +msgstr "Comentário" | ||
| 181 | + | ||
| 146 | #: src/objects/window/actions/connect.c:59 | 182 | #: src/objects/window/actions/connect.c:59 |
| 147 | msgid "Connect" | 183 | msgid "Connect" |
| 148 | msgstr "Conectar" | 184 | msgstr "Conectar" |
| @@ -155,11 +191,15 @@ msgstr "Conectar ao iniciar" | @@ -155,11 +191,15 @@ msgstr "Conectar ao iniciar" | ||
| 155 | msgid "Connect to host" | 191 | msgid "Connect to host" |
| 156 | msgstr "Conectar ao servidor" | 192 | msgstr "Conectar ao servidor" |
| 157 | 193 | ||
| 158 | -#: src/objects/window/window.c:702 src/objects/window/page.c:217 | 194 | +#: src/objects/window/window.c:753 src/objects/window/page.c:218 |
| 159 | msgid "Connected to host" | 195 | msgid "Connected to host" |
| 160 | msgstr "Conectado no servidor" | 196 | msgstr "Conectado no servidor" |
| 161 | 197 | ||
| 162 | -#: src/objects/application/actions/about.c:127 | 198 | +#: src/tools/entry.c:131 |
| 199 | +msgid "Continue" | ||
| 200 | +msgstr "Continuar" | ||
| 201 | + | ||
| 202 | +#: src/objects/application/actions/about.c:130 | ||
| 163 | msgid "Contributors" | 203 | msgid "Contributors" |
| 164 | msgstr "Contribuidores" | 204 | msgstr "Contribuidores" |
| 165 | 205 | ||
| @@ -167,6 +207,14 @@ msgstr "Contribuidores" | @@ -167,6 +207,14 @@ msgstr "Contribuidores" | ||
| 167 | msgid "Copy" | 207 | msgid "Copy" |
| 168 | msgstr "Copiar" | 208 | msgstr "Copiar" |
| 169 | 209 | ||
| 210 | +#: ui/window.xml:168 | ||
| 211 | +msgid "Copy as HTML" | ||
| 212 | +msgstr "Copiar como HTML" | ||
| 213 | + | ||
| 214 | +#: ui/window.xml:173 | ||
| 215 | +msgid "Copy as image" | ||
| 216 | +msgstr "Copiar como imagem" | ||
| 217 | + | ||
| 170 | #: ui/window.xml:163 ui/application.xml:246 | 218 | #: ui/window.xml:163 ui/application.xml:246 |
| 171 | msgid "Copy as table" | 219 | msgid "Copy as table" |
| 172 | msgstr "Copiar como tabela" | 220 | msgstr "Copiar como tabela" |
| @@ -175,11 +223,11 @@ msgstr "Copiar como tabela" | @@ -175,11 +223,11 @@ msgstr "Copiar como tabela" | ||
| 175 | msgid "Copy as text" | 223 | msgid "Copy as text" |
| 176 | msgstr "Copiar como texto" | 224 | msgstr "Copiar como texto" |
| 177 | 225 | ||
| 178 | -#: src/objects/windows/savedesktopicon.c:79 | ||
| 179 | -msgid "Create a desktop icon for the current session" | ||
| 180 | -msgstr "Criar ícone da área de trabalho para a sessão atual." | 226 | +#: src/objects/os/linux/savedesktopicon.c:114 |
| 227 | +msgid "Create shortcut for the current session" | ||
| 228 | +msgstr "Criar atalho para a sessão atual." | ||
| 181 | 229 | ||
| 182 | -#: ui/window.xml:359 ui/application.xml:459 | 230 | +#: ui/window.xml:369 ui/application.xml:459 |
| 183 | msgid "Cross hair cursor" | 231 | msgid "Cross hair cursor" |
| 184 | msgstr "Cursor mira" | 232 | msgstr "Cursor mira" |
| 185 | 233 | ||
| @@ -195,28 +243,24 @@ msgstr "Tela atual" | @@ -195,28 +243,24 @@ msgstr "Tela atual" | ||
| 195 | msgid "Current session" | 243 | msgid "Current session" |
| 196 | msgstr "Sessão atual" | 244 | msgstr "Sessão atual" |
| 197 | 245 | ||
| 198 | -#: ui/window.xml:173 ui/application.xml:256 | 246 | +#: ui/window.xml:183 ui/application.xml:256 |
| 199 | msgid "Cut" | 247 | msgid "Cut" |
| 200 | msgstr "Recortar" | 248 | msgstr "Recortar" |
| 201 | 249 | ||
| 202 | -#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:314 | 250 | +#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:314 |
| 203 | msgid "Delete Field" | 251 | msgid "Delete Field" |
| 204 | msgstr "Apagar campo" | 252 | msgstr "Apagar campo" |
| 205 | 253 | ||
| 206 | -#: ui/window.xml:93 ui/application.xml:158 | ||
| 207 | -msgid "Desktop icon" | ||
| 208 | -msgstr "Ícone da área de trabalho" | ||
| 209 | - | ||
| 210 | -#: ui/window.xml:265 ui/window.xml:453 | 254 | +#: ui/window.xml:275 ui/window.xml:468 |
| 211 | msgid "Disconnect" | 255 | msgid "Disconnect" |
| 212 | msgstr "Desconectar" | 256 | msgstr "Desconectar" |
| 213 | 257 | ||
| 214 | -#: src/objects/window/window.c:702 src/objects/window/window.c:729 | ||
| 215 | -#: src/objects/window/page.c:206 | 258 | +#: src/objects/window/window.c:753 src/objects/window/window.c:780 |
| 259 | +#: src/objects/window/page.c:207 | ||
| 216 | msgid "Disconnected from host" | 260 | msgid "Disconnected from host" |
| 217 | msgstr "Desconectado do servidor" | 261 | msgstr "Desconectado do servidor" |
| 218 | 262 | ||
| 219 | -#: ui/window.xml:381 ui/window.xml:492 ui/application.xml:524 | 263 | +#: ui/window.xml:391 ui/window.xml:507 ui/application.xml:524 |
| 220 | msgid "Dynamic font spacing" | 264 | msgid "Dynamic font spacing" |
| 221 | msgstr "Espaçamento dinâmico" | 265 | msgstr "Espaçamento dinâmico" |
| 222 | 266 | ||
| @@ -240,15 +284,19 @@ msgstr "Largura do elemento em colunas" | @@ -240,15 +284,19 @@ msgstr "Largura do elemento em colunas" | ||
| 240 | msgid "Enabled" | 284 | msgid "Enabled" |
| 241 | msgstr "Habilitado" | 285 | msgstr "Habilitado" |
| 242 | 286 | ||
| 243 | -#: ui/window.xml:187 ui/window.xml:329 ui/application.xml:309 | 287 | +#: src/objects/settings/actionview.c:78 |
| 288 | +msgid "End" | ||
| 289 | +msgstr "Final" | ||
| 290 | + | ||
| 291 | +#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:309 | ||
| 244 | msgid "Erase input" | 292 | msgid "Erase input" |
| 245 | msgstr "Apagar campos" | 293 | msgstr "Apagar campos" |
| 246 | 294 | ||
| 247 | -#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:319 | 295 | +#: ui/window.xml:207 ui/window.xml:349 ui/application.xml:319 |
| 248 | msgid "Erase to end of field" | 296 | msgid "Erase to end of field" |
| 249 | msgstr "Apagar até o final do campo" | 297 | msgstr "Apagar até o final do campo" |
| 250 | 298 | ||
| 251 | -#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:324 | 299 | +#: ui/window.xml:212 ui/window.xml:354 ui/application.xml:324 |
| 252 | msgid "Erase to end of line" | 300 | msgid "Erase to end of line" |
| 253 | msgstr "Apagar até o final da linha" | 301 | msgstr "Apagar até o final da linha" |
| 254 | 302 | ||
| @@ -256,15 +304,11 @@ msgstr "Apagar até o final da linha" | @@ -256,15 +304,11 @@ msgstr "Apagar até o final da linha" | ||
| 256 | msgid "Field attributes" | 304 | msgid "Field attributes" |
| 257 | msgstr "Mostra atributos de campo" | 305 | msgstr "Mostra atributos de campo" |
| 258 | 306 | ||
| 259 | -#: src/objects/windows/savedesktopicon.c:62 | ||
| 260 | -msgid "File name" | ||
| 261 | -msgstr "Nome do arquivo" | ||
| 262 | - | ||
| 263 | #: ui/application.xml:454 | 307 | #: ui/application.xml:454 |
| 264 | msgid "Full Screen" | 308 | msgid "Full Screen" |
| 265 | msgstr "Tela cheia" | 309 | msgstr "Tela cheia" |
| 266 | 310 | ||
| 267 | -#: ui/window.xml:236 ui/window.xml:407 ui/window.xml:497 | 311 | +#: ui/window.xml:246 ui/window.xml:417 ui/window.xml:512 |
| 268 | msgid "Full screen" | 312 | msgid "Full screen" |
| 269 | msgstr "Tela cheia" | 313 | msgstr "Tela cheia" |
| 270 | 314 | ||
| @@ -272,6 +316,10 @@ msgstr "Tela cheia" | @@ -272,6 +316,10 @@ msgstr "Tela cheia" | ||
| 272 | msgid "Function bar" | 316 | msgid "Function bar" |
| 273 | msgstr "Barra de funções" | 317 | msgstr "Barra de funções" |
| 274 | 318 | ||
| 319 | +#: src/objects/os/linux/savedesktopicon.c:94 | ||
| 320 | +msgid "Generic name" | ||
| 321 | +msgstr "Nome genérico" | ||
| 322 | + | ||
| 275 | #: ui/application.xml:36 ui/application.xml:534 | 323 | #: ui/application.xml:36 ui/application.xml:534 |
| 276 | msgid "Help" | 324 | msgid "Help" |
| 277 | msgstr "Ajuda" | 325 | msgstr "Ajuda" |
| @@ -280,11 +328,11 @@ msgstr "Ajuda" | @@ -280,11 +328,11 @@ msgstr "Ajuda" | ||
| 280 | msgid "Host properties" | 328 | msgid "Host properties" |
| 281 | msgstr "Propriedades do Servidor" | 329 | msgstr "Propriedades do Servidor" |
| 282 | 330 | ||
| 283 | -#: src/objects/window/window.c:469 | 331 | +#: src/objects/window/window.c:552 src/objects/os/linux/savedesktopicon.c:102 |
| 284 | msgid "IBM 3270 Terminal emulator" | 332 | msgid "IBM 3270 Terminal emulator" |
| 285 | msgstr "Emulador 3270" | 333 | msgstr "Emulador 3270" |
| 286 | 334 | ||
| 287 | -#: src/objects/actions/view.c:89 | 335 | +#: src/objects/actions/view.c:90 |
| 288 | msgid "Icon" | 336 | msgid "Icon" |
| 289 | msgstr "Ícone" | 337 | msgstr "Ícone" |
| 290 | 338 | ||
| @@ -292,19 +340,27 @@ msgstr "Ícone" | @@ -292,19 +340,27 @@ msgstr "Ícone" | ||
| 292 | msgid "Icon Name" | 340 | msgid "Icon Name" |
| 293 | msgstr "Nome do ícone" | 341 | msgstr "Nome do ícone" |
| 294 | 342 | ||
| 295 | -#: src/objects/toolbar/settings.c:50 | 343 | +#: src/objects/toolbar/settings.c:54 |
| 296 | msgid "Icon Size" | 344 | msgid "Icon Size" |
| 297 | msgstr "Tamanho do ícone" | 345 | msgstr "Tamanho do ícone" |
| 298 | 346 | ||
| 299 | -#: src/objects/toolbar/toolbar.c:262 | 347 | +#: src/objects/toolbar/settings.c:61 |
| 348 | +msgid "Icon Style" | ||
| 349 | +msgstr "Estilo do ícone" | ||
| 350 | + | ||
| 351 | +#: src/objects/toolbar/models.c:52 | ||
| 300 | msgid "Icon _size" | 352 | msgid "Icon _size" |
| 301 | msgstr "_Tamanho do ícone" | 353 | msgstr "_Tamanho do ícone" |
| 302 | 354 | ||
| 303 | -#: src/objects/toolbar/toolbar.c:84 | 355 | +#: src/objects/toolbar/models.c:108 |
| 356 | +msgid "Icon type" | ||
| 357 | +msgstr "Tipo do ícone" | ||
| 358 | + | ||
| 359 | +#: src/objects/toolbar/models.c:97 | ||
| 304 | msgid "Icons & text" | 360 | msgid "Icons & text" |
| 305 | msgstr "Ícones e texto" | 361 | msgstr "Ícones e texto" |
| 306 | 362 | ||
| 307 | -#: src/objects/toolbar/toolbar.c:74 | 363 | +#: src/objects/toolbar/models.c:87 |
| 308 | msgid "Icons only" | 364 | msgid "Icons only" |
| 309 | msgstr "Apenas ícones" | 365 | msgstr "Apenas ícones" |
| 310 | 366 | ||
| @@ -312,7 +368,7 @@ msgstr "Apenas ícones" | @@ -312,7 +368,7 @@ msgstr "Apenas ícones" | ||
| 312 | msgid "If the action can be activated" | 368 | msgid "If the action can be activated" |
| 313 | msgstr "Se a ação pode ser ativada" | 369 | msgstr "Se a ação pode ser ativada" |
| 314 | 370 | ||
| 315 | -#: ui/window.xml:469 | 371 | +#: ui/window.xml:484 |
| 316 | msgid "Insert" | 372 | msgid "Insert" |
| 317 | msgstr "Inserção" | 373 | msgstr "Inserção" |
| 318 | 374 | ||
| @@ -320,7 +376,15 @@ msgstr "Inserção" | @@ -320,7 +376,15 @@ msgstr "Inserção" | ||
| 320 | msgid "Invalid or unknown property type" | 376 | msgid "Invalid or unknown property type" |
| 321 | msgstr "Tipo da propriedade é inválido ou desconhecido" | 377 | msgstr "Tipo da propriedade é inválido ou desconhecido" |
| 322 | 378 | ||
| 323 | -#: src/objects/toolbar/settings.c:108 | 379 | +#: src/objects/settings/actionview.c:79 |
| 380 | +msgid "Items packed from the end to the start" | ||
| 381 | +msgstr "Itens empacotados do final para o início" | ||
| 382 | + | ||
| 383 | +#: src/objects/settings/actionview.c:69 | ||
| 384 | +msgid "Items packed from the start to the end" | ||
| 385 | +msgstr "Itens empacotados do início para o final" | ||
| 386 | + | ||
| 387 | +#: src/objects/toolbar/settings.c:106 | ||
| 324 | msgid "Itens" | 388 | msgid "Itens" |
| 325 | msgstr "Itens" | 389 | msgstr "Itens" |
| 326 | 390 | ||
| @@ -348,22 +412,26 @@ msgstr "Largura do painel em colunas" | @@ -348,22 +412,26 @@ msgstr "Largura do painel em colunas" | ||
| 348 | msgid "Keypads" | 412 | msgid "Keypads" |
| 349 | msgstr "Painéis" | 413 | msgstr "Painéis" |
| 350 | 414 | ||
| 351 | -#: src/objects/actions/view.c:98 | 415 | +#: src/objects/application/actions/about.c:140 |
| 416 | +msgid "LICENSE" | ||
| 417 | +msgstr "LICENCA" | ||
| 418 | + | ||
| 419 | +#: src/objects/actions/view.c:99 | ||
| 352 | msgid "Label" | 420 | msgid "Label" |
| 353 | msgstr "Etiqueta" | 421 | msgstr "Etiqueta" |
| 354 | 422 | ||
| 355 | -#: src/objects/toolbar/toolbar.c:58 | 423 | +#: src/objects/toolbar/models.c:66 |
| 356 | msgid "Large" | 424 | msgid "Large" |
| 357 | msgstr "Grande" | 425 | msgstr "Grande" |
| 358 | 426 | ||
| 359 | -#: src/objects/windows/savedesktopicon.c:67 | ||
| 360 | -msgid "Launcher name" | ||
| 361 | -msgstr "Nome do lançador" | ||
| 362 | - | ||
| 363 | -#: src/objects/toolbar/settings.c:207 | 427 | +#: src/objects/toolbar/settings.c:176 |
| 364 | msgid "Layout" | 428 | msgid "Layout" |
| 365 | msgstr "Formato" | 429 | msgstr "Formato" |
| 366 | 430 | ||
| 431 | +#: src/objects/settings/actionview.c:74 | ||
| 432 | +msgid "List of the available and unpacked actions" | ||
| 433 | +msgstr "Lista de ações disponíveis ainda não empacotadas" | ||
| 434 | + | ||
| 367 | #: ui/application.xml:71 | 435 | #: ui/application.xml:71 |
| 368 | msgid "Main Menu" | 436 | msgid "Main Menu" |
| 369 | msgstr "Menu principal" | 437 | msgstr "Menu principal" |
| @@ -372,11 +440,11 @@ msgstr "Menu principal" | @@ -372,11 +440,11 @@ msgstr "Menu principal" | ||
| 372 | msgid "Main Toolbar" | 440 | msgid "Main Toolbar" |
| 373 | msgstr "Barra de ferramentas" | 441 | msgstr "Barra de ferramentas" |
| 374 | 442 | ||
| 375 | -#: ui/window.xml:540 | 443 | +#: ui/window.xml:555 |
| 376 | msgid "Main menu" | 444 | msgid "Main menu" |
| 377 | msgstr "Menu principal" | 445 | msgstr "Menu principal" |
| 378 | 446 | ||
| 379 | -#: src/objects/application/actions/about.c:125 | 447 | +#: src/objects/application/actions/about.c:128 |
| 380 | msgid "Maintainers" | 448 | msgid "Maintainers" |
| 381 | msgstr "Mantenedores" | 449 | msgstr "Mantenedores" |
| 382 | 450 | ||
| @@ -384,23 +452,23 @@ msgstr "Mantenedores" | @@ -384,23 +452,23 @@ msgstr "Mantenedores" | ||
| 384 | msgid "Menu" | 452 | msgid "Menu" |
| 385 | msgstr "Menu" | 453 | msgstr "Menu" |
| 386 | 454 | ||
| 387 | -#: ui/window.xml:506 ui/application.xml:403 | 455 | +#: ui/window.xml:521 ui/application.xml:403 |
| 388 | msgid "Model 2 - 80x24" | 456 | msgid "Model 2 - 80x24" |
| 389 | msgstr "Modelo 2 - 80x24" | 457 | msgstr "Modelo 2 - 80x24" |
| 390 | 458 | ||
| 391 | -#: ui/window.xml:511 ui/application.xml:408 | 459 | +#: ui/window.xml:526 ui/application.xml:408 |
| 392 | msgid "Model 3 - 80x32" | 460 | msgid "Model 3 - 80x32" |
| 393 | msgstr "Modelo 3 - 80x32" | 461 | msgstr "Modelo 3 - 80x32" |
| 394 | 462 | ||
| 395 | -#: ui/window.xml:516 ui/application.xml:413 | 463 | +#: ui/window.xml:531 ui/application.xml:413 |
| 396 | msgid "Model 4 - 80x43" | 464 | msgid "Model 4 - 80x43" |
| 397 | msgstr "Modelo 4 - 80x43" | 465 | msgstr "Modelo 4 - 80x43" |
| 398 | 466 | ||
| 399 | -#: ui/window.xml:521 ui/application.xml:418 | 467 | +#: ui/window.xml:536 ui/application.xml:418 |
| 400 | msgid "Model 5 - 132x27" | 468 | msgid "Model 5 - 132x27" |
| 401 | msgstr "Modelo 5 - 132x27" | 469 | msgstr "Modelo 5 - 132x27" |
| 402 | 470 | ||
| 403 | -#: ui/window.xml:376 ui/application.xml:444 | 471 | +#: ui/window.xml:386 ui/application.xml:444 |
| 404 | msgid "Monocase" | 472 | msgid "Monocase" |
| 405 | msgstr "Só Maiúsculas" | 473 | msgstr "Só Maiúsculas" |
| 406 | 474 | ||
| @@ -408,7 +476,7 @@ msgstr "Só Maiúsculas" | @@ -408,7 +476,7 @@ msgstr "Só Maiúsculas" | ||
| 408 | msgid "Network keep alive" | 476 | msgid "Network keep alive" |
| 409 | msgstr "Network keep alive" | 477 | msgstr "Network keep alive" |
| 410 | 478 | ||
| 411 | -#: src/objects/window/page.c:274 | 479 | +#: src/objects/window/page.c:275 |
| 412 | msgid "New session name" | 480 | msgid "New session name" |
| 413 | msgstr "Novo nome de sessão" | 481 | msgstr "Novo nome de sessão" |
| 414 | 482 | ||
| @@ -456,7 +524,7 @@ msgstr "Abrir sessão em nova aba" | @@ -456,7 +524,7 @@ msgstr "Abrir sessão em nova aba" | ||
| 456 | msgid "Open session in New window" | 524 | msgid "Open session in New window" |
| 457 | msgstr "Abrir sessão em nova janela" | 525 | msgstr "Abrir sessão em nova janela" |
| 458 | 526 | ||
| 459 | -#: ui/window.xml:212 ui/window.xml:354 ui/window.xml:489 ui/application.xml:431 | 527 | +#: ui/window.xml:222 ui/window.xml:364 ui/window.xml:504 ui/application.xml:431 |
| 460 | msgid "Options" | 528 | msgid "Options" |
| 461 | msgstr "Opções" | 529 | msgstr "Opções" |
| 462 | 530 | ||
| @@ -464,22 +532,26 @@ msgstr "Opções" | @@ -464,22 +532,26 @@ msgstr "Opções" | ||
| 464 | msgid "Parameter Type" | 532 | msgid "Parameter Type" |
| 465 | msgstr "Tipo de parâmetro" | 533 | msgstr "Tipo de parâmetro" |
| 466 | 534 | ||
| 467 | -#: ui/window.xml:286 ui/application.xml:261 | 535 | +#: ui/window.xml:296 ui/application.xml:261 |
| 468 | msgid "Paste from clipboard" | 536 | msgid "Paste from clipboard" |
| 469 | msgstr "Colar da área de transferência" | 537 | msgstr "Colar da área de transferência" |
| 470 | 538 | ||
| 471 | -#: ui/window.xml:296 ui/application.xml:271 | 539 | +#: ui/window.xml:306 ui/application.xml:271 |
| 472 | msgid "Paste from text file" | 540 | msgid "Paste from text file" |
| 473 | msgstr "Colar de um arquivo texto" | 541 | msgstr "Colar de um arquivo texto" |
| 474 | 542 | ||
| 475 | -#: ui/window.xml:291 ui/application.xml:266 | 543 | +#: ui/window.xml:301 ui/application.xml:266 |
| 476 | msgid "Paste next" | 544 | msgid "Paste next" |
| 477 | msgstr "Colar próximo" | 545 | msgstr "Colar próximo" |
| 478 | 546 | ||
| 479 | -#: ui/window.xml:393 ui/application.xml:469 | 547 | +#: ui/window.xml:403 ui/application.xml:469 |
| 480 | msgid "Paste with left margin" | 548 | msgid "Paste with left margin" |
| 481 | msgstr "Colar com margem esquerda" | 549 | msgstr "Colar com margem esquerda" |
| 482 | 550 | ||
| 551 | +#: src/objects/os/linux/savedesktopicon.c:71 | ||
| 552 | +msgid "Path for the new shortcut" | ||
| 553 | +msgstr "Caminho para o novo atalho" | ||
| 554 | + | ||
| 483 | #: ui/window.xml:129 | 555 | #: ui/window.xml:129 |
| 484 | msgid "Preferences" | 556 | msgid "Preferences" |
| 485 | msgstr "Preferências" | 557 | msgstr "Preferências" |
| @@ -488,11 +560,11 @@ msgstr "Preferências" | @@ -488,11 +560,11 @@ msgstr "Preferências" | ||
| 488 | msgid "Print" | 560 | msgid "Print" |
| 489 | msgstr "Imprimir" | 561 | msgstr "Imprimir" |
| 490 | 562 | ||
| 491 | -#: ui/window.xml:439 | 563 | +#: ui/window.xml:454 |
| 492 | msgid "Print screen" | 564 | msgid "Print screen" |
| 493 | msgstr "Imrpimir o conteúdo da tela" | 565 | msgstr "Imrpimir o conteúdo da tela" |
| 494 | 566 | ||
| 495 | -#: ui/window.xml:252 | 567 | +#: ui/window.xml:262 |
| 496 | msgid "Print selected" | 568 | msgid "Print selected" |
| 497 | msgstr "Imprimir seleção" | 569 | msgstr "Imprimir seleção" |
| 498 | 570 | ||
| @@ -505,15 +577,15 @@ msgstr "Propriedade \"%s\" é inválida para este objeto" | @@ -505,15 +577,15 @@ msgstr "Propriedade \"%s\" é inválida para este objeto" | ||
| 505 | msgid "Quit" | 577 | msgid "Quit" |
| 506 | msgstr "Sair" | 578 | msgstr "Sair" |
| 507 | 579 | ||
| 508 | -#: src/objects/window/page.c:261 | 580 | +#: src/objects/window/page.c:262 |
| 509 | msgid "Rename Session" | 581 | msgid "Rename Session" |
| 510 | msgstr "Renomear sessão" | 582 | msgstr "Renomear sessão" |
| 511 | 583 | ||
| 512 | -#: ui/window.xml:315 ui/application.xml:295 | 584 | +#: ui/window.xml:325 ui/application.xml:295 |
| 513 | msgid "Reselect" | 585 | msgid "Reselect" |
| 514 | msgstr "Reselecionar" | 586 | msgstr "Reselecionar" |
| 515 | 587 | ||
| 516 | -#: ui/window.xml:364 ui/application.xml:464 | 588 | +#: ui/window.xml:374 ui/application.xml:464 |
| 517 | msgid "Resize on alternate screen" | 589 | msgid "Resize on alternate screen" |
| 518 | msgstr "Mudar tamanho do terminal em tela alternativa" | 590 | msgstr "Mudar tamanho do terminal em tela alternativa" |
| 519 | 591 | ||
| @@ -521,55 +593,59 @@ msgstr "Mudar tamanho do terminal em tela alternativa" | @@ -521,55 +593,59 @@ msgstr "Mudar tamanho do terminal em tela alternativa" | ||
| 521 | msgid "Right keypad" | 593 | msgid "Right keypad" |
| 522 | msgstr "Painel direito" | 594 | msgstr "Painel direito" |
| 523 | 595 | ||
| 524 | -#: src/objects/toolbar/toolbar.c:286 | ||
| 525 | -msgid "S_tyle" | ||
| 526 | -msgstr "E_stilo" | ||
| 527 | - | ||
| 528 | -#: src/objects/actions/save.c:64 ui/window.xml:69 ui/application.xml:134 | 596 | +#: ui/window.xml:69 ui/application.xml:134 |
| 529 | msgid "Save" | 597 | msgid "Save" |
| 530 | msgstr "Salvar" | 598 | msgstr "Salvar" |
| 531 | 599 | ||
| 532 | -#: src/objects/actions/save.c:49 | ||
| 533 | -msgid "Save As" | ||
| 534 | -msgstr "Salvar Como" | ||
| 535 | - | ||
| 536 | -#: src/objects/windows/savedesktopicon.c:78 | ||
| 537 | -msgid "Save desktop icon" | ||
| 538 | -msgstr "Salvar ícone da área de trabalho" | 600 | +#: src/objects/actions/save.c:77 |
| 601 | +msgid "Save current session preferences to file" | ||
| 602 | +msgstr "Salvar preferências da sessão para arquivo" | ||
| 539 | 603 | ||
| 540 | -#: ui/window.xml:434 | 604 | +#: ui/window.xml:449 |
| 541 | msgid "Save screen" | 605 | msgid "Save screen" |
| 542 | msgstr "Salvar tela" | 606 | msgstr "Salvar tela" |
| 543 | 607 | ||
| 544 | -#: ui/window.xml:247 | 608 | +#: ui/window.xml:257 |
| 545 | msgid "Save selected" | 609 | msgid "Save selected" |
| 546 | msgstr "Salvar seleção" | 610 | msgstr "Salvar seleção" |
| 547 | 611 | ||
| 548 | -#: src/objects/actions/save.c:51 | ||
| 549 | -msgid "Save session properties" | ||
| 550 | -msgstr "Salvar propriedades da sessão" | 612 | +#: src/objects/actions/save.c:75 src/objects/actions/save.c:153 |
| 613 | +msgid "Save session preferences" | ||
| 614 | +msgstr "Salvar preferências da sessão" | ||
| 615 | + | ||
| 616 | +#: src/objects/os/linux/savedesktopicon.c:113 | ||
| 617 | +msgid "Save session shortcut" | ||
| 618 | +msgstr "Salvar atalho para a sessão" | ||
| 551 | 619 | ||
| 552 | -#: ui/window.xml:503 ui/application.xml:400 | 620 | +#: src/objects/os/linux/savedesktopicon.c:264 |
| 621 | +msgid "Save to session filename" | ||
| 622 | +msgstr "Salvar para arquivo de sessão" | ||
| 623 | + | ||
| 624 | +#: src/objects/os/linux/savedesktopicon.c:236 | ||
| 625 | +msgid "Save to shortcut file" | ||
| 626 | +msgstr "Salvar para atalho" | ||
| 627 | + | ||
| 628 | +#: ui/window.xml:518 ui/application.xml:400 | ||
| 553 | msgid "Screen size" | 629 | msgid "Screen size" |
| 554 | msgstr "Tamanho da tela" | 630 | msgstr "Tamanho da tela" |
| 555 | 631 | ||
| 556 | -#: ui/window.xml:310 ui/application.xml:285 | 632 | +#: ui/window.xml:320 ui/application.xml:285 |
| 557 | msgid "Select Field" | 633 | msgid "Select Field" |
| 558 | msgstr "Selecionar campo" | 634 | msgstr "Selecionar campo" |
| 559 | 635 | ||
| 560 | -#: ui/window.xml:305 ui/application.xml:280 | 636 | +#: ui/window.xml:315 ui/application.xml:280 |
| 561 | msgid "Select all" | 637 | msgid "Select all" |
| 562 | msgstr "Selecionar tudo" | 638 | msgstr "Selecionar tudo" |
| 563 | 639 | ||
| 564 | -#: ui/window.xml:217 ui/application.xml:479 | 640 | +#: ui/window.xml:227 ui/application.xml:479 |
| 565 | msgid "Select by rectangles" | 641 | msgid "Select by rectangles" |
| 566 | msgstr "Seleção retangular" | 642 | msgstr "Seleção retangular" |
| 567 | 643 | ||
| 568 | -#: src/objects/toolbar/settings.c:108 | 644 | +#: src/objects/toolbar/settings.c:106 |
| 569 | msgid "Select the toolbar itens" | 645 | msgid "Select the toolbar itens" |
| 570 | msgstr "Selecione itens da barra de ferramentas" | 646 | msgstr "Selecione itens da barra de ferramentas" |
| 571 | 647 | ||
| 572 | -#: src/objects/toolbar/settings.c:113 | 648 | +#: src/objects/toolbar/settings.c:111 |
| 573 | msgid "Selected" | 649 | msgid "Selected" |
| 574 | msgstr "Selecionado" | 650 | msgstr "Selecionado" |
| 575 | 651 | ||
| @@ -582,12 +658,12 @@ msgstr "Área selecionada" | @@ -582,12 +658,12 @@ msgstr "Área selecionada" | ||
| 582 | msgid "Send/Receive" | 658 | msgid "Send/Receive" |
| 583 | msgstr "Enviar/Receber" | 659 | msgstr "Enviar/Receber" |
| 584 | 660 | ||
| 585 | -#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:444 | 661 | +#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:459 |
| 586 | #: ui/application.xml:195 | 662 | #: ui/application.xml:195 |
| 587 | msgid "Send/Receive files" | 663 | msgid "Send/Receive files" |
| 588 | msgstr "Enviar/Receber arquivos" | 664 | msgstr "Enviar/Receber arquivos" |
| 589 | 665 | ||
| 590 | -#: src/objects/toolbar/settings.c:266 src/objects/toolbar/settings.c:276 | 666 | +#: src/objects/toolbar/settings.c:234 src/objects/toolbar/settings.c:244 |
| 591 | msgid "Separator" | 667 | msgid "Separator" |
| 592 | msgstr "Separador" | 668 | msgstr "Separador" |
| 593 | 669 | ||
| @@ -595,10 +671,14 @@ msgstr "Separador" | @@ -595,10 +671,14 @@ msgstr "Separador" | ||
| 595 | msgid "Session" | 671 | msgid "Session" |
| 596 | msgstr "Sessão" | 672 | msgstr "Sessão" |
| 597 | 673 | ||
| 598 | -#: ui/application.xml:76 | 674 | +#: ui/window.xml:440 ui/window.xml:560 ui/application.xml:76 |
| 599 | msgid "Session Trace" | 675 | msgid "Session Trace" |
| 600 | msgstr "Trace da sessão" | 676 | msgstr "Trace da sessão" |
| 601 | 677 | ||
| 678 | +#: src/objects/actions/save.c:63 src/objects/os/linux/savedesktopicon.c:85 | ||
| 679 | +msgid "Session file" | ||
| 680 | +msgstr "Arquivo de sessão" | ||
| 681 | + | ||
| 602 | #: ui/window.xml:61 ui/application.xml:126 | 682 | #: ui/window.xml:61 ui/application.xml:126 |
| 603 | msgid "Session in New Tab" | 683 | msgid "Session in New Tab" |
| 604 | msgstr "Sessão em nova aba" | 684 | msgstr "Sessão em nova aba" |
| @@ -607,12 +687,16 @@ msgstr "Sessão em nova aba" | @@ -607,12 +687,16 @@ msgstr "Sessão em nova aba" | ||
| 607 | msgid "Session in new window" | 687 | msgid "Session in new window" |
| 608 | msgstr "Sessão em nova janela" | 688 | msgstr "Sessão em nova janela" |
| 609 | 689 | ||
| 610 | -#: src/objects/window/actions/sessionproperties.c:45 ui/window.xml:98 | ||
| 611 | -#: ui/window.xml:554 ui/application.xml:163 | ||
| 612 | -msgid "Session properties" | ||
| 613 | -msgstr "Propriedades da sessão" | 690 | +#: src/objects/actions/save.c:56 src/objects/os/linux/savedesktopicon.c:77 |
| 691 | +msgid "Session name" | ||
| 692 | +msgstr "Nome da sessão" | ||
| 614 | 693 | ||
| 615 | -#: src/objects/application/application.c:221 | 694 | +#: src/objects/window/actions/sessionproperties.c:46 ui/window.xml:98 |
| 695 | +#: ui/window.xml:574 ui/application.xml:163 | ||
| 696 | +msgid "Session preferences" | ||
| 697 | +msgstr "Preferências da sessão" | ||
| 698 | + | ||
| 699 | +#: src/objects/application/application.c:219 | ||
| 616 | msgid "Set the user-interface type" | 700 | msgid "Set the user-interface type" |
| 617 | msgstr "Define o tipo de interface do usuário" | 701 | msgstr "Define o tipo de interface do usuário" |
| 618 | 702 | ||
| @@ -620,34 +704,58 @@ msgstr "Define o tipo de interface do usuário" | @@ -620,34 +704,58 @@ msgstr "Define o tipo de interface do usuário" | ||
| 620 | msgid "Settings" | 704 | msgid "Settings" |
| 621 | msgstr "Configurações" | 705 | msgstr "Configurações" |
| 622 | 706 | ||
| 623 | -#: src/objects/toolbar/settings.c:207 | 707 | +#: src/objects/toolbar/settings.c:176 |
| 624 | msgid "Setup the toolbar layout" | 708 | msgid "Setup the toolbar layout" |
| 625 | msgstr "Configura formato da barra de ferramentas" | 709 | msgstr "Configura formato da barra de ferramentas" |
| 626 | 710 | ||
| 627 | -#: src/objects/toolbar/settings.c:90 | 711 | +#: src/objects/window/header-settings.c:87 |
| 712 | +msgid "Setup title bar" | ||
| 713 | +msgstr "Configurar barra de título" | ||
| 714 | + | ||
| 715 | +#: src/objects/toolbar/toolbar.c:214 src/objects/toolbar/settings.c:88 | ||
| 628 | msgid "Setup toolbar" | 716 | msgid "Setup toolbar" |
| 629 | msgstr "Configurar barra de ferramentas" | 717 | msgstr "Configurar barra de ferramentas" |
| 630 | 718 | ||
| 719 | +#: src/objects/os/linux/savedesktopicon.c:70 | ||
| 720 | +msgid "Shortcut file" | ||
| 721 | +msgstr "Arquivo de atalho" | ||
| 722 | + | ||
| 723 | +#: ui/window.xml:93 ui/application.xml:158 | ||
| 724 | +msgid "Shortcut for this session" | ||
| 725 | +msgstr "Atalho para essa sessão" | ||
| 726 | + | ||
| 727 | +#: src/objects/os/linux/savedesktopicon.c:63 | ||
| 728 | +msgid "Shortcut name" | ||
| 729 | +msgstr "Nome do atalho" | ||
| 730 | + | ||
| 631 | #: ui/application.xml:494 | 731 | #: ui/application.xml:494 |
| 632 | msgid "Show Underline" | 732 | msgid "Show Underline" |
| 633 | msgstr "Mostrar sublinhado" | 733 | msgstr "Mostrar sublinhado" |
| 634 | 734 | ||
| 635 | -#: ui/window.xml:231 | 735 | +#: ui/window.xml:241 |
| 636 | msgid "Show menu" | 736 | msgid "Show menu" |
| 637 | msgstr "Mostrar menu" | 737 | msgstr "Mostrar menu" |
| 638 | 738 | ||
| 639 | -#: ui/window.xml:226 | 739 | +#: ui/window.xml:236 |
| 640 | msgid "Show toolbar" | 740 | msgid "Show toolbar" |
| 641 | msgstr "Mostrar barra de ferramentas" | 741 | msgstr "Mostrar barra de ferramentas" |
| 642 | 742 | ||
| 643 | -#: src/objects/toolbar/toolbar.c:53 | 743 | +#: src/objects/toolbar/models.c:61 |
| 644 | msgid "Small" | 744 | msgid "Small" |
| 645 | msgstr "Pequeno" | 745 | msgstr "Pequeno" |
| 646 | 746 | ||
| 647 | -#: ui/window.xml:388 ui/application.xml:504 | 747 | +#: ui/window.xml:398 ui/application.xml:504 |
| 648 | msgid "Smart paste" | 748 | msgid "Smart paste" |
| 649 | msgstr "Colar inteligente" | 749 | msgstr "Colar inteligente" |
| 650 | 750 | ||
| 751 | +#: src/objects/os/linux/savedesktopicon.c:239 | ||
| 752 | +msgid "Standard desktop files" | ||
| 753 | +msgstr "Arquivo de atalho padrão" | ||
| 754 | + | ||
| 755 | +#: src/objects/settings/actionview.c:68 | ||
| 756 | +msgid "Start" | ||
| 757 | +msgstr "Inicio" | ||
| 758 | + | ||
| 651 | #: src/objects/actions/abstract.c:152 | 759 | #: src/objects/actions/abstract.c:152 |
| 652 | msgid "State" | 760 | msgid "State" |
| 653 | msgstr "Estado" | 761 | msgstr "Estado" |
| @@ -656,11 +764,12 @@ msgstr "Estado" | @@ -656,11 +764,12 @@ msgstr "Estado" | ||
| 656 | msgid "State Type" | 764 | msgid "State Type" |
| 657 | msgstr "Tipo do estado" | 765 | msgstr "Tipo do estado" |
| 658 | 766 | ||
| 659 | -#: src/objects/toolbar/settings.c:55 | ||
| 660 | -msgid "Style" | ||
| 661 | -msgstr "Estilo" | 767 | +#: src/objects/toolbar/models.c:115 |
| 768 | +msgid "Symbolic" | ||
| 769 | +msgstr "Simbólico" | ||
| 662 | 770 | ||
| 663 | -#: src/objects/toolbar/toolbar.c:47 src/objects/toolbar/toolbar.c:69 | 771 | +#: src/objects/toolbar/models.c:55 src/objects/toolbar/models.c:82 |
| 772 | +#: src/objects/toolbar/models.c:111 | ||
| 664 | msgid "System default" | 773 | msgid "System default" |
| 665 | msgstr "Padrão do sistema" | 774 | msgstr "Padrão do sistema" |
| 666 | 775 | ||
| @@ -676,7 +785,7 @@ msgstr "Aba com a sessão padrão" | @@ -676,7 +785,7 @@ msgstr "Aba com a sessão padrão" | ||
| 676 | msgid "Terminal font" | 785 | msgid "Terminal font" |
| 677 | msgstr "Fonte do terminal" | 786 | msgstr "Fonte do terminal" |
| 678 | 787 | ||
| 679 | -#: src/objects/toolbar/toolbar.c:79 | 788 | +#: src/objects/toolbar/models.c:92 |
| 680 | msgid "Text only" | 789 | msgid "Text only" |
| 681 | msgstr "Apenas texto" | 790 | msgstr "Apenas texto" |
| 682 | 791 | ||
| @@ -696,6 +805,14 @@ msgstr "A dica da ação" | @@ -696,6 +805,14 @@ msgstr "A dica da ação" | ||
| 696 | msgid "The code of the User interface type" | 805 | msgid "The code of the User interface type" |
| 697 | msgstr "Código identificando o tipo de interface do usuário" | 806 | msgstr "Código identificando o tipo de interface do usuário" |
| 698 | 807 | ||
| 808 | +#: src/objects/actions/save.c:64 | ||
| 809 | +msgid "The file to save the current session preferences" | ||
| 810 | +msgstr "O arquivo com as preferências da sessão atual" | ||
| 811 | + | ||
| 812 | +#: src/objects/os/linux/savedesktopicon.c:86 | ||
| 813 | +msgid "The file with the session preferences for this shortcut" | ||
| 814 | +msgstr "O arquivo com as preferências da sessão para esse atalho" | ||
| 815 | + | ||
| 699 | #: src/objects/actions/abstract.c:110 | 816 | #: src/objects/actions/abstract.c:110 |
| 700 | msgid "The label for the action" | 817 | msgid "The label for the action" |
| 701 | msgstr "A etiqueta da ação" | 818 | msgstr "A etiqueta da ação" |
| @@ -704,11 +821,11 @@ msgstr "A etiqueta da ação" | @@ -704,11 +821,11 @@ msgstr "A etiqueta da ação" | ||
| 704 | msgid "The name of associated action" | 821 | msgid "The name of associated action" |
| 705 | msgstr "Nome da ação associada" | 822 | msgstr "Nome da ação associada" |
| 706 | 823 | ||
| 707 | -#: src/objects/window/window.c:164 | 824 | +#: src/objects/window/window.c:185 |
| 708 | msgid "The name of the actions in the header bar" | 825 | msgid "The name of the actions in the header bar" |
| 709 | msgstr "O nome das ações na barra de título" | 826 | msgstr "O nome das ações na barra de título" |
| 710 | 827 | ||
| 711 | -#: src/objects/toolbar/toolbar.c:136 | 828 | +#: src/objects/toolbar/toolbar.c:98 |
| 712 | msgid "The name of the actions in the toolbar" | 829 | msgid "The name of the actions in the toolbar" |
| 713 | msgstr "O nome das ações na barra de ferramentas" | 830 | msgstr "O nome das ações na barra de ferramentas" |
| 714 | 831 | ||
| @@ -732,15 +849,25 @@ msgstr "O nome usado para ativar a ação" | @@ -732,15 +849,25 @@ msgstr "O nome usado para ativar a ação" | ||
| 732 | msgid "The position of the keypad" | 849 | msgid "The position of the keypad" |
| 733 | msgstr "A posição do painel" | 850 | msgstr "A posição do painel" |
| 734 | 851 | ||
| 852 | +#: src/objects/actions/save.c:57 src/objects/os/linux/savedesktopicon.c:79 | ||
| 853 | +msgid "The session name used in the window/tab title (empty for default)" | ||
| 854 | +msgstr "" | ||
| 855 | +"O nome da sessão usada no título da janela/aba. Vazio para usar o valor " | ||
| 856 | +"padrão" | ||
| 857 | + | ||
| 735 | #: src/objects/actions/abstract.c:153 | 858 | #: src/objects/actions/abstract.c:153 |
| 736 | msgid "The state the action is in" | 859 | msgid "The state the action is in" |
| 737 | msgstr "O estado em que a ação está" | 860 | msgstr "O estado em que a ação está" |
| 738 | 861 | ||
| 739 | -#: src/objects/toolbar/toolbar.c:147 | 862 | +#: src/objects/toolbar/toolbar.c:109 |
| 740 | msgid "The toolbar icon size" | 863 | msgid "The toolbar icon size" |
| 741 | msgstr "Tamanho dos ícones na barra de ferramentas" | 864 | msgstr "Tamanho dos ícones na barra de ferramentas" |
| 742 | 865 | ||
| 743 | -#: src/objects/toolbar/toolbar.c:160 | 866 | +#: src/objects/toolbar/toolbar.c:135 |
| 867 | +msgid "The toolbar icon type" | ||
| 868 | +msgstr "Tipo dos ícones na barra de ferramentas" | ||
| 869 | + | ||
| 870 | +#: src/objects/toolbar/toolbar.c:122 | ||
| 744 | msgid "The toolbar style" | 871 | msgid "The toolbar style" |
| 745 | msgstr "Estilo da barra de ferramentas" | 872 | msgstr "Estilo da barra de ferramentas" |
| 746 | 873 | ||
| @@ -756,12 +883,28 @@ msgstr "The type of GVariant passed to activate()" | @@ -756,12 +883,28 @@ msgstr "The type of GVariant passed to activate()" | ||
| 756 | msgid "The type of the state kept by the action" | 883 | msgid "The type of the state kept by the action" |
| 757 | msgstr "O tipo do estado mantido pela ação" | 884 | msgstr "O tipo do estado mantido pela ação" |
| 758 | 885 | ||
| 759 | -#: src/objects/toolbar/settings.c:89 ui/window.xml:420 ui/window.xml:535 | 886 | +#: src/objects/window/header-settings.c:86 |
| 887 | +msgid "Title bar" | ||
| 888 | +msgstr "Barra de título" | ||
| 889 | + | ||
| 890 | +#: src/objects/window/header-settings.c:98 | ||
| 891 | +msgid "Title bar actions" | ||
| 892 | +msgstr "Ações da barra de título" | ||
| 893 | + | ||
| 894 | +#: src/objects/toolbar/settings.c:87 ui/window.xml:430 ui/window.xml:550 | ||
| 760 | #: ui/application.xml:342 | 895 | #: ui/application.xml:342 |
| 761 | msgid "Toolbar" | 896 | msgid "Toolbar" |
| 762 | msgstr "Barra de ferramentas" | 897 | msgstr "Barra de ferramentas" |
| 763 | 898 | ||
| 764 | -#: ui/window.xml:425 | 899 | +#: src/objects/toolbar/settings.c:68 |
| 900 | +msgid "Toolbar Style" | ||
| 901 | +msgstr "Estilo da barra de ferramentas" | ||
| 902 | + | ||
| 903 | +#: src/objects/toolbar/models.c:79 | ||
| 904 | +msgid "Toolbar s_tyle" | ||
| 905 | +msgstr "Est_ilo da barra de ferramentas" | ||
| 906 | + | ||
| 907 | +#: ui/window.xml:435 | ||
| 765 | msgid "Top menu" | 908 | msgid "Top menu" |
| 766 | msgstr "Menu principal" | 909 | msgstr "Menu principal" |
| 767 | 910 | ||
| @@ -769,7 +912,7 @@ msgstr "Menu principal" | @@ -769,7 +912,7 @@ msgstr "Menu principal" | ||
| 769 | msgid "Trace" | 912 | msgid "Trace" |
| 770 | msgstr "Trace" | 913 | msgstr "Trace" |
| 771 | 914 | ||
| 772 | -#: ui/window.xml:474 ui/application.xml:449 | 915 | +#: ui/window.xml:489 ui/application.xml:449 |
| 773 | msgid "Track Cursor" | 916 | msgid "Track Cursor" |
| 774 | msgstr "Mostrar posição do cursor" | 917 | msgstr "Mostrar posição do cursor" |
| 775 | 918 | ||
| @@ -777,7 +920,7 @@ msgstr "Mostrar posição do cursor" | @@ -777,7 +920,7 @@ msgstr "Mostrar posição do cursor" | ||
| 777 | msgid "UI Type" | 920 | msgid "UI Type" |
| 778 | msgstr "Interface de usuário" | 921 | msgstr "Interface de usuário" |
| 779 | 922 | ||
| 780 | -#: ui/window.xml:257 ui/application.xml:290 | 923 | +#: ui/window.xml:267 ui/application.xml:290 |
| 781 | msgid "Unselect" | 924 | msgid "Unselect" |
| 782 | msgstr "Remover seleção" | 925 | msgstr "Remover seleção" |
| 783 | 926 | ||
| @@ -785,34 +928,38 @@ msgstr "Remover seleção" | @@ -785,34 +928,38 @@ msgstr "Remover seleção" | ||
| 785 | msgid "Use +/- for field navigation" | 928 | msgid "Use +/- for field navigation" |
| 786 | msgstr "Usar teclas +/- para navegar por campos" | 929 | msgstr "Usar teclas +/- para navegar por campos" |
| 787 | 930 | ||
| 788 | -#: src/objects/application/actions/about.c:86 | ||
| 789 | -#: src/objects/application/actions/about.c:88 | 931 | +#: src/objects/application/actions/about.c:70 |
| 790 | #, c-format | 932 | #, c-format |
| 791 | msgid "Version %s-%s" | 933 | msgid "Version %s-%s" |
| 792 | msgstr "Versão %s-%s" | 934 | msgstr "Versão %s-%s" |
| 793 | 935 | ||
| 794 | -#: src/objects/window/header.c:66 ui/window.xml:417 ui/window.xml:532 | 936 | +#: src/objects/window/header.c:66 ui/window.xml:427 ui/window.xml:547 |
| 795 | #: ui/application.xml:63 | 937 | #: ui/application.xml:63 |
| 796 | msgid "View" | 938 | msgid "View" |
| 797 | msgstr "Exibir" | 939 | msgstr "Exibir" |
| 798 | 940 | ||
| 941 | +#: src/objects/application/actions/about.c:163 | ||
| 942 | +msgid "View this project on github" | ||
| 943 | +msgstr "Portal do Software Público Brasileiro" | ||
| 944 | + | ||
| 799 | #: ui/window.xml:40 ui/application.xml:105 | 945 | #: ui/window.xml:40 ui/application.xml:105 |
| 800 | msgid "Window with default session" | 946 | msgid "Window with default session" |
| 801 | msgstr "Janela com sessão padrão" | 947 | msgstr "Janela com sessão padrão" |
| 802 | 948 | ||
| 803 | -#: src/objects/settings/dialog.c:84 | 949 | +#: src/objects/settings/dialog.c:79 |
| 804 | msgid "_Apply" | 950 | msgid "_Apply" |
| 805 | msgstr "_Aplicar" | 951 | msgstr "_Aplicar" |
| 806 | 952 | ||
| 807 | -#: src/objects/settings/dialog.c:83 src/objects/windows/savedesktopicon.c:104 | 953 | +#: src/objects/actions/save.c:102 src/objects/settings/dialog.c:78 |
| 954 | +#: src/objects/os/linux/savedesktopicon.c:174 | ||
| 808 | msgid "_Cancel" | 955 | msgid "_Cancel" |
| 809 | msgstr "_Cancelar" | 956 | msgstr "_Cancelar" |
| 810 | 957 | ||
| 811 | -#: src/objects/window/page.c:394 | 958 | +#: src/objects/window/page.c:371 |
| 812 | msgid "_Close session" | 959 | msgid "_Close session" |
| 813 | msgstr "_Fechar sessão" | 960 | msgstr "_Fechar sessão" |
| 814 | 961 | ||
| 815 | -#: ui/window.xml:549 ui/application.xml:368 | 962 | +#: ui/window.xml:569 ui/application.xml:368 |
| 816 | msgid "_Connect" | 963 | msgid "_Connect" |
| 817 | msgstr "_Conectar" | 964 | msgstr "_Conectar" |
| 818 | 965 | ||
| @@ -820,7 +967,7 @@ msgstr "_Conectar" | @@ -820,7 +967,7 @@ msgstr "_Conectar" | ||
| 820 | msgid "_Disconnect" | 967 | msgid "_Disconnect" |
| 821 | msgstr "_Desconectar" | 968 | msgstr "_Desconectar" |
| 822 | 969 | ||
| 823 | -#: ui/window.xml:148 ui/window.xml:281 ui/application.xml:231 | 970 | +#: ui/window.xml:148 ui/window.xml:291 ui/application.xml:231 |
| 824 | msgid "_Edit" | 971 | msgid "_Edit" |
| 825 | msgstr "_Editar" | 972 | msgstr "_Editar" |
| 826 | 973 | ||
| @@ -840,15 +987,15 @@ msgstr "_Nova" | @@ -840,15 +987,15 @@ msgstr "_Nova" | ||
| 840 | msgid "_Open" | 987 | msgid "_Open" |
| 841 | msgstr "_Abrir" | 988 | msgstr "_Abrir" |
| 842 | 989 | ||
| 843 | -#: src/objects/toolbar/toolbar.c:308 | ||
| 844 | -msgid "_Properties" | ||
| 845 | -msgstr "_Propriedades" | 990 | +#: src/objects/toolbar/toolbar.c:236 |
| 991 | +msgid "_Preferences" | ||
| 992 | +msgstr "_Preferências" | ||
| 846 | 993 | ||
| 847 | -#: src/objects/window/page.c:388 | 994 | +#: src/objects/window/page.c:365 |
| 848 | msgid "_Rename session" | 995 | msgid "_Rename session" |
| 849 | msgstr "Renomear sessão" | 996 | msgstr "Renomear sessão" |
| 850 | 997 | ||
| 851 | -#: src/objects/windows/savedesktopicon.c:105 | 998 | +#: src/objects/actions/save.c:103 src/objects/os/linux/savedesktopicon.c:175 |
| 852 | msgid "_Save" | 999 | msgid "_Save" |
| 853 | msgstr "_Salvar" | 1000 | msgstr "_Salvar" |
| 854 | 1001 | ||
| @@ -856,7 +1003,11 @@ msgstr "_Salvar" | @@ -856,7 +1003,11 @@ msgstr "_Salvar" | ||
| 856 | msgid "_View" | 1003 | msgid "_View" |
| 857 | msgstr "_Exibir" | 1004 | msgstr "_Exibir" |
| 858 | 1005 | ||
| 859 | -#: src/objects/application/actions/about.c:145 | 1006 | +#: src/objects/application/actions/about.c:162 |
| 1007 | +msgid "https://github.com/PerryWerneck/pw3270" | ||
| 1008 | +msgstr "https://portal.softwarepublico.gov.br/social/pw3270/" | ||
| 1009 | + | ||
| 1010 | +#: src/objects/application/actions/about.c:165 | ||
| 860 | msgid "translator-credits" | 1011 | msgid "translator-credits" |
| 861 | msgstr "translator-credits" | 1012 | msgstr "translator-credits" |
| 862 | 1013 | ||
| @@ -1165,6 +1316,10 @@ msgstr "translator-credits" | @@ -1165,6 +1316,10 @@ msgstr "translator-credits" | ||
| 1165 | #~ msgid "Blue" | 1316 | #~ msgid "Blue" |
| 1166 | #~ msgstr "Azul" | 1317 | #~ msgstr "Azul" |
| 1167 | 1318 | ||
| 1319 | +#~ msgctxt "ProjectURLTitle" | ||
| 1320 | +#~ msgid "Brazilian Public Software Portal" | ||
| 1321 | +#~ msgstr "Portal do Software Público Brasileiro" | ||
| 1322 | + | ||
| 1168 | #~ msgid "Break" | 1323 | #~ msgid "Break" |
| 1169 | #~ msgstr "Break" | 1324 | #~ msgstr "Break" |
| 1170 | 1325 | ||
| @@ -1287,7 +1442,7 @@ msgstr "translator-credits" | @@ -1287,7 +1442,7 @@ msgstr "translator-credits" | ||
| 1287 | #~ msgid "Can't load plugin %s" | 1442 | #~ msgid "Can't load plugin %s" |
| 1288 | #~ msgstr "Não foi possível carregar plugin %s" | 1443 | #~ msgstr "Não foi possível carregar plugin %s" |
| 1289 | 1444 | ||
| 1290 | -#~ msgid "Can't open %s" | 1445 | +#~ msgid "Can't open \"%s\"" |
| 1291 | #~ msgstr "Não foi possível abrir %s" | 1446 | #~ msgstr "Não foi possível abrir %s" |
| 1292 | 1447 | ||
| 1293 | #~ msgid "Can't open CRL File" | 1448 | #~ msgid "Can't open CRL File" |
| @@ -1335,9 +1490,6 @@ msgstr "translator-credits" | @@ -1335,9 +1490,6 @@ msgstr "translator-credits" | ||
| 1335 | #~ msgid "Can't save \"%s\": %s" | 1490 | #~ msgid "Can't save \"%s\": %s" |
| 1336 | #~ msgstr "Não foi possível salvar %s: %s" | 1491 | #~ msgstr "Não foi possível salvar %s: %s" |
| 1337 | 1492 | ||
| 1338 | -#~ msgid "Can't save %s" | ||
| 1339 | -#~ msgstr "Não foi possível salvar arquivo %s" | ||
| 1340 | - | ||
| 1341 | #~ msgid "" | 1493 | #~ msgid "" |
| 1342 | #~ "Can't save copy to file\n" | 1494 | #~ "Can't save copy to file\n" |
| 1343 | #~ "%s" | 1495 | #~ "%s" |
| @@ -1345,6 +1497,9 @@ msgstr "translator-credits" | @@ -1345,6 +1497,9 @@ msgstr "translator-credits" | ||
| 1345 | #~ "Não foi possível salvar cópia para o arquivo\n" | 1497 | #~ "Não foi possível salvar cópia para o arquivo\n" |
| 1346 | #~ "%s" | 1498 | #~ "%s" |
| 1347 | 1499 | ||
| 1500 | +#~ msgid "Can't save file \"%s\"" | ||
| 1501 | +#~ msgstr "Não foi possível salvar arquivo \"%s\"" | ||
| 1502 | + | ||
| 1348 | #~ msgid "" | 1503 | #~ msgid "" |
| 1349 | #~ "Can't save screen to file\n" | 1504 | #~ "Can't save screen to file\n" |
| 1350 | #~ "%s" | 1505 | #~ "%s" |
| @@ -1508,9 +1663,6 @@ msgstr "translator-credits" | @@ -1508,9 +1663,6 @@ msgstr "translator-credits" | ||
| 1508 | #~ msgid "Command to execute" | 1663 | #~ msgid "Command to execute" |
| 1509 | #~ msgstr "Comando a executar" | 1664 | #~ msgstr "Comando a executar" |
| 1510 | 1665 | ||
| 1511 | -#~ msgid "Comment" | ||
| 1512 | -#~ msgstr "Comentário" | ||
| 1513 | - | ||
| 1514 | #~ msgid "Complete" | 1666 | #~ msgid "Complete" |
| 1515 | #~ msgstr "Completo" | 1667 | #~ msgstr "Completo" |
| 1516 | 1668 | ||
| @@ -1532,9 +1684,6 @@ msgstr "translator-credits" | @@ -1532,9 +1684,6 @@ msgstr "translator-credits" | ||
| 1532 | #~ msgid "Copiar tudo" | 1684 | #~ msgid "Copiar tudo" |
| 1533 | #~ msgstr "Copiar tudo" | 1685 | #~ msgstr "Copiar tudo" |
| 1534 | 1686 | ||
| 1535 | -#~ msgid "Copy as HTML" | ||
| 1536 | -#~ msgstr "Copiar como HTML" | ||
| 1537 | - | ||
| 1538 | #~ msgid "Creates a file with fixed-length records." | 1687 | #~ msgid "Creates a file with fixed-length records." |
| 1539 | #~ msgstr "Cria arquivo com registros de tamanho fixo." | 1688 | #~ msgstr "Cria arquivo com registros de tamanho fixo." |
| 1540 | 1689 | ||
| @@ -1620,9 +1769,15 @@ msgstr "translator-credits" | @@ -1620,9 +1769,15 @@ msgstr "translator-credits" | ||
| 1620 | #~ msgid "Default host URL" | 1769 | #~ msgid "Default host URL" |
| 1621 | #~ msgstr "URL parão para acesso ao host" | 1770 | #~ msgstr "URL parão para acesso ao host" |
| 1622 | 1771 | ||
| 1772 | +#~ msgid "Description" | ||
| 1773 | +#~ msgstr "Descrição" | ||
| 1774 | + | ||
| 1623 | #~ msgid "Description of the current security state" | 1775 | #~ msgid "Description of the current security state" |
| 1624 | #~ msgstr "Descrição do estado de segurança atual" | 1776 | #~ msgstr "Descrição do estado de segurança atual" |
| 1625 | 1777 | ||
| 1778 | +#~ msgid "Desktop icon" | ||
| 1779 | +#~ msgstr "Ícone da área de trabalho" | ||
| 1780 | + | ||
| 1626 | #~ msgid "Device type rejected" | 1781 | #~ msgid "Device type rejected" |
| 1627 | #~ msgstr "Tipo de dispositivo rejeitado" | 1782 | #~ msgstr "Tipo de dispositivo rejeitado" |
| 1628 | 1783 | ||
| @@ -1766,6 +1921,9 @@ msgstr "translator-credits" | @@ -1766,6 +1921,9 @@ msgstr "translator-credits" | ||
| 1766 | #~ msgid "File _Format" | 1921 | #~ msgid "File _Format" |
| 1767 | #~ msgstr "_Formato do arquivo" | 1922 | #~ msgstr "_Formato do arquivo" |
| 1768 | 1923 | ||
| 1924 | +#~ msgid "File name" | ||
| 1925 | +#~ msgstr "Nome do arquivo" | ||
| 1926 | + | ||
| 1769 | #~ msgid "File transfer complete" | 1927 | #~ msgid "File transfer complete" |
| 1770 | #~ msgstr "Transferência completa" | 1928 | #~ msgstr "Transferência completa" |
| 1771 | 1929 | ||
| @@ -1836,9 +1994,6 @@ msgstr "translator-credits" | @@ -1836,9 +1994,6 @@ msgstr "translator-credits" | ||
| 1836 | #~ msgid "GTK Version mismatch" | 1994 | #~ msgid "GTK Version mismatch" |
| 1837 | #~ msgstr "Divergência de versão GTK" | 1995 | #~ msgstr "Divergência de versão GTK" |
| 1838 | 1996 | ||
| 1839 | -#~ msgid "Generic name" | ||
| 1840 | -#~ msgstr "Nome genérico" | ||
| 1841 | - | ||
| 1842 | #~ msgid "Get transfer queue from an external XML file" | 1997 | #~ msgid "Get transfer queue from an external XML file" |
| 1843 | #~ msgstr "Obtém a fila de transferência de um arquivo XML externo" | 1998 | #~ msgstr "Obtém a fila de transferência de um arquivo XML externo" |
| 1844 | 1999 | ||
| @@ -2142,6 +2297,12 @@ msgstr "translator-credits" | @@ -2142,6 +2297,12 @@ msgstr "translator-credits" | ||
| 2142 | #~ msgid "Latest program message" | 2297 | #~ msgid "Latest program message" |
| 2143 | #~ msgstr "Última mensagem de programa" | 2298 | #~ msgstr "Última mensagem de programa" |
| 2144 | 2299 | ||
| 2300 | +#~ msgid "Launcher name" | ||
| 2301 | +#~ msgstr "Nome do lançador" | ||
| 2302 | + | ||
| 2303 | +#~ msgid "Left" | ||
| 2304 | +#~ msgstr "Esquerda" | ||
| 2305 | + | ||
| 2145 | #~ msgid "Load" | 2306 | #~ msgid "Load" |
| 2146 | #~ msgstr "Load" | 2307 | #~ msgstr "Load" |
| 2147 | 2308 | ||
| @@ -2459,6 +2620,10 @@ msgstr "translator-credits" | @@ -2459,6 +2620,10 @@ msgstr "translator-credits" | ||
| 2459 | #~ msgid "Port or service name (empty for \"telnet\")." | 2620 | #~ msgid "Port or service name (empty for \"telnet\")." |
| 2460 | #~ msgstr "Nº da porta ou nome do serviço (em branco para \"telnet\")." | 2621 | #~ msgstr "Nº da porta ou nome do serviço (em branco para \"telnet\")." |
| 2461 | 2622 | ||
| 2623 | +#~ msgctxt "PrjLabel" | ||
| 2624 | +#~ msgid "Portal do Software Público Brasileiro" | ||
| 2625 | +#~ msgstr "https://portal.softwarepublico.gov.br/social/pw3270/" | ||
| 2626 | + | ||
| 2462 | #~ msgid "Predefined color schemes" | 2627 | #~ msgid "Predefined color schemes" |
| 2463 | #~ msgstr "Esquemas de cor pré-definidos" | 2628 | #~ msgstr "Esquemas de cor pré-definidos" |
| 2464 | 2629 | ||
| @@ -2645,6 +2810,9 @@ msgstr "translator-credits" | @@ -2645,6 +2810,9 @@ msgstr "translator-credits" | ||
| 2645 | #~ msgid "Revocation list" | 2810 | #~ msgid "Revocation list" |
| 2646 | #~ msgstr "Lista de revogados" | 2811 | #~ msgstr "Lista de revogados" |
| 2647 | 2812 | ||
| 2813 | +#~ msgid "Right" | ||
| 2814 | +#~ msgstr "Direita" | ||
| 2815 | + | ||
| 2648 | #~ msgid "SOCKS4 Proxy: client is not reachable" | 2816 | #~ msgid "SOCKS4 Proxy: client is not reachable" |
| 2649 | #~ msgstr "SOCKS4 Proxy: client is not reachable" | 2817 | #~ msgstr "SOCKS4 Proxy: client is not reachable" |
| 2650 | 2818 | ||
| @@ -2773,6 +2941,12 @@ msgstr "translator-credits" | @@ -2773,6 +2941,12 @@ msgstr "translator-credits" | ||
| 2773 | #~ msgid "SSLv2/v3 read server hello A" | 2941 | #~ msgid "SSLv2/v3 read server hello A" |
| 2774 | #~ msgstr "SSLv2/v3 read server hello A" | 2942 | #~ msgstr "SSLv2/v3 read server hello A" |
| 2775 | 2943 | ||
| 2944 | +#~ msgid "S_tyle" | ||
| 2945 | +#~ msgstr "E_stilo" | ||
| 2946 | + | ||
| 2947 | +#~ msgid "Save As" | ||
| 2948 | +#~ msgstr "Salvar Como" | ||
| 2949 | + | ||
| 2776 | #~ msgid "Save copied data" | 2950 | #~ msgid "Save copied data" |
| 2777 | #~ msgstr "Salvar cópia" | 2951 | #~ msgstr "Salvar cópia" |
| 2778 | 2952 | ||
| @@ -2782,6 +2956,9 @@ msgstr "translator-credits" | @@ -2782,6 +2956,9 @@ msgstr "translator-credits" | ||
| 2782 | #~ msgid "Save copy to file" | 2956 | #~ msgid "Save copy to file" |
| 2783 | #~ msgstr "Salvar cópia para arquivo" | 2957 | #~ msgstr "Salvar cópia para arquivo" |
| 2784 | 2958 | ||
| 2959 | +#~ msgid "Save desktop icon" | ||
| 2960 | +#~ msgstr "Salvar ícone da área de trabalho" | ||
| 2961 | + | ||
| 2785 | #~ msgid "Save desktop launcher" | 2962 | #~ msgid "Save desktop launcher" |
| 2786 | #~ msgstr "Salvar lançador para área de trabalho" | 2963 | #~ msgstr "Salvar lançador para área de trabalho" |
| 2787 | 2964 | ||
| @@ -2800,9 +2977,6 @@ msgstr "translator-credits" | @@ -2800,9 +2977,6 @@ msgstr "translator-credits" | ||
| 2800 | #~ msgid "Save terminal contents" | 2977 | #~ msgid "Save terminal contents" |
| 2801 | #~ msgstr "Salvar conteúdo da tela" | 2978 | #~ msgstr "Salvar conteúdo da tela" |
| 2802 | 2979 | ||
| 2803 | -#~ msgid "Save trace file" | ||
| 2804 | -#~ msgstr "Salvar arquivo de trace" | ||
| 2805 | - | ||
| 2806 | #~ msgid "Save trace to file" | 2980 | #~ msgid "Save trace to file" |
| 2807 | #~ msgstr "Salvar trace para arquivo" | 2981 | #~ msgstr "Salvar trace para arquivo" |
| 2808 | 2982 | ||
| @@ -2865,12 +3039,12 @@ msgstr "translator-credits" | @@ -2865,12 +3039,12 @@ msgstr "translator-credits" | ||
| 2865 | #~ msgid "Security warning" | 3039 | #~ msgid "Security warning" |
| 2866 | #~ msgstr "Alerta de segurança" | 3040 | #~ msgstr "Alerta de segurança" |
| 2867 | 3041 | ||
| 3042 | +#~ msgid "Select" | ||
| 3043 | +#~ msgstr "Selecionar" | ||
| 3044 | + | ||
| 2868 | #~ msgid "Select destination file" | 3045 | #~ msgid "Select destination file" |
| 2869 | #~ msgstr "Selecionar arquivo destino" | 3046 | #~ msgstr "Selecionar arquivo destino" |
| 2870 | 3047 | ||
| 2871 | -#~ msgid "Select file" | ||
| 2872 | -#~ msgstr "Selecionar arquivo" | ||
| 2873 | - | ||
| 2874 | #~ msgid "Select file to receive" | 3048 | #~ msgid "Select file to receive" |
| 2875 | #~ msgstr "Selecione arquivo a receber" | 3049 | #~ msgstr "Selecione arquivo a receber" |
| 2876 | 3050 | ||
| @@ -2895,6 +3069,9 @@ msgstr "translator-credits" | @@ -2895,6 +3069,9 @@ msgstr "translator-credits" | ||
| 2895 | #~ msgid "Select previous file" | 3069 | #~ msgid "Select previous file" |
| 2896 | #~ msgstr "Selecionar arquivo anterior" | 3070 | #~ msgstr "Selecionar arquivo anterior" |
| 2897 | 3071 | ||
| 3072 | +#~ msgid "Select the title bar itens" | ||
| 3073 | +#~ msgstr "Selecione itens da barra de título" | ||
| 3074 | + | ||
| 2898 | #~ msgid "Select() failed when processing for events." | 3075 | #~ msgid "Select() failed when processing for events." |
| 2899 | #~ msgstr "Select() falhou ao processar eventos." | 3076 | #~ msgstr "Select() falhou ao processar eventos." |
| 2900 | 3077 | ||
| @@ -2913,9 +3090,6 @@ msgstr "translator-credits" | @@ -2913,9 +3090,6 @@ msgstr "translator-credits" | ||
| 2913 | #~ msgid "Send an \"Enter\" action." | 3090 | #~ msgid "Send an \"Enter\" action." |
| 2914 | #~ msgstr "Envia um \"Enter\"." | 3091 | #~ msgstr "Envia um \"Enter\"." |
| 2915 | 3092 | ||
| 2916 | -#~ msgid "Send file" | ||
| 2917 | -#~ msgstr "Enviar arquivo" | ||
| 2918 | - | ||
| 2919 | #~ msgid "Send file to host" | 3093 | #~ msgid "Send file to host" |
| 2920 | #~ msgstr "Enviar arquivo para o servidor" | 3094 | #~ msgstr "Enviar arquivo para o servidor" |
| 2921 | 3095 | ||
| @@ -3048,9 +3222,6 @@ msgstr "translator-credits" | @@ -3048,9 +3222,6 @@ msgstr "translator-credits" | ||
| 3048 | #~ msgid "Start upload." | 3222 | #~ msgid "Start upload." |
| 3049 | #~ msgstr "Iniciar envio." | 3223 | #~ msgstr "Iniciar envio." |
| 3050 | 3224 | ||
| 3051 | -#~ msgid "Starting" | ||
| 3052 | -#~ msgstr "Iniciando" | ||
| 3053 | - | ||
| 3054 | #~ msgid "Starting transfer" | 3225 | #~ msgid "Starting transfer" |
| 3055 | #~ msgstr "Iniciando transferência" | 3226 | #~ msgstr "Iniciando transferência" |
| 3056 | 3227 | ||
| @@ -3060,6 +3231,9 @@ msgstr "translator-credits" | @@ -3060,6 +3231,9 @@ msgstr "translator-credits" | ||
| 3060 | #~ msgid "State is 3270, TN3270e or SSCP" | 3231 | #~ msgid "State is 3270, TN3270e or SSCP" |
| 3061 | #~ msgstr "Estado do terminal é 3270, TN3270e or SSCP" | 3232 | #~ msgstr "Estado do terminal é 3270, TN3270e or SSCP" |
| 3062 | 3233 | ||
| 3234 | +#~ msgid "Style" | ||
| 3235 | +#~ msgstr "Estilo" | ||
| 3236 | + | ||
| 3063 | #~ msgid "Subject issuer mismatch" | 3237 | #~ msgid "Subject issuer mismatch" |
| 3064 | #~ msgstr "Divergência na identidade do emissor" | 3238 | #~ msgstr "Divergência na identidade do emissor" |
| 3065 | 3239 | ||
| @@ -3847,6 +4021,9 @@ msgstr "translator-credits" | @@ -3847,6 +4021,9 @@ msgstr "translator-credits" | ||
| 3847 | #~ msgid "_Port:" | 4021 | #~ msgid "_Port:" |
| 3848 | #~ msgstr "_Porta:" | 4022 | #~ msgstr "_Porta:" |
| 3849 | 4023 | ||
| 4024 | +#~ msgid "_Properties" | ||
| 4025 | +#~ msgstr "_Propriedades" | ||
| 4026 | + | ||
| 3850 | #~ msgid "_Receive" | 4027 | #~ msgid "_Receive" |
| 3851 | #~ msgstr "_Receber" | 4028 | #~ msgstr "_Receber" |
| 3852 | 4029 | ||
| @@ -3895,6 +4072,19 @@ msgstr "translator-credits" | @@ -3895,6 +4072,19 @@ msgstr "translator-credits" | ||
| 3895 | #~ msgid "fcntl() error when getting socket state." | 4072 | #~ msgid "fcntl() error when getting socket state." |
| 3896 | #~ msgstr "erro fcntl() ao obter estado do socket." | 4073 | #~ msgstr "erro fcntl() ao obter estado do socket." |
| 3897 | 4074 | ||
| 4075 | +#, fuzzy | ||
| 4076 | +#~ msgctxt "PrjLabel" | ||
| 4077 | +#~ msgid "https://github.com/PerryWerneck/pw3270" | ||
| 4078 | +#~ msgstr "Portal do Software Público Brasileiro" | ||
| 4079 | + | ||
| 4080 | +#~ msgctxt "ProjectURLLabel" | ||
| 4081 | +#~ msgid "https://github.com/PerryWerneck/pw3270" | ||
| 4082 | +#~ msgstr "Portal do Software Público Brasileiro" | ||
| 4083 | + | ||
| 4084 | +#~ msgctxt "ProjectURL" | ||
| 4085 | +#~ msgid "https://portal.softwarepublico.gov.br/social/pw3270/" | ||
| 4086 | +#~ msgstr "https://portal.softwarepublico.gov.br/social/pw3270/" | ||
| 4087 | + | ||
| 3898 | #~ msgid "ioctl(%s)" | 4088 | #~ msgid "ioctl(%s)" |
| 3899 | #~ msgstr "ioctl(%s)" | 4089 | #~ msgstr "ioctl(%s)" |
| 3900 | 4090 |
locale/pw3270.pot
| @@ -8,7 +8,7 @@ msgid "" | @@ -8,7 +8,7 @@ msgid "" | ||
| 8 | msgstr "" | 8 | msgstr "" |
| 9 | "Project-Id-Version: PACKAGE VERSION\n" | 9 | "Project-Id-Version: PACKAGE VERSION\n" |
| 10 | "Report-Msgid-Bugs-To: \n" | 10 | "Report-Msgid-Bugs-To: \n" |
| 11 | -"POT-Creation-Date: 2020-08-05 16:03-0300\n" | 11 | +"POT-Creation-Date: 2020-10-15 13:43-0300\n" |
| 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
| 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
| 14 | "Language-Team: LANGUAGE <LL@li.org>\n" | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
| @@ -17,17 +17,37 @@ msgstr "" | @@ -17,17 +17,37 @@ msgstr "" | ||
| 17 | "Content-Type: text/plain; charset=CHARSET\n" | 17 | "Content-Type: text/plain; charset=CHARSET\n" |
| 18 | "Content-Transfer-Encoding: 8bit\n" | 18 | "Content-Transfer-Encoding: 8bit\n" |
| 19 | 19 | ||
| 20 | -#: src/objects/application/application.c:208 | 20 | +#: src/objects/application/application.c:206 |
| 21 | #, c-format | 21 | #, c-format |
| 22 | msgid "\"%s\" is not a valid user interface name" | 22 | msgid "\"%s\" is not a valid user interface name" |
| 23 | msgstr "" | 23 | msgstr "" |
| 24 | 24 | ||
| 25 | -#: src/objects/application/actions/about.c:96 | 25 | +#: src/objects/application/actions/about.c:93 |
| 26 | +msgid "32 bits Linux" | ||
| 27 | +msgstr "" | ||
| 28 | + | ||
| 29 | +#: src/objects/application/actions/about.c:91 | ||
| 30 | +msgid "32 bits Windows" | ||
| 31 | +msgstr "" | ||
| 32 | + | ||
| 33 | +#: src/objects/actions/save.c:156 src/objects/os/linux/savedesktopicon.c:267 | ||
| 34 | +msgid "3270 session files" | ||
| 35 | +msgstr "" | ||
| 36 | + | ||
| 37 | +#: src/objects/application/actions/about.c:87 | ||
| 26 | #, c-format | 38 | #, c-format |
| 27 | -msgid "3270 terminal emulator for GTK %d.%d" | 39 | +msgid "3270 terminal emulator for %s." |
| 28 | msgstr "" | 40 | msgstr "" |
| 29 | 41 | ||
| 30 | -#: src/objects/application/actions/about.c:161 ui/application.xml:39 | 42 | +#: src/objects/application/actions/about.c:95 |
| 43 | +msgid "64 bits Linux" | ||
| 44 | +msgstr "" | ||
| 45 | + | ||
| 46 | +#: src/objects/application/actions/about.c:89 | ||
| 47 | +msgid "64 bits Windows" | ||
| 48 | +msgstr "" | ||
| 49 | + | ||
| 50 | +#: src/objects/application/actions/about.c:188 ui/application.xml:39 | ||
| 31 | #: ui/application.xml:537 | 51 | #: ui/application.xml:537 |
| 32 | msgid "About PW3270" | 52 | msgid "About PW3270" |
| 33 | msgstr "" | 53 | msgstr "" |
| @@ -36,23 +56,23 @@ msgstr "" | @@ -36,23 +56,23 @@ msgstr "" | ||
| 36 | msgid "Action Name" | 56 | msgid "Action Name" |
| 37 | msgstr "" | 57 | msgstr "" |
| 38 | 58 | ||
| 39 | -#: src/objects/window/window.c:163 src/objects/toolbar/toolbar.c:135 | 59 | +#: src/objects/window/window.c:184 |
| 40 | msgid "Action Names" | 60 | msgid "Action Names" |
| 41 | msgstr "" | 61 | msgstr "" |
| 42 | 62 | ||
| 43 | -#: ui/window.xml:369 ui/window.xml:479 ui/application.xml:509 | 63 | +#: ui/window.xml:379 ui/window.xml:494 ui/application.xml:509 |
| 44 | msgid "Alert sound" | 64 | msgid "Alert sound" |
| 45 | msgstr "" | 65 | msgstr "" |
| 46 | 66 | ||
| 47 | -#: src/main/tools.c:99 | 67 | +#: src/main/tools.c:99 src/tools/entry.c:88 |
| 48 | msgid "All files" | 68 | msgid "All files" |
| 49 | msgstr "" | 69 | msgstr "" |
| 50 | 70 | ||
| 51 | -#: ui/window.xml:168 ui/application.xml:251 | 71 | +#: ui/window.xml:178 ui/application.xml:251 |
| 52 | msgid "Append to copy" | 72 | msgid "Append to copy" |
| 53 | msgstr "" | 73 | msgstr "" |
| 54 | 74 | ||
| 55 | -#: src/objects/application/actions/about.c:126 | 75 | +#: src/objects/application/actions/about.c:129 |
| 56 | msgid "Apple version" | 76 | msgid "Apple version" |
| 57 | msgstr "" | 77 | msgstr "" |
| 58 | 78 | ||
| @@ -60,11 +80,15 @@ msgstr "" | @@ -60,11 +80,15 @@ msgstr "" | ||
| 60 | msgid "Application" | 80 | msgid "Application" |
| 61 | msgstr "" | 81 | msgstr "" |
| 62 | 82 | ||
| 63 | -#: src/objects/application/actions/preferences.c:69 ui/application.xml:83 | 83 | +#: src/objects/window/header-settings.c:123 |
| 84 | +msgid "Application menu" | ||
| 85 | +msgstr "" | ||
| 86 | + | ||
| 87 | +#: src/objects/application/actions/preferences.c:76 ui/application.xml:83 | ||
| 64 | msgid "Application preferences" | 88 | msgid "Application preferences" |
| 65 | msgstr "" | 89 | msgstr "" |
| 66 | 90 | ||
| 67 | -#: src/objects/window/page.c:263 | 91 | +#: src/objects/window/page.c:264 |
| 68 | msgid "Apply" | 92 | msgid "Apply" |
| 69 | msgstr "" | 93 | msgstr "" |
| 70 | 94 | ||
| @@ -72,15 +96,15 @@ msgstr "" | @@ -72,15 +96,15 @@ msgstr "" | ||
| 72 | msgid "Auto-Reconnect" | 96 | msgid "Auto-Reconnect" |
| 73 | msgstr "" | 97 | msgstr "" |
| 74 | 98 | ||
| 75 | -#: src/objects/toolbar/settings.c:114 | 99 | +#: src/objects/toolbar/settings.c:112 src/objects/settings/actionview.c:73 |
| 76 | msgid "Available" | 100 | msgid "Available" |
| 77 | msgstr "" | 101 | msgstr "" |
| 78 | 102 | ||
| 79 | -#: src/objects/application/actions/about.c:130 | 103 | +#: src/objects/application/actions/about.c:132 |
| 80 | msgid "Based on X3270 from" | 104 | msgid "Based on X3270 from" |
| 81 | msgstr "" | 105 | msgstr "" |
| 82 | 106 | ||
| 83 | -#: ui/window.xml:398 ui/application.xml:474 | 107 | +#: ui/window.xml:408 ui/application.xml:474 |
| 84 | msgid "Blank Fill" | 108 | msgid "Blank Fill" |
| 85 | msgstr "" | 109 | msgstr "" |
| 86 | 110 | ||
| @@ -92,21 +116,17 @@ msgstr "" | @@ -92,21 +116,17 @@ msgstr "" | ||
| 92 | msgid "Bold" | 116 | msgid "Bold" |
| 93 | msgstr "" | 117 | msgstr "" |
| 94 | 118 | ||
| 95 | -#: src/objects/application/actions/about.c:142 | ||
| 96 | -msgid "Brazilian Public Software Portal" | 119 | +#: src/objects/window/terminal.c:165 |
| 120 | +msgid "Can't load session file" | ||
| 97 | msgstr "" | 121 | msgstr "" |
| 98 | 122 | ||
| 99 | -#: src/objects/window/terminal.c:197 | 123 | +#: src/objects/window/terminal.c:160 |
| 100 | #, c-format | 124 | #, c-format |
| 101 | -msgid "Can't save file \"%s\"" | ||
| 102 | -msgstr "" | ||
| 103 | - | ||
| 104 | -#: src/objects/window/terminal.c:202 | ||
| 105 | -msgid "Can't save session file" | 125 | +msgid "Can't use \"%s\"" |
| 106 | msgstr "" | 126 | msgstr "" |
| 107 | 127 | ||
| 108 | -#: src/objects/actions/save.c:65 src/objects/application/actions/open.c:49 | ||
| 109 | -#: src/objects/window/page.c:264 | 128 | +#: src/objects/application/actions/open.c:49 src/objects/window/page.c:265 |
| 129 | +#: src/tools/entry.c:71 | ||
| 110 | msgid "Cancel" | 130 | msgid "Cancel" |
| 111 | msgstr "" | 131 | msgstr "" |
| 112 | 132 | ||
| @@ -114,7 +134,19 @@ msgstr "" | @@ -114,7 +134,19 @@ msgstr "" | ||
| 114 | msgid "Change terminal colors" | 134 | msgid "Change terminal colors" |
| 115 | msgstr "" | 135 | msgstr "" |
| 116 | 136 | ||
| 117 | -#: ui/window.xml:182 ui/window.xml:324 ui/application.xml:304 | 137 | +#: src/objects/application/actions/preferences.c:78 |
| 138 | +msgid "Change the application preferences" | ||
| 139 | +msgstr "" | ||
| 140 | + | ||
| 141 | +#: src/objects/window/header-settings.c:98 | ||
| 142 | +msgid "Change the position of the title bar icons" | ||
| 143 | +msgstr "" | ||
| 144 | + | ||
| 145 | +#: src/objects/window/actions/sessionproperties.c:47 | ||
| 146 | +msgid "Change the preferences for the active session" | ||
| 147 | +msgstr "" | ||
| 148 | + | ||
| 149 | +#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:304 | ||
| 118 | msgid "Clear" | 150 | msgid "Clear" |
| 119 | msgstr "" | 151 | msgstr "" |
| 120 | 152 | ||
| @@ -131,8 +163,8 @@ msgstr "" | @@ -131,8 +163,8 @@ msgstr "" | ||
| 131 | msgid "Close the window" | 163 | msgid "Close the window" |
| 132 | msgstr "" | 164 | msgstr "" |
| 133 | 165 | ||
| 134 | -#: src/objects/window/actions/close.c:60 ui/window.xml:270 ui/window.xml:458 | ||
| 135 | -#: ui/window.xml:560 ui/application.xml:216 | 166 | +#: src/objects/window/actions/close.c:60 ui/window.xml:280 ui/window.xml:473 |
| 167 | +#: ui/window.xml:580 ui/application.xml:216 | ||
| 136 | msgid "Close window" | 168 | msgid "Close window" |
| 137 | msgstr "" | 169 | msgstr "" |
| 138 | 170 | ||
| @@ -140,6 +172,10 @@ msgstr "" | @@ -140,6 +172,10 @@ msgstr "" | ||
| 140 | msgid "Colors" | 172 | msgid "Colors" |
| 141 | msgstr "" | 173 | msgstr "" |
| 142 | 174 | ||
| 175 | +#: src/objects/os/linux/savedesktopicon.c:101 | ||
| 176 | +msgid "Comment" | ||
| 177 | +msgstr "" | ||
| 178 | + | ||
| 143 | #: src/objects/window/actions/connect.c:59 | 179 | #: src/objects/window/actions/connect.c:59 |
| 144 | msgid "Connect" | 180 | msgid "Connect" |
| 145 | msgstr "" | 181 | msgstr "" |
| @@ -152,11 +188,15 @@ msgstr "" | @@ -152,11 +188,15 @@ msgstr "" | ||
| 152 | msgid "Connect to host" | 188 | msgid "Connect to host" |
| 153 | msgstr "" | 189 | msgstr "" |
| 154 | 190 | ||
| 155 | -#: src/objects/window/window.c:702 src/objects/window/page.c:217 | 191 | +#: src/objects/window/window.c:753 src/objects/window/page.c:218 |
| 156 | msgid "Connected to host" | 192 | msgid "Connected to host" |
| 157 | msgstr "" | 193 | msgstr "" |
| 158 | 194 | ||
| 159 | -#: src/objects/application/actions/about.c:127 | 195 | +#: src/tools/entry.c:131 |
| 196 | +msgid "Continue" | ||
| 197 | +msgstr "" | ||
| 198 | + | ||
| 199 | +#: src/objects/application/actions/about.c:130 | ||
| 160 | msgid "Contributors" | 200 | msgid "Contributors" |
| 161 | msgstr "" | 201 | msgstr "" |
| 162 | 202 | ||
| @@ -164,6 +204,14 @@ msgstr "" | @@ -164,6 +204,14 @@ msgstr "" | ||
| 164 | msgid "Copy" | 204 | msgid "Copy" |
| 165 | msgstr "" | 205 | msgstr "" |
| 166 | 206 | ||
| 207 | +#: ui/window.xml:168 | ||
| 208 | +msgid "Copy as HTML" | ||
| 209 | +msgstr "" | ||
| 210 | + | ||
| 211 | +#: ui/window.xml:173 | ||
| 212 | +msgid "Copy as image" | ||
| 213 | +msgstr "" | ||
| 214 | + | ||
| 167 | #: ui/window.xml:163 ui/application.xml:246 | 215 | #: ui/window.xml:163 ui/application.xml:246 |
| 168 | msgid "Copy as table" | 216 | msgid "Copy as table" |
| 169 | msgstr "" | 217 | msgstr "" |
| @@ -172,11 +220,11 @@ msgstr "" | @@ -172,11 +220,11 @@ msgstr "" | ||
| 172 | msgid "Copy as text" | 220 | msgid "Copy as text" |
| 173 | msgstr "" | 221 | msgstr "" |
| 174 | 222 | ||
| 175 | -#: src/objects/windows/savedesktopicon.c:79 | ||
| 176 | -msgid "Create a desktop icon for the current session" | 223 | +#: src/objects/os/linux/savedesktopicon.c:114 |
| 224 | +msgid "Create shortcut for the current session" | ||
| 177 | msgstr "" | 225 | msgstr "" |
| 178 | 226 | ||
| 179 | -#: ui/window.xml:359 ui/application.xml:459 | 227 | +#: ui/window.xml:369 ui/application.xml:459 |
| 180 | msgid "Cross hair cursor" | 228 | msgid "Cross hair cursor" |
| 181 | msgstr "" | 229 | msgstr "" |
| 182 | 230 | ||
| @@ -192,28 +240,24 @@ msgstr "" | @@ -192,28 +240,24 @@ msgstr "" | ||
| 192 | msgid "Current session" | 240 | msgid "Current session" |
| 193 | msgstr "" | 241 | msgstr "" |
| 194 | 242 | ||
| 195 | -#: ui/window.xml:173 ui/application.xml:256 | 243 | +#: ui/window.xml:183 ui/application.xml:256 |
| 196 | msgid "Cut" | 244 | msgid "Cut" |
| 197 | msgstr "" | 245 | msgstr "" |
| 198 | 246 | ||
| 199 | -#: ui/window.xml:192 ui/window.xml:334 ui/application.xml:314 | 247 | +#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:314 |
| 200 | msgid "Delete Field" | 248 | msgid "Delete Field" |
| 201 | msgstr "" | 249 | msgstr "" |
| 202 | 250 | ||
| 203 | -#: ui/window.xml:93 ui/application.xml:158 | ||
| 204 | -msgid "Desktop icon" | ||
| 205 | -msgstr "" | ||
| 206 | - | ||
| 207 | -#: ui/window.xml:265 ui/window.xml:453 | 251 | +#: ui/window.xml:275 ui/window.xml:468 |
| 208 | msgid "Disconnect" | 252 | msgid "Disconnect" |
| 209 | msgstr "" | 253 | msgstr "" |
| 210 | 254 | ||
| 211 | -#: src/objects/window/window.c:702 src/objects/window/window.c:729 | ||
| 212 | -#: src/objects/window/page.c:206 | 255 | +#: src/objects/window/window.c:753 src/objects/window/window.c:780 |
| 256 | +#: src/objects/window/page.c:207 | ||
| 213 | msgid "Disconnected from host" | 257 | msgid "Disconnected from host" |
| 214 | msgstr "" | 258 | msgstr "" |
| 215 | 259 | ||
| 216 | -#: ui/window.xml:381 ui/window.xml:492 ui/application.xml:524 | 260 | +#: ui/window.xml:391 ui/window.xml:507 ui/application.xml:524 |
| 217 | msgid "Dynamic font spacing" | 261 | msgid "Dynamic font spacing" |
| 218 | msgstr "" | 262 | msgstr "" |
| 219 | 263 | ||
| @@ -237,15 +281,19 @@ msgstr "" | @@ -237,15 +281,19 @@ msgstr "" | ||
| 237 | msgid "Enabled" | 281 | msgid "Enabled" |
| 238 | msgstr "" | 282 | msgstr "" |
| 239 | 283 | ||
| 240 | -#: ui/window.xml:187 ui/window.xml:329 ui/application.xml:309 | 284 | +#: src/objects/settings/actionview.c:78 |
| 285 | +msgid "End" | ||
| 286 | +msgstr "" | ||
| 287 | + | ||
| 288 | +#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:309 | ||
| 241 | msgid "Erase input" | 289 | msgid "Erase input" |
| 242 | msgstr "" | 290 | msgstr "" |
| 243 | 291 | ||
| 244 | -#: ui/window.xml:197 ui/window.xml:339 ui/application.xml:319 | 292 | +#: ui/window.xml:207 ui/window.xml:349 ui/application.xml:319 |
| 245 | msgid "Erase to end of field" | 293 | msgid "Erase to end of field" |
| 246 | msgstr "" | 294 | msgstr "" |
| 247 | 295 | ||
| 248 | -#: ui/window.xml:202 ui/window.xml:344 ui/application.xml:324 | 296 | +#: ui/window.xml:212 ui/window.xml:354 ui/application.xml:324 |
| 249 | msgid "Erase to end of line" | 297 | msgid "Erase to end of line" |
| 250 | msgstr "" | 298 | msgstr "" |
| 251 | 299 | ||
| @@ -253,15 +301,11 @@ msgstr "" | @@ -253,15 +301,11 @@ msgstr "" | ||
| 253 | msgid "Field attributes" | 301 | msgid "Field attributes" |
| 254 | msgstr "" | 302 | msgstr "" |
| 255 | 303 | ||
| 256 | -#: src/objects/windows/savedesktopicon.c:62 | ||
| 257 | -msgid "File name" | ||
| 258 | -msgstr "" | ||
| 259 | - | ||
| 260 | #: ui/application.xml:454 | 304 | #: ui/application.xml:454 |
| 261 | msgid "Full Screen" | 305 | msgid "Full Screen" |
| 262 | msgstr "" | 306 | msgstr "" |
| 263 | 307 | ||
| 264 | -#: ui/window.xml:236 ui/window.xml:407 ui/window.xml:497 | 308 | +#: ui/window.xml:246 ui/window.xml:417 ui/window.xml:512 |
| 265 | msgid "Full screen" | 309 | msgid "Full screen" |
| 266 | msgstr "" | 310 | msgstr "" |
| 267 | 311 | ||
| @@ -269,6 +313,10 @@ msgstr "" | @@ -269,6 +313,10 @@ msgstr "" | ||
| 269 | msgid "Function bar" | 313 | msgid "Function bar" |
| 270 | msgstr "" | 314 | msgstr "" |
| 271 | 315 | ||
| 316 | +#: src/objects/os/linux/savedesktopicon.c:94 | ||
| 317 | +msgid "Generic name" | ||
| 318 | +msgstr "" | ||
| 319 | + | ||
| 272 | #: ui/application.xml:36 ui/application.xml:534 | 320 | #: ui/application.xml:36 ui/application.xml:534 |
| 273 | msgid "Help" | 321 | msgid "Help" |
| 274 | msgstr "" | 322 | msgstr "" |
| @@ -277,11 +325,11 @@ msgstr "" | @@ -277,11 +325,11 @@ msgstr "" | ||
| 277 | msgid "Host properties" | 325 | msgid "Host properties" |
| 278 | msgstr "" | 326 | msgstr "" |
| 279 | 327 | ||
| 280 | -#: src/objects/window/window.c:469 | 328 | +#: src/objects/window/window.c:552 src/objects/os/linux/savedesktopicon.c:102 |
| 281 | msgid "IBM 3270 Terminal emulator" | 329 | msgid "IBM 3270 Terminal emulator" |
| 282 | msgstr "" | 330 | msgstr "" |
| 283 | 331 | ||
| 284 | -#: src/objects/actions/view.c:89 | 332 | +#: src/objects/actions/view.c:90 |
| 285 | msgid "Icon" | 333 | msgid "Icon" |
| 286 | msgstr "" | 334 | msgstr "" |
| 287 | 335 | ||
| @@ -289,19 +337,27 @@ msgstr "" | @@ -289,19 +337,27 @@ msgstr "" | ||
| 289 | msgid "Icon Name" | 337 | msgid "Icon Name" |
| 290 | msgstr "" | 338 | msgstr "" |
| 291 | 339 | ||
| 292 | -#: src/objects/toolbar/settings.c:50 | 340 | +#: src/objects/toolbar/settings.c:54 |
| 293 | msgid "Icon Size" | 341 | msgid "Icon Size" |
| 294 | msgstr "" | 342 | msgstr "" |
| 295 | 343 | ||
| 296 | -#: src/objects/toolbar/toolbar.c:262 | 344 | +#: src/objects/toolbar/settings.c:61 |
| 345 | +msgid "Icon Style" | ||
| 346 | +msgstr "" | ||
| 347 | + | ||
| 348 | +#: src/objects/toolbar/models.c:52 | ||
| 297 | msgid "Icon _size" | 349 | msgid "Icon _size" |
| 298 | msgstr "" | 350 | msgstr "" |
| 299 | 351 | ||
| 300 | -#: src/objects/toolbar/toolbar.c:84 | 352 | +#: src/objects/toolbar/models.c:108 |
| 353 | +msgid "Icon type" | ||
| 354 | +msgstr "" | ||
| 355 | + | ||
| 356 | +#: src/objects/toolbar/models.c:97 | ||
| 301 | msgid "Icons & text" | 357 | msgid "Icons & text" |
| 302 | msgstr "" | 358 | msgstr "" |
| 303 | 359 | ||
| 304 | -#: src/objects/toolbar/toolbar.c:74 | 360 | +#: src/objects/toolbar/models.c:87 |
| 305 | msgid "Icons only" | 361 | msgid "Icons only" |
| 306 | msgstr "" | 362 | msgstr "" |
| 307 | 363 | ||
| @@ -309,7 +365,7 @@ msgstr "" | @@ -309,7 +365,7 @@ msgstr "" | ||
| 309 | msgid "If the action can be activated" | 365 | msgid "If the action can be activated" |
| 310 | msgstr "" | 366 | msgstr "" |
| 311 | 367 | ||
| 312 | -#: ui/window.xml:469 | 368 | +#: ui/window.xml:484 |
| 313 | msgid "Insert" | 369 | msgid "Insert" |
| 314 | msgstr "" | 370 | msgstr "" |
| 315 | 371 | ||
| @@ -317,7 +373,15 @@ msgstr "" | @@ -317,7 +373,15 @@ msgstr "" | ||
| 317 | msgid "Invalid or unknown property type" | 373 | msgid "Invalid or unknown property type" |
| 318 | msgstr "" | 374 | msgstr "" |
| 319 | 375 | ||
| 320 | -#: src/objects/toolbar/settings.c:108 | 376 | +#: src/objects/settings/actionview.c:79 |
| 377 | +msgid "Items packed from the end to the start" | ||
| 378 | +msgstr "" | ||
| 379 | + | ||
| 380 | +#: src/objects/settings/actionview.c:69 | ||
| 381 | +msgid "Items packed from the start to the end" | ||
| 382 | +msgstr "" | ||
| 383 | + | ||
| 384 | +#: src/objects/toolbar/settings.c:106 | ||
| 321 | msgid "Itens" | 385 | msgid "Itens" |
| 322 | msgstr "" | 386 | msgstr "" |
| 323 | 387 | ||
| @@ -345,20 +409,24 @@ msgstr "" | @@ -345,20 +409,24 @@ msgstr "" | ||
| 345 | msgid "Keypads" | 409 | msgid "Keypads" |
| 346 | msgstr "" | 410 | msgstr "" |
| 347 | 411 | ||
| 348 | -#: src/objects/actions/view.c:98 | 412 | +#: src/objects/application/actions/about.c:140 |
| 413 | +msgid "LICENSE" | ||
| 414 | +msgstr "" | ||
| 415 | + | ||
| 416 | +#: src/objects/actions/view.c:99 | ||
| 349 | msgid "Label" | 417 | msgid "Label" |
| 350 | msgstr "" | 418 | msgstr "" |
| 351 | 419 | ||
| 352 | -#: src/objects/toolbar/toolbar.c:58 | 420 | +#: src/objects/toolbar/models.c:66 |
| 353 | msgid "Large" | 421 | msgid "Large" |
| 354 | msgstr "" | 422 | msgstr "" |
| 355 | 423 | ||
| 356 | -#: src/objects/windows/savedesktopicon.c:67 | ||
| 357 | -msgid "Launcher name" | 424 | +#: src/objects/toolbar/settings.c:176 |
| 425 | +msgid "Layout" | ||
| 358 | msgstr "" | 426 | msgstr "" |
| 359 | 427 | ||
| 360 | -#: src/objects/toolbar/settings.c:207 | ||
| 361 | -msgid "Layout" | 428 | +#: src/objects/settings/actionview.c:74 |
| 429 | +msgid "List of the available and unpacked actions" | ||
| 362 | msgstr "" | 430 | msgstr "" |
| 363 | 431 | ||
| 364 | #: ui/application.xml:71 | 432 | #: ui/application.xml:71 |
| @@ -369,11 +437,11 @@ msgstr "" | @@ -369,11 +437,11 @@ msgstr "" | ||
| 369 | msgid "Main Toolbar" | 437 | msgid "Main Toolbar" |
| 370 | msgstr "" | 438 | msgstr "" |
| 371 | 439 | ||
| 372 | -#: ui/window.xml:540 | 440 | +#: ui/window.xml:555 |
| 373 | msgid "Main menu" | 441 | msgid "Main menu" |
| 374 | msgstr "" | 442 | msgstr "" |
| 375 | 443 | ||
| 376 | -#: src/objects/application/actions/about.c:125 | 444 | +#: src/objects/application/actions/about.c:128 |
| 377 | msgid "Maintainers" | 445 | msgid "Maintainers" |
| 378 | msgstr "" | 446 | msgstr "" |
| 379 | 447 | ||
| @@ -381,23 +449,23 @@ msgstr "" | @@ -381,23 +449,23 @@ msgstr "" | ||
| 381 | msgid "Menu" | 449 | msgid "Menu" |
| 382 | msgstr "" | 450 | msgstr "" |
| 383 | 451 | ||
| 384 | -#: ui/window.xml:506 ui/application.xml:403 | 452 | +#: ui/window.xml:521 ui/application.xml:403 |
| 385 | msgid "Model 2 - 80x24" | 453 | msgid "Model 2 - 80x24" |
| 386 | msgstr "" | 454 | msgstr "" |
| 387 | 455 | ||
| 388 | -#: ui/window.xml:511 ui/application.xml:408 | 456 | +#: ui/window.xml:526 ui/application.xml:408 |
| 389 | msgid "Model 3 - 80x32" | 457 | msgid "Model 3 - 80x32" |
| 390 | msgstr "" | 458 | msgstr "" |
| 391 | 459 | ||
| 392 | -#: ui/window.xml:516 ui/application.xml:413 | 460 | +#: ui/window.xml:531 ui/application.xml:413 |
| 393 | msgid "Model 4 - 80x43" | 461 | msgid "Model 4 - 80x43" |
| 394 | msgstr "" | 462 | msgstr "" |
| 395 | 463 | ||
| 396 | -#: ui/window.xml:521 ui/application.xml:418 | 464 | +#: ui/window.xml:536 ui/application.xml:418 |
| 397 | msgid "Model 5 - 132x27" | 465 | msgid "Model 5 - 132x27" |
| 398 | msgstr "" | 466 | msgstr "" |
| 399 | 467 | ||
| 400 | -#: ui/window.xml:376 ui/application.xml:444 | 468 | +#: ui/window.xml:386 ui/application.xml:444 |
| 401 | msgid "Monocase" | 469 | msgid "Monocase" |
| 402 | msgstr "" | 470 | msgstr "" |
| 403 | 471 | ||
| @@ -405,7 +473,7 @@ msgstr "" | @@ -405,7 +473,7 @@ msgstr "" | ||
| 405 | msgid "Network keep alive" | 473 | msgid "Network keep alive" |
| 406 | msgstr "" | 474 | msgstr "" |
| 407 | 475 | ||
| 408 | -#: src/objects/window/page.c:274 | 476 | +#: src/objects/window/page.c:275 |
| 409 | msgid "New session name" | 477 | msgid "New session name" |
| 410 | msgstr "" | 478 | msgstr "" |
| 411 | 479 | ||
| @@ -453,7 +521,7 @@ msgstr "" | @@ -453,7 +521,7 @@ msgstr "" | ||
| 453 | msgid "Open session in New window" | 521 | msgid "Open session in New window" |
| 454 | msgstr "" | 522 | msgstr "" |
| 455 | 523 | ||
| 456 | -#: ui/window.xml:212 ui/window.xml:354 ui/window.xml:489 ui/application.xml:431 | 524 | +#: ui/window.xml:222 ui/window.xml:364 ui/window.xml:504 ui/application.xml:431 |
| 457 | msgid "Options" | 525 | msgid "Options" |
| 458 | msgstr "" | 526 | msgstr "" |
| 459 | 527 | ||
| @@ -461,22 +529,26 @@ msgstr "" | @@ -461,22 +529,26 @@ msgstr "" | ||
| 461 | msgid "Parameter Type" | 529 | msgid "Parameter Type" |
| 462 | msgstr "" | 530 | msgstr "" |
| 463 | 531 | ||
| 464 | -#: ui/window.xml:286 ui/application.xml:261 | 532 | +#: ui/window.xml:296 ui/application.xml:261 |
| 465 | msgid "Paste from clipboard" | 533 | msgid "Paste from clipboard" |
| 466 | msgstr "" | 534 | msgstr "" |
| 467 | 535 | ||
| 468 | -#: ui/window.xml:296 ui/application.xml:271 | 536 | +#: ui/window.xml:306 ui/application.xml:271 |
| 469 | msgid "Paste from text file" | 537 | msgid "Paste from text file" |
| 470 | msgstr "" | 538 | msgstr "" |
| 471 | 539 | ||
| 472 | -#: ui/window.xml:291 ui/application.xml:266 | 540 | +#: ui/window.xml:301 ui/application.xml:266 |
| 473 | msgid "Paste next" | 541 | msgid "Paste next" |
| 474 | msgstr "" | 542 | msgstr "" |
| 475 | 543 | ||
| 476 | -#: ui/window.xml:393 ui/application.xml:469 | 544 | +#: ui/window.xml:403 ui/application.xml:469 |
| 477 | msgid "Paste with left margin" | 545 | msgid "Paste with left margin" |
| 478 | msgstr "" | 546 | msgstr "" |
| 479 | 547 | ||
| 548 | +#: src/objects/os/linux/savedesktopicon.c:71 | ||
| 549 | +msgid "Path for the new shortcut" | ||
| 550 | +msgstr "" | ||
| 551 | + | ||
| 480 | #: ui/window.xml:129 | 552 | #: ui/window.xml:129 |
| 481 | msgid "Preferences" | 553 | msgid "Preferences" |
| 482 | msgstr "" | 554 | msgstr "" |
| @@ -485,11 +557,11 @@ msgstr "" | @@ -485,11 +557,11 @@ msgstr "" | ||
| 485 | msgid "Print" | 557 | msgid "Print" |
| 486 | msgstr "" | 558 | msgstr "" |
| 487 | 559 | ||
| 488 | -#: ui/window.xml:439 | 560 | +#: ui/window.xml:454 |
| 489 | msgid "Print screen" | 561 | msgid "Print screen" |
| 490 | msgstr "" | 562 | msgstr "" |
| 491 | 563 | ||
| 492 | -#: ui/window.xml:252 | 564 | +#: ui/window.xml:262 |
| 493 | msgid "Print selected" | 565 | msgid "Print selected" |
| 494 | msgstr "" | 566 | msgstr "" |
| 495 | 567 | ||
| @@ -502,15 +574,15 @@ msgstr "" | @@ -502,15 +574,15 @@ msgstr "" | ||
| 502 | msgid "Quit" | 574 | msgid "Quit" |
| 503 | msgstr "" | 575 | msgstr "" |
| 504 | 576 | ||
| 505 | -#: src/objects/window/page.c:261 | 577 | +#: src/objects/window/page.c:262 |
| 506 | msgid "Rename Session" | 578 | msgid "Rename Session" |
| 507 | msgstr "" | 579 | msgstr "" |
| 508 | 580 | ||
| 509 | -#: ui/window.xml:315 ui/application.xml:295 | 581 | +#: ui/window.xml:325 ui/application.xml:295 |
| 510 | msgid "Reselect" | 582 | msgid "Reselect" |
| 511 | msgstr "" | 583 | msgstr "" |
| 512 | 584 | ||
| 513 | -#: ui/window.xml:364 ui/application.xml:464 | 585 | +#: ui/window.xml:374 ui/application.xml:464 |
| 514 | msgid "Resize on alternate screen" | 586 | msgid "Resize on alternate screen" |
| 515 | msgstr "" | 587 | msgstr "" |
| 516 | 588 | ||
| @@ -518,55 +590,59 @@ msgstr "" | @@ -518,55 +590,59 @@ msgstr "" | ||
| 518 | msgid "Right keypad" | 590 | msgid "Right keypad" |
| 519 | msgstr "" | 591 | msgstr "" |
| 520 | 592 | ||
| 521 | -#: src/objects/toolbar/toolbar.c:286 | ||
| 522 | -msgid "S_tyle" | 593 | +#: ui/window.xml:69 ui/application.xml:134 |
| 594 | +msgid "Save" | ||
| 523 | msgstr "" | 595 | msgstr "" |
| 524 | 596 | ||
| 525 | -#: src/objects/actions/save.c:64 ui/window.xml:69 ui/application.xml:134 | ||
| 526 | -msgid "Save" | 597 | +#: src/objects/actions/save.c:77 |
| 598 | +msgid "Save current session preferences to file" | ||
| 527 | msgstr "" | 599 | msgstr "" |
| 528 | 600 | ||
| 529 | -#: src/objects/actions/save.c:49 | ||
| 530 | -msgid "Save As" | 601 | +#: ui/window.xml:449 |
| 602 | +msgid "Save screen" | ||
| 531 | msgstr "" | 603 | msgstr "" |
| 532 | 604 | ||
| 533 | -#: src/objects/windows/savedesktopicon.c:78 | ||
| 534 | -msgid "Save desktop icon" | 605 | +#: ui/window.xml:257 |
| 606 | +msgid "Save selected" | ||
| 535 | msgstr "" | 607 | msgstr "" |
| 536 | 608 | ||
| 537 | -#: ui/window.xml:434 | ||
| 538 | -msgid "Save screen" | 609 | +#: src/objects/actions/save.c:75 src/objects/actions/save.c:153 |
| 610 | +msgid "Save session preferences" | ||
| 539 | msgstr "" | 611 | msgstr "" |
| 540 | 612 | ||
| 541 | -#: ui/window.xml:247 | ||
| 542 | -msgid "Save selected" | 613 | +#: src/objects/os/linux/savedesktopicon.c:113 |
| 614 | +msgid "Save session shortcut" | ||
| 615 | +msgstr "" | ||
| 616 | + | ||
| 617 | +#: src/objects/os/linux/savedesktopicon.c:264 | ||
| 618 | +msgid "Save to session filename" | ||
| 543 | msgstr "" | 619 | msgstr "" |
| 544 | 620 | ||
| 545 | -#: src/objects/actions/save.c:51 | ||
| 546 | -msgid "Save session properties" | 621 | +#: src/objects/os/linux/savedesktopicon.c:236 |
| 622 | +msgid "Save to shortcut file" | ||
| 547 | msgstr "" | 623 | msgstr "" |
| 548 | 624 | ||
| 549 | -#: ui/window.xml:503 ui/application.xml:400 | 625 | +#: ui/window.xml:518 ui/application.xml:400 |
| 550 | msgid "Screen size" | 626 | msgid "Screen size" |
| 551 | msgstr "" | 627 | msgstr "" |
| 552 | 628 | ||
| 553 | -#: ui/window.xml:310 ui/application.xml:285 | 629 | +#: ui/window.xml:320 ui/application.xml:285 |
| 554 | msgid "Select Field" | 630 | msgid "Select Field" |
| 555 | msgstr "" | 631 | msgstr "" |
| 556 | 632 | ||
| 557 | -#: ui/window.xml:305 ui/application.xml:280 | 633 | +#: ui/window.xml:315 ui/application.xml:280 |
| 558 | msgid "Select all" | 634 | msgid "Select all" |
| 559 | msgstr "" | 635 | msgstr "" |
| 560 | 636 | ||
| 561 | -#: ui/window.xml:217 ui/application.xml:479 | 637 | +#: ui/window.xml:227 ui/application.xml:479 |
| 562 | msgid "Select by rectangles" | 638 | msgid "Select by rectangles" |
| 563 | msgstr "" | 639 | msgstr "" |
| 564 | 640 | ||
| 565 | -#: src/objects/toolbar/settings.c:108 | 641 | +#: src/objects/toolbar/settings.c:106 |
| 566 | msgid "Select the toolbar itens" | 642 | msgid "Select the toolbar itens" |
| 567 | msgstr "" | 643 | msgstr "" |
| 568 | 644 | ||
| 569 | -#: src/objects/toolbar/settings.c:113 | 645 | +#: src/objects/toolbar/settings.c:111 |
| 570 | msgid "Selected" | 646 | msgid "Selected" |
| 571 | msgstr "" | 647 | msgstr "" |
| 572 | 648 | ||
| @@ -579,12 +655,12 @@ msgstr "" | @@ -579,12 +655,12 @@ msgstr "" | ||
| 579 | msgid "Send/Receive" | 655 | msgid "Send/Receive" |
| 580 | msgstr "" | 656 | msgstr "" |
| 581 | 657 | ||
| 582 | -#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:444 | 658 | +#: src/objects/window/actions/filetransfer.c:46 ui/window.xml:459 |
| 583 | #: ui/application.xml:195 | 659 | #: ui/application.xml:195 |
| 584 | msgid "Send/Receive files" | 660 | msgid "Send/Receive files" |
| 585 | msgstr "" | 661 | msgstr "" |
| 586 | 662 | ||
| 587 | -#: src/objects/toolbar/settings.c:266 src/objects/toolbar/settings.c:276 | 663 | +#: src/objects/toolbar/settings.c:234 src/objects/toolbar/settings.c:244 |
| 588 | msgid "Separator" | 664 | msgid "Separator" |
| 589 | msgstr "" | 665 | msgstr "" |
| 590 | 666 | ||
| @@ -592,10 +668,14 @@ msgstr "" | @@ -592,10 +668,14 @@ msgstr "" | ||
| 592 | msgid "Session" | 668 | msgid "Session" |
| 593 | msgstr "" | 669 | msgstr "" |
| 594 | 670 | ||
| 595 | -#: ui/application.xml:76 | 671 | +#: ui/window.xml:440 ui/window.xml:560 ui/application.xml:76 |
| 596 | msgid "Session Trace" | 672 | msgid "Session Trace" |
| 597 | msgstr "" | 673 | msgstr "" |
| 598 | 674 | ||
| 675 | +#: src/objects/actions/save.c:63 src/objects/os/linux/savedesktopicon.c:85 | ||
| 676 | +msgid "Session file" | ||
| 677 | +msgstr "" | ||
| 678 | + | ||
| 599 | #: ui/window.xml:61 ui/application.xml:126 | 679 | #: ui/window.xml:61 ui/application.xml:126 |
| 600 | msgid "Session in New Tab" | 680 | msgid "Session in New Tab" |
| 601 | msgstr "" | 681 | msgstr "" |
| @@ -604,12 +684,16 @@ msgstr "" | @@ -604,12 +684,16 @@ msgstr "" | ||
| 604 | msgid "Session in new window" | 684 | msgid "Session in new window" |
| 605 | msgstr "" | 685 | msgstr "" |
| 606 | 686 | ||
| 607 | -#: src/objects/window/actions/sessionproperties.c:45 ui/window.xml:98 | ||
| 608 | -#: ui/window.xml:554 ui/application.xml:163 | ||
| 609 | -msgid "Session properties" | 687 | +#: src/objects/actions/save.c:56 src/objects/os/linux/savedesktopicon.c:77 |
| 688 | +msgid "Session name" | ||
| 689 | +msgstr "" | ||
| 690 | + | ||
| 691 | +#: src/objects/window/actions/sessionproperties.c:46 ui/window.xml:98 | ||
| 692 | +#: ui/window.xml:574 ui/application.xml:163 | ||
| 693 | +msgid "Session preferences" | ||
| 610 | msgstr "" | 694 | msgstr "" |
| 611 | 695 | ||
| 612 | -#: src/objects/application/application.c:221 | 696 | +#: src/objects/application/application.c:219 |
| 613 | msgid "Set the user-interface type" | 697 | msgid "Set the user-interface type" |
| 614 | msgstr "" | 698 | msgstr "" |
| 615 | 699 | ||
| @@ -617,34 +701,58 @@ msgstr "" | @@ -617,34 +701,58 @@ msgstr "" | ||
| 617 | msgid "Settings" | 701 | msgid "Settings" |
| 618 | msgstr "" | 702 | msgstr "" |
| 619 | 703 | ||
| 620 | -#: src/objects/toolbar/settings.c:207 | 704 | +#: src/objects/toolbar/settings.c:176 |
| 621 | msgid "Setup the toolbar layout" | 705 | msgid "Setup the toolbar layout" |
| 622 | msgstr "" | 706 | msgstr "" |
| 623 | 707 | ||
| 624 | -#: src/objects/toolbar/settings.c:90 | 708 | +#: src/objects/window/header-settings.c:87 |
| 709 | +msgid "Setup title bar" | ||
| 710 | +msgstr "" | ||
| 711 | + | ||
| 712 | +#: src/objects/toolbar/toolbar.c:214 src/objects/toolbar/settings.c:88 | ||
| 625 | msgid "Setup toolbar" | 713 | msgid "Setup toolbar" |
| 626 | msgstr "" | 714 | msgstr "" |
| 627 | 715 | ||
| 716 | +#: src/objects/os/linux/savedesktopicon.c:70 | ||
| 717 | +msgid "Shortcut file" | ||
| 718 | +msgstr "" | ||
| 719 | + | ||
| 720 | +#: ui/window.xml:93 ui/application.xml:158 | ||
| 721 | +msgid "Shortcut for this session" | ||
| 722 | +msgstr "" | ||
| 723 | + | ||
| 724 | +#: src/objects/os/linux/savedesktopicon.c:63 | ||
| 725 | +msgid "Shortcut name" | ||
| 726 | +msgstr "" | ||
| 727 | + | ||
| 628 | #: ui/application.xml:494 | 728 | #: ui/application.xml:494 |
| 629 | msgid "Show Underline" | 729 | msgid "Show Underline" |
| 630 | msgstr "" | 730 | msgstr "" |
| 631 | 731 | ||
| 632 | -#: ui/window.xml:231 | 732 | +#: ui/window.xml:241 |
| 633 | msgid "Show menu" | 733 | msgid "Show menu" |
| 634 | msgstr "" | 734 | msgstr "" |
| 635 | 735 | ||
| 636 | -#: ui/window.xml:226 | 736 | +#: ui/window.xml:236 |
| 637 | msgid "Show toolbar" | 737 | msgid "Show toolbar" |
| 638 | msgstr "" | 738 | msgstr "" |
| 639 | 739 | ||
| 640 | -#: src/objects/toolbar/toolbar.c:53 | 740 | +#: src/objects/toolbar/models.c:61 |
| 641 | msgid "Small" | 741 | msgid "Small" |
| 642 | msgstr "" | 742 | msgstr "" |
| 643 | 743 | ||
| 644 | -#: ui/window.xml:388 ui/application.xml:504 | 744 | +#: ui/window.xml:398 ui/application.xml:504 |
| 645 | msgid "Smart paste" | 745 | msgid "Smart paste" |
| 646 | msgstr "" | 746 | msgstr "" |
| 647 | 747 | ||
| 748 | +#: src/objects/os/linux/savedesktopicon.c:239 | ||
| 749 | +msgid "Standard desktop files" | ||
| 750 | +msgstr "" | ||
| 751 | + | ||
| 752 | +#: src/objects/settings/actionview.c:68 | ||
| 753 | +msgid "Start" | ||
| 754 | +msgstr "" | ||
| 755 | + | ||
| 648 | #: src/objects/actions/abstract.c:152 | 756 | #: src/objects/actions/abstract.c:152 |
| 649 | msgid "State" | 757 | msgid "State" |
| 650 | msgstr "" | 758 | msgstr "" |
| @@ -653,11 +761,12 @@ msgstr "" | @@ -653,11 +761,12 @@ msgstr "" | ||
| 653 | msgid "State Type" | 761 | msgid "State Type" |
| 654 | msgstr "" | 762 | msgstr "" |
| 655 | 763 | ||
| 656 | -#: src/objects/toolbar/settings.c:55 | ||
| 657 | -msgid "Style" | 764 | +#: src/objects/toolbar/models.c:115 |
| 765 | +msgid "Symbolic" | ||
| 658 | msgstr "" | 766 | msgstr "" |
| 659 | 767 | ||
| 660 | -#: src/objects/toolbar/toolbar.c:47 src/objects/toolbar/toolbar.c:69 | 768 | +#: src/objects/toolbar/models.c:55 src/objects/toolbar/models.c:82 |
| 769 | +#: src/objects/toolbar/models.c:111 | ||
| 661 | msgid "System default" | 770 | msgid "System default" |
| 662 | msgstr "" | 771 | msgstr "" |
| 663 | 772 | ||
| @@ -673,7 +782,7 @@ msgstr "" | @@ -673,7 +782,7 @@ msgstr "" | ||
| 673 | msgid "Terminal font" | 782 | msgid "Terminal font" |
| 674 | msgstr "" | 783 | msgstr "" |
| 675 | 784 | ||
| 676 | -#: src/objects/toolbar/toolbar.c:79 | 785 | +#: src/objects/toolbar/models.c:92 |
| 677 | msgid "Text only" | 786 | msgid "Text only" |
| 678 | msgstr "" | 787 | msgstr "" |
| 679 | 788 | ||
| @@ -693,6 +802,14 @@ msgstr "" | @@ -693,6 +802,14 @@ msgstr "" | ||
| 693 | msgid "The code of the User interface type" | 802 | msgid "The code of the User interface type" |
| 694 | msgstr "" | 803 | msgstr "" |
| 695 | 804 | ||
| 805 | +#: src/objects/actions/save.c:64 | ||
| 806 | +msgid "The file to save the current session preferences" | ||
| 807 | +msgstr "" | ||
| 808 | + | ||
| 809 | +#: src/objects/os/linux/savedesktopicon.c:86 | ||
| 810 | +msgid "The file with the session preferences for this shortcut" | ||
| 811 | +msgstr "" | ||
| 812 | + | ||
| 696 | #: src/objects/actions/abstract.c:110 | 813 | #: src/objects/actions/abstract.c:110 |
| 697 | msgid "The label for the action" | 814 | msgid "The label for the action" |
| 698 | msgstr "" | 815 | msgstr "" |
| @@ -701,11 +818,11 @@ msgstr "" | @@ -701,11 +818,11 @@ msgstr "" | ||
| 701 | msgid "The name of associated action" | 818 | msgid "The name of associated action" |
| 702 | msgstr "" | 819 | msgstr "" |
| 703 | 820 | ||
| 704 | -#: src/objects/window/window.c:164 | 821 | +#: src/objects/window/window.c:185 |
| 705 | msgid "The name of the actions in the header bar" | 822 | msgid "The name of the actions in the header bar" |
| 706 | msgstr "" | 823 | msgstr "" |
| 707 | 824 | ||
| 708 | -#: src/objects/toolbar/toolbar.c:136 | 825 | +#: src/objects/toolbar/toolbar.c:98 |
| 709 | msgid "The name of the actions in the toolbar" | 826 | msgid "The name of the actions in the toolbar" |
| 710 | msgstr "" | 827 | msgstr "" |
| 711 | 828 | ||
| @@ -729,15 +846,23 @@ msgstr "" | @@ -729,15 +846,23 @@ msgstr "" | ||
| 729 | msgid "The position of the keypad" | 846 | msgid "The position of the keypad" |
| 730 | msgstr "" | 847 | msgstr "" |
| 731 | 848 | ||
| 849 | +#: src/objects/actions/save.c:57 src/objects/os/linux/savedesktopicon.c:79 | ||
| 850 | +msgid "The session name used in the window/tab title (empty for default)" | ||
| 851 | +msgstr "" | ||
| 852 | + | ||
| 732 | #: src/objects/actions/abstract.c:153 | 853 | #: src/objects/actions/abstract.c:153 |
| 733 | msgid "The state the action is in" | 854 | msgid "The state the action is in" |
| 734 | msgstr "" | 855 | msgstr "" |
| 735 | 856 | ||
| 736 | -#: src/objects/toolbar/toolbar.c:147 | 857 | +#: src/objects/toolbar/toolbar.c:109 |
| 737 | msgid "The toolbar icon size" | 858 | msgid "The toolbar icon size" |
| 738 | msgstr "" | 859 | msgstr "" |
| 739 | 860 | ||
| 740 | -#: src/objects/toolbar/toolbar.c:160 | 861 | +#: src/objects/toolbar/toolbar.c:135 |
| 862 | +msgid "The toolbar icon type" | ||
| 863 | +msgstr "" | ||
| 864 | + | ||
| 865 | +#: src/objects/toolbar/toolbar.c:122 | ||
| 741 | msgid "The toolbar style" | 866 | msgid "The toolbar style" |
| 742 | msgstr "" | 867 | msgstr "" |
| 743 | 868 | ||
| @@ -753,12 +878,28 @@ msgstr "" | @@ -753,12 +878,28 @@ msgstr "" | ||
| 753 | msgid "The type of the state kept by the action" | 878 | msgid "The type of the state kept by the action" |
| 754 | msgstr "" | 879 | msgstr "" |
| 755 | 880 | ||
| 756 | -#: src/objects/toolbar/settings.c:89 ui/window.xml:420 ui/window.xml:535 | 881 | +#: src/objects/window/header-settings.c:86 |
| 882 | +msgid "Title bar" | ||
| 883 | +msgstr "" | ||
| 884 | + | ||
| 885 | +#: src/objects/window/header-settings.c:98 | ||
| 886 | +msgid "Title bar actions" | ||
| 887 | +msgstr "" | ||
| 888 | + | ||
| 889 | +#: src/objects/toolbar/settings.c:87 ui/window.xml:430 ui/window.xml:550 | ||
| 757 | #: ui/application.xml:342 | 890 | #: ui/application.xml:342 |
| 758 | msgid "Toolbar" | 891 | msgid "Toolbar" |
| 759 | msgstr "" | 892 | msgstr "" |
| 760 | 893 | ||
| 761 | -#: ui/window.xml:425 | 894 | +#: src/objects/toolbar/settings.c:68 |
| 895 | +msgid "Toolbar Style" | ||
| 896 | +msgstr "" | ||
| 897 | + | ||
| 898 | +#: src/objects/toolbar/models.c:79 | ||
| 899 | +msgid "Toolbar s_tyle" | ||
| 900 | +msgstr "" | ||
| 901 | + | ||
| 902 | +#: ui/window.xml:435 | ||
| 762 | msgid "Top menu" | 903 | msgid "Top menu" |
| 763 | msgstr "" | 904 | msgstr "" |
| 764 | 905 | ||
| @@ -766,7 +907,7 @@ msgstr "" | @@ -766,7 +907,7 @@ msgstr "" | ||
| 766 | msgid "Trace" | 907 | msgid "Trace" |
| 767 | msgstr "" | 908 | msgstr "" |
| 768 | 909 | ||
| 769 | -#: ui/window.xml:474 ui/application.xml:449 | 910 | +#: ui/window.xml:489 ui/application.xml:449 |
| 770 | msgid "Track Cursor" | 911 | msgid "Track Cursor" |
| 771 | msgstr "" | 912 | msgstr "" |
| 772 | 913 | ||
| @@ -774,7 +915,7 @@ msgstr "" | @@ -774,7 +915,7 @@ msgstr "" | ||
| 774 | msgid "UI Type" | 915 | msgid "UI Type" |
| 775 | msgstr "" | 916 | msgstr "" |
| 776 | 917 | ||
| 777 | -#: ui/window.xml:257 ui/application.xml:290 | 918 | +#: ui/window.xml:267 ui/application.xml:290 |
| 778 | msgid "Unselect" | 919 | msgid "Unselect" |
| 779 | msgstr "" | 920 | msgstr "" |
| 780 | 921 | ||
| @@ -782,34 +923,38 @@ msgstr "" | @@ -782,34 +923,38 @@ msgstr "" | ||
| 782 | msgid "Use +/- for field navigation" | 923 | msgid "Use +/- for field navigation" |
| 783 | msgstr "" | 924 | msgstr "" |
| 784 | 925 | ||
| 785 | -#: src/objects/application/actions/about.c:86 | ||
| 786 | -#: src/objects/application/actions/about.c:88 | 926 | +#: src/objects/application/actions/about.c:70 |
| 787 | #, c-format | 927 | #, c-format |
| 788 | msgid "Version %s-%s" | 928 | msgid "Version %s-%s" |
| 789 | msgstr "" | 929 | msgstr "" |
| 790 | 930 | ||
| 791 | -#: src/objects/window/header.c:66 ui/window.xml:417 ui/window.xml:532 | 931 | +#: src/objects/window/header.c:66 ui/window.xml:427 ui/window.xml:547 |
| 792 | #: ui/application.xml:63 | 932 | #: ui/application.xml:63 |
| 793 | msgid "View" | 933 | msgid "View" |
| 794 | msgstr "" | 934 | msgstr "" |
| 795 | 935 | ||
| 936 | +#: src/objects/application/actions/about.c:163 | ||
| 937 | +msgid "View this project on github" | ||
| 938 | +msgstr "" | ||
| 939 | + | ||
| 796 | #: ui/window.xml:40 ui/application.xml:105 | 940 | #: ui/window.xml:40 ui/application.xml:105 |
| 797 | msgid "Window with default session" | 941 | msgid "Window with default session" |
| 798 | msgstr "" | 942 | msgstr "" |
| 799 | 943 | ||
| 800 | -#: src/objects/settings/dialog.c:84 | 944 | +#: src/objects/settings/dialog.c:79 |
| 801 | msgid "_Apply" | 945 | msgid "_Apply" |
| 802 | msgstr "" | 946 | msgstr "" |
| 803 | 947 | ||
| 804 | -#: src/objects/settings/dialog.c:83 src/objects/windows/savedesktopicon.c:104 | 948 | +#: src/objects/actions/save.c:102 src/objects/settings/dialog.c:78 |
| 949 | +#: src/objects/os/linux/savedesktopicon.c:174 | ||
| 805 | msgid "_Cancel" | 950 | msgid "_Cancel" |
| 806 | msgstr "" | 951 | msgstr "" |
| 807 | 952 | ||
| 808 | -#: src/objects/window/page.c:394 | 953 | +#: src/objects/window/page.c:371 |
| 809 | msgid "_Close session" | 954 | msgid "_Close session" |
| 810 | msgstr "" | 955 | msgstr "" |
| 811 | 956 | ||
| 812 | -#: ui/window.xml:549 ui/application.xml:368 | 957 | +#: ui/window.xml:569 ui/application.xml:368 |
| 813 | msgid "_Connect" | 958 | msgid "_Connect" |
| 814 | msgstr "" | 959 | msgstr "" |
| 815 | 960 | ||
| @@ -817,7 +962,7 @@ msgstr "" | @@ -817,7 +962,7 @@ msgstr "" | ||
| 817 | msgid "_Disconnect" | 962 | msgid "_Disconnect" |
| 818 | msgstr "" | 963 | msgstr "" |
| 819 | 964 | ||
| 820 | -#: ui/window.xml:148 ui/window.xml:281 ui/application.xml:231 | 965 | +#: ui/window.xml:148 ui/window.xml:291 ui/application.xml:231 |
| 821 | msgid "_Edit" | 966 | msgid "_Edit" |
| 822 | msgstr "" | 967 | msgstr "" |
| 823 | 968 | ||
| @@ -837,15 +982,15 @@ msgstr "" | @@ -837,15 +982,15 @@ msgstr "" | ||
| 837 | msgid "_Open" | 982 | msgid "_Open" |
| 838 | msgstr "" | 983 | msgstr "" |
| 839 | 984 | ||
| 840 | -#: src/objects/toolbar/toolbar.c:308 | ||
| 841 | -msgid "_Properties" | 985 | +#: src/objects/toolbar/toolbar.c:236 |
| 986 | +msgid "_Preferences" | ||
| 842 | msgstr "" | 987 | msgstr "" |
| 843 | 988 | ||
| 844 | -#: src/objects/window/page.c:388 | 989 | +#: src/objects/window/page.c:365 |
| 845 | msgid "_Rename session" | 990 | msgid "_Rename session" |
| 846 | msgstr "" | 991 | msgstr "" |
| 847 | 992 | ||
| 848 | -#: src/objects/windows/savedesktopicon.c:105 | 993 | +#: src/objects/actions/save.c:103 src/objects/os/linux/savedesktopicon.c:175 |
| 849 | msgid "_Save" | 994 | msgid "_Save" |
| 850 | msgstr "" | 995 | msgstr "" |
| 851 | 996 | ||
| @@ -853,6 +998,10 @@ msgstr "" | @@ -853,6 +998,10 @@ msgstr "" | ||
| 853 | msgid "_View" | 998 | msgid "_View" |
| 854 | msgstr "" | 999 | msgstr "" |
| 855 | 1000 | ||
| 856 | -#: src/objects/application/actions/about.c:145 | 1001 | +#: src/objects/application/actions/about.c:162 |
| 1002 | +msgid "https://github.com/PerryWerneck/pw3270" | ||
| 1003 | +msgstr "" | ||
| 1004 | + | ||
| 1005 | +#: src/objects/application/actions/about.c:165 | ||
| 857 | msgid "translator-credits" | 1006 | msgid "translator-credits" |
| 858 | msgstr "" | 1007 | msgstr "" |
pw3270.cbp
| @@ -43,13 +43,18 @@ | @@ -43,13 +43,18 @@ | ||
| 43 | <Unit filename="Makefile.in" /> | 43 | <Unit filename="Makefile.in" /> |
| 44 | <Unit filename="configure.ac" /> | 44 | <Unit filename="configure.ac" /> |
| 45 | <Unit filename="schemas/linux/application.gschema.xml.in" /> | 45 | <Unit filename="schemas/linux/application.gschema.xml.in" /> |
| 46 | + <Unit filename="schemas/linux/window.gschema.xml.in" /> | ||
| 47 | + <Unit filename="schemas/windows/application.gschema.xml.in" /> | ||
| 48 | + <Unit filename="schemas/windows/window.gschema.xml.in" /> | ||
| 46 | <Unit filename="src/include/pw3270.h" /> | 49 | <Unit filename="src/include/pw3270.h" /> |
| 47 | <Unit filename="src/include/pw3270/actions.h" /> | 50 | <Unit filename="src/include/pw3270/actions.h" /> |
| 48 | <Unit filename="src/include/pw3270/application.h" /> | 51 | <Unit filename="src/include/pw3270/application.h" /> |
| 49 | <Unit filename="src/include/pw3270/keypad.h" /> | 52 | <Unit filename="src/include/pw3270/keypad.h" /> |
| 50 | <Unit filename="src/include/pw3270/settings.h" /> | 53 | <Unit filename="src/include/pw3270/settings.h" /> |
| 51 | <Unit filename="src/include/pw3270/toolbar.h" /> | 54 | <Unit filename="src/include/pw3270/toolbar.h" /> |
| 55 | + <Unit filename="src/include/pw3270/tools.h" /> | ||
| 52 | <Unit filename="src/include/pw3270/window.h" /> | 56 | <Unit filename="src/include/pw3270/window.h" /> |
| 57 | + <Unit filename="src/include/v3270/keyfile.h" /> | ||
| 53 | <Unit filename="src/main/main.c"> | 58 | <Unit filename="src/main/main.c"> |
| 54 | <Option compilerVar="CC" /> | 59 | <Option compilerVar="CC" /> |
| 55 | </Unit> | 60 | </Unit> |
| @@ -126,7 +131,13 @@ | @@ -126,7 +131,13 @@ | ||
| 126 | <Unit filename="src/objects/keypad/widget.c"> | 131 | <Unit filename="src/objects/keypad/widget.c"> |
| 127 | <Option compilerVar="CC" /> | 132 | <Option compilerVar="CC" /> |
| 128 | </Unit> | 133 | </Unit> |
| 129 | - <Unit filename="src/objects/linux/savedesktopicon.c"> | 134 | + <Unit filename="src/objects/os/linux/savedesktopicon.c"> |
| 135 | + <Option compilerVar="CC" /> | ||
| 136 | + </Unit> | ||
| 137 | + <Unit filename="src/objects/os/windows/savedesktopicon.c"> | ||
| 138 | + <Option compilerVar="CC" /> | ||
| 139 | + </Unit> | ||
| 140 | + <Unit filename="src/objects/settings/actionview.c"> | ||
| 130 | <Option compilerVar="CC" /> | 141 | <Option compilerVar="CC" /> |
| 131 | </Unit> | 142 | </Unit> |
| 132 | <Unit filename="src/objects/settings/dialog.c"> | 143 | <Unit filename="src/objects/settings/dialog.c"> |
| @@ -138,6 +149,9 @@ | @@ -138,6 +149,9 @@ | ||
| 138 | <Unit filename="src/objects/toolbar/actions.c"> | 149 | <Unit filename="src/objects/toolbar/actions.c"> |
| 139 | <Option compilerVar="CC" /> | 150 | <Option compilerVar="CC" /> |
| 140 | </Unit> | 151 | </Unit> |
| 152 | + <Unit filename="src/objects/toolbar/models.c"> | ||
| 153 | + <Option compilerVar="CC" /> | ||
| 154 | + </Unit> | ||
| 141 | <Unit filename="src/objects/toolbar/private.h" /> | 155 | <Unit filename="src/objects/toolbar/private.h" /> |
| 142 | <Unit filename="src/objects/toolbar/settings.c"> | 156 | <Unit filename="src/objects/toolbar/settings.c"> |
| 143 | <Option compilerVar="CC" /> | 157 | <Option compilerVar="CC" /> |
| @@ -163,9 +177,15 @@ | @@ -163,9 +177,15 @@ | ||
| 163 | <Unit filename="src/objects/window/actions/setcolors.c"> | 177 | <Unit filename="src/objects/window/actions/setcolors.c"> |
| 164 | <Option compilerVar="CC" /> | 178 | <Option compilerVar="CC" /> |
| 165 | </Unit> | 179 | </Unit> |
| 180 | + <Unit filename="src/objects/window/header-settings.c"> | ||
| 181 | + <Option compilerVar="CC" /> | ||
| 182 | + </Unit> | ||
| 166 | <Unit filename="src/objects/window/header.c"> | 183 | <Unit filename="src/objects/window/header.c"> |
| 167 | <Option compilerVar="CC" /> | 184 | <Option compilerVar="CC" /> |
| 168 | </Unit> | 185 | </Unit> |
| 186 | + <Unit filename="src/objects/window/keyfile.c"> | ||
| 187 | + <Option compilerVar="CC" /> | ||
| 188 | + </Unit> | ||
| 169 | <Unit filename="src/objects/window/page.c"> | 189 | <Unit filename="src/objects/window/page.c"> |
| 170 | <Option compilerVar="CC" /> | 190 | <Option compilerVar="CC" /> |
| 171 | </Unit> | 191 | </Unit> |
| @@ -179,7 +199,7 @@ | @@ -179,7 +199,7 @@ | ||
| 179 | <Unit filename="src/objects/window/window.c"> | 199 | <Unit filename="src/objects/window/window.c"> |
| 180 | <Option compilerVar="CC" /> | 200 | <Option compilerVar="CC" /> |
| 181 | </Unit> | 201 | </Unit> |
| 182 | - <Unit filename="src/objects/windows/savedesktopicon.c"> | 202 | + <Unit filename="src/tools/entry.c"> |
| 183 | <Option compilerVar="CC" /> | 203 | <Option compilerVar="CC" /> |
| 184 | </Unit> | 204 | </Unit> |
| 185 | <Unit filename="ui/application.xml" /> | 205 | <Unit filename="ui/application.xml" /> |
rpm/_service
| @@ -8,7 +8,7 @@ | @@ -8,7 +8,7 @@ | ||
| 8 | <param name="changesgenerate">enable</param> | 8 | <param name="changesgenerate">enable</param> |
| 9 | <param name="changesauthor">perry.werneck@gmail.com</param> | 9 | <param name="changesauthor">perry.werneck@gmail.com</param> |
| 10 | 10 | ||
| 11 | - <param name="versionformat">@PARENT_TAG@</param> | 11 | + <param name="versionformat">@PARENT_TAG@+git%cd</param> |
| 12 | <param name="scm">git</param> | 12 | <param name="scm">git</param> |
| 13 | </service> | 13 | </service> |
| 14 | 14 |
rpm/pw3270.spec
| @@ -22,17 +22,17 @@ | @@ -22,17 +22,17 @@ | ||
| 22 | 22 | ||
| 23 | #---[ Packaging ]----------------------------------------------------------------------------------------------------- | 23 | #---[ Packaging ]----------------------------------------------------------------------------------------------------- |
| 24 | 24 | ||
| 25 | -Name: pw3270 | ||
| 26 | -Version: 5.3 | ||
| 27 | -Release: 0 | ||
| 28 | -Summary: IBM 3270 Terminal emulator for GTK | ||
| 29 | -License: GPL-2.0 | ||
| 30 | -Group: System/X11/Terminals | ||
| 31 | -Url: https://portal.softwarepublico.gov.br/social/pw3270/ | 25 | +Name: pw3270 |
| 26 | +Version: 5.3 | ||
| 27 | +Release: 0 | ||
| 28 | +Summary: IBM 3270 Terminal emulator for GTK | ||
| 29 | +License: GPL-2.0 | ||
| 30 | +Group: System/X11/Terminals | ||
| 31 | +Url: https://github.com/PerryWerneck/pw3270 | ||
| 32 | 32 | ||
| 33 | -Source: pw3270-%{version}.tar.xz | 33 | +Source: pw3270-%{version}.tar.xz |
| 34 | 34 | ||
| 35 | -BuildRoot: %{_tmppath}/%{name}-%{version}-build | 35 | +BuildRoot: %{_tmppath}/%{name}-%{version}-build |
| 36 | 36 | ||
| 37 | Requires: shared-mime-info | 37 | Requires: shared-mime-info |
| 38 | Requires: %{name}-branding = %{version} | 38 | Requires: %{name}-branding = %{version} |
| @@ -41,7 +41,6 @@ BuildRequires: update-desktop-files | @@ -41,7 +41,6 @@ BuildRequires: update-desktop-files | ||
| 41 | 41 | ||
| 42 | %glib2_gsettings_schema_requires | 42 | %glib2_gsettings_schema_requires |
| 43 | 43 | ||
| 44 | - | ||
| 45 | #--[ Setup by distribution ]------------------------------------------------------------------------------------------ | 44 | #--[ Setup by distribution ]------------------------------------------------------------------------------------------ |
| 46 | # | 45 | # |
| 47 | # References: | 46 | # References: |
| @@ -56,7 +55,7 @@ BuildRequires: update-desktop-files | @@ -56,7 +55,7 @@ BuildRequires: update-desktop-files | ||
| 56 | BuildRequires: gtk3-devel | 55 | BuildRequires: gtk3-devel |
| 57 | BuildRequires: glib2-devel | 56 | BuildRequires: glib2-devel |
| 58 | BuildRequires: librsvg2-tools | 57 | BuildRequires: librsvg2-tools |
| 59 | -BuildRequires: libv3270-devel >= %{version} | 58 | +BuildRequires: libv3270-devel >= 5.3 |
| 60 | 59 | ||
| 61 | %endif | 60 | %endif |
| 62 | 61 | ||
| @@ -66,7 +65,7 @@ BuildRequires: libv3270-devel >= %{version} | @@ -66,7 +65,7 @@ BuildRequires: libv3270-devel >= %{version} | ||
| 66 | 65 | ||
| 67 | BuildRequires: gtk3-devel | 66 | BuildRequires: gtk3-devel |
| 68 | BuildRequires: glib2-devel | 67 | BuildRequires: glib2-devel |
| 69 | -BuildRequires: libv3270-devel | 68 | +BuildRequires: libv3270-devel >= 5.3 |
| 70 | 69 | ||
| 71 | # Required for genmarshal | 70 | # Required for genmarshal |
| 72 | BuildRequires: python | 71 | BuildRequires: python |
| @@ -79,7 +78,7 @@ BuildRequires: python | @@ -79,7 +78,7 @@ BuildRequires: python | ||
| 79 | 78 | ||
| 80 | BuildRequires: pkgconfig(gtk+-3.0) | 79 | BuildRequires: pkgconfig(gtk+-3.0) |
| 81 | BuildRequires: pkgconfig(glib-2.0) | 80 | BuildRequires: pkgconfig(glib-2.0) |
| 82 | -BuildRequires: pkgconfig(libv3270) >= %{version} | 81 | +BuildRequires: pkgconfig(libv3270) >= 5.3 |
| 83 | 82 | ||
| 84 | %endif | 83 | %endif |
| 85 | 84 | ||
| @@ -89,7 +88,7 @@ BuildRequires: pkgconfig(libv3270) >= %{version} | @@ -89,7 +88,7 @@ BuildRequires: pkgconfig(libv3270) >= %{version} | ||
| 89 | 88 | ||
| 90 | BuildRequires: pkgconfig(gtk+-3.0) | 89 | BuildRequires: pkgconfig(gtk+-3.0) |
| 91 | BuildRequires: pkgconfig(glib-2.0) | 90 | BuildRequires: pkgconfig(glib-2.0) |
| 92 | -BuildRequires: pkgconfig(libv3270) >= %{version} | 91 | +BuildRequires: pkgconfig(libv3270) >= 5.3 |
| 93 | 92 | ||
| 94 | %endif | 93 | %endif |
| 95 | 94 | ||
| @@ -192,6 +191,7 @@ make all -j1 | @@ -192,6 +191,7 @@ make all -j1 | ||
| 192 | %{_datadir}/%{_product}/*.png | 191 | %{_datadir}/%{_product}/*.png |
| 193 | %{_datadir}/applications/*.desktop | 192 | %{_datadir}/applications/*.desktop |
| 194 | %{_datadir}/pixmaps/*.png | 193 | %{_datadir}/pixmaps/*.png |
| 194 | +%{_datadir}/mime/packages/*.xml | ||
| 195 | 195 | ||
| 196 | %files keypads | 196 | %files keypads |
| 197 | %{_datadir}/%{_product}/keypad/* | 197 | %{_datadir}/%{_product}/keypad/* |
schemas/linux/window.gschema.xml.in
| @@ -82,19 +82,37 @@ | @@ -82,19 +82,37 @@ | ||
| 82 | 82 | ||
| 83 | <key name="toolbar-icon-size" type="i"> | 83 | <key name="toolbar-icon-size" type="i"> |
| 84 | <default>0</default> | 84 | <default>0</default> |
| 85 | - <summary>The size of the icons in a toolbar</summary> | 85 | + <summary>The size of the toolbar icons</summary> |
| 86 | + <description></description> | ||
| 87 | + </key> | ||
| 88 | + | ||
| 89 | + <key name="toolbar-icon-type" type="i"> | ||
| 90 | + <default>0</default> | ||
| 91 | + <summary>Use symbolic icons on toolbar</summary> | ||
| 92 | + <description></description> | ||
| 93 | + </key> | ||
| 94 | + | ||
| 95 | + <key name="header-icon-type" type="i"> | ||
| 96 | + <default>0</default> | ||
| 97 | + <summary>Use symbolic icons on title bar</summary> | ||
| 98 | + <description></description> | ||
| 99 | + </key> | ||
| 100 | + | ||
| 101 | + <key name="toolbar-position" type="i"> | ||
| 102 | + <default>0</default> | ||
| 103 | + <summary>The toolbar position</summary> | ||
| 86 | <description></description> | 104 | <description></description> |
| 87 | </key> | 105 | </key> |
| 88 | 106 | ||
| 89 | <key name="toolbar-action-names" type="s"> | 107 | <key name="toolbar-action-names" type="s"> |
| 90 | - <default>'win.copy,win.paste,win.select-all,separator,win.connect,win.disconnect,separator,win.session.properties,win.file.transfer,win.print,win.close'</default> | 108 | + <default>'win.copy,win.paste,win.select-all,separator,win.clear,win.erase-input,separator,win.print,separator,win.zoom-out,win.zoom-fit-best,win.zoom-in'</default> |
| 91 | <summary>The toolbar action list</summary> | 109 | <summary>The toolbar action list</summary> |
| 92 | <description></description> | 110 | <description></description> |
| 93 | </key> | 111 | </key> |
| 94 | 112 | ||
| 95 | <key name="header-action-names" type="s"> | 113 | <key name="header-action-names" type="s"> |
| 96 | - <default>'win.disconnect,win.reconnect,win.file.transfer,win.print:menu.open-menu'</default> | ||
| 97 | - <summary>The actions in the header bar</summary> | 114 | + <default>':menu.open-menu,win.disconnect,win.reconnect'</default> |
| 115 | + <summary>The title bar action list</summary> | ||
| 98 | <description></description> | 116 | <description></description> |
| 99 | </key> | 117 | </key> |
| 100 | 118 |
schemas/windows/window.gschema.xml.in
| @@ -82,7 +82,25 @@ | @@ -82,7 +82,25 @@ | ||
| 82 | 82 | ||
| 83 | <key name="toolbar-icon-size" type="i"> | 83 | <key name="toolbar-icon-size" type="i"> |
| 84 | <default>2</default> | 84 | <default>2</default> |
| 85 | - <summary>The size of the icons in a toolbar</summary> | 85 | + <summary>The size of the toolbar icons</summary> |
| 86 | + <description></description> | ||
| 87 | + </key> | ||
| 88 | + | ||
| 89 | + <key name="toolbar-icon-type" type="i"> | ||
| 90 | + <default>0</default> | ||
| 91 | + <summary>Use symbolic icons on toolbar</summary> | ||
| 92 | + <description></description> | ||
| 93 | + </key> | ||
| 94 | + | ||
| 95 | + <key name="header-icon-type" type="i"> | ||
| 96 | + <default>0</default> | ||
| 97 | + <summary>Use symbolic icons on title bar</summary> | ||
| 98 | + <description></description> | ||
| 99 | + </key> | ||
| 100 | + | ||
| 101 | + <key name="toolbar-position" type="i"> | ||
| 102 | + <default>0</default> | ||
| 103 | + <summary>The toolbar position</summary> | ||
| 86 | <description></description> | 104 | <description></description> |
| 87 | </key> | 105 | </key> |
| 88 | 106 |
src/include/pw3270.h
| @@ -68,13 +68,6 @@ | @@ -68,13 +68,6 @@ | ||
| 68 | 68 | ||
| 69 | void gtk_file_chooser_set_pw3270_filters(GtkFileChooser *chooser); | 69 | void gtk_file_chooser_set_pw3270_filters(GtkFileChooser *chooser); |
| 70 | 70 | ||
| 71 | - const gchar * v3270_get_session_filename(GtkWidget *widget); | ||
| 72 | - void v3270_set_session_filename(GtkWidget *widget, const gchar *filename); | ||
| 73 | - GKeyFile * v3270_get_session_keyfile(GtkWidget *widget); | ||
| 74 | - | ||
| 75 | - /// @brief Check if the terminal has a customized session file. | ||
| 76 | - gboolean v3270_allow_custom_settings(GtkWidget *widget); | ||
| 77 | - | ||
| 78 | G_END_DECLS | 71 | G_END_DECLS |
| 79 | 72 | ||
| 80 | #endif // PW3270_H_INCLUDED | 73 | #endif // PW3270_H_INCLUDED |
src/include/pw3270/actions.h
| @@ -90,15 +90,26 @@ | @@ -90,15 +90,26 @@ | ||
| 90 | // | 90 | // |
| 91 | typedef GSList Pw3270ActionList; | 91 | typedef GSList Pw3270ActionList; |
| 92 | 92 | ||
| 93 | + typedef enum _pw3270ActionViewFlag { | ||
| 94 | + PW3270_ACTION_VIEW_FLAG_FIXED = 0, ///< @brief Don't move to other views. | ||
| 95 | + PW3270_ACTION_VIEW_FLAG_ALLOW_ADD = 1, ///< @brief Allow add to target view. | ||
| 96 | + PW3270_ACTION_VIEW_ALLOW_REMOVE = 2, ///< @brief Allow remove from source view. | ||
| 97 | + PW3270_ACTION_VIEW_ALLOW_MOVE = 3 ///< @brief Allow move from one view to another. | ||
| 98 | + } PW3270ActionViewFlag; | ||
| 99 | + | ||
| 100 | + | ||
| 93 | GtkWidget * pw3270_action_view_new(); | 101 | GtkWidget * pw3270_action_view_new(); |
| 94 | - Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); | ||
| 95 | - void pw3270_action_list_free(Pw3270ActionList *action_list); | ||
| 96 | void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); | 102 | void pw3270_action_view_set_actions(GtkWidget *view, Pw3270ActionList *list); |
| 103 | + void pw3270_action_view_order_by_label(GtkWidget *view); | ||
| 97 | void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); | 104 | void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); |
| 98 | - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags); | 105 | + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags); |
| 99 | gchar * pw3270_action_view_get_action_names(GtkWidget *widget); | 106 | gchar * pw3270_action_view_get_action_names(GtkWidget *widget); |
| 107 | + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name); | ||
| 100 | 108 | ||
| 109 | + Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); | ||
| 110 | + Pw3270ActionList * pw3270_action_list_append(Pw3270ActionList *action_list, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags); | ||
| 101 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); | 111 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); |
| 112 | + void pw3270_action_list_free(Pw3270ActionList *action_list); | ||
| 102 | 113 | ||
| 103 | // | 114 | // |
| 104 | // Tools | 115 | // Tools |
| @@ -109,8 +120,8 @@ | @@ -109,8 +120,8 @@ | ||
| 109 | 120 | ||
| 110 | GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags); | 121 | GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags); |
| 111 | 122 | ||
| 112 | - GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size); | ||
| 113 | - GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size); | 123 | + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic); |
| 124 | + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic); | ||
| 114 | 125 | ||
| 115 | G_END_DECLS | 126 | G_END_DECLS |
| 116 | 127 |
src/include/pw3270/application.h
| @@ -73,6 +73,10 @@ | @@ -73,6 +73,10 @@ | ||
| 73 | 73 | ||
| 74 | // Plugins | 74 | // Plugins |
| 75 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); | 75 | void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data); |
| 76 | + | ||
| 77 | + /// @brief Call plugin method. | ||
| 78 | + void pw3270_application_plugin_call(GApplication *app, const gchar *method, gpointer user_data); | ||
| 79 | + | ||
| 76 | GSList * pw3270_application_get_plugins(GApplication *app); | 80 | GSList * pw3270_application_get_plugins(GApplication *app); |
| 77 | 81 | ||
| 78 | // Tools | 82 | // Tools |
| @@ -84,6 +88,10 @@ | @@ -84,6 +88,10 @@ | ||
| 84 | void pw3270_application_print_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); | 88 | void pw3270_application_print_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); |
| 85 | void pw3270_application_save_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); | 89 | void pw3270_application_save_copy_activated(GAction *action, GVariant *parameter, GtkWidget *terminal); |
| 86 | 90 | ||
| 91 | + // Settings | ||
| 92 | + GtkWidget * pw3270_header_settings_new(); | ||
| 93 | + | ||
| 94 | + | ||
| 87 | G_END_DECLS | 95 | G_END_DECLS |
| 88 | 96 | ||
| 89 | 97 |
src/include/pw3270/settings.h
| @@ -36,6 +36,7 @@ | @@ -36,6 +36,7 @@ | ||
| 36 | #endif // _WIN32 | 36 | #endif // _WIN32 |
| 37 | 37 | ||
| 38 | #include <gtk/gtk.h> | 38 | #include <gtk/gtk.h> |
| 39 | + #include <pw3270/actions.h> | ||
| 39 | 40 | ||
| 40 | G_BEGIN_DECLS | 41 | G_BEGIN_DECLS |
| 41 | 42 | ||
| @@ -87,8 +88,23 @@ | @@ -87,8 +88,23 @@ | ||
| 87 | typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass; | 88 | typedef struct _PW3270SettingsDialogClass PW3270SettingsDialogClass; |
| 88 | 89 | ||
| 89 | GType PW3270SettingsDialog_get_type(void); | 90 | GType PW3270SettingsDialog_get_type(void); |
| 90 | - GtkWidget * pw3270_settings_dialog_new(GAction *action); | 91 | + GtkWidget * pw3270_settings_dialog_new(GAction *action, gboolean has_subtitle); |
| 91 | 92 | ||
| 92 | G_END_DECLS | 93 | G_END_DECLS |
| 93 | 94 | ||
| 95 | +/*--[ PW3270 Action List Editor ]--------------------------------------------------------------------*/ | ||
| 96 | + | ||
| 97 | + #define GTK_TYPE_PW3270_SETTINGS_ACTIONS (PW3270SettingsActions_get_type()) | ||
| 98 | + | ||
| 99 | + typedef struct _PW3270SettingsActions PW3270SettingsActions; | ||
| 100 | + typedef struct _PW3270SettingsActionsClass PW3270SettingsActionsClass; | ||
| 101 | + | ||
| 102 | + GType PW3270SettingsActions_get_type(void); | ||
| 103 | + GtkWidget * pw3270_settings_actions_new(); | ||
| 104 | + Pw3270ActionList * pw3270_settings_action_set(GtkWidget *widget, Pw3270ActionList *available, const gchar *value); | ||
| 105 | + gchar * pw3270_settings_action_get(GtkWidget *widget); | ||
| 106 | + | ||
| 107 | + G_END_DECLS | ||
| 108 | + | ||
| 109 | + | ||
| 94 | #endif // V3270SETTINGS_H_INCLUDED | 110 | #endif // V3270SETTINGS_H_INCLUDED |
src/include/pw3270/toolbar.h
| @@ -66,9 +66,11 @@ | @@ -66,9 +66,11 @@ | ||
| 66 | 66 | ||
| 67 | void pw3270_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style); | 67 | void pw3270_toolbar_set_style(GtkToolbar *toolbar, GtkToolbarStyle style); |
| 68 | void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size); | 68 | void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size); |
| 69 | + void pw3270_toolbar_set_icon_type(GtkToolbar *toolbar, gint icon_type); | ||
| 69 | 70 | ||
| 70 | GtkToolbarStyle pw3270_toolbar_get_style(GtkToolbar *toolbar); | 71 | GtkToolbarStyle pw3270_toolbar_get_style(GtkToolbar *toolbar); |
| 71 | GtkIconSize pw3270_toolbar_get_icon_size(GtkToolbar *toolbar); | 72 | GtkIconSize pw3270_toolbar_get_icon_size(GtkToolbar *toolbar); |
| 73 | + gint pw3270_toolbar_get_icon_type(GtkToolbar *toolbar); | ||
| 72 | 74 | ||
| 73 | G_END_DECLS | 75 | G_END_DECLS |
| 74 | 76 |
| @@ -0,0 +1,68 @@ | @@ -0,0 +1,68 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +/** | ||
| 31 | + * @brief Declares the v3270 keyfile object. | ||
| 32 | + * | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | +#ifndef V3270_KEYFILE_H_INCLUDED | ||
| 36 | + | ||
| 37 | + #define V3270_KEYFILE_H_INCLUDED | ||
| 38 | + | ||
| 39 | + #include <glib.h> | ||
| 40 | + | ||
| 41 | + G_BEGIN_DECLS | ||
| 42 | + | ||
| 43 | + typedef struct _V3270KeyFile V3270KeyFile; | ||
| 44 | + | ||
| 45 | + gchar * v3270_keyfile_get_default_filename(void); | ||
| 46 | + gchar * v3270_key_file_get_default_path(GtkWidget *terminal); | ||
| 47 | + | ||
| 48 | + V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *name, GError **error); | ||
| 49 | + void v3270_key_file_close(GtkWidget *terminal); | ||
| 50 | + | ||
| 51 | + void v3270_key_file_save(GtkWidget *terminal, GError **error); | ||
| 52 | + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error); | ||
| 53 | + | ||
| 54 | + /// @brief Get current key filename | ||
| 55 | + const gchar * v3270_key_file_get_filename(GtkWidget *terminal); | ||
| 56 | + | ||
| 57 | + /// @brief Build a writable key filename | ||
| 58 | + gchar * v3270_key_file_build_filename(GtkWidget *terminal); | ||
| 59 | + | ||
| 60 | + GKeyFile * v3270_key_file_get(GtkWidget *terminal); | ||
| 61 | + | ||
| 62 | + gboolean v3270_key_file_can_write(GtkWidget *widget); | ||
| 63 | + | ||
| 64 | + void v3270_key_file_set_boolean(GtkWidget *terminal, const gchar *group_name, const gchar *key, gboolean value); | ||
| 65 | + | ||
| 66 | + G_END_DECLS | ||
| 67 | + | ||
| 68 | +#endif // PW3270_H_INCLUDED |
src/main/main.c
| @@ -94,6 +94,7 @@ int main (int argc, char **argv) { | @@ -94,6 +94,7 @@ int main (int argc, char **argv) { | ||
| 94 | { | 94 | { |
| 95 | g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL); | 95 | g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL); |
| 96 | g_autofree gchar * locdir = g_build_filename(appdir,"locale",NULL); | 96 | g_autofree gchar * locdir = g_build_filename(appdir,"locale",NULL); |
| 97 | + debug("Locale from \"%s\"\n",locdir); | ||
| 97 | bindtextdomain( PACKAGE_NAME, locdir ); | 98 | bindtextdomain( PACKAGE_NAME, locdir ); |
| 98 | } | 99 | } |
| 99 | #endif // _WIN32 | 100 | #endif // _WIN32 |
src/main/windows/resources.rc.in
| @@ -16,7 +16,7 @@ BEGIN | @@ -16,7 +16,7 @@ BEGIN | ||
| 16 | VALUE "CompanyName", "Banco do Brasil S/A.\0" | 16 | VALUE "CompanyName", "Banco do Brasil S/A.\0" |
| 17 | VALUE "FileVersion", "@WIN32_VERSION@\0" | 17 | VALUE "FileVersion", "@WIN32_VERSION@\0" |
| 18 | VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" | 18 | VALUE "LegalCopyright", "(C) 2017 Banco do Brasil S/A. All Rights Reserved\0" |
| 19 | - VALUE "OriginalFilename", "@APPLICATION_NAME@.exe_NAME@.exe\0"" | 19 | + VALUE "OriginalFilename", "@PRODUCT_NAME@.exe_NAME@.exe\0"" |
| 20 | VALUE "ProductName", "@PRODUCT_NAME@\0" | 20 | VALUE "ProductName", "@PRODUCT_NAME@\0" |
| 21 | VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.@PACKAGE_MINOR_RELEASE@\0" | 21 | VALUE "ProductVersion", "@PACKAGE_MAJOR_VERSION@.@PACKAGE_MINOR_VERSION@.@PACKAGE_MAJOR_RELEASE@.@PACKAGE_MINOR_RELEASE@\0" |
| 22 | END | 22 | END |
src/objects/actions/button.c
| @@ -35,14 +35,19 @@ | @@ -35,14 +35,19 @@ | ||
| 35 | #include "private.h" | 35 | #include "private.h" |
| 36 | #include <pw3270/actions.h> | 36 | #include <pw3270/actions.h> |
| 37 | 37 | ||
| 38 | - GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size) { | 38 | + GtkWidget * gtk_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic) { |
| 39 | 39 | ||
| 40 | if(!action) | 40 | if(!action) |
| 41 | return NULL; | 41 | return NULL; |
| 42 | 42 | ||
| 43 | g_autofree gchar * icon_name = g_action_get_icon_name(action); | 43 | g_autofree gchar * icon_name = g_action_get_icon_name(action); |
| 44 | - if(icon_name) | 44 | + if(icon_name) { |
| 45 | + if(symbolic && !strstr(icon_name,"-symbolic")) { | ||
| 46 | + g_autofree gchar * name = g_strconcat(icon_name,"-symbolic",NULL); | ||
| 47 | + return gtk_button_new_from_icon_name(name,icon_size); | ||
| 48 | + } | ||
| 45 | return gtk_button_new_from_icon_name(icon_name,icon_size); | 49 | return gtk_button_new_from_icon_name(icon_name,icon_size); |
| 50 | + } | ||
| 46 | 51 | ||
| 47 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK); | 52 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_BUTTON, GTK_ICON_LOOKUP_GENERIC_FALLBACK); |
| 48 | 53 | ||
| @@ -62,7 +67,7 @@ | @@ -62,7 +67,7 @@ | ||
| 62 | return NULL; | 67 | return NULL; |
| 63 | } | 68 | } |
| 64 | 69 | ||
| 65 | - GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size) { | 70 | + GtkToolItem * gtk_tool_button_new_from_action(GAction *action, GtkIconSize icon_size, gboolean symbolic) { |
| 66 | 71 | ||
| 67 | if(!action) | 72 | if(!action) |
| 68 | return NULL; | 73 | return NULL; |
| @@ -75,14 +80,18 @@ | @@ -75,14 +80,18 @@ | ||
| 75 | } | 80 | } |
| 76 | 81 | ||
| 77 | g_autofree gchar * icon_name = g_action_get_icon_name(action); | 82 | g_autofree gchar * icon_name = g_action_get_icon_name(action); |
| 78 | -// debug("%s(%s).icon_name=%s",__FUNCTION__,g_action_get_name(action),icon_name); | ||
| 79 | 83 | ||
| 80 | if(icon_name) { | 84 | if(icon_name) { |
| 81 | 85 | ||
| 82 | // Has icon name | 86 | // Has icon name |
| 83 | GtkToolItem * item = gtk_tool_button_new(NULL,label); | 87 | GtkToolItem * item = gtk_tool_button_new(NULL,label); |
| 84 | 88 | ||
| 85 | - gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name); | 89 | + if(symbolic && !strstr(icon_name,"-symbolic")) { |
| 90 | + g_autofree gchar * symbolic_name = g_strconcat(icon_name,"-symbolic",NULL); | ||
| 91 | + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),symbolic_name); | ||
| 92 | + } else { | ||
| 93 | + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item),icon_name); | ||
| 94 | + } | ||
| 86 | 95 | ||
| 87 | if(tooltip) | 96 | if(tooltip) |
| 88 | gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); | 97 | gtk_widget_set_tooltip_markup(GTK_WIDGET(item),tooltip); |
src/objects/actions/save.c
| @@ -34,21 +34,47 @@ | @@ -34,21 +34,47 @@ | ||
| 34 | 34 | ||
| 35 | #include "private.h" | 35 | #include "private.h" |
| 36 | #include <v3270.h> | 36 | #include <v3270.h> |
| 37 | + #include <v3270/keyfile.h> | ||
| 37 | #include <pw3270.h> | 38 | #include <pw3270.h> |
| 38 | #include <pw3270/application.h> | 39 | #include <pw3270/application.h> |
| 39 | - | 40 | + #include <v3270/tools.h> |
| 41 | + #include <v3270/settings.h> | ||
| 40 | 42 | ||
| 41 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | 43 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 42 | static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | 44 | static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); |
| 43 | 45 | ||
| 44 | - GAction * pw3270_action_save_session_as_new(void) { | 46 | + static const struct Entry { |
| 47 | + | ||
| 48 | + const gchar *label; | ||
| 49 | + const gchar *tooltip; | ||
| 50 | + const gint width; | ||
| 51 | + | ||
| 52 | + } entries[] = { | ||
| 53 | + | ||
| 54 | + // 0 = Session name | ||
| 55 | + { | ||
| 56 | + .label = N_("Session name"), | ||
| 57 | + .tooltip = N_("The session name used in the window/tab title (empty for default)"), | ||
| 58 | + .width = 15, | ||
| 59 | + }, | ||
| 60 | + | ||
| 61 | + // 1 = Session file | ||
| 62 | + { | ||
| 63 | + .label = N_("Session file"), | ||
| 64 | + .tooltip = N_("The file to save the current session preferences"), | ||
| 65 | + .width = 40, | ||
| 66 | + } | ||
| 67 | + | ||
| 68 | + }; | ||
| 69 | + | ||
| 70 | + GAction * pw3270_action_save_session_preferences_new(void) { | ||
| 45 | 71 | ||
| 46 | V3270SimpleAction * action = v3270_dialog_action_new(factory); | 72 | V3270SimpleAction * action = v3270_dialog_action_new(factory); |
| 47 | 73 | ||
| 48 | - action->name = "save.session.as"; | ||
| 49 | - action->label = _("Save As"); | 74 | + action->name = "save.session.preferences"; |
| 75 | + action->label = _("Save session preferences"); | ||
| 50 | action->icon_name = "document-save-as"; | 76 | action->icon_name = "document-save-as"; |
| 51 | - action->tooltip = _("Save session properties"); | 77 | + action->tooltip = _("Save current session preferences to file"); |
| 52 | 78 | ||
| 53 | return G_ACTION(action); | 79 | return G_ACTION(action); |
| 54 | 80 | ||
| @@ -56,41 +82,119 @@ | @@ -56,41 +82,119 @@ | ||
| 56 | 82 | ||
| 57 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | 83 | GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { |
| 58 | 84 | ||
| 85 | + // Create dialog | ||
| 86 | + gboolean use_header; | ||
| 87 | + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | ||
| 88 | + | ||
| 59 | GtkWidget * dialog = | 89 | GtkWidget * dialog = |
| 60 | - gtk_file_chooser_dialog_new( | ||
| 61 | - action->tooltip, | ||
| 62 | - GTK_WINDOW(gtk_widget_get_toplevel(terminal)), | ||
| 63 | - GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 64 | - _("Save"), GTK_RESPONSE_OK, | ||
| 65 | - _("Cancel"),GTK_RESPONSE_CANCEL, | ||
| 66 | - NULL | ||
| 67 | - ); | 90 | + GTK_WIDGET(g_object_new( |
| 91 | + GTK_TYPE_DIALOG, | ||
| 92 | + "use-header-bar", (use_header ? 1 : 0), | ||
| 93 | + NULL | ||
| 94 | + )); | ||
| 95 | + | ||
| 68 | 96 | ||
| 69 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | 97 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); |
| 70 | - gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog)); | 98 | + gtk_window_set_title(GTK_WINDOW(dialog),action->label); |
| 99 | + | ||
| 100 | + gtk_dialog_add_buttons( | ||
| 101 | + GTK_DIALOG(dialog), | ||
| 102 | + _("_Cancel"), GTK_RESPONSE_CANCEL, | ||
| 103 | + _("_Save"), GTK_RESPONSE_APPLY, | ||
| 104 | + NULL | ||
| 105 | + ); | ||
| 106 | + | ||
| 107 | + | ||
| 108 | + // Create entry fields | ||
| 109 | + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | ||
| 110 | + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | ||
| 111 | + debug("Dialog=%p inputs=%p",dialog,inputs); | ||
| 112 | + | ||
| 113 | + GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 114 | + | ||
| 115 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0); | ||
| 116 | + | ||
| 117 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 118 | + gtk_container_set_border_width(GTK_CONTAINER(grid),18); | ||
| 119 | + gtk_grid_set_row_spacing(GTK_GRID(grid),6); | ||
| 120 | + gtk_grid_set_column_spacing(GTK_GRID(grid),12); | ||
| 121 | + | ||
| 122 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 123 | + // gtk_box_set_spacing(GTK_BOX(content_area),18); | ||
| 124 | + | ||
| 125 | + size_t ix; | ||
| 126 | + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 127 | + | ||
| 128 | + GtkWidget * label = gtk_label_new(gettext(entries[ix].label)); | ||
| 129 | + gtk_label_set_xalign(GTK_LABEL(label),1); | ||
| 130 | + gtk_grid_attach(grid,label,0,ix,1,1); | ||
| 131 | + | ||
| 132 | + inputs[ix] = gtk_entry_new(); | ||
| 133 | + | ||
| 134 | + if(entries[ix].tooltip) { | ||
| 135 | + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip)); | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | ||
| 139 | + gtk_widget_set_hexpand(inputs[ix],FALSE); | ||
| 140 | + gtk_widget_set_vexpand(inputs[ix],FALSE); | ||
| 141 | + | ||
| 142 | + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1); | ||
| 143 | + | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + { | ||
| 147 | + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal); | ||
| 148 | + gtk_entry_set_text(GTK_ENTRY(inputs[1]),session_filename); | ||
| 149 | + | ||
| 150 | + gtk_entry_bind_to_filechooser( | ||
| 151 | + inputs[1], | ||
| 152 | + GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 153 | + _("Save session preferences"), | ||
| 154 | + NULL, | ||
| 155 | + "*.3270", | ||
| 156 | + _("3270 session files") | ||
| 157 | + ); | ||
| 71 | 158 | ||
| 72 | - if(terminal) { | ||
| 73 | - const gchar * current_file = v3270_get_session_filename(terminal); | ||
| 74 | - if(current_file && g_file_test(current_file,G_FILE_TEST_IS_REGULAR) && !g_str_has_prefix(current_file,g_get_user_config_dir())) | ||
| 75 | - gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),current_file); | ||
| 76 | } | 159 | } |
| 77 | 160 | ||
| 78 | g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | 161 | g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); |
| 79 | 162 | ||
| 80 | - gtk_widget_show_all(dialog); | 163 | + gtk_widget_show_all(GTK_WIDGET(grid)); |
| 81 | return dialog; | 164 | return dialog; |
| 165 | + | ||
| 82 | } | 166 | } |
| 83 | 167 | ||
| 84 | void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { | 168 | void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { |
| 85 | 169 | ||
| 86 | - debug("%s(%d)",__FUNCTION__,response_id); | 170 | + if(response_id == GTK_RESPONSE_APPLY) { |
| 87 | 171 | ||
| 88 | - g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); | 172 | + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); |
| 173 | + gtk_widget_hide(dialog); | ||
| 89 | 174 | ||
| 90 | - gtk_widget_destroy(dialog); | 175 | + GError * error = NULL; |
| 176 | + v3270_key_file_save_to_file( | ||
| 177 | + terminal, | ||
| 178 | + gtk_entry_get_text(GTK_ENTRY(inputs[1])), | ||
| 179 | + &error | ||
| 180 | + ); | ||
| 181 | + | ||
| 182 | + if(error) { | ||
| 183 | + | ||
| 184 | + g_message("%s",error->message); | ||
| 185 | + g_error_free(error); | ||
| 186 | + | ||
| 187 | + } else { | ||
| 188 | + | ||
| 189 | + // Set session name (after save to avoid changes on the old session file). | ||
| 190 | + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[0]))); | ||
| 191 | + v3270_emit_save_settings(terminal,NULL); | ||
| 192 | + | ||
| 193 | + } | ||
| 91 | 194 | ||
| 92 | - if(response_id == GTK_RESPONSE_OK) { | ||
| 93 | - v3270_set_session_filename(terminal, filename); | ||
| 94 | } | 195 | } |
| 95 | 196 | ||
| 197 | + | ||
| 198 | + gtk_widget_destroy(dialog); | ||
| 199 | + | ||
| 96 | } | 200 | } |
src/objects/actions/view.c
| @@ -45,9 +45,10 @@ | @@ -45,9 +45,10 @@ | ||
| 45 | }; | 45 | }; |
| 46 | 46 | ||
| 47 | struct ListElement { | 47 | struct ListElement { |
| 48 | - GAction * action; | 48 | +// GAction * action; |
| 49 | GdkPixbuf * pixbuf; | 49 | GdkPixbuf * pixbuf; |
| 50 | - gchar name[1]; | 50 | + gchar * action_name; |
| 51 | + gchar * action_label; | ||
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 53 | static void list_element_free(struct ListElement *element); | 54 | static void list_element_free(struct ListElement *element); |
| @@ -106,7 +107,7 @@ | @@ -106,7 +107,7 @@ | ||
| 106 | return view; | 107 | return view; |
| 107 | } | 108 | } |
| 108 | 109 | ||
| 109 | - void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, gint flags) { | 110 | + void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, PW3270ActionViewFlag flags) { |
| 110 | 111 | ||
| 111 | GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); | 112 | GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(widget))); |
| 112 | 113 | ||
| @@ -118,68 +119,38 @@ | @@ -118,68 +119,38 @@ | ||
| 118 | COLUMN_PIXBUF, pixbuf, | 119 | COLUMN_PIXBUF, pixbuf, |
| 119 | COLUMN_LABEL, label, | 120 | COLUMN_LABEL, label, |
| 120 | COLUMN_ACTION_NAME, action_name, | 121 | COLUMN_ACTION_NAME, action_name, |
| 121 | - COLUMN_FLAGS, flags, | 122 | + COLUMN_FLAGS, (gint) flags, |
| 122 | -1 | 123 | -1 |
| 123 | ); | 124 | ); |
| 124 | 125 | ||
| 125 | 126 | ||
| 126 | } | 127 | } |
| 127 | 128 | ||
| 128 | - static void pw3270_action_view_append_element(GtkListStore * store, struct ListElement * element) { | ||
| 129 | - | ||
| 130 | - size_t ix; | ||
| 131 | - | ||
| 132 | - struct Properties { | ||
| 133 | - const gchar * name; | ||
| 134 | - GType g_type; | ||
| 135 | - GValue value; | ||
| 136 | - } properties[] = { | ||
| 137 | - { | ||
| 138 | - .name = "label", | ||
| 139 | - .g_type = G_TYPE_STRING, | ||
| 140 | - .value = G_VALUE_INIT | ||
| 141 | - } | ||
| 142 | - }; | ||
| 143 | - | ||
| 144 | - for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { | ||
| 145 | - | ||
| 146 | - g_value_init(&properties[ix].value, properties[ix].g_type); | ||
| 147 | - g_object_get_property(G_OBJECT(element->action), properties[ix].name, &properties[ix].value); | ||
| 148 | - | ||
| 149 | - } | ||
| 150 | - | ||
| 151 | - // Remove "_" | ||
| 152 | - g_autofree gchar * label = g_strdup(g_value_get_string(&properties[0].value)); | 129 | + void pw3270_action_view_order_by_label(GtkWidget *view) { |
| 153 | 130 | ||
| 154 | - if(label) { | 131 | + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(view),FALSE); |
| 155 | 132 | ||
| 156 | - gchar *from, *to; | ||
| 157 | - | ||
| 158 | - for(from=to=label;*from;from++) { | ||
| 159 | - if(*from != '_') { | ||
| 160 | - *(to++) = *from; | ||
| 161 | - } | ||
| 162 | - } | ||
| 163 | - *to = 0; | 133 | + gtk_tree_sortable_set_sort_column_id( |
| 134 | + GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(view))), | ||
| 135 | + COLUMN_LABEL, | ||
| 136 | + GTK_SORT_ASCENDING | ||
| 137 | + ); | ||
| 138 | + } | ||
| 164 | 139 | ||
| 165 | - } | 140 | + static void pw3270_action_view_append_element(GtkListStore * store, struct ListElement * element) { |
| 166 | 141 | ||
| 167 | GtkTreeIter iter; | 142 | GtkTreeIter iter; |
| 168 | gtk_list_store_append(store, &iter); | 143 | gtk_list_store_append(store, &iter); |
| 169 | gtk_list_store_set( | 144 | gtk_list_store_set( |
| 170 | store, | 145 | store, |
| 171 | &iter, | 146 | &iter, |
| 172 | - COLUMN_PIXBUF, element->pixbuf, | ||
| 173 | - COLUMN_LABEL, (label ? label : g_action_get_name(element->action)), | ||
| 174 | - COLUMN_ACTION_NAME, element->name, | ||
| 175 | - COLUMN_FLAGS, 3, | 147 | + COLUMN_PIXBUF, element->pixbuf, |
| 148 | + COLUMN_LABEL, element->action_label, | ||
| 149 | + COLUMN_ACTION_NAME, element->action_name, | ||
| 150 | + COLUMN_FLAGS, (gint) PW3270_ACTION_VIEW_ALLOW_MOVE, | ||
| 176 | -1 | 151 | -1 |
| 177 | ); | 152 | ); |
| 178 | 153 | ||
| 179 | - for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { | ||
| 180 | - g_value_unset(&properties[ix].value); | ||
| 181 | - } | ||
| 182 | - | ||
| 183 | } | 154 | } |
| 184 | 155 | ||
| 185 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { | 156 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { |
| @@ -190,8 +161,7 @@ | @@ -190,8 +161,7 @@ | ||
| 190 | while(item) { | 161 | while(item) { |
| 191 | 162 | ||
| 192 | struct ListElement * element = (struct ListElement *) item->data; | 163 | struct ListElement * element = (struct ListElement *) item->data; |
| 193 | - | ||
| 194 | - if(!g_ascii_strcasecmp(action_name,element->name)) { | 164 | + if(!g_ascii_strcasecmp(action_name,element->action_name)) { |
| 195 | 165 | ||
| 196 | pw3270_action_view_append_element(store, element); | 166 | pw3270_action_view_append_element(store, element); |
| 197 | list_element_free(element); | 167 | list_element_free(element); |
| @@ -219,36 +189,38 @@ | @@ -219,36 +189,38 @@ | ||
| 219 | 189 | ||
| 220 | } | 190 | } |
| 221 | 191 | ||
| 222 | - static GSList * append_action(GSList * list, const gchar *type, GAction *action) { | 192 | + static GSList * append_action(GSList * list, const gchar *prefix, GAction *action) { |
| 223 | 193 | ||
| 224 | if(!action) | 194 | if(!action) |
| 225 | return list; | 195 | return list; |
| 226 | 196 | ||
| 227 | - if(!g_object_class_find_property(G_OBJECT_GET_CLASS(action),"label")) { | ||
| 228 | - debug("Action \"%s\": Doesn't have a label",g_action_get_name(action)); | ||
| 229 | - return list; | ||
| 230 | - } | ||
| 231 | - | ||
| 232 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK); | 197 | GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU, GTK_ICON_LOOKUP_GENERIC_FALLBACK); |
| 233 | if(!pixbuf) { | 198 | if(!pixbuf) { |
| 234 | debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action)); | 199 | debug("Action \"%s\": Doesn't have a pixbuf",g_action_get_name(action)); |
| 235 | return list; | 200 | return list; |
| 236 | } | 201 | } |
| 237 | 202 | ||
| 238 | - const gchar *name = g_action_get_name(action); | ||
| 239 | - | ||
| 240 | - struct ListElement * element = (struct ListElement *) g_malloc0(sizeof(struct ListElement) + strlen(type) + strlen(name)); | 203 | + g_autofree gchar *action_name = g_strconcat(prefix,".",g_action_get_name(action),NULL); |
| 241 | 204 | ||
| 242 | - strcpy(element->name,type); | ||
| 243 | - strcat(element->name,name); | 205 | + GValue value = G_VALUE_INIT; |
| 206 | + g_value_init(&value, G_TYPE_STRING); | ||
| 207 | + g_object_get_property(G_OBJECT(action),"label",&value); | ||
| 244 | 208 | ||
| 245 | - element->action = action; | 209 | + const gchar * label = g_value_get_string(&value); |
| 210 | + if(!(label && *label)) | ||
| 211 | + label = g_action_get_name(action); | ||
| 246 | 212 | ||
| 247 | - element->pixbuf = pixbuf; | ||
| 248 | - g_object_ref_sink(G_OBJECT(element->pixbuf)); | 213 | + list = pw3270_action_list_append( |
| 214 | + list, | ||
| 215 | + label, | ||
| 216 | + pixbuf, | ||
| 217 | + action_name, | ||
| 218 | + PW3270_ACTION_VIEW_ALLOW_MOVE | ||
| 219 | + ); | ||
| 249 | 220 | ||
| 250 | - return g_slist_prepend(list,element); | 221 | + g_value_unset(&value); |
| 251 | 222 | ||
| 223 | + return list; | ||
| 252 | } | 224 | } |
| 253 | 225 | ||
| 254 | Pw3270ActionList * pw3270_action_list_new(GtkApplication *application) { | 226 | Pw3270ActionList * pw3270_action_list_new(GtkApplication *application) { |
| @@ -262,7 +234,7 @@ | @@ -262,7 +234,7 @@ | ||
| 262 | 234 | ||
| 263 | action_names = g_action_group_list_actions(G_ACTION_GROUP(application)); | 235 | action_names = g_action_group_list_actions(G_ACTION_GROUP(application)); |
| 264 | for(ix = 0; action_names[ix];ix++) { | 236 | for(ix = 0; action_names[ix];ix++) { |
| 265 | - list = append_action(list,"app.",g_action_map_lookup_action(G_ACTION_MAP(application),action_names[ix])); | 237 | + list = append_action(list,"app",g_action_map_lookup_action(G_ACTION_MAP(application),action_names[ix])); |
| 266 | } | 238 | } |
| 267 | g_strfreev(action_names); | 239 | g_strfreev(action_names); |
| 268 | 240 | ||
| @@ -274,7 +246,7 @@ | @@ -274,7 +246,7 @@ | ||
| 274 | // Get window actions. | 246 | // Get window actions. |
| 275 | action_names = g_action_group_list_actions(G_ACTION_GROUP(window)); | 247 | action_names = g_action_group_list_actions(G_ACTION_GROUP(window)); |
| 276 | for(ix = 0; action_names[ix];ix++) { | 248 | for(ix = 0; action_names[ix];ix++) { |
| 277 | - list = append_action(list,"win.",g_action_map_lookup_action(G_ACTION_MAP(window),action_names[ix])); | 249 | + list = append_action(list,"win",g_action_map_lookup_action(G_ACTION_MAP(window),action_names[ix])); |
| 278 | } | 250 | } |
| 279 | g_strfreev(action_names); | 251 | g_strfreev(action_names); |
| 280 | 252 | ||
| @@ -283,6 +255,32 @@ | @@ -283,6 +255,32 @@ | ||
| 283 | return (Pw3270ActionList *) list; | 255 | return (Pw3270ActionList *) list; |
| 284 | } | 256 | } |
| 285 | 257 | ||
| 258 | + Pw3270ActionList * pw3270_action_list_append(Pw3270ActionList *action_list, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags) { | ||
| 259 | + | ||
| 260 | + struct ListElement * element = (struct ListElement *) | ||
| 261 | + g_malloc0( | ||
| 262 | + sizeof(struct ListElement) | ||
| 263 | + + strlen(action_name) | ||
| 264 | + + strlen(label) | ||
| 265 | + + 3 | ||
| 266 | + ); | ||
| 267 | + | ||
| 268 | + if(pixbuf) { | ||
| 269 | + element->pixbuf = pixbuf; | ||
| 270 | + g_object_ref_sink(G_OBJECT(element->pixbuf)); | ||
| 271 | + } | ||
| 272 | + | ||
| 273 | + element->action_name = (char *) (element+1); | ||
| 274 | + strcpy(element->action_name,action_name); | ||
| 275 | + | ||
| 276 | + element->action_label = element->action_name + strlen(element->action_name) + 1; | ||
| 277 | + strcpy(element->action_label,label); | ||
| 278 | + | ||
| 279 | + return (Pw3270ActionList *) g_slist_prepend((GSList *) action_list, element); | ||
| 280 | + | ||
| 281 | + | ||
| 282 | + }; | ||
| 283 | + | ||
| 286 | void list_element_free(struct ListElement *element) { | 284 | void list_element_free(struct ListElement *element) { |
| 287 | 285 | ||
| 288 | if(element->pixbuf) { | 286 | if(element->pixbuf) { |
| @@ -338,7 +336,7 @@ | @@ -338,7 +336,7 @@ | ||
| 338 | gint flags = g_value_get_int(&vFlags); | 336 | gint flags = g_value_get_int(&vFlags); |
| 339 | g_value_unset(&vFlags); | 337 | g_value_unset(&vFlags); |
| 340 | 338 | ||
| 341 | - if(flags & 1) { | 339 | + if(flags & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD) { |
| 342 | 340 | ||
| 343 | // Add on target widget. | 341 | // Add on target widget. |
| 344 | GValue pixbuf = G_VALUE_INIT; | 342 | GValue pixbuf = G_VALUE_INIT; |
| @@ -369,7 +367,7 @@ | @@ -369,7 +367,7 @@ | ||
| 369 | 367 | ||
| 370 | } | 368 | } |
| 371 | 369 | ||
| 372 | - if(flags & 2) { | 370 | + if(flags & PW3270_ACTION_VIEW_ALLOW_REMOVE) { |
| 373 | 371 | ||
| 374 | // Remove from source widget. | 372 | // Remove from source widget. |
| 375 | gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); | 373 | gtk_list_store_remove(GTK_LIST_STORE(fromModel), &iter); |
| @@ -411,3 +409,70 @@ | @@ -411,3 +409,70 @@ | ||
| 411 | return g_string_free(str,FALSE); | 409 | return g_string_free(str,FALSE); |
| 412 | } | 410 | } |
| 413 | 411 | ||
| 412 | + static void check_4_sensitive(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gboolean *sensitive) { | ||
| 413 | + | ||
| 414 | + GValue value = { 0, }; | ||
| 415 | + gtk_tree_model_get_value(model,iter,COLUMN_FLAGS,&value); | ||
| 416 | + | ||
| 417 | + if(!(g_value_get_int(&value) & PW3270_ACTION_VIEW_FLAG_ALLOW_ADD)) | ||
| 418 | + *sensitive = FALSE; | ||
| 419 | + | ||
| 420 | + g_value_unset(&value); | ||
| 421 | + | ||
| 422 | + } | ||
| 423 | + | ||
| 424 | + static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { | ||
| 425 | + | ||
| 426 | + if(!gtk_tree_selection_count_selected_rows(selection)) { | ||
| 427 | + gtk_widget_set_sensitive(button,FALSE); | ||
| 428 | + return; | ||
| 429 | + } | ||
| 430 | + | ||
| 431 | + gboolean sensitive = TRUE; | ||
| 432 | + | ||
| 433 | + // Scan selected rows | ||
| 434 | + gtk_tree_selection_selected_foreach(selection,(GtkTreeSelectionForeachFunc) check_4_sensitive,&sensitive); | ||
| 435 | + gtk_widget_set_sensitive(button,sensitive); | ||
| 436 | + | ||
| 437 | + } | ||
| 438 | + | ||
| 439 | + struct MoveData { | ||
| 440 | + GtkWidget *from; | ||
| 441 | + GtkWidget *to; | ||
| 442 | + }; | ||
| 443 | + | ||
| 444 | + static void move_clicked(GtkButton G_GNUC_UNUSED(*button), struct MoveData *args) { | ||
| 445 | + pw3270_action_view_move_selected(args->from,args->to); | ||
| 446 | + } | ||
| 447 | + | ||
| 448 | + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name) { | ||
| 449 | + | ||
| 450 | + GtkWidget * button = gtk_button_new_from_icon_name(icon_name,GTK_ICON_SIZE_DND); | ||
| 451 | + | ||
| 452 | + struct MoveData * data = g_new0(struct MoveData,1); | ||
| 453 | + data->from = from; | ||
| 454 | + data->to = to; | ||
| 455 | + g_object_set_data_full(G_OBJECT(button),"move-control-data",data,g_free); | ||
| 456 | + | ||
| 457 | + gtk_widget_set_focus_on_click(button,FALSE); | ||
| 458 | + gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE); | ||
| 459 | + gtk_widget_set_sensitive(button,FALSE); | ||
| 460 | + gtk_widget_set_hexpand(button,FALSE); | ||
| 461 | + gtk_widget_set_vexpand(button,FALSE); | ||
| 462 | + | ||
| 463 | + g_signal_connect( | ||
| 464 | + gtk_tree_view_get_selection(GTK_TREE_VIEW(from)), | ||
| 465 | + "changed", | ||
| 466 | + G_CALLBACK(selection_changed), | ||
| 467 | + button | ||
| 468 | + ); | ||
| 469 | + | ||
| 470 | + g_signal_connect( | ||
| 471 | + button, | ||
| 472 | + "clicked", | ||
| 473 | + G_CALLBACK(move_clicked), | ||
| 474 | + data | ||
| 475 | + ); | ||
| 476 | + | ||
| 477 | + return button; | ||
| 478 | + } |
src/objects/application/actions/about.c
| @@ -33,22 +33,6 @@ | @@ -33,22 +33,6 @@ | ||
| 33 | 33 | ||
| 34 | static GtkWidget * factory(PW3270Action G_GNUC_UNUSED(*action), GtkApplication G_GNUC_UNUSED(*application)) { | 34 | static GtkWidget * factory(PW3270Action G_GNUC_UNUSED(*action), GtkApplication G_GNUC_UNUSED(*application)) { |
| 35 | 35 | ||
| 36 | - /* | ||
| 37 | - static const gchar *license = | ||
| 38 | - N_( "This program is free software; you can redistribute it and/or " | ||
| 39 | - "modify it under the terms of the GNU General Public License as " | ||
| 40 | - "published by the Free Software Foundation; either version 2 of the " | ||
| 41 | - "License, or (at your option) any later version.\n\n" | ||
| 42 | - "This program is distributed in the hope that it will be useful, " | ||
| 43 | - "but WITHOUT ANY WARRANTY; without even the implied warranty of " | ||
| 44 | - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " | ||
| 45 | - "GNU General Public License for more details.\n\n" | ||
| 46 | - "You should have received a copy of the GNU General Public License " | ||
| 47 | - "along with this program; if not, write to the Free Software " | ||
| 48 | - "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 " | ||
| 49 | - "USA" ); | ||
| 50 | - */ | ||
| 51 | - | ||
| 52 | GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); | 36 | GtkAboutDialog * dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new()); |
| 53 | 37 | ||
| 54 | // Get application logo | 38 | // Get application logo |
| @@ -82,18 +66,37 @@ | @@ -82,18 +66,37 @@ | ||
| 82 | 66 | ||
| 83 | // Set version | 67 | // Set version |
| 84 | { | 68 | { |
| 69 | + g_autofree gchar * version = g_strdup_printf( | ||
| 70 | + _("Version %s-%s"), | ||
| 71 | + PACKAGE_VERSION, | ||
| 85 | #ifdef PACKAGE_RELEASE | 72 | #ifdef PACKAGE_RELEASE |
| 86 | - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,PACKAGE_RELEASE); | 73 | + PACKAGE_RELEASE |
| 87 | #else | 74 | #else |
| 88 | - g_autofree gchar * version = g_strdup_printf(_("Version %s-%s"),PACKAGE_VERSION,G_STRINGIFY(BUILD_DATE)); | ||
| 89 | -#endif // PACKAGE_REVISION | 75 | + G_STRINGIFY(BUILD_DATE) |
| 76 | +#endif // PACKAGE_RELEASE | ||
| 77 | + ); | ||
| 90 | 78 | ||
| 91 | gtk_about_dialog_set_version(dialog,version); | 79 | gtk_about_dialog_set_version(dialog,version); |
| 92 | } | 80 | } |
| 93 | 81 | ||
| 94 | // Set comments | 82 | // Set comments |
| 95 | { | 83 | { |
| 96 | - g_autofree gchar * comments = g_strdup_printf(_( "3270 terminal emulator for GTK %d.%d" ),GTK_MAJOR_VERSION,GTK_MINOR_VERSION); | 84 | + g_autofree gchar * comments = |
| 85 | + | ||
| 86 | + g_strdup_printf( | ||
| 87 | + _( "3270 terminal emulator for %s." ), | ||
| 88 | +#if defined(__MINGW64__) | ||
| 89 | + _( "64 bits Windows" ) | ||
| 90 | +#elif defined(__MINGW32__) | ||
| 91 | + _( "32 bits Windows" ) | ||
| 92 | +#elif defined(linux) && defined(__i386__) | ||
| 93 | + _( "32 bits Linux" ) | ||
| 94 | +#elif defined(linux) && defined(__x86_64__) | ||
| 95 | + _( "64 bits Linux" ) | ||
| 96 | +#else | ||
| 97 | + "GTK" | ||
| 98 | +#endif | ||
| 99 | + ); | ||
| 97 | gtk_about_dialog_set_comments(dialog, comments); | 100 | gtk_about_dialog_set_comments(dialog, comments); |
| 98 | } | 101 | } |
| 99 | 102 | ||
| @@ -126,22 +129,39 @@ | @@ -126,22 +129,39 @@ | ||
| 126 | gtk_about_dialog_add_credit_section(dialog, _("Apple version"), apple); | 129 | gtk_about_dialog_add_credit_section(dialog, _("Apple version"), apple); |
| 127 | gtk_about_dialog_add_credit_section (dialog, _("Contributors"), contributors); | 130 | gtk_about_dialog_add_credit_section (dialog, _("Contributors"), contributors); |
| 128 | 131 | ||
| 129 | - | ||
| 130 | gtk_about_dialog_add_credit_section(dialog, _("Based on X3270 from"), references); | 132 | gtk_about_dialog_add_credit_section(dialog, _("Based on X3270 from"), references); |
| 131 | 133 | ||
| 132 | } | 134 | } |
| 133 | 135 | ||
| 134 | gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); | 136 | gtk_about_dialog_set_copyright(dialog, "Copyright © 2008 Banco do Brasil S.A." ); |
| 135 | 137 | ||
| 136 | -// gtk_about_dialog_set_license(dialog, gettext( license ) ); | ||
| 137 | -// gtk_about_dialog_set_wrap_license(dialog,TRUE); | 138 | +#ifdef _WIN32 |
| 139 | + | ||
| 140 | + lib3270_autoptr(char) license = lib3270_build_data_filename(_("LICENSE"),NULL); | ||
| 138 | 141 | ||
| 142 | + if(g_file_test(license, G_FILE_TEST_IS_REGULAR)) { | ||
| 143 | + | ||
| 144 | + g_autofree gchar * text = NULL; | ||
| 145 | + | ||
| 146 | + if(g_file_get_contents(license,&text,NULL,NULL)) { | ||
| 147 | + gtk_about_dialog_set_license(dialog, text ); | ||
| 148 | + gtk_about_dialog_set_wrap_license(dialog,TRUE); | ||
| 149 | + } | ||
| 150 | + | ||
| 151 | + } else { | ||
| 152 | + gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0); | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | +#else | ||
| 139 | gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0); | 156 | gtk_about_dialog_set_license_type(dialog,GTK_LICENSE_GPL_3_0); |
| 157 | +#endif // _WIN32 | ||
| 158 | + | ||
| 159 | +// gtk_about_dialog_set_website(dialog,NC_("ProjectURL","https://portal.softwarepublico.gov.br/social/pw3270/")); | ||
| 160 | +// gtk_about_dialog_set_website_label(dialog,NC_("ProjectURLLabel","Brazilian Public Software Portal" )); | ||
| 140 | 161 | ||
| 141 | - gtk_about_dialog_set_website(dialog,"https://portal.softwarepublico.gov.br/social/pw3270/"); | ||
| 142 | - gtk_about_dialog_set_website_label(dialog,_( "Brazilian Public Software Portal" )); | 162 | + gtk_about_dialog_set_website(dialog,_("https://github.com/PerryWerneck/pw3270")); |
| 163 | + gtk_about_dialog_set_website_label(dialog,_("View this project on github")); | ||
| 143 | 164 | ||
| 144 | -// gtk_about_dialog_set_authors(dialog,authors); | ||
| 145 | gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); | 165 | gtk_about_dialog_set_translator_credits(dialog,_("translator-credits")); |
| 146 | 166 | ||
| 147 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | 167 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); |
| @@ -149,6 +169,13 @@ | @@ -149,6 +169,13 @@ | ||
| 149 | g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); | 169 | g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); |
| 150 | gtk_widget_show_all(GTK_WIDGET(dialog)); | 170 | gtk_widget_show_all(GTK_WIDGET(dialog)); |
| 151 | 171 | ||
| 172 | + // Call plugins | ||
| 173 | + pw3270_application_plugin_call( | ||
| 174 | + g_application_get_default(), | ||
| 175 | + "pw3270_plugin_set_about_dialog", | ||
| 176 | + dialog | ||
| 177 | + ); | ||
| 178 | + | ||
| 152 | return GTK_WIDGET(dialog); | 179 | return GTK_WIDGET(dialog); |
| 153 | 180 | ||
| 154 | } | 181 | } |
src/objects/application/actions/preferences.c
| @@ -34,14 +34,11 @@ | @@ -34,14 +34,11 @@ | ||
| 34 | #include <pw3270/settings.h> | 34 | #include <pw3270/settings.h> |
| 35 | #include <pw3270/toolbar.h> | 35 | #include <pw3270/toolbar.h> |
| 36 | 36 | ||
| 37 | - | ||
| 38 | -// gtk_window_set_title(GTK_WINDOW(dialog),action->label); | ||
| 39 | - | ||
| 40 | static GtkWidget * factory(PW3270Action * action, GtkApplication *application) { | 37 | static GtkWidget * factory(PW3270Action * action, GtkApplication *application) { |
| 41 | 38 | ||
| 42 | size_t ix; | 39 | size_t ix; |
| 43 | GtkWindow * window = gtk_application_get_active_window(application); | 40 | GtkWindow * window = gtk_application_get_active_window(application); |
| 44 | - GtkWidget * dialog = pw3270_settings_dialog_new(G_ACTION(action)); | 41 | + GtkWidget * dialog = pw3270_settings_dialog_new(G_ACTION(action),TRUE); |
| 45 | 42 | ||
| 46 | gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); | 43 | gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); |
| 47 | gtk_window_set_attached_to(GTK_WINDOW(dialog), GTK_WIDGET(window)); | 44 | gtk_window_set_attached_to(GTK_WINDOW(dialog), GTK_WIDGET(window)); |
| @@ -55,6 +52,16 @@ | @@ -55,6 +52,16 @@ | ||
| 55 | gtk_container_add(GTK_CONTAINER(dialog),pages[ix]); | 52 | gtk_container_add(GTK_CONTAINER(dialog),pages[ix]); |
| 56 | } | 53 | } |
| 57 | 54 | ||
| 55 | + pw3270_application_plugin_call( | ||
| 56 | + G_APPLICATION(application), | ||
| 57 | + "pw3270_plugin_set_application_preferences", | ||
| 58 | + dialog | ||
| 59 | + ); | ||
| 60 | + | ||
| 61 | + if(pw3270_application_get_ui_style(G_APPLICATION(application)) != PW3270_UI_STYLE_CLASSICAL){ | ||
| 62 | + gtk_container_add(GTK_CONTAINER(dialog),pw3270_header_settings_new()); | ||
| 63 | + } | ||
| 64 | + | ||
| 58 | gtk_widget_show_all(dialog); | 65 | gtk_widget_show_all(dialog); |
| 59 | 66 | ||
| 60 | return dialog; | 67 | return dialog; |
| @@ -68,6 +75,7 @@ | @@ -68,6 +75,7 @@ | ||
| 68 | action->name = "preferences"; | 75 | action->name = "preferences"; |
| 69 | action->label = _("Application preferences"); | 76 | action->label = _("Application preferences"); |
| 70 | action->icon_name = "preferences-system"; | 77 | action->icon_name = "preferences-system"; |
| 78 | + action->tooltip = _("Change the application preferences"); | ||
| 71 | 79 | ||
| 72 | return G_ACTION(action); | 80 | return G_ACTION(action); |
| 73 | } | 81 | } |
src/objects/application/actions/window.c
| @@ -69,7 +69,7 @@ | @@ -69,7 +69,7 @@ | ||
| 69 | return G_ACTION(action); | 69 | return G_ACTION(action); |
| 70 | } | 70 | } |
| 71 | 71 | ||
| 72 | - static void new_tab_activated(GAction *action, GVariant *parameter, GtkApplication *application) { | 72 | + static void new_tab_activated(GAction G_GNUC_UNUSED(*action), GVariant G_GNUC_UNUSED(*parameter), GtkApplication *application) { |
| 73 | 73 | ||
| 74 | debug("%s",__FUNCTION__); | 74 | debug("%s",__FUNCTION__); |
| 75 | pw3270_application_window_new_tab(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL); | 75 | pw3270_application_window_new_tab(GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))), NULL); |
src/objects/application/application.c
| @@ -173,13 +173,8 @@ | @@ -173,13 +173,8 @@ | ||
| 173 | 173 | ||
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | - | ||
| 177 | static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { | 176 | static gboolean on_user_interface(const gchar G_GNUC_UNUSED(*option), const gchar *value, gpointer G_GNUC_UNUSED(dunno), GError **error) { |
| 178 | 177 | ||
| 179 | - GApplication * app = g_application_get_default(); | ||
| 180 | - | ||
| 181 | - debug("********************* %p",app); | ||
| 182 | - | ||
| 183 | g_autoptr(GSettings) app_settings = pw3270_application_settings_new(); | 178 | g_autoptr(GSettings) app_settings = pw3270_application_settings_new(); |
| 184 | g_autoptr(GSettings) win_settings = pw3270_application_window_settings_new(); | 179 | g_autoptr(GSettings) win_settings = pw3270_application_window_settings_new(); |
| 185 | 180 | ||
| @@ -466,6 +461,33 @@ | @@ -466,6 +461,33 @@ | ||
| 466 | 461 | ||
| 467 | } | 462 | } |
| 468 | 463 | ||
| 464 | + void pw3270_application_plugin_foreach(GApplication *app, GFunc func, gpointer user_data) { | ||
| 465 | + | ||
| 466 | + g_return_if_fail(PW3270_IS_APPLICATION(app)); | ||
| 467 | + | ||
| 468 | + GSList * item; | ||
| 469 | + for(item = PW3270_APPLICATION(app)->plugins; item; item = g_slist_next(item)) { | ||
| 470 | + func(item->data,user_data); | ||
| 471 | + } | ||
| 472 | + | ||
| 473 | + } | ||
| 474 | + | ||
| 475 | + void pw3270_application_plugin_call(GApplication *app, const gchar *method, gpointer user_data) { | ||
| 476 | + | ||
| 477 | + g_return_if_fail(PW3270_IS_APPLICATION(app)); | ||
| 478 | + | ||
| 479 | + int (*call)(GtkWidget *); | ||
| 480 | + | ||
| 481 | + GSList * item; | ||
| 482 | + for(item = PW3270_APPLICATION(app)->plugins; item; item = g_slist_next(item)) { | ||
| 483 | + if(g_module_symbol((GModule *) item->data, method, (gpointer *) &call)) { | ||
| 484 | + call(user_data); | ||
| 485 | + } | ||
| 486 | + } | ||
| 487 | + | ||
| 488 | + } | ||
| 489 | + | ||
| 490 | + | ||
| 469 | GSettings * pw3270_application_settings_new() { | 491 | GSettings * pw3270_application_settings_new() { |
| 470 | 492 | ||
| 471 | GSettings *settings = NULL; | 493 | GSettings *settings = NULL; |
| @@ -510,3 +532,4 @@ | @@ -510,3 +532,4 @@ | ||
| 510 | g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); | 532 | g_return_val_if_fail(PW3270_IS_APPLICATION(app),NULL); |
| 511 | return PW3270_APPLICATION(app)->keypads; | 533 | return PW3270_APPLICATION(app)->keypads; |
| 512 | } | 534 | } |
| 535 | + |
src/objects/application/open.c
| @@ -29,22 +29,54 @@ | @@ -29,22 +29,54 @@ | ||
| 29 | 29 | ||
| 30 | #include "private.h" | 30 | #include "private.h" |
| 31 | 31 | ||
| 32 | + gchar * v3270_keyfile_find(const gchar *name) { | ||
| 33 | + // | ||
| 34 | + // It can be a session file, scans for it | ||
| 35 | + // | ||
| 36 | + const gchar * paths[] = { | ||
| 37 | + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), | ||
| 38 | + g_get_user_config_dir() | ||
| 39 | + }; | ||
| 40 | + | ||
| 41 | + static const gchar *subdirs[] = { | ||
| 42 | + "3270", | ||
| 43 | + G_STRINGIFY(PRODUCT_NAME), | ||
| 44 | + PACKAGE_NAME | ||
| 45 | + }; | ||
| 46 | + | ||
| 47 | + size_t path, subdir; | ||
| 48 | + | ||
| 49 | + g_autofree gchar * filename = g_strconcat(name,".3270",NULL); | ||
| 50 | + | ||
| 51 | + for(path = 0; path < G_N_ELEMENTS(paths); path++) { | ||
| 52 | + | ||
| 53 | + for(subdir = 0; subdir < G_N_ELEMENTS(subdirs); subdir++) { | ||
| 54 | + | ||
| 55 | + gchar * fullpath = g_build_filename(paths[path],subdirs[subdir],filename,NULL); | ||
| 56 | + | ||
| 57 | + debug("Searching for \"%s\"",fullpath); | ||
| 58 | + | ||
| 59 | + if(g_file_test(fullpath,G_FILE_TEST_IS_REGULAR)) { | ||
| 60 | + return fullpath; | ||
| 61 | + } | ||
| 62 | + g_free(fullpath); | ||
| 63 | + | ||
| 64 | + } | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + return NULL; | ||
| 68 | + | ||
| 69 | + } | ||
| 70 | + | ||
| 32 | void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) { | 71 | void pw3270_application_open(GApplication *application, GFile **files, gint n_files, const gchar G_GNUC_UNUSED(*hint)) { |
| 33 | 72 | ||
| 34 | GtkWidget * window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))); | 73 | GtkWidget * window = GTK_WIDGET(gtk_application_get_active_window(GTK_APPLICATION(application))); |
| 35 | - | 74 | + size_t path, subdir; |
| 36 | gint file; | 75 | gint file; |
| 37 | 76 | ||
| 38 | for(file = 0; file < n_files; file++) { | 77 | for(file = 0; file < n_files; file++) { |
| 39 | 78 | ||
| 40 | g_autofree gchar *path = g_file_get_path(files[file]); | 79 | g_autofree gchar *path = g_file_get_path(files[file]); |
| 41 | - if(!window) { | ||
| 42 | - debug("%s: Open in new window",__FUNCTION__); | ||
| 43 | - window = pw3270_application_window_new(GTK_APPLICATION(application), path); | ||
| 44 | - } else { | ||
| 45 | - debug("%s: Open in new tab",__FUNCTION__); | ||
| 46 | - window = pw3270_application_window_new_tab(window,path); | ||
| 47 | - } | ||
| 48 | 80 | ||
| 49 | if(!path) { | 81 | if(!path) { |
| 50 | 82 | ||
| @@ -63,6 +95,38 @@ | @@ -63,6 +95,38 @@ | ||
| 63 | 95 | ||
| 64 | } | 96 | } |
| 65 | 97 | ||
| 98 | + continue; | ||
| 99 | + | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + if(g_file_test(path,G_FILE_TEST_IS_REGULAR)) { | ||
| 103 | + | ||
| 104 | + // The file exists, use it. | ||
| 105 | + | ||
| 106 | + if(!window) { | ||
| 107 | + window = pw3270_application_window_new(GTK_APPLICATION(application), path); | ||
| 108 | + } else { | ||
| 109 | + window = pw3270_application_window_new_tab(window,path); | ||
| 110 | + } | ||
| 111 | + | ||
| 112 | + continue; | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + { | ||
| 116 | + g_autofree gchar * basename = g_file_get_basename(files[file]); | ||
| 117 | + g_autofree gchar * filename = v3270_keyfile_find(basename); | ||
| 118 | + | ||
| 119 | + if(filename) { | ||
| 120 | + | ||
| 121 | + if(!window) { | ||
| 122 | + window = pw3270_application_window_new(GTK_APPLICATION(application), filename); | ||
| 123 | + } else { | ||
| 124 | + window = pw3270_application_window_new_tab(window, filename); | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + continue; | ||
| 128 | + } | ||
| 129 | + | ||
| 66 | } | 130 | } |
| 67 | 131 | ||
| 68 | } | 132 | } |
src/objects/keypad/element.c
| @@ -159,12 +159,12 @@ | @@ -159,12 +159,12 @@ | ||
| 159 | 159 | ||
| 160 | } | 160 | } |
| 161 | 161 | ||
| 162 | - static void KeypadElement_init(KeypadElement *object) { | 162 | + static void KeypadElement_init(KeypadElement G_GNUC_UNUSED(*object)) { |
| 163 | 163 | ||
| 164 | 164 | ||
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | - static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { | 167 | + static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { |
| 168 | 168 | ||
| 169 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); | 169 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); |
| 170 | 170 | ||
| @@ -203,7 +203,7 @@ | @@ -203,7 +203,7 @@ | ||
| 203 | 203 | ||
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | - static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { | 206 | + static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { |
| 207 | 207 | ||
| 208 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); | 208 | KeypadElement * element = PW_KEYPAD_ELEMENT(object); |
| 209 | 209 |
src/objects/keypad/load.c
| @@ -82,7 +82,7 @@ | @@ -82,7 +82,7 @@ | ||
| 82 | 82 | ||
| 83 | } | 83 | } |
| 84 | 84 | ||
| 85 | - static void element_end(GMarkupParseContext *context, const gchar *element_name, GList **keypads, GError **error) { | 85 | + static void element_end(GMarkupParseContext *context, const gchar *element_name, GList G_GNUC_UNUSED(**keypads), GError G_GNUC_UNUSED(**error)) { |
| 86 | 86 | ||
| 87 | debug("%s(%s)",__FUNCTION__,element_name); | 87 | debug("%s(%s)",__FUNCTION__,element_name); |
| 88 | 88 |
src/objects/linux/savedesktopicon.c
| @@ -1,301 +0,0 @@ | @@ -1,301 +0,0 @@ | ||
| 1 | -/* | ||
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | - * | ||
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | - * | ||
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | - * Free Software Foundation. | ||
| 11 | - * | ||
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | - * obter mais detalhes. | ||
| 16 | - * | ||
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | - * | ||
| 21 | - * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | - * | ||
| 23 | - * Contatos: | ||
| 24 | - * | ||
| 25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | - * | ||
| 28 | - */ | ||
| 29 | - | ||
| 30 | - /** | ||
| 31 | - * @brief Implement Linux version of the save desktop icon action. | ||
| 32 | - * | ||
| 33 | - */ | ||
| 34 | - | ||
| 35 | - #include <v3270.h> | ||
| 36 | - #include <pw3270.h> | ||
| 37 | - #include <pw3270/application.h> | ||
| 38 | - #include <v3270/actions.h> | ||
| 39 | - #include <lib3270.h> | ||
| 40 | - #include <lib3270/log.h> | ||
| 41 | - | ||
| 42 | - static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | ||
| 43 | - static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | ||
| 44 | - | ||
| 45 | -/* | ||
| 46 | - | ||
| 47 | -[Desktop Entry] | ||
| 48 | -GenericName=pw3270 | ||
| 49 | -Name=pw3270 | ||
| 50 | -Comment=Comment | ||
| 51 | -Exec=/usr/bin/sisbb | ||
| 52 | -Icon=pw3270 | ||
| 53 | -Terminal=false | ||
| 54 | -Type=Application | ||
| 55 | -StartupNotify=true | ||
| 56 | -Categories=GTK;GNOME;TerminalEmulator | ||
| 57 | -OnlyShowIn=GNOME;Unity | ||
| 58 | -X-Desktop-File-Install-Version=0.23 | ||
| 59 | -*/ | ||
| 60 | - | ||
| 61 | - static const struct _entry { | ||
| 62 | - | ||
| 63 | - const gchar * key; | ||
| 64 | - const gchar * label; | ||
| 65 | - const gchar * tooltip; | ||
| 66 | - gint width; | ||
| 67 | -// gint n_chars; | ||
| 68 | - | ||
| 69 | - } entries[] = { | ||
| 70 | - | ||
| 71 | - { | ||
| 72 | - .label = N_("File name"), | ||
| 73 | - .width = 40, | ||
| 74 | -// .n_chars = 40 | ||
| 75 | - }, | ||
| 76 | - | ||
| 77 | - { | ||
| 78 | - .key = "Name", | ||
| 79 | - .label = N_("Launcher name"), | ||
| 80 | - .width = 20, | ||
| 81 | -// .n_chars = 128 | ||
| 82 | - }, | ||
| 83 | - | ||
| 84 | - { | ||
| 85 | - .key = "GenericName", | ||
| 86 | - .label = N_("Generic name"), | ||
| 87 | - .width = 20, | ||
| 88 | -// .n_chars = 128 | ||
| 89 | - }, | ||
| 90 | - | ||
| 91 | - { | ||
| 92 | - .key = "Comment", | ||
| 93 | - .label = N_("Comment"), | ||
| 94 | - .width = 30, | ||
| 95 | -// .n_chars = 128 | ||
| 96 | - } | ||
| 97 | - | ||
| 98 | - }; | ||
| 99 | - | ||
| 100 | - GAction * pw3270_action_save_desktop_icon_new(void) { | ||
| 101 | - | ||
| 102 | - V3270SimpleAction * action = v3270_dialog_action_new(factory); | ||
| 103 | - | ||
| 104 | - action->name = "save.launcher"; | ||
| 105 | - action->label = _("Save desktop icon"); | ||
| 106 | - action->tooltip = _("Create a desktop icon for the current session"); | ||
| 107 | - | ||
| 108 | - return G_ACTION(action); | ||
| 109 | - | ||
| 110 | - } | ||
| 111 | - | ||
| 112 | - GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | ||
| 113 | - | ||
| 114 | - size_t ix; | ||
| 115 | - | ||
| 116 | - gboolean use_header; | ||
| 117 | - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | ||
| 118 | - | ||
| 119 | - GtkWidget * dialog = | ||
| 120 | - GTK_WIDGET(g_object_new( | ||
| 121 | - GTK_TYPE_DIALOG, | ||
| 122 | - "use-header-bar", (use_header ? 1 : 0), | ||
| 123 | - NULL | ||
| 124 | - )); | ||
| 125 | - | ||
| 126 | - | ||
| 127 | - gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | ||
| 128 | - gtk_window_set_title(GTK_WINDOW(dialog),action->label); | ||
| 129 | - | ||
| 130 | - gtk_dialog_add_buttons( | ||
| 131 | - GTK_DIALOG(dialog), | ||
| 132 | - _("_Cancel"), GTK_RESPONSE_CANCEL, | ||
| 133 | - _("_Save"), GTK_RESPONSE_APPLY, | ||
| 134 | - NULL | ||
| 135 | - ); | ||
| 136 | - | ||
| 137 | - g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | ||
| 138 | - | ||
| 139 | - // Create entry fields | ||
| 140 | - GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | ||
| 141 | - g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | ||
| 142 | - debug("Dialog=%p inputs=%p",dialog,inputs); | ||
| 143 | - | ||
| 144 | - GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 145 | - | ||
| 146 | - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0); | ||
| 147 | - | ||
| 148 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 149 | - gtk_container_set_border_width(GTK_CONTAINER(grid),18); | ||
| 150 | - gtk_grid_set_row_spacing(GTK_GRID(grid),6); | ||
| 151 | - gtk_grid_set_column_spacing(GTK_GRID(grid),12); | ||
| 152 | - | ||
| 153 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 154 | - // gtk_box_set_spacing(GTK_BOX(content_area),18); | ||
| 155 | - | ||
| 156 | - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 157 | - | ||
| 158 | - GtkWidget * label = gtk_label_new(gettext(entries[ix].label)); | ||
| 159 | - gtk_label_set_xalign(GTK_LABEL(label),1); | ||
| 160 | - gtk_grid_attach(grid,label,0,ix,1,1); | ||
| 161 | - | ||
| 162 | - inputs[ix] = gtk_entry_new(); | ||
| 163 | - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 164 | - | ||
| 165 | - gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | ||
| 166 | -// gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars); | ||
| 167 | - gtk_widget_set_hexpand(inputs[ix],FALSE); | ||
| 168 | - gtk_widget_set_vexpand(inputs[ix],FALSE); | ||
| 169 | - | ||
| 170 | - gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1); | ||
| 171 | - | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); | ||
| 175 | - | ||
| 176 | - gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename); | ||
| 177 | - | ||
| 178 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 179 | - gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 180 | - | ||
| 181 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 182 | - gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 183 | - | ||
| 184 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
| 185 | - gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
| 186 | - gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK); | ||
| 187 | - | ||
| 188 | - gtk_widget_show_all(GTK_WIDGET(grid)); | ||
| 189 | - return dialog; | ||
| 190 | - } | ||
| 191 | - | ||
| 192 | - void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { | ||
| 193 | - | ||
| 194 | - debug("%s(%d)",__FUNCTION__,response_id); | ||
| 195 | - | ||
| 196 | - if(response_id == GTK_RESPONSE_APPLY) { | ||
| 197 | - | ||
| 198 | - static const char * key_file_data = | ||
| 199 | - "[Desktop Entry]\n" \ | ||
| 200 | - "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ | ||
| 201 | - "Terminal=false\n" \ | ||
| 202 | - "Type=Application\n" \ | ||
| 203 | - "StartupNotify=true\n" \ | ||
| 204 | - "Categories=GTK;GNOME;TerminalEmulator\n" \ | ||
| 205 | - "OnlyShowIn=GNOME;Unity\n"; | ||
| 206 | - | ||
| 207 | - GError * error = NULL; | ||
| 208 | - size_t ix; | ||
| 209 | - | ||
| 210 | - GKeyFile * keyfile = g_key_file_new(); | ||
| 211 | - g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL); | ||
| 212 | - | ||
| 213 | -#ifdef DEBUG | ||
| 214 | - { | ||
| 215 | - g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL); | ||
| 216 | - debug("\n%s\n",dbg_data); | ||
| 217 | - } | ||
| 218 | -#endif // DEBUG | ||
| 219 | - | ||
| 220 | - | ||
| 221 | - GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); | ||
| 222 | - debug("dialog=%p inputs=%p",dialog,inputs); | ||
| 223 | - | ||
| 224 | - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 225 | - if(entries[ix].key) { | ||
| 226 | - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 227 | - g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix]))); | ||
| 228 | - } | ||
| 229 | - } | ||
| 230 | - | ||
| 231 | - // Get session filename | ||
| 232 | - /* | ||
| 233 | - const gchar * session_file = v3270_get_session_filename(terminal); | ||
| 234 | - | ||
| 235 | - if(!session_file) { | ||
| 236 | - | ||
| 237 | - // No session file, create one. | ||
| 238 | - | ||
| 239 | - // Check for configdir | ||
| 240 | - g_autofree gchar * configdir = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME),"sessions",NULL); | ||
| 241 | - g_mkdir_with_parents(configdir,0755); | ||
| 242 | - | ||
| 243 | - // Create a base name | ||
| 244 | - g_autofree gchar * basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(inputs[0]))); | ||
| 245 | - | ||
| 246 | - gchar *ptr = strrchr(basename,'.'); | ||
| 247 | - if(ptr) | ||
| 248 | - *ptr = 0; | ||
| 249 | - | ||
| 250 | - ix = time(NULL); | ||
| 251 | - gchar * new_session_file = g_strdup_printf("%s/%s.3270",configdir,basename); | ||
| 252 | - while(!g_file_test(new_session_file,G_FILE_TEST_EXISTS)) { | ||
| 253 | - g_free(new_session_file); | ||
| 254 | - new_session_file = g_strdup_printf("%s/%s_%08lx.3270",configdir,basename,(unsigned long) ix++); | ||
| 255 | - } | ||
| 256 | - | ||
| 257 | - g_message("Saving session to %s",new_session_file); | ||
| 258 | - v3270_set_session_filename(terminal,new_session_file); | ||
| 259 | - g_free(new_session_file); | ||
| 260 | - | ||
| 261 | - } | ||
| 262 | - */ | ||
| 263 | - | ||
| 264 | - // Get program file name | ||
| 265 | - // https://stackoverflow.com/questions/4517425/how-to-get-program-path | ||
| 266 | - { | ||
| 267 | - char buffer[4096]; | ||
| 268 | - g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid()); | ||
| 269 | - | ||
| 270 | - int bytes = readlink(pidfile,buffer,4095); | ||
| 271 | - | ||
| 272 | - if(bytes >= 0) | ||
| 273 | - buffer[bytes] = '\0'; | ||
| 274 | - | ||
| 275 | - g_autofree gchar * exec_line = g_strdup_printf("%s \"%s\"",buffer,v3270_get_session_filename(terminal)); | ||
| 276 | - g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); | ||
| 277 | - | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[0])),&error); | ||
| 281 | - | ||
| 282 | - if(error) { | ||
| 283 | - | ||
| 284 | - g_message("%s",error->message); | ||
| 285 | - | ||
| 286 | - | ||
| 287 | - g_error_free(error); | ||
| 288 | - | ||
| 289 | - } else { | ||
| 290 | - | ||
| 291 | - g_message("File \"%s\" was saved",gtk_entry_get_text(GTK_ENTRY(inputs[0]))); | ||
| 292 | - | ||
| 293 | - } | ||
| 294 | - | ||
| 295 | - | ||
| 296 | - g_key_file_free(keyfile); | ||
| 297 | - } | ||
| 298 | - | ||
| 299 | - gtk_widget_destroy(dialog); | ||
| 300 | - | ||
| 301 | -} |
| @@ -0,0 +1,378 @@ | @@ -0,0 +1,378 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * @brief Implement Linux version of the save desktop icon action. | ||
| 32 | + * | ||
| 33 | + */ | ||
| 34 | + | ||
| 35 | + #include <v3270.h> | ||
| 36 | + #include <pw3270.h> | ||
| 37 | + #include <pw3270/application.h> | ||
| 38 | + #include <v3270/actions.h> | ||
| 39 | + #include <v3270/keyfile.h> | ||
| 40 | + #include <v3270/settings.h> | ||
| 41 | + #include <lib3270.h> | ||
| 42 | + #include <lib3270/log.h> | ||
| 43 | + #include <lib3270/properties.h> | ||
| 44 | + #include <v3270/tools.h> | ||
| 45 | + | ||
| 46 | + static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | ||
| 47 | + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | ||
| 48 | + | ||
| 49 | + static const struct _entry { | ||
| 50 | + | ||
| 51 | + const gchar * key; | ||
| 52 | + const gchar * label; | ||
| 53 | + const gchar * tooltip; | ||
| 54 | + const gchar * default_value; | ||
| 55 | + gint margin_top; | ||
| 56 | + gint width; | ||
| 57 | + | ||
| 58 | + } entries[] = { | ||
| 59 | + | ||
| 60 | + // 0 = Shortcut name | ||
| 61 | + { | ||
| 62 | + .key = "Name", | ||
| 63 | + .label = N_("Shortcut name"), | ||
| 64 | + .default_value = G_STRINGIFY(PRODUCT_NAME), | ||
| 65 | + .width = 20, | ||
| 66 | + }, | ||
| 67 | + | ||
| 68 | + // 1 = Shortcut file | ||
| 69 | + { | ||
| 70 | + .label = N_("Shortcut file"), | ||
| 71 | + .tooltip = N_("Path for the new shortcut"), | ||
| 72 | + .width = 40, | ||
| 73 | + }, | ||
| 74 | + | ||
| 75 | + // 2 = Session name | ||
| 76 | + { | ||
| 77 | + .label = N_("Session name"), | ||
| 78 | + .margin_top = 12, | ||
| 79 | + .tooltip = N_("The session name used in the window/tab title (empty for default)"), | ||
| 80 | + .width = 15, | ||
| 81 | + }, | ||
| 82 | + | ||
| 83 | + // 3 = Session file | ||
| 84 | + { | ||
| 85 | + .label = N_("Session file"), | ||
| 86 | + .tooltip = N_("The file with the session preferences for this shortcut"), | ||
| 87 | + .width = 40, | ||
| 88 | + }, | ||
| 89 | + | ||
| 90 | + // 4 = Generic name. | ||
| 91 | + { | ||
| 92 | + .key = "GenericName", | ||
| 93 | + .margin_top = 12, | ||
| 94 | + .label = N_("Generic name"), | ||
| 95 | + .default_value = G_STRINGIFY(PRODUCT_NAME), | ||
| 96 | + .width = 20, | ||
| 97 | + }, | ||
| 98 | + | ||
| 99 | + { | ||
| 100 | + .key = "Comment", | ||
| 101 | + .label = N_("Comment"), | ||
| 102 | + .default_value = N_("IBM 3270 Terminal emulator"), | ||
| 103 | + .width = 30, | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + }; | ||
| 107 | + | ||
| 108 | + GAction * pw3270_action_save_desktop_icon_new(void) { | ||
| 109 | + | ||
| 110 | + V3270SimpleAction * action = v3270_dialog_action_new(factory); | ||
| 111 | + | ||
| 112 | + action->name = "save.launcher"; | ||
| 113 | + action->label = _("Save session shortcut"); | ||
| 114 | + action->tooltip = _("Create shortcut for the current session"); | ||
| 115 | + | ||
| 116 | + return G_ACTION(action); | ||
| 117 | + | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + /* | ||
| 121 | + static gchar * get_filename(GtkWidget *terminal) { | ||
| 122 | + | ||
| 123 | + g_autofree gchar * defname = v3270_keyfile_get_default_filename(); | ||
| 124 | + const gchar * current = v3270_key_file_get_filename(terminal); | ||
| 125 | + | ||
| 126 | + // If is not the default name, return it. | ||
| 127 | + if(strcmp(defname,current)) { | ||
| 128 | + return g_strdup(current); | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + // It's the default one, create a new one on the user_config dir | ||
| 132 | + g_autofree gchar * config_path = v3270_key_file_get_default_path(terminal); | ||
| 133 | + | ||
| 134 | + // Use the hostname | ||
| 135 | + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); | ||
| 136 | + if(!hostname) { | ||
| 137 | + hostname = G_STRINGIFY(PRODUCT_NAME); | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + // Build the filename | ||
| 141 | + gchar *filename = g_strconcat(config_path,G_DIR_SEPARATOR_S,hostname,".3270",NULL); | ||
| 142 | + | ||
| 143 | + unsigned int index = 0; | ||
| 144 | + while(g_file_test(filename,G_FILE_TEST_EXISTS)) { | ||
| 145 | + g_free(filename); | ||
| 146 | + filename = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",config_path,hostname,++index); | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + return filename; | ||
| 150 | + | ||
| 151 | + } | ||
| 152 | + */ | ||
| 153 | + | ||
| 154 | + GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | ||
| 155 | + | ||
| 156 | + size_t ix; | ||
| 157 | + | ||
| 158 | + gboolean use_header; | ||
| 159 | + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | ||
| 160 | + | ||
| 161 | + GtkWidget * dialog = | ||
| 162 | + GTK_WIDGET(g_object_new( | ||
| 163 | + GTK_TYPE_DIALOG, | ||
| 164 | + "use-header-bar", (use_header ? 1 : 0), | ||
| 165 | + NULL | ||
| 166 | + )); | ||
| 167 | + | ||
| 168 | + | ||
| 169 | + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | ||
| 170 | + gtk_window_set_title(GTK_WINDOW(dialog),action->label); | ||
| 171 | + | ||
| 172 | + gtk_dialog_add_buttons( | ||
| 173 | + GTK_DIALOG(dialog), | ||
| 174 | + _("_Cancel"), GTK_RESPONSE_CANCEL, | ||
| 175 | + _("_Save"), GTK_RESPONSE_APPLY, | ||
| 176 | + NULL | ||
| 177 | + ); | ||
| 178 | + | ||
| 179 | + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | ||
| 180 | + | ||
| 181 | + // Create entry fields | ||
| 182 | + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | ||
| 183 | + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | ||
| 184 | + debug("Dialog=%p inputs=%p",dialog,inputs); | ||
| 185 | + | ||
| 186 | + GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 187 | + | ||
| 188 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0); | ||
| 189 | + | ||
| 190 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 191 | + gtk_container_set_border_width(GTK_CONTAINER(grid),18); | ||
| 192 | + gtk_grid_set_row_spacing(GTK_GRID(grid),6); | ||
| 193 | + gtk_grid_set_column_spacing(GTK_GRID(grid),12); | ||
| 194 | + | ||
| 195 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 196 | + // gtk_box_set_spacing(GTK_BOX(content_area),18); | ||
| 197 | + | ||
| 198 | + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 199 | + | ||
| 200 | + GtkWidget * label = gtk_label_new(gettext(entries[ix].label)); | ||
| 201 | + gtk_label_set_xalign(GTK_LABEL(label),1); | ||
| 202 | + gtk_grid_attach(grid,label,0,ix,1,1); | ||
| 203 | + | ||
| 204 | + inputs[ix] = gtk_entry_new(); | ||
| 205 | + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 206 | + | ||
| 207 | + if(entries[ix].margin_top) { | ||
| 208 | + gtk_widget_set_margin_top(label,entries[ix].margin_top); | ||
| 209 | + gtk_widget_set_margin_top(inputs[ix],entries[ix].margin_top); | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + if(entries[ix].default_value) { | ||
| 213 | + gtk_entry_set_text(GTK_ENTRY(inputs[ix]),gettext(entries[ix].default_value)); | ||
| 214 | + } | ||
| 215 | + | ||
| 216 | + if(entries[ix].tooltip) { | ||
| 217 | + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip)); | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | ||
| 221 | + gtk_widget_set_hexpand(inputs[ix],FALSE); | ||
| 222 | + gtk_widget_set_vexpand(inputs[ix],FALSE); | ||
| 223 | + | ||
| 224 | + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1); | ||
| 225 | + | ||
| 226 | + } | ||
| 227 | + | ||
| 228 | + g_autofree gchar * filename = g_strdup_printf("%s/" G_STRINGIFY(PRODUCT_NAME) ".desktop",g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP)); | ||
| 229 | + | ||
| 230 | + // 1 = Shortcut filename | ||
| 231 | + { | ||
| 232 | + gtk_entry_set_text(GTK_ENTRY(inputs[1]),filename); | ||
| 233 | + gtk_entry_bind_to_filechooser( | ||
| 234 | + inputs[1], | ||
| 235 | + GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 236 | + _("Save to shortcut file"), | ||
| 237 | + NULL, | ||
| 238 | + "*.desktop", | ||
| 239 | + _("Standard desktop files") | ||
| 240 | + ); | ||
| 241 | + | ||
| 242 | + } | ||
| 243 | + | ||
| 244 | + // 2 = Session name | ||
| 245 | + { | ||
| 246 | + gchar * session_name = g_strdup(v3270_get_session_name(terminal)); | ||
| 247 | + gchar * ptr = strchr(session_name,':'); | ||
| 248 | + if(ptr) | ||
| 249 | + *ptr = 0; | ||
| 250 | + | ||
| 251 | + if(strcmp(session_name,G_STRINGIFY(PRODUCT_NAME))) | ||
| 252 | + gtk_entry_set_text(GTK_ENTRY(inputs[2]),session_name); | ||
| 253 | + | ||
| 254 | + } | ||
| 255 | + | ||
| 256 | + // 3 = Session filename | ||
| 257 | + { | ||
| 258 | + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal); | ||
| 259 | + gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename); | ||
| 260 | + | ||
| 261 | + gtk_entry_bind_to_filechooser( | ||
| 262 | + inputs[3], | ||
| 263 | + GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 264 | + _("Save to session filename"), | ||
| 265 | + NULL, | ||
| 266 | + "*.3270", | ||
| 267 | + _("3270 session files") | ||
| 268 | + ); | ||
| 269 | + | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + // 4 = Generic name | ||
| 273 | + gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); | ||
| 274 | + gtk_entry_set_text(GTK_ENTRY(inputs[4]),v3270_get_url(terminal)); | ||
| 275 | + gtk_entry_set_input_hints(GTK_ENTRY(inputs[4]),GTK_INPUT_HINT_SPELLCHECK); | ||
| 276 | + | ||
| 277 | + gtk_widget_show_all(GTK_WIDGET(grid)); | ||
| 278 | + return dialog; | ||
| 279 | + } | ||
| 280 | + | ||
| 281 | + static void apply(GtkWidget *dialog, GtkWidget *terminal) { | ||
| 282 | + | ||
| 283 | + GError * error = NULL; | ||
| 284 | + size_t ix; | ||
| 285 | + | ||
| 286 | + static const char * key_file_data = | ||
| 287 | + "[Desktop Entry]\n" \ | ||
| 288 | + "Icon=" G_STRINGIFY(PRODUCT_NAME) "\n" \ | ||
| 289 | + "Terminal=false\n" \ | ||
| 290 | + "Type=Application\n" \ | ||
| 291 | + "StartupNotify=true\n" \ | ||
| 292 | + "Categories=GTK;GNOME;TerminalEmulator\n" \ | ||
| 293 | + "OnlyShowIn=GNOME;Unity\n"; | ||
| 294 | + | ||
| 295 | + GKeyFile * keyfile = g_key_file_new(); | ||
| 296 | + g_key_file_load_from_data(keyfile,key_file_data,-1,G_KEY_FILE_NONE,NULL); | ||
| 297 | + | ||
| 298 | +#ifdef DEBUG | ||
| 299 | + { | ||
| 300 | + g_autofree gchar * dbg_data = g_key_file_to_data(keyfile,NULL,NULL); | ||
| 301 | + debug("\n%s\n",dbg_data); | ||
| 302 | + } | ||
| 303 | +#endif // DEBUG | ||
| 304 | + | ||
| 305 | + | ||
| 306 | + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); | ||
| 307 | + debug("dialog=%p inputs=%p",dialog,inputs); | ||
| 308 | + | ||
| 309 | + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 310 | + if(entries[ix].key) { | ||
| 311 | + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 312 | + g_key_file_set_string(keyfile,"Desktop Entry",entries[ix].key,gtk_entry_get_text(GTK_ENTRY(inputs[ix]))); | ||
| 313 | + } | ||
| 314 | + } | ||
| 315 | + | ||
| 316 | + // Save keyfile | ||
| 317 | + v3270_key_file_save_to_file( | ||
| 318 | + terminal, | ||
| 319 | + gtk_entry_get_text(GTK_ENTRY(inputs[3])), | ||
| 320 | + &error | ||
| 321 | + ); | ||
| 322 | + | ||
| 323 | + // Get program file name | ||
| 324 | + // https://stackoverflow.com/questions/4517425/how-to-get-program-path | ||
| 325 | + if(!error) { | ||
| 326 | + char buffer[4096]; | ||
| 327 | + g_autofree gchar * pidfile = g_strdup_printf("/proc/%d/exe", getpid()); | ||
| 328 | + | ||
| 329 | + int bytes = readlink(pidfile,buffer,4095); | ||
| 330 | + | ||
| 331 | + if(bytes >= 0) | ||
| 332 | + buffer[bytes] = '\0'; | ||
| 333 | + | ||
| 334 | + g_autofree gchar * exec_line = | ||
| 335 | + g_strconcat( | ||
| 336 | + buffer, | ||
| 337 | + " \"",gtk_entry_get_text(GTK_ENTRY(inputs[3])),"\"", | ||
| 338 | + NULL | ||
| 339 | + ); | ||
| 340 | + | ||
| 341 | + g_key_file_set_string(keyfile,"Desktop Entry","Exec",exec_line); | ||
| 342 | + | ||
| 343 | + } | ||
| 344 | + | ||
| 345 | + // Save shortcut | ||
| 346 | + g_key_file_save_to_file(keyfile,gtk_entry_get_text(GTK_ENTRY(inputs[1])),&error); | ||
| 347 | + | ||
| 348 | + g_key_file_free(keyfile); | ||
| 349 | + | ||
| 350 | + if(error) { | ||
| 351 | + | ||
| 352 | + g_message("%s",error->message); | ||
| 353 | + g_error_free(error); | ||
| 354 | + | ||
| 355 | + } else { | ||
| 356 | + | ||
| 357 | + // Set session name (after save to avoid changes on the old session file). | ||
| 358 | + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[2]))); | ||
| 359 | + v3270_emit_save_settings(terminal,NULL); | ||
| 360 | + | ||
| 361 | + } | ||
| 362 | + | ||
| 363 | +} | ||
| 364 | + | ||
| 365 | +void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { | ||
| 366 | + | ||
| 367 | + debug("%s(%d)",__FUNCTION__,response_id); | ||
| 368 | + | ||
| 369 | + gtk_widget_hide(dialog); | ||
| 370 | + if(response_id == GTK_RESPONSE_APPLY) { | ||
| 371 | + apply(dialog,terminal); | ||
| 372 | + } | ||
| 373 | + | ||
| 374 | + gtk_widget_destroy(dialog); | ||
| 375 | + | ||
| 376 | +} | ||
| 377 | + | ||
| 378 | + |
| @@ -0,0 +1,354 @@ | @@ -0,0 +1,354 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | + /** | ||
| 31 | + * @brief Implement Windows version of the save desktop icon action. | ||
| 32 | + * | ||
| 33 | + * References: | ||
| 34 | + * | ||
| 35 | + * <https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32> | ||
| 36 | + * <https://docs.microsoft.com/pt-br/windows/win32/shell/links?redirectedfrom=MSDN> | ||
| 37 | + * | ||
| 38 | + */ | ||
| 39 | + | ||
| 40 | +// #include <stdafx.h> | ||
| 41 | + #include <winsock2.h> | ||
| 42 | + #include <windows.h> | ||
| 43 | + #include <winnls.h> | ||
| 44 | + #include <shobjidl.h> | ||
| 45 | + #include <objbase.h> | ||
| 46 | + #include <objidl.h> | ||
| 47 | + #include <shlguid.h> | ||
| 48 | + | ||
| 49 | + #include <v3270.h> | ||
| 50 | + #include <pw3270.h> | ||
| 51 | + #include <pw3270/application.h> | ||
| 52 | + #include <v3270/actions.h> | ||
| 53 | + #include <lib3270.h> | ||
| 54 | + #include <lib3270/log.h> | ||
| 55 | + #include <v3270/tools.h> | ||
| 56 | + #include <v3270/keyfile.h> | ||
| 57 | + #include <v3270/settings.h> | ||
| 58 | + | ||
| 59 | + static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | ||
| 60 | + static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | ||
| 61 | + | ||
| 62 | + static const struct _entry { | ||
| 63 | + | ||
| 64 | + const gchar * label; | ||
| 65 | + const gchar * tooltip; | ||
| 66 | + gint margin_top; | ||
| 67 | + gint width; | ||
| 68 | + | ||
| 69 | + } entries[] = { | ||
| 70 | + | ||
| 71 | + // 0 - Shorcut file name | ||
| 72 | + { | ||
| 73 | + .label = N_("Shortcut file"), | ||
| 74 | + .tooltip = N_("Path for the new shortcut"), | ||
| 75 | + .width = 40, | ||
| 76 | + }, | ||
| 77 | + | ||
| 78 | + // 1 - Shortcut description | ||
| 79 | + { | ||
| 80 | + .label = N_("Description"), | ||
| 81 | + .width = 20, | ||
| 82 | + }, | ||
| 83 | + | ||
| 84 | + // 2 = Session name | ||
| 85 | + { | ||
| 86 | + .label = N_("Session name"), | ||
| 87 | + .margin_top = 12, | ||
| 88 | + .tooltip = N_("The session name used in the window/tab title (empty for default)"), | ||
| 89 | + .width = 15, | ||
| 90 | + }, | ||
| 91 | + | ||
| 92 | + // 3 = Session file | ||
| 93 | + { | ||
| 94 | + .label = N_("Session file"), | ||
| 95 | + .tooltip = N_("The file with the session preferences for this shortcut"), | ||
| 96 | + .width = 40, | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + }; | ||
| 100 | + | ||
| 101 | + GAction * pw3270_action_save_desktop_icon_new(void) { | ||
| 102 | + | ||
| 103 | + V3270SimpleAction * action = v3270_dialog_action_new(factory); | ||
| 104 | + | ||
| 105 | + action->name = "save.launcher"; | ||
| 106 | + action->label = _("Save session shortcut"); | ||
| 107 | + action->tooltip = _("Create shortcut for the current session"); | ||
| 108 | + | ||
| 109 | + return G_ACTION(action); | ||
| 110 | + | ||
| 111 | + } | ||
| 112 | + | ||
| 113 | + GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | ||
| 114 | + | ||
| 115 | + size_t ix; | ||
| 116 | + | ||
| 117 | + gboolean use_header; | ||
| 118 | + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | ||
| 119 | + | ||
| 120 | + GtkWidget * dialog = | ||
| 121 | + GTK_WIDGET(g_object_new( | ||
| 122 | + GTK_TYPE_DIALOG, | ||
| 123 | + "use-header-bar", (use_header ? 1 : 0), | ||
| 124 | + NULL | ||
| 125 | + )); | ||
| 126 | + | ||
| 127 | + gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | ||
| 128 | + gtk_window_set_title(GTK_WINDOW(dialog),action->label); | ||
| 129 | + | ||
| 130 | + gtk_dialog_add_buttons( | ||
| 131 | + GTK_DIALOG(dialog), | ||
| 132 | + _("_Cancel"), GTK_RESPONSE_CANCEL, | ||
| 133 | + _("_Save"), GTK_RESPONSE_APPLY, | ||
| 134 | + NULL | ||
| 135 | + ); | ||
| 136 | + | ||
| 137 | + g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | ||
| 138 | + | ||
| 139 | + // Create entry fields | ||
| 140 | + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | ||
| 141 | + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | ||
| 142 | + debug("Dialog=%p inputs=%p",dialog,inputs); | ||
| 143 | + | ||
| 144 | + GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 145 | + | ||
| 146 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0); | ||
| 147 | + | ||
| 148 | + // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 149 | + gtk_container_set_border_width(GTK_CONTAINER(grid),18); | ||
| 150 | + gtk_grid_set_row_spacing(GTK_GRID(grid),6); | ||
| 151 | + gtk_grid_set_column_spacing(GTK_GRID(grid),12); | ||
| 152 | + | ||
| 153 | + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 154 | + | ||
| 155 | + GtkWidget * label = gtk_label_new(gettext(entries[ix].label)); | ||
| 156 | + gtk_label_set_xalign(GTK_LABEL(label),1); | ||
| 157 | + gtk_grid_attach(grid,label,0,ix,1,1); | ||
| 158 | + | ||
| 159 | + inputs[ix] = gtk_entry_new(); | ||
| 160 | + debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 161 | + | ||
| 162 | + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | ||
| 163 | + gtk_widget_set_hexpand(inputs[ix],FALSE); | ||
| 164 | + gtk_widget_set_vexpand(inputs[ix],FALSE); | ||
| 165 | + | ||
| 166 | + if(entries[ix].tooltip) { | ||
| 167 | + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip)); | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + if(entries[ix].margin_top) { | ||
| 171 | + gtk_widget_set_margin_top(label,entries[ix].margin_top); | ||
| 172 | + gtk_widget_set_margin_top(inputs[ix],entries[ix].margin_top); | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1); | ||
| 176 | + | ||
| 177 | + } | ||
| 178 | + | ||
| 179 | + // Setup short-cut name entry. | ||
| 180 | + { | ||
| 181 | + gtk_entry_bind_to_filechooser( | ||
| 182 | + inputs[0], | ||
| 183 | + GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 184 | + _("Save to windows shortcut"), | ||
| 185 | + NULL, | ||
| 186 | + "*.lnk", | ||
| 187 | + _("Windows shortcuts") | ||
| 188 | + ); | ||
| 189 | + | ||
| 190 | + gchar * filename = g_strdup_printf( | ||
| 191 | + "%s\\" G_STRINGIFY(PRODUCT_NAME) ".lnk", | ||
| 192 | + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP) | ||
| 193 | + ); | ||
| 194 | + | ||
| 195 | + size_t ix = 0; | ||
| 196 | + | ||
| 197 | + while(g_file_test(filename,G_FILE_TEST_EXISTS)) { | ||
| 198 | + | ||
| 199 | + g_free(filename); | ||
| 200 | + filename = g_strdup_printf( | ||
| 201 | + "%s\\" G_STRINGIFY(PRODUCT_NAME) "%u.lnk", | ||
| 202 | + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP), | ||
| 203 | + (unsigned int) ++ix | ||
| 204 | + ); | ||
| 205 | + | ||
| 206 | + } | ||
| 207 | + | ||
| 208 | + gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename); | ||
| 209 | + g_free(filename); | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + { | ||
| 213 | + g_autofree gchar * session_filename = v3270_key_file_build_filename(terminal); | ||
| 214 | + gtk_entry_set_text(GTK_ENTRY(inputs[3]),session_filename); | ||
| 215 | + | ||
| 216 | + gtk_entry_bind_to_filechooser( | ||
| 217 | + inputs[3], | ||
| 218 | + GTK_FILE_CHOOSER_ACTION_SAVE, | ||
| 219 | + _("File for session preferences"), | ||
| 220 | + NULL, | ||
| 221 | + "*.3270", | ||
| 222 | + _("3270 session files") | ||
| 223 | + ); | ||
| 224 | + | ||
| 225 | + } | ||
| 226 | + | ||
| 227 | + gtk_widget_show_all(GTK_WIDGET(grid)); | ||
| 228 | + return dialog; | ||
| 229 | + } | ||
| 230 | + | ||
| 231 | + static HRESULT CreateShortCut(const char * pszTargetfile, const char * pszTargetargs, const char * pszLinkfile, const char * pszDescription, int iShowmode, const char * pszCurdir, LPSTR pszIconfile, int iIconindex) { | ||
| 232 | + | ||
| 233 | + // https://www.codeproject.com/Articles/11467/How-to-create-short-cuts-link-files | ||
| 234 | + IShellLink* pShellLink; // IShellLink object pointer | ||
| 235 | + IPersistFile* pPersistFile; // IPersistFile object pointer | ||
| 236 | + WORD wszLinkfile[MAX_PATH]; // pszLinkfile as Unicode string | ||
| 237 | + int iWideCharsWritten; // Number of wide characters written | ||
| 238 | + | ||
| 239 | + HRESULT hRes = | ||
| 240 | + CoCreateInstance( | ||
| 241 | + &CLSID_ShellLink, // predefined CLSID of the IShellLink object | ||
| 242 | + NULL, // pointer to parent interface if part of aggregate | ||
| 243 | + CLSCTX_INPROC_SERVER, // caller and called code are in same process | ||
| 244 | + &IID_IShellLink, // predefined interface of the IShellLink object | ||
| 245 | + (void **) &pShellLink); // Returns a pointer to the IShellLink object | ||
| 246 | + | ||
| 247 | + if(!SUCCEEDED(hRes)) { | ||
| 248 | + return hRes; | ||
| 249 | + } | ||
| 250 | + | ||
| 251 | + if(pszTargetfile && strlen(pszTargetfile)) { | ||
| 252 | + hRes = pShellLink->lpVtbl->SetPath(pShellLink,pszTargetfile); | ||
| 253 | + } else { | ||
| 254 | + char filename[MAX_PATH+1]; | ||
| 255 | + memset(filename,0,MAX_PATH+1); | ||
| 256 | + GetModuleFileName(NULL,filename,MAX_PATH); | ||
| 257 | + hRes = pShellLink->lpVtbl->SetPath(pShellLink,filename); | ||
| 258 | + } | ||
| 259 | + | ||
| 260 | + if(pszTargetargs) { | ||
| 261 | + hRes = pShellLink->lpVtbl->SetArguments(pShellLink,pszTargetargs); | ||
| 262 | + } else { | ||
| 263 | + hRes = pShellLink->lpVtbl->SetArguments(pShellLink,""); | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + if(pszDescription && strlen(pszDescription) > 0) { | ||
| 267 | + hRes = pShellLink->lpVtbl->SetDescription(pShellLink,pszDescription); | ||
| 268 | + } else { | ||
| 269 | + hRes = pShellLink->lpVtbl->SetDescription(pShellLink,_("IBM 3270 Terminal emulator")); | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + if(iShowmode > 0) { | ||
| 273 | + hRes = pShellLink->lpVtbl->SetShowCmd(pShellLink,iShowmode); | ||
| 274 | + } | ||
| 275 | + | ||
| 276 | + if(pszCurdir && strlen(pszCurdir) > 0) { | ||
| 277 | + hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,pszCurdir); | ||
| 278 | + } else { | ||
| 279 | + g_autofree gchar * appdir = g_win32_get_package_installation_directory_of_module(NULL); | ||
| 280 | + hRes = pShellLink->lpVtbl->SetWorkingDirectory(pShellLink,appdir); | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + if(pszIconfile && strlen(pszIconfile) > 0 && iIconindex >= 0) { | ||
| 284 | + hRes = pShellLink->lpVtbl->SetIconLocation(pShellLink, pszIconfile, iIconindex); | ||
| 285 | + } | ||
| 286 | + | ||
| 287 | + // Use the IPersistFile object to save the shell link | ||
| 288 | + hRes = pShellLink->lpVtbl->QueryInterface( | ||
| 289 | + pShellLink, // existing IShellLink object | ||
| 290 | + &IID_IPersistFile, // pre-defined interface of the IPersistFile object | ||
| 291 | + (void **) &pPersistFile); // returns a pointer to the IPersistFile object | ||
| 292 | + | ||
| 293 | + | ||
| 294 | + if(SUCCEEDED(hRes)){ | ||
| 295 | + iWideCharsWritten = MultiByteToWideChar(CP_ACP, 0, pszLinkfile, -1, wszLinkfile, MAX_PATH); | ||
| 296 | + hRes = pPersistFile->lpVtbl->Save(pPersistFile,wszLinkfile, TRUE); | ||
| 297 | + pPersistFile->lpVtbl->Release(pPersistFile); | ||
| 298 | + } | ||
| 299 | + | ||
| 300 | + pShellLink->lpVtbl->Release(pShellLink); | ||
| 301 | + | ||
| 302 | + return hRes; | ||
| 303 | + } | ||
| 304 | + | ||
| 305 | + void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { | ||
| 306 | + | ||
| 307 | + debug("%s(%d)",__FUNCTION__,response_id); | ||
| 308 | + | ||
| 309 | + if(response_id == GTK_RESPONSE_APPLY) { | ||
| 310 | + | ||
| 311 | + // Save desktop icon | ||
| 312 | + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs"); | ||
| 313 | + | ||
| 314 | + // Save keyfile | ||
| 315 | + GError * error = NULL; | ||
| 316 | + v3270_key_file_save_to_file( | ||
| 317 | + terminal, | ||
| 318 | + gtk_entry_get_text(GTK_ENTRY(inputs[3])), | ||
| 319 | + &error | ||
| 320 | + ); | ||
| 321 | + | ||
| 322 | + if(!error) { | ||
| 323 | + | ||
| 324 | + HRESULT hRes = CreateShortCut( | ||
| 325 | + NULL, // LPSTR pszTargetfile, | ||
| 326 | + gtk_entry_get_text(GTK_ENTRY(inputs[3])), // LPSTR pszTargetargs, | ||
| 327 | + gtk_entry_get_text(GTK_ENTRY(inputs[0])), // LPSTR pszLinkfile, | ||
| 328 | + gtk_entry_get_text(GTK_ENTRY(inputs[1])), // LPSTR pszDescription, | ||
| 329 | + 0, | ||
| 330 | + NULL, | ||
| 331 | + NULL, | ||
| 332 | + 0 | ||
| 333 | + ); | ||
| 334 | + | ||
| 335 | + } | ||
| 336 | + | ||
| 337 | + if(error) { | ||
| 338 | + | ||
| 339 | + g_message("%s",error->message); | ||
| 340 | + g_error_free(error); | ||
| 341 | + | ||
| 342 | + } else { | ||
| 343 | + | ||
| 344 | + // Set session name (after save to avoid changes on the old session file). | ||
| 345 | + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[2]))); | ||
| 346 | + v3270_emit_save_settings(terminal,NULL); | ||
| 347 | + | ||
| 348 | + } | ||
| 349 | + | ||
| 350 | + } | ||
| 351 | + | ||
| 352 | + gtk_widget_destroy(dialog); | ||
| 353 | + | ||
| 354 | +} |
| @@ -0,0 +1,207 @@ | @@ -0,0 +1,207 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | +#ifdef _WIN32 | ||
| 31 | + #include <winsock2.h> | ||
| 32 | + #include <windows.h> | ||
| 33 | +#endif // _WIN32 | ||
| 34 | + | ||
| 35 | + #include <pw3270.h> | ||
| 36 | + #include <pw3270/settings.h> | ||
| 37 | + #include <lib3270.h> | ||
| 38 | + #include <lib3270/log.h> | ||
| 39 | + #include <pw3270/actions.h> | ||
| 40 | + | ||
| 41 | + struct _PW3270SettingsActions { | ||
| 42 | + GtkGrid parent; | ||
| 43 | + GtkWidget * views[3]; | ||
| 44 | + GtkTreeModel * model; | ||
| 45 | + }; | ||
| 46 | + | ||
| 47 | + struct _PW3270SettingsActionsClass { | ||
| 48 | + GtkGridClass parent; | ||
| 49 | + | ||
| 50 | + int dunno; | ||
| 51 | + }; | ||
| 52 | + | ||
| 53 | + G_DEFINE_TYPE(PW3270SettingsActions, PW3270SettingsActions, GTK_TYPE_GRID); | ||
| 54 | + | ||
| 55 | + static void PW3270SettingsActions_class_init(PW3270SettingsActionsClass *klass) { | ||
| 56 | + | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + static void PW3270SettingsActions_init(PW3270SettingsActions *grid) { | ||
| 60 | + | ||
| 61 | + size_t ix; | ||
| 62 | + | ||
| 63 | + static const struct View { | ||
| 64 | + const gchar *label; | ||
| 65 | + const gchar *tooltip; | ||
| 66 | + } views[G_N_ELEMENTS(grid->views)] = { | ||
| 67 | + { | ||
| 68 | + .label = N_("Start"), | ||
| 69 | + .tooltip = N_("Items packed from the start to the end") | ||
| 70 | + }, | ||
| 71 | + | ||
| 72 | + { | ||
| 73 | + .label = N_("Available"), | ||
| 74 | + .tooltip = N_("List of the available and unpacked actions") | ||
| 75 | + }, | ||
| 76 | + | ||
| 77 | + { | ||
| 78 | + .label = N_("End"), | ||
| 79 | + .tooltip = N_("Items packed from the end to the start") | ||
| 80 | + } | ||
| 81 | + }; | ||
| 82 | + | ||
| 83 | + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); | ||
| 84 | + gtk_grid_set_row_spacing(GTK_GRID(grid),12); | ||
| 85 | + gtk_grid_set_column_spacing(GTK_GRID(grid),6); | ||
| 86 | + | ||
| 87 | + { | ||
| 88 | + // Create views | ||
| 89 | + GtkTreeSelection * selection; | ||
| 90 | + GtkWidget *box; | ||
| 91 | + | ||
| 92 | + for(ix = 0; ix < G_N_ELEMENTS(grid->views); ix++) { | ||
| 93 | + | ||
| 94 | + // Create label. | ||
| 95 | + GtkWidget * label = gtk_label_new(gettext(views[ix].label)); | ||
| 96 | + gtk_widget_set_tooltip_markup(label,gettext(views[ix].tooltip)); | ||
| 97 | + gtk_label_set_xalign(GTK_LABEL(label),0); | ||
| 98 | + gtk_widget_set_hexpand(label,TRUE); | ||
| 99 | + gtk_widget_set_vexpand(label,FALSE); | ||
| 100 | + | ||
| 101 | + gtk_grid_attach( | ||
| 102 | + GTK_GRID(grid), | ||
| 103 | + label, | ||
| 104 | + (ix*2),0, | ||
| 105 | + 1,1 | ||
| 106 | + ); | ||
| 107 | + | ||
| 108 | + // Create view | ||
| 109 | + grid->views[ix] = pw3270_action_view_new(); | ||
| 110 | + gtk_widget_set_hexpand(grid->views[ix],TRUE); | ||
| 111 | + gtk_widget_set_vexpand(grid->views[ix],TRUE); | ||
| 112 | + | ||
| 113 | + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(grid->views[ix])); | ||
| 114 | + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); | ||
| 115 | + | ||
| 116 | + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); | ||
| 117 | + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); | ||
| 118 | + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(box),GTK_SHADOW_ETCHED_IN); | ||
| 119 | + gtk_container_add(GTK_CONTAINER(box),grid->views[ix]); | ||
| 120 | + | ||
| 121 | + gtk_grid_attach( | ||
| 122 | + GTK_GRID(grid), | ||
| 123 | + box, | ||
| 124 | + (ix*2),1, | ||
| 125 | + 1,5 | ||
| 126 | + ); | ||
| 127 | + | ||
| 128 | + } | ||
| 129 | + | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(grid->views[0]),TRUE); | ||
| 133 | + gtk_tree_view_set_reorderable(GTK_TREE_VIEW(grid->views[2]),TRUE); | ||
| 134 | + pw3270_action_view_order_by_label(grid->views[1]); | ||
| 135 | + | ||
| 136 | + // Create buttons | ||
| 137 | + { | ||
| 138 | + GtkWidget *buttons[] = { | ||
| 139 | + pw3270_action_view_move_button_new(grid->views[1],grid->views[0],"go-previous"), | ||
| 140 | + pw3270_action_view_move_button_new(grid->views[1],grid->views[2],"go-next"), | ||
| 141 | + pw3270_action_view_move_button_new(grid->views[0],grid->views[1],"go-next"), | ||
| 142 | + pw3270_action_view_move_button_new(grid->views[2],grid->views[1],"go-previous") | ||
| 143 | + }; | ||
| 144 | + | ||
| 145 | + gtk_grid_attach(GTK_GRID(grid),buttons[0],1,2,1,1); | ||
| 146 | + gtk_grid_attach(GTK_GRID(grid),buttons[1],3,2,1,1); | ||
| 147 | + | ||
| 148 | + gtk_grid_attach(GTK_GRID(grid),buttons[2],1,3,1,1); | ||
| 149 | + gtk_grid_attach(GTK_GRID(grid),buttons[3],3,3,1,1); | ||
| 150 | + | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + GtkWidget * pw3270_settings_actions_new() { | ||
| 156 | + | ||
| 157 | + return GTK_WIDGET(g_object_new( | ||
| 158 | + GTK_TYPE_PW3270_SETTINGS_ACTIONS, | ||
| 159 | + NULL | ||
| 160 | + )); | ||
| 161 | + | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + Pw3270ActionList * pw3270_settings_action_set(GtkWidget *widget, Pw3270ActionList *action_list, const gchar *action_names) { | ||
| 165 | + | ||
| 166 | + PW3270SettingsActions *editor = (PW3270SettingsActions *) widget; | ||
| 167 | + | ||
| 168 | + static const unsigned short columns[] = { 0, 2 }; | ||
| 169 | + unsigned short column; | ||
| 170 | + size_t action; | ||
| 171 | + | ||
| 172 | + gchar **views = g_strsplit(action_names,":",-1); | ||
| 173 | + | ||
| 174 | + for(column = 0; column < G_N_ELEMENTS(columns); column++) { | ||
| 175 | + | ||
| 176 | + if(!views[column]) | ||
| 177 | + break; | ||
| 178 | + | ||
| 179 | + gchar ** actions = g_strsplit(views[column],",",-1); | ||
| 180 | + | ||
| 181 | + for(action = 0; actions[action];action++) { | ||
| 182 | + action_list = pw3270_action_list_move_action( | ||
| 183 | + action_list, | ||
| 184 | + actions[action], | ||
| 185 | + editor->views[columns[column]] | ||
| 186 | + ); | ||
| 187 | + } | ||
| 188 | + | ||
| 189 | + g_strfreev(actions); | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + g_strfreev(views); | ||
| 193 | + | ||
| 194 | + pw3270_action_view_set_actions(editor->views[1], action_list); | ||
| 195 | + | ||
| 196 | + return action_list; | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + gchar * pw3270_settings_action_get(GtkWidget *widget) { | ||
| 200 | + | ||
| 201 | + PW3270SettingsActions *editor = (PW3270SettingsActions *) widget; | ||
| 202 | + | ||
| 203 | + g_autofree gchar * left_names = pw3270_action_view_get_action_names(editor->views[0]); | ||
| 204 | + g_autofree gchar * right_names = pw3270_action_view_get_action_names(editor->views[2]); | ||
| 205 | + return g_strconcat(left_names,":",right_names,NULL); | ||
| 206 | + | ||
| 207 | + } |
src/objects/settings/dialog.c
| @@ -71,11 +71,6 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) | @@ -71,11 +71,6 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) | ||
| 71 | // Get use of header bar. | 71 | // Get use of header bar. |
| 72 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL); | 72 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &dialog->has_subtitle, NULL); |
| 73 | 73 | ||
| 74 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 75 | - //gtk_box_set_spacing(GTK_BOX(content_area),18); | ||
| 76 | - //gtk_container_set_border_width(GTK_CONTAINER(content_area),18); | ||
| 77 | - | ||
| 78 | -// gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | ||
| 79 | gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); | 74 | gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); |
| 80 | 75 | ||
| 81 | gtk_dialog_add_buttons( | 76 | gtk_dialog_add_buttons( |
| @@ -102,7 +97,7 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) | @@ -102,7 +97,7 @@ static void PW3270SettingsDialog_init(PW3270SettingsDialog *dialog) | ||
| 102 | 97 | ||
| 103 | } | 98 | } |
| 104 | 99 | ||
| 105 | -GtkWidget * pw3270_settings_dialog_new(GAction *action) { | 100 | +GtkWidget * pw3270_settings_dialog_new(GAction *action, gboolean has_subtitle) { |
| 106 | 101 | ||
| 107 | #ifdef _WIN32 | 102 | #ifdef _WIN32 |
| 108 | 103 | ||
| @@ -115,7 +110,7 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { | @@ -115,7 +110,7 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { | ||
| 115 | 110 | ||
| 116 | #elif GTK_CHECK_VERSION(3,12,0) | 111 | #elif GTK_CHECK_VERSION(3,12,0) |
| 117 | 112 | ||
| 118 | - gboolean use_header; | 113 | + gboolean use_header = FALSE; |
| 119 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | 114 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); |
| 120 | 115 | ||
| 121 | GtkWidget * dialog = | 116 | GtkWidget * dialog = |
| @@ -131,6 +126,8 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { | @@ -131,6 +126,8 @@ GtkWidget * pw3270_settings_dialog_new(GAction *action) { | ||
| 131 | 126 | ||
| 132 | #endif // GTK 3.12 | 127 | #endif // GTK 3.12 |
| 133 | 128 | ||
| 129 | + GTK_PW3270_SETTINGS_DIALOG(dialog)->has_subtitle = has_subtitle; | ||
| 130 | + | ||
| 134 | if(action) { | 131 | if(action) { |
| 135 | 132 | ||
| 136 | if(PW3270_IS_ACTION(action)) { | 133 | if(PW3270_IS_ACTION(action)) { |
| @@ -202,6 +199,7 @@ void add(GtkContainer *container, GtkWidget *widget) { | @@ -202,6 +199,7 @@ void add(GtkContainer *container, GtkWidget *widget) { | ||
| 202 | settings->load(widget,settings->settings); | 199 | settings->load(widget,settings->settings); |
| 203 | } | 200 | } |
| 204 | 201 | ||
| 202 | + gtk_widget_show(widget); | ||
| 205 | gtk_notebook_append_page( | 203 | gtk_notebook_append_page( |
| 206 | GTK_PW3270_SETTINGS_DIALOG(container)->tabs, | 204 | GTK_PW3270_SETTINGS_DIALOG(container)->tabs, |
| 207 | widget, | 205 | widget, |
| @@ -216,20 +214,11 @@ void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint | @@ -216,20 +214,11 @@ void page_changed(GtkNotebook *notebook, GtkWidget G_GNUC_UNUSED(*child), guint | ||
| 216 | 214 | ||
| 217 | void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) { | 215 | void switch_page(GtkNotebook *notebook, PW3270Settings *page, guint G_GNUC_UNUSED(page_num), PW3270SettingsDialog *dialog) { |
| 218 | 216 | ||
| 219 | - if(gtk_notebook_get_n_pages(notebook) > 1) { | ||
| 220 | - | ||
| 221 | - GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); | ||
| 222 | - | ||
| 223 | - if(header_bar) { | ||
| 224 | - gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),page->title); | ||
| 225 | - } | ||
| 226 | - | ||
| 227 | - } else if(page->title) { | ||
| 228 | - | ||
| 229 | - gtk_window_set_title(GTK_WINDOW(dialog),page->title); | 217 | + GtkWidget * header_bar = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); |
| 230 | 218 | ||
| 219 | + if(header_bar && dialog->has_subtitle) { | ||
| 220 | + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header_bar),page->title); | ||
| 231 | } | 221 | } |
| 232 | 222 | ||
| 233 | - | ||
| 234 | } | 223 | } |
| 235 | 224 |
src/objects/toolbar/actions.c
| @@ -65,21 +65,35 @@ | @@ -65,21 +65,35 @@ | ||
| 65 | 65 | ||
| 66 | if(!action) { | 66 | if(!action) { |
| 67 | const gchar *ptr = strchr(name,'.'); | 67 | const gchar *ptr = strchr(name,'.'); |
| 68 | - | ||
| 69 | if(ptr) { | 68 | if(ptr) { |
| 70 | action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1); | 69 | action = g_action_map_lookup_action(G_ACTION_MAP(window), ptr+1); |
| 71 | - debug("action(%s)=%p",ptr+1,action); | ||
| 72 | } | 70 | } |
| 71 | + } | ||
| 73 | 72 | ||
| 73 | + if(!action) { | ||
| 74 | + action = g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()),name); | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + if(!action) { | ||
| 78 | + const gchar *ptr = strchr(name,'.'); | ||
| 79 | + if(ptr) { | ||
| 80 | + action = g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()), ptr+1); | ||
| 81 | + } | ||
| 74 | } | 82 | } |
| 75 | 83 | ||
| 76 | debug("%s(%s)=%p",__FUNCTION__,name,action); | 84 | debug("%s(%s)=%p",__FUNCTION__,name,action); |
| 77 | 85 | ||
| 78 | - if(action) { | ||
| 79 | - debug("Creating button \"%s\" from action \"%s\"",name,g_action_get_name(G_ACTION(action))); | ||
| 80 | - item = gtk_tool_button_new_from_action(action,GTK_ICON_SIZE_LARGE_TOOLBAR); | 86 | + if(!action) { |
| 87 | + g_warning("Can't find action \"%s\"",name); | ||
| 88 | + return NULL; | ||
| 81 | } | 89 | } |
| 82 | 90 | ||
| 91 | + item = gtk_tool_button_new_from_action( | ||
| 92 | + action, | ||
| 93 | + GTK_ICON_SIZE_LARGE_TOOLBAR, | ||
| 94 | + pw3270_toolbar_get_icon_type(GTK_TOOLBAR(toolbar)) == 1 | ||
| 95 | + ); | ||
| 96 | + | ||
| 83 | if(item) { | 97 | if(item) { |
| 84 | 98 | ||
| 85 | gtk_widget_show_all(GTK_WIDGET(item)); | 99 | gtk_widget_show_all(GTK_WIDGET(item)); |
| @@ -0,0 +1,277 @@ | @@ -0,0 +1,277 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | + #include "private.h" | ||
| 31 | + #include <pw3270/application.h> | ||
| 32 | + #include <pw3270/settings.h> | ||
| 33 | + #include <pw3270/window.h> | ||
| 34 | + | ||
| 35 | + #define GTK_TOOLBAR_DEFAULT_STYLE ((GtkToolbarStyle) -1) | ||
| 36 | + | ||
| 37 | + struct _contents { | ||
| 38 | + const gchar * label; | ||
| 39 | + int value; | ||
| 40 | + }; | ||
| 41 | + | ||
| 42 | + static const struct _models { | ||
| 43 | + const gchar *name; | ||
| 44 | + const gchar *property; | ||
| 45 | + const gchar *label; | ||
| 46 | + const struct _contents *contents; | ||
| 47 | + } models[] = { | ||
| 48 | + | ||
| 49 | + { | ||
| 50 | + "toolbar-icon-size", | ||
| 51 | + "icon-size", | ||
| 52 | + N_("Icon _size"), | ||
| 53 | + (const struct _contents[]) { | ||
| 54 | + { | ||
| 55 | + .label = N_( "System default" ), | ||
| 56 | + .value = GTK_ICON_SIZE_INVALID | ||
| 57 | + | ||
| 58 | + }, | ||
| 59 | + | ||
| 60 | + { | ||
| 61 | + .label = N_( "Small" ), | ||
| 62 | + .value = GTK_ICON_SIZE_SMALL_TOOLBAR | ||
| 63 | + }, | ||
| 64 | + | ||
| 65 | + { | ||
| 66 | + .label = N_( "Large" ), | ||
| 67 | + .value = GTK_ICON_SIZE_LARGE_TOOLBAR | ||
| 68 | + }, | ||
| 69 | + | ||
| 70 | + { | ||
| 71 | + .label = NULL | ||
| 72 | + } | ||
| 73 | + } | ||
| 74 | + }, | ||
| 75 | + | ||
| 76 | + { | ||
| 77 | + "toolbar-style", | ||
| 78 | + "style", | ||
| 79 | + N_("Toolbar s_tyle"), | ||
| 80 | + (const struct _contents[]) { | ||
| 81 | + { | ||
| 82 | + .label = N_( "System default" ), | ||
| 83 | + .value = GTK_TOOLBAR_DEFAULT_STYLE | ||
| 84 | + }, | ||
| 85 | + | ||
| 86 | + { | ||
| 87 | + .label = N_( "Icons only" ), | ||
| 88 | + .value = GTK_TOOLBAR_ICONS | ||
| 89 | + }, | ||
| 90 | + | ||
| 91 | + { | ||
| 92 | + .label = N_( "Text only" ), | ||
| 93 | + .value = GTK_TOOLBAR_TEXT | ||
| 94 | + }, | ||
| 95 | + | ||
| 96 | + { | ||
| 97 | + .label = N_( "Icons & text" ), | ||
| 98 | + .value = GTK_TOOLBAR_BOTH | ||
| 99 | + }, | ||
| 100 | + { | ||
| 101 | + .label = NULL | ||
| 102 | + } | ||
| 103 | + } | ||
| 104 | + }, | ||
| 105 | + { | ||
| 106 | + "toolbar-icon-type", | ||
| 107 | + "icon-type", | ||
| 108 | + N_("Icon type"), | ||
| 109 | + (const struct _contents[]) { | ||
| 110 | + { | ||
| 111 | + .label = N_( "System default" ), | ||
| 112 | + .value = 0 | ||
| 113 | + }, | ||
| 114 | + { | ||
| 115 | + .label = N_( "Symbolic" ), | ||
| 116 | + .value = 1 | ||
| 117 | + }, | ||
| 118 | + { | ||
| 119 | + .label = NULL | ||
| 120 | + } | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + }; | ||
| 125 | + | ||
| 126 | + GtkTreeModel * pw3270_model_from_name(const gchar *name) { | ||
| 127 | + | ||
| 128 | + size_t model; | ||
| 129 | + | ||
| 130 | + for(model = 0; model < G_N_ELEMENTS(models); model++) { | ||
| 131 | + | ||
| 132 | + if(g_ascii_strcasecmp(models[model].name,name)) | ||
| 133 | + continue; | ||
| 134 | + | ||
| 135 | + // Create model | ||
| 136 | + size_t row; | ||
| 137 | + GtkTreeIter iter; | ||
| 138 | + GtkListStore * store = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT); | ||
| 139 | + | ||
| 140 | + for(row = 0; models[model].contents[row].label; row++) { | ||
| 141 | + gtk_list_store_append(store,&iter); | ||
| 142 | + gtk_list_store_set( store, | ||
| 143 | + &iter, | ||
| 144 | + 0, gettext(models[model].contents[row].label), | ||
| 145 | + 1, models[model].contents[row].value, | ||
| 146 | + -1); | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + return GTK_TREE_MODEL(store); | ||
| 150 | + | ||
| 151 | + } | ||
| 152 | + | ||
| 153 | + g_warning("Can't create combobox '%s'",name); | ||
| 154 | + return NULL; | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) { | ||
| 158 | + | ||
| 159 | + if(gtk_tree_model_get_iter_first(model,iter)) { | ||
| 160 | + | ||
| 161 | + do { | ||
| 162 | + | ||
| 163 | + GValue gVal = { 0, }; | ||
| 164 | + gtk_tree_model_get_value(model,iter,1,&gVal); | ||
| 165 | + guint iVal = g_value_get_uint(&gVal); | ||
| 166 | + g_value_unset(&gVal); | ||
| 167 | + | ||
| 168 | + if(iVal == value) { | ||
| 169 | + return; | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + } while(gtk_tree_model_iter_next(model,iter)); | ||
| 173 | + | ||
| 174 | + } | ||
| 175 | + | ||
| 176 | + } | ||
| 177 | + | ||
| 178 | + guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) { | ||
| 179 | + GValue gVal = { 0, }; | ||
| 180 | + gtk_tree_model_get_value(model,iter,1,&gVal); | ||
| 181 | + guint iVal = g_value_get_uint(&gVal); | ||
| 182 | + g_value_unset(&gVal); | ||
| 183 | + return iVal; | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + static void set_property(GObject *menuitem, GObject *widget) { | ||
| 187 | + | ||
| 188 | + if(gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) { | ||
| 189 | + | ||
| 190 | + const struct _contents *model = (const struct _contents *) g_object_get_data(menuitem, I_("pw3270_model_data")); | ||
| 191 | + const char *name = (const char *) g_object_get_data(menuitem, I_("pw3270_property_name")); | ||
| 192 | + | ||
| 193 | + debug("%s(%s,%d)",__FUNCTION__,name,model->value); | ||
| 194 | + g_object_set(widget,name,model->value,NULL); | ||
| 195 | + | ||
| 196 | + } | ||
| 197 | + | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + static void set_toggle_menu_item(GtkCheckMenuItem *item, gint *value) { | ||
| 201 | + const struct _contents *model = (const struct _contents *) g_object_get_data(G_OBJECT(item), I_("pw3270_model_data")); | ||
| 202 | + if(model) { | ||
| 203 | + gtk_check_menu_item_set_active(item,model->value == *value); | ||
| 204 | + } | ||
| 205 | + } | ||
| 206 | + | ||
| 207 | + static void property_changed(GObject *widget, GParamSpec G_GNUC_UNUSED(*pspec), GtkContainer *menu) { | ||
| 208 | + | ||
| 209 | + gint value = -1; | ||
| 210 | + const gchar * name = g_object_get_data(G_OBJECT(menu), I_("pw3270_property_name")); | ||
| 211 | + g_object_get(widget,name,&value,NULL); | ||
| 212 | + | ||
| 213 | + debug("%s(%p,%s)=%d",__FUNCTION__,widget,name,value); | ||
| 214 | + | ||
| 215 | + gtk_container_foreach(menu,(GtkCallback) set_toggle_menu_item,&value); | ||
| 216 | + | ||
| 217 | + | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *name) { | ||
| 221 | + | ||
| 222 | + size_t model; | ||
| 223 | + | ||
| 224 | + | ||
| 225 | + for(model = 0; model < G_N_ELEMENTS(models); model++) { | ||
| 226 | + | ||
| 227 | + if(g_ascii_strcasecmp(models[model].name,name)) | ||
| 228 | + continue; | ||
| 229 | + | ||
| 230 | + // Create submenu | ||
| 231 | + size_t row; | ||
| 232 | + GtkWidget * item; | ||
| 233 | + GtkWidget * menu = gtk_menu_item_new_with_mnemonic(gettext(models[model].label)); | ||
| 234 | + | ||
| 235 | + GtkWidget * submenu = gtk_menu_new(); | ||
| 236 | + g_object_set_data(G_OBJECT(submenu),I_("pw3270_property_name"),(gpointer) models[model].property); | ||
| 237 | + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu),submenu); | ||
| 238 | + | ||
| 239 | + gint selected = -1; | ||
| 240 | + if(widget) { | ||
| 241 | + g_object_get(G_OBJECT(widget),models[model].property,&selected,NULL); | ||
| 242 | + g_autofree gchar * signame = g_strconcat("notify::",models[model].property,NULL); | ||
| 243 | + g_signal_connect(G_OBJECT(widget),signame,G_CALLBACK(property_changed),submenu); | ||
| 244 | + } | ||
| 245 | + | ||
| 246 | + for(row = 0; models[model].contents[row].label; row++) { | ||
| 247 | + | ||
| 248 | + item = gtk_check_menu_item_new_with_mnemonic(gettext(models[model].contents[row].label)); | ||
| 249 | + gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE); | ||
| 250 | + | ||
| 251 | + g_object_set_data(G_OBJECT(item),I_("pw3270_property_name"),(gpointer) models[model].property); | ||
| 252 | + g_object_set_data(G_OBJECT(item),I_("pw3270_model_data"),(gpointer) &models[model].contents[row]); | ||
| 253 | + | ||
| 254 | + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item),selected == models[model].contents[row].value); | ||
| 255 | + | ||
| 256 | + if(widget) { | ||
| 257 | + g_signal_connect(item, "toggled", G_CALLBACK(set_property), widget); | ||
| 258 | + } | ||
| 259 | + | ||
| 260 | + gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item); | ||
| 261 | + | ||
| 262 | + } | ||
| 263 | + | ||
| 264 | + gtk_widget_show_all(menu); | ||
| 265 | + | ||
| 266 | + return menu; | ||
| 267 | + } | ||
| 268 | + | ||
| 269 | + return NULL; | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + void pw3270_menu_item_set_value(GtkWidget *menu, guint value) { | ||
| 273 | + | ||
| 274 | + debug("%s(%p,%d)",__FUNCTION__,menu,value); | ||
| 275 | + | ||
| 276 | + } | ||
| 277 | + |
src/objects/toolbar/private.h
| @@ -37,6 +37,9 @@ | @@ -37,6 +37,9 @@ | ||
| 37 | #define GETTEXT_PACKAGE PACKAGE_NAME | 37 | #define GETTEXT_PACKAGE PACKAGE_NAME |
| 38 | #endif | 38 | #endif |
| 39 | 39 | ||
| 40 | + /* not really I18N-related, but also a string marker macro */ | ||
| 41 | + #define I_(string) g_intern_static_string (string) | ||
| 42 | + | ||
| 40 | #include <libintl.h> | 43 | #include <libintl.h> |
| 41 | #include <glib/gi18n.h> | 44 | #include <glib/gi18n.h> |
| 42 | #include <gtk/gtk.h> | 45 | #include <gtk/gtk.h> |
| @@ -47,8 +50,9 @@ | @@ -47,8 +50,9 @@ | ||
| 47 | G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action); | 50 | G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new(GAction *action); |
| 48 | G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name); | 51 | G_GNUC_INTERNAL GtkWidget * pw3270_tool_button_new_from_action_name(const gchar * action_name); |
| 49 | 52 | ||
| 50 | - G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_style_model_new(); | ||
| 51 | - G_GNUC_INTERNAL GtkTreeModel * pw3270_toolbar_icon_size_model_new(); | 53 | + GtkTreeModel * pw3270_model_from_name(const gchar *name); |
| 54 | + GtkWidget * pw3270_menu_item_from_model(GtkWidget *widget, const gchar *model_name); | ||
| 55 | + void pw3270_menu_item_set_value(GtkWidget *menu, guint value); | ||
| 52 | 56 | ||
| 53 | G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value); | 57 | G_GNUC_INTERNAL void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value); |
| 54 | G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter); | 58 | G_GNUC_INTERNAL guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter); |
src/objects/toolbar/settings.c
| @@ -41,45 +41,43 @@ | @@ -41,45 +41,43 @@ | ||
| 41 | /*--[ Constants ]------------------------------------------------------------------------------------*/ | 41 | /*--[ Constants ]------------------------------------------------------------------------------------*/ |
| 42 | 42 | ||
| 43 | static const struct _comboboxes { | 43 | static const struct _comboboxes { |
| 44 | - const gchar * name; | ||
| 45 | - const gchar * label; | 44 | + const gchar * name; ///< @brief The gsettings name. |
| 45 | + const gchar * label; ///< @brief The combo name. | ||
| 46 | + guint left; | ||
| 47 | + guint top; | ||
| 46 | } comboboxes[] = { | 48 | } comboboxes[] = { |
| 47 | 49 | ||
| 48 | { | 50 | { |
| 51 | + .left = 0, | ||
| 52 | + .top = 0, | ||
| 49 | .name = "toolbar-icon-size", | 53 | .name = "toolbar-icon-size", |
| 50 | .label = N_("Icon Size"), | 54 | .label = N_("Icon Size"), |
| 51 | }, | 55 | }, |
| 52 | 56 | ||
| 53 | { | 57 | { |
| 58 | + .left = 3, | ||
| 59 | + .top = 0, | ||
| 60 | + .name = "toolbar-icon-type", | ||
| 61 | + .label = N_("Icon Style") | ||
| 62 | + }, | ||
| 63 | + | ||
| 64 | + { | ||
| 65 | + .left = 0, | ||
| 66 | + .top = 1, | ||
| 54 | .name = "toolbar-style", | 67 | .name = "toolbar-style", |
| 55 | - .label = N_("Style") | 68 | + .label = N_("Toolbar Style") |
| 56 | } | 69 | } |
| 57 | 70 | ||
| 58 | }; | 71 | }; |
| 59 | 72 | ||
| 60 | struct _PW3270SettingsPrivate { | 73 | struct _PW3270SettingsPrivate { |
| 61 | GtkWidget * views[2]; | 74 | GtkWidget * views[2]; |
| 62 | - GtkWidget * buttons[2]; | ||
| 63 | - GtkTreeModel * models[2]; | 75 | +// GtkTreeModel * models[G_N_ELEMENTS(comboboxes)]; |
| 64 | GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; | 76 | GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; |
| 65 | }; | 77 | }; |
| 66 | 78 | ||
| 67 | /*--[ Implement ]------------------------------------------------------------------------------------*/ | 79 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 68 | 80 | ||
| 69 | - static void selection_changed(GtkTreeSelection *selection, GtkWidget *button) { | ||
| 70 | - gtk_widget_set_sensitive(button,gtk_tree_selection_count_selected_rows(selection) > 0); | ||
| 71 | - } | ||
| 72 | - | ||
| 73 | - void toolbar_insert(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { | ||
| 74 | - debug("%s(%p)",__FUNCTION__,settings); | ||
| 75 | - pw3270_action_view_move_selected(settings->views[1],settings->views[0]); | ||
| 76 | - } | ||
| 77 | - | ||
| 78 | - void toolbar_remove(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { | ||
| 79 | - debug("%s(%p)",__FUNCTION__,settings); | ||
| 80 | - pw3270_action_view_move_selected(settings->views[0],settings->views[1]); | ||
| 81 | - } | ||
| 82 | - | ||
| 83 | GtkWidget * pw3270_toolbar_settings_new() { | 81 | GtkWidget * pw3270_toolbar_settings_new() { |
| 84 | 82 | ||
| 85 | size_t ix; | 83 | size_t ix; |
| @@ -132,6 +130,7 @@ | @@ -132,6 +130,7 @@ | ||
| 132 | 130 | ||
| 133 | GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); | 131 | GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); |
| 134 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); | 132 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); |
| 133 | + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(box),GTK_SHADOW_ETCHED_IN); | ||
| 135 | gtk_container_add(GTK_CONTAINER(box),page->views[ix]); | 134 | gtk_container_add(GTK_CONTAINER(box),page->views[ix]); |
| 136 | 135 | ||
| 137 | gtk_grid_attach( | 136 | gtk_grid_attach( |
| @@ -143,50 +142,20 @@ | @@ -143,50 +142,20 @@ | ||
| 143 | } | 142 | } |
| 144 | 143 | ||
| 145 | gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE); | 144 | gtk_tree_view_set_reorderable(GTK_TREE_VIEW(page->views[0]),TRUE); |
| 146 | - gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(gtk_tree_view_get_model(GTK_TREE_VIEW(page->views[1]))), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING); | 145 | + pw3270_action_view_order_by_label(page->views[1]); |
| 147 | 146 | ||
| 148 | // Create buttons | 147 | // Create buttons |
| 149 | - static const gchar * icon_names[G_N_ELEMENTS(page->buttons)] = { | ||
| 150 | - "go-next", | ||
| 151 | - "go-previous" | ||
| 152 | - }; | ||
| 153 | - | ||
| 154 | GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); | 148 | GtkWidget * box = gtk_button_box_new(GTK_ORIENTATION_VERTICAL); |
| 155 | gtk_widget_set_hexpand(box,FALSE); | 149 | gtk_widget_set_hexpand(box,FALSE); |
| 156 | gtk_widget_set_vexpand(box,FALSE); | 150 | gtk_widget_set_vexpand(box,FALSE); |
| 157 | 151 | ||
| 158 | - for(ix = 0; ix < G_N_ELEMENTS(icon_names); ix++) { | ||
| 159 | - page->buttons[ix] = gtk_button_new_from_icon_name(icon_names[ix],GTK_ICON_SIZE_DND); | ||
| 160 | - | ||
| 161 | - gtk_widget_set_focus_on_click(page->buttons[ix],FALSE); | ||
| 162 | - gtk_button_set_relief(GTK_BUTTON(page->buttons[ix]),GTK_RELIEF_NONE); | ||
| 163 | - gtk_widget_set_sensitive(page->buttons[ix],FALSE); | ||
| 164 | - | ||
| 165 | - g_signal_connect( | ||
| 166 | - gtk_tree_view_get_selection(GTK_TREE_VIEW(page->views[ix])), | ||
| 167 | - "changed", | ||
| 168 | - G_CALLBACK(selection_changed), | ||
| 169 | - page->buttons[ix] | ||
| 170 | - ); | ||
| 171 | - | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - gtk_box_pack_start(GTK_BOX(box),page->buttons[0],FALSE,FALSE,0); | ||
| 175 | - gtk_box_pack_end(GTK_BOX(box),page->buttons[1],FALSE,FALSE,0); | ||
| 176 | - | ||
| 177 | - g_signal_connect( | ||
| 178 | - page->buttons[0], | ||
| 179 | - "clicked", | ||
| 180 | - G_CALLBACK(toolbar_remove), | ||
| 181 | - page | ||
| 182 | - ); | 152 | + GtkWidget * buttons[] = { |
| 153 | + pw3270_action_view_move_button_new(page->views[0],page->views[1],"go-next"), | ||
| 154 | + pw3270_action_view_move_button_new(page->views[1],page->views[0],"go-previous"), | ||
| 155 | + }; | ||
| 183 | 156 | ||
| 184 | - g_signal_connect( | ||
| 185 | - page->buttons[1], | ||
| 186 | - "clicked", | ||
| 187 | - G_CALLBACK(toolbar_insert), | ||
| 188 | - page | ||
| 189 | - ); | 157 | + gtk_box_pack_start(GTK_BOX(box),buttons[0],FALSE,FALSE,0); |
| 158 | + gtk_box_pack_end(GTK_BOX(box),buttons[1],FALSE,FALSE,0); | ||
| 190 | 159 | ||
| 191 | gtk_grid_attach( | 160 | gtk_grid_attach( |
| 192 | grid, | 161 | grid, |
| @@ -197,7 +166,7 @@ | @@ -197,7 +166,7 @@ | ||
| 197 | } | 166 | } |
| 198 | 167 | ||
| 199 | // | 168 | // |
| 200 | - // Create style & icon size settings. | 169 | + // Create Combos. |
| 201 | // | 170 | // |
| 202 | { | 171 | { |
| 203 | GtkGrid * grid = GTK_GRID(gtk_grid_new()); | 172 | GtkGrid * grid = GTK_GRID(gtk_grid_new()); |
| @@ -213,25 +182,24 @@ | @@ -213,25 +182,24 @@ | ||
| 213 | gtk_grid_set_column_spacing(grid,12); | 182 | gtk_grid_set_column_spacing(grid,12); |
| 214 | gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE); | 183 | gtk_widget_set_hexpand(GTK_WIDGET(grid),TRUE); |
| 215 | 184 | ||
| 216 | - page->models[0] = pw3270_toolbar_icon_size_model_new(); | ||
| 217 | - page->models[1] = pw3270_toolbar_style_model_new(); | ||
| 218 | - | ||
| 219 | GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); | 185 | GtkCellRenderer * renderer = gtk_cell_renderer_text_new(); |
| 220 | 186 | ||
| 221 | - for(ix = 0; ix < G_N_ELEMENTS(page->models); ix++) { | 187 | + for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { |
| 188 | + | ||
| 189 | + GtkTreeModel *model = pw3270_model_from_name(comboboxes[ix].name); | ||
| 222 | 190 | ||
| 223 | GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label)); | 191 | GtkWidget * label = gtk_label_new(gettext(comboboxes[ix].label)); |
| 224 | gtk_label_set_xalign(GTK_LABEL(label),1); | 192 | gtk_label_set_xalign(GTK_LABEL(label),1); |
| 225 | 193 | ||
| 226 | - gtk_grid_attach(grid,label,(ix*3),0,1,1); | 194 | + gtk_grid_attach(grid,label,comboboxes[ix].left,comboboxes[ix].top,1,1); |
| 227 | 195 | ||
| 228 | - page->combos[ix] = gtk_combo_box_new_with_model(page->models[ix]); | ||
| 229 | - gtk_widget_set_hexpand(page->combos[ix],TRUE); | 196 | + page->combos[ix] = gtk_combo_box_new_with_model(model); |
| 197 | + gtk_widget_set_hexpand(page->combos[ix],FALSE); | ||
| 230 | 198 | ||
| 231 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE); | 199 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(page->combos[ix]), renderer, TRUE); |
| 232 | gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL); | 200 | gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(page->combos[ix]), renderer, "text", 0, NULL); |
| 233 | 201 | ||
| 234 | - gtk_grid_attach(grid,page->combos[ix],(ix*3)+1,0,2,1); | 202 | + gtk_grid_attach(grid,page->combos[ix],comboboxes[ix].left+1,comboboxes[ix].top,2,1); |
| 235 | 203 | ||
| 236 | } | 204 | } |
| 237 | 205 | ||
| @@ -273,12 +241,11 @@ | @@ -273,12 +241,11 @@ | ||
| 273 | 241 | ||
| 274 | // Load available actions. | 242 | // Load available actions. |
| 275 | pw3270_action_view_set_actions(page->views[1], action_list); | 243 | pw3270_action_view_set_actions(page->views[1], action_list); |
| 276 | - pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", 1); | 244 | + pw3270_action_view_append(page->views[1], _( "Separator"), NULL, "separator", PW3270_ACTION_VIEW_FLAG_ALLOW_ADD); |
| 277 | 245 | ||
| 278 | pw3270_action_list_free(action_list); | 246 | pw3270_action_list_free(action_list); |
| 279 | 247 | ||
| 280 | GtkTreeIter iter; | 248 | GtkTreeIter iter; |
| 281 | - | ||
| 282 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { | 249 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { |
| 283 | 250 | ||
| 284 | pw3270_model_get_iter_from_value( | 251 | pw3270_model_get_iter_from_value( |
| @@ -298,13 +265,9 @@ | @@ -298,13 +265,9 @@ | ||
| 298 | size_t ix; | 265 | size_t ix; |
| 299 | g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | 266 | g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); |
| 300 | 267 | ||
| 301 | - debug("%s",__FUNCTION__); | ||
| 302 | - | ||
| 303 | g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]); | 268 | g_autofree gchar * action_names = pw3270_action_view_get_action_names(page->views[0]); |
| 304 | g_settings_set_string(settings,"toolbar-action-names",action_names); | 269 | g_settings_set_string(settings,"toolbar-action-names",action_names); |
| 305 | 270 | ||
| 306 | - debug("[%s]",action_names); | ||
| 307 | - | ||
| 308 | GtkTreeIter iter; | 271 | GtkTreeIter iter; |
| 309 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { | 272 | for(ix = 0; ix < G_N_ELEMENTS(page->combos); ix++) { |
| 310 | 273 | ||
| @@ -322,48 +285,3 @@ | @@ -322,48 +285,3 @@ | ||
| 322 | 285 | ||
| 323 | } | 286 | } |
| 324 | 287 | ||
| 325 | - /* | ||
| 326 | - | ||
| 327 | - typedef struct _ToolbarSettingsPage { | ||
| 328 | - Pw3270SettingsPage parent; | ||
| 329 | - GtkWidget * views[2]; | ||
| 330 | - GtkWidget * buttons[2]; | ||
| 331 | - GtkTreeModel * models[2]; | ||
| 332 | - GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; | ||
| 333 | - | ||
| 334 | - } ToolbarSettingsPage; | ||
| 335 | - | ||
| 336 | - static void load(Pw3270SettingsPage *pg, GtkApplication *application) { | ||
| 337 | - | ||
| 338 | - size_t ix; | ||
| 339 | - ToolbarSettingsPage * page = (ToolbarSettingsPage *) pg; | ||
| 340 | - g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | ||
| 341 | - | ||
| 342 | - debug("%s",__FUNCTION__); | ||
| 343 | - | ||
| 344 | - | ||
| 345 | - } | ||
| 346 | - | ||
| 347 | - static void apply(Pw3270SettingsPage *pg, GtkApplication G_GNUC_UNUSED(*application)) { | ||
| 348 | - | ||
| 349 | - } | ||
| 350 | - | ||
| 351 | - | ||
| 352 | - Pw3270SettingsPage * pw3270_toolbar_settings_new() { | ||
| 353 | - | ||
| 354 | - size_t ix; | ||
| 355 | - | ||
| 356 | - ToolbarSettingsPage * page = g_new0(ToolbarSettingsPage,1); | ||
| 357 | - | ||
| 358 | - page->parent.load = load; | ||
| 359 | - page->parent.apply = apply; | ||
| 360 | - page->parent.label = _("Toolbar"); | ||
| 361 | - page->parent.title = _("Setup toolbar"); | ||
| 362 | - | ||
| 363 | - page->parent.widget = gtk_box_new(GTK_ORIENTATION_VERTICAL,0); | ||
| 364 | - | ||
| 365 | - | ||
| 366 | - | ||
| 367 | - return (Pw3270SettingsPage *) page; | ||
| 368 | - } | ||
| 369 | - */ |
src/objects/toolbar/toolbar.c
| @@ -38,71 +38,33 @@ | @@ -38,71 +38,33 @@ | ||
| 38 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); | 38 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| 39 | static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); | 39 | static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| 40 | 40 | ||
| 41 | - const struct icon_size { | ||
| 42 | - const gchar * label; | ||
| 43 | - GtkIconSize icon_size; | ||
| 44 | - } icon_sizes[] = { | ||
| 45 | - | ||
| 46 | - { | ||
| 47 | - .label = N_( "System default" ), | ||
| 48 | - .icon_size = GTK_ICON_SIZE_INVALID | ||
| 49 | - | ||
| 50 | - }, | ||
| 51 | - | ||
| 52 | - { | ||
| 53 | - .label = N_( "Small" ), | ||
| 54 | - .icon_size = GTK_ICON_SIZE_SMALL_TOOLBAR | ||
| 55 | - }, | ||
| 56 | - | ||
| 57 | - { | ||
| 58 | - .label = N_( "Large" ), | ||
| 59 | - .icon_size = GTK_ICON_SIZE_LARGE_TOOLBAR | ||
| 60 | - }, | ||
| 61 | - }; | ||
| 62 | - | ||
| 63 | - static const struct style { | ||
| 64 | - const gchar * label; | ||
| 65 | - GtkToolbarStyle style; | ||
| 66 | - } styles[] = { | ||
| 67 | - | ||
| 68 | - { | ||
| 69 | - .label = N_( "System default" ), | ||
| 70 | - .style = GTK_TOOLBAR_DEFAULT_STYLE | ||
| 71 | - }, | ||
| 72 | - | ||
| 73 | - { | ||
| 74 | - .label = N_( "Icons only" ), | ||
| 75 | - .style = GTK_TOOLBAR_ICONS | ||
| 76 | - }, | ||
| 77 | - | ||
| 78 | - { | ||
| 79 | - .label = N_( "Text only" ), | ||
| 80 | - .style = GTK_TOOLBAR_TEXT | ||
| 81 | - }, | ||
| 82 | - | ||
| 83 | - { | ||
| 84 | - .label = N_( "Icons & text" ), | ||
| 85 | - .style = GTK_TOOLBAR_BOTH | ||
| 86 | - }, | ||
| 87 | - }; | ||
| 88 | - | ||
| 89 | enum { | 41 | enum { |
| 90 | PROP_NONE, | 42 | PROP_NONE, |
| 91 | PROP_ACTION_NAMES, | 43 | PROP_ACTION_NAMES, |
| 92 | PROP_ICON_SIZE, | 44 | PROP_ICON_SIZE, |
| 45 | + PROP_ICON_TYPE, | ||
| 93 | PROP_STYLE | 46 | PROP_STYLE |
| 94 | }; | 47 | }; |
| 95 | 48 | ||
| 49 | + enum { | ||
| 50 | + TOOLBAR_MENU_STYLE, | ||
| 51 | + TOOLBAR_MENU_ICON_SIZE, | ||
| 52 | + TOOLBAR_MENU_ICON_TYPE | ||
| 53 | + }; | ||
| 54 | + | ||
| 55 | + static const gchar * toolbar_menus[] = { | ||
| 56 | + "toolbar-style", | ||
| 57 | + "toolbar-icon-size", | ||
| 58 | + "toolbar-icon-type" | ||
| 59 | + }; | ||
| 60 | + | ||
| 96 | struct _pw3270ToolBar { | 61 | struct _pw3270ToolBar { |
| 97 | GtkToolbar parent; | 62 | GtkToolbar parent; |
| 98 | GtkToolbarStyle style; | 63 | GtkToolbarStyle style; |
| 64 | + int icon_type; | ||
| 99 | 65 | ||
| 100 | - /// @brief Popup Menu | ||
| 101 | - struct { | ||
| 102 | - GtkWidget * menu; | ||
| 103 | - GtkWidget * styles[G_N_ELEMENTS(styles)]; | ||
| 104 | - GtkWidget * icon_sizes[G_N_ELEMENTS(icon_sizes)]; | ||
| 105 | - } popup; | 66 | + GtkWidget *menu; |
| 67 | + GtkWidget *submenu[G_N_ELEMENTS(toolbar_menus)]; | ||
| 106 | 68 | ||
| 107 | }; | 69 | }; |
| 108 | 70 | ||
| @@ -131,9 +93,9 @@ | @@ -131,9 +93,9 @@ | ||
| 131 | object_class, | 93 | object_class, |
| 132 | PROP_ACTION_NAMES, | 94 | PROP_ACTION_NAMES, |
| 133 | g_param_spec_string ( | 95 | g_param_spec_string ( |
| 134 | - "action-names", | ||
| 135 | - N_("Action Names"), | ||
| 136 | - N_("The name of the actions in the toolbar"), | 96 | + I_("action-names"), |
| 97 | + "Action Names", | ||
| 98 | + _("The name of the actions in the toolbar"), | ||
| 137 | NULL, | 99 | NULL, |
| 138 | G_PARAM_READABLE|G_PARAM_WRITABLE) | 100 | G_PARAM_READABLE|G_PARAM_WRITABLE) |
| 139 | ); | 101 | ); |
| @@ -142,8 +104,8 @@ | @@ -142,8 +104,8 @@ | ||
| 142 | object_class, | 104 | object_class, |
| 143 | PROP_ICON_SIZE, | 105 | PROP_ICON_SIZE, |
| 144 | g_param_spec_int( | 106 | g_param_spec_int( |
| 145 | - "icon-size", | ||
| 146 | - "icon-size", | 107 | + I_("icon-size"), |
| 108 | + "icon size", | ||
| 147 | _("The toolbar icon size"), | 109 | _("The toolbar icon size"), |
| 148 | INT_MIN, | 110 | INT_MIN, |
| 149 | INT_MAX, | 111 | INT_MAX, |
| @@ -155,7 +117,7 @@ | @@ -155,7 +117,7 @@ | ||
| 155 | object_class, | 117 | object_class, |
| 156 | PROP_STYLE, | 118 | PROP_STYLE, |
| 157 | g_param_spec_int( | 119 | g_param_spec_int( |
| 158 | - "style", | 120 | + I_("style"), |
| 159 | "style", | 121 | "style", |
| 160 | _("The toolbar style"), | 122 | _("The toolbar style"), |
| 161 | INT_MIN, | 123 | INT_MIN, |
| @@ -164,6 +126,19 @@ | @@ -164,6 +126,19 @@ | ||
| 164 | G_PARAM_READABLE|G_PARAM_WRITABLE) | 126 | G_PARAM_READABLE|G_PARAM_WRITABLE) |
| 165 | ); | 127 | ); |
| 166 | 128 | ||
| 129 | + g_object_class_install_property( | ||
| 130 | + object_class, | ||
| 131 | + PROP_ICON_TYPE, | ||
| 132 | + g_param_spec_int( | ||
| 133 | + I_("icon-type"), | ||
| 134 | + I_("icon-type"), | ||
| 135 | + _("The toolbar icon type"), | ||
| 136 | + 0, | ||
| 137 | + 1, | ||
| 138 | + 0, | ||
| 139 | + G_PARAM_READABLE|G_PARAM_WRITABLE) | ||
| 140 | + ); | ||
| 141 | + | ||
| 167 | } | 142 | } |
| 168 | 143 | ||
| 169 | void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { | 144 | void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec G_GNUC_UNUSED(*pspec)) { |
| @@ -181,6 +156,10 @@ | @@ -181,6 +156,10 @@ | ||
| 181 | g_value_set_int(value,pw3270_toolbar_get_style(GTK_TOOLBAR(object))); | 156 | g_value_set_int(value,pw3270_toolbar_get_style(GTK_TOOLBAR(object))); |
| 182 | break; | 157 | break; |
| 183 | 158 | ||
| 159 | + case PROP_ICON_TYPE: | ||
| 160 | + g_value_set_int(value,pw3270_toolbar_get_icon_type(GTK_TOOLBAR(object))); | ||
| 161 | + break; | ||
| 162 | + | ||
| 184 | default: | 163 | default: |
| 185 | g_assert_not_reached (); | 164 | g_assert_not_reached (); |
| 186 | } | 165 | } |
| @@ -203,42 +182,27 @@ | @@ -203,42 +182,27 @@ | ||
| 203 | pw3270_toolbar_set_style(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value)); | 182 | pw3270_toolbar_set_style(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value)); |
| 204 | break; | 183 | break; |
| 205 | 184 | ||
| 185 | + case PROP_ICON_TYPE: | ||
| 186 | + pw3270_toolbar_set_icon_type(GTK_TOOLBAR(object),(GtkToolbarStyle) g_value_get_int(value)); | ||
| 187 | + break; | ||
| 188 | + | ||
| 206 | default: | 189 | default: |
| 207 | g_assert_not_reached (); | 190 | g_assert_not_reached (); |
| 208 | } | 191 | } |
| 209 | 192 | ||
| 210 | } | 193 | } |
| 211 | 194 | ||
| 212 | - | ||
| 213 | static void detacher(GtkWidget *attach_widget, GtkMenu G_GNUC_UNUSED(*menu)) { | 195 | static void detacher(GtkWidget *attach_widget, GtkMenu G_GNUC_UNUSED(*menu)) { |
| 214 | 196 | ||
| 215 | pw3270ToolBar * toolbar = PW3270_TOOLBAR(attach_widget); | 197 | pw3270ToolBar * toolbar = PW3270_TOOLBAR(attach_widget); |
| 216 | - toolbar->popup.menu = NULL; | ||
| 217 | - | ||
| 218 | - } | ||
| 219 | - | ||
| 220 | - static void set_icon_size(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) { | ||
| 221 | - | ||
| 222 | - if(gtk_check_menu_item_get_active(menuitem)) { | ||
| 223 | - const struct icon_size * size = g_object_get_data(G_OBJECT(menuitem),"icon_size"); | ||
| 224 | - pw3270_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), size->icon_size); | ||
| 225 | - } | 198 | + toolbar->menu = NULL; |
| 226 | 199 | ||
| 227 | } | 200 | } |
| 228 | 201 | ||
| 229 | - static void set_style(GtkCheckMenuItem *menuitem, GtkWidget *toolbar) { | ||
| 230 | - | ||
| 231 | - if(gtk_check_menu_item_get_active(menuitem)) { | ||
| 232 | - struct style * style = g_object_get_data(G_OBJECT(menuitem),"toolbar_style"); | ||
| 233 | - pw3270_toolbar_set_style(GTK_TOOLBAR(toolbar), style->style); | ||
| 234 | - } | ||
| 235 | - | ||
| 236 | - } | ||
| 237 | - | ||
| 238 | - static void open_properties(GtkMenuItem G_GNUC_UNUSED(*menuitem), GtkWidget *toolbar) { | 202 | + static void open_preferences(GtkMenuItem G_GNUC_UNUSED(*menuitem), GtkWidget *toolbar) { |
| 239 | 203 | ||
| 240 | GtkWidget * window = gtk_widget_get_toplevel(toolbar); | 204 | GtkWidget * window = gtk_widget_get_toplevel(toolbar); |
| 241 | - GtkWidget * dialog = pw3270_settings_dialog_new(NULL); | 205 | + GtkWidget * dialog = pw3270_settings_dialog_new(NULL,FALSE); |
| 242 | 206 | ||
| 243 | gtk_container_add(GTK_CONTAINER(dialog),pw3270_toolbar_settings_new()); | 207 | gtk_container_add(GTK_CONTAINER(dialog),pw3270_toolbar_settings_new()); |
| 244 | 208 | ||
| @@ -247,72 +211,36 @@ | @@ -247,72 +211,36 @@ | ||
| 247 | gtk_window_set_attached_to(GTK_WINDOW(dialog), window); | 211 | gtk_window_set_attached_to(GTK_WINDOW(dialog), window); |
| 248 | gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(window)); | 212 | gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(window)); |
| 249 | 213 | ||
| 214 | + gtk_window_set_title(GTK_WINDOW(dialog),_("Setup toolbar")); | ||
| 215 | + | ||
| 250 | gtk_widget_show_all(dialog); | 216 | gtk_widget_show_all(dialog); |
| 251 | 217 | ||
| 252 | } | 218 | } |
| 253 | 219 | ||
| 254 | static void pw3270ToolBar_init(pw3270ToolBar *widget) { | 220 | static void pw3270ToolBar_init(pw3270ToolBar *widget) { |
| 255 | 221 | ||
| 256 | - widget->popup.menu = gtk_menu_new(); | ||
| 257 | - | ||
| 258 | - // Size options | ||
| 259 | - { | ||
| 260 | - size_t ix; | ||
| 261 | - | ||
| 262 | - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("Icon _size") ); | ||
| 263 | - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item); | ||
| 264 | - | ||
| 265 | - GtkWidget * submenu = gtk_menu_new(); | ||
| 266 | - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu); | ||
| 267 | - | ||
| 268 | - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) { | ||
| 269 | - | ||
| 270 | - widget->popup.icon_sizes[ix] = item = gtk_check_menu_item_new_with_mnemonic(gettext(icon_sizes[ix].label)); | ||
| 271 | - gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE); | ||
| 272 | - | ||
| 273 | - g_object_set_data(G_OBJECT(item),"icon_size", (gpointer) &icon_sizes[ix]); | ||
| 274 | - g_signal_connect(item, "toggled", G_CALLBACK(set_icon_size), widget); | 222 | + size_t ix; |
| 275 | 223 | ||
| 276 | - gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item); | 224 | + widget->menu = gtk_menu_new(); |
| 277 | 225 | ||
| 278 | - } | ||
| 279 | - | ||
| 280 | - } | ||
| 281 | - | ||
| 282 | - // Style option | 226 | + // Create menus. |
| 283 | { | 227 | { |
| 284 | - size_t ix; | ||
| 285 | - | ||
| 286 | - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("S_tyle") ); | ||
| 287 | - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item); | ||
| 288 | - | ||
| 289 | - GtkWidget * submenu = gtk_menu_new(); | ||
| 290 | - gtk_menu_item_set_submenu(GTK_MENU_ITEM(item),submenu); | ||
| 291 | - | ||
| 292 | - for(ix = 0; ix < G_N_ELEMENTS(styles); ix++) { | ||
| 293 | - | ||
| 294 | - widget->popup.styles[ix] = item = gtk_check_menu_item_new_with_mnemonic(gettext(styles[ix].label)); | ||
| 295 | - gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item),TRUE); | ||
| 296 | - | ||
| 297 | - g_object_set_data(G_OBJECT(item),"toolbar_style", (gpointer) &styles[ix]); | ||
| 298 | - g_signal_connect(item, "toggled", G_CALLBACK(set_style), widget); | ||
| 299 | - | ||
| 300 | - gtk_menu_shell_append(GTK_MENU_SHELL(submenu),item); | ||
| 301 | - | 228 | + for(ix = 0; ix < G_N_ELEMENTS(widget->submenu); ix++) { |
| 229 | + widget->submenu[ix] = pw3270_menu_item_from_model(GTK_WIDGET(widget),toolbar_menus[ix]); | ||
| 230 | + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),widget->submenu[ix]); | ||
| 302 | } | 231 | } |
| 303 | - | ||
| 304 | } | 232 | } |
| 305 | 233 | ||
| 306 | - // Toolbar properties. | 234 | + // Toolbar preferences. |
| 307 | { | 235 | { |
| 308 | - GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("_Properties") ); | ||
| 309 | - gtk_menu_shell_append(GTK_MENU_SHELL(widget->popup.menu),item); | ||
| 310 | - g_signal_connect(item, "activate", G_CALLBACK(open_properties), widget); | 236 | + GtkWidget * item = gtk_menu_item_new_with_mnemonic( _("_Preferences") ); |
| 237 | + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),gtk_separator_menu_item_new()); | ||
| 238 | + gtk_menu_shell_append(GTK_MENU_SHELL(widget->menu),item); | ||
| 239 | + g_signal_connect(item, "activate", G_CALLBACK(open_preferences), widget); | ||
| 311 | } | 240 | } |
| 312 | 241 | ||
| 313 | - // gtk_container_set_border_width(GTK_CONTAINER(widget->popup_menu),6); | ||
| 314 | - gtk_widget_show_all(widget->popup.menu); | ||
| 315 | - gtk_menu_attach_to_widget(GTK_MENU(widget->popup.menu),GTK_WIDGET(widget),detacher); | 242 | + gtk_widget_show_all(widget->menu); |
| 243 | + gtk_menu_attach_to_widget(GTK_MENU(widget->menu),GTK_WIDGET(widget),detacher); | ||
| 316 | 244 | ||
| 317 | } | 245 | } |
| 318 | 246 | ||
| @@ -332,11 +260,11 @@ | @@ -332,11 +260,11 @@ | ||
| 332 | 260 | ||
| 333 | debug("%s button_number=%d",__FUNCTION__,button_number); | 261 | debug("%s button_number=%d",__FUNCTION__,button_number); |
| 334 | 262 | ||
| 335 | - if(toolbar->popup.menu) { | 263 | + if(toolbar->menu) { |
| 336 | #if GTK_CHECK_VERSION(3,22,0) | 264 | #if GTK_CHECK_VERSION(3,22,0) |
| 337 | - gtk_menu_popup_at_pointer(GTK_MENU(toolbar->popup.menu),NULL); | 265 | + gtk_menu_popup_at_pointer(GTK_MENU(toolbar->menu),NULL); |
| 338 | #else | 266 | #else |
| 339 | - gtk_menu_popup(GTK_MENU(toolbar->popup.menu), NULL, NULL, NULL, NULL, 0, 0); | 267 | + gtk_menu_popup(GTK_MENU(toolbar->menu), NULL, NULL, NULL, NULL, 0, 0); |
| 340 | #endif | 268 | #endif |
| 341 | } | 269 | } |
| 342 | 270 | ||
| @@ -355,22 +283,6 @@ | @@ -355,22 +283,6 @@ | ||
| 355 | else | 283 | else |
| 356 | gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),style); | 284 | gtk_toolbar_set_style(GTK_TOOLBAR(toolbar),style); |
| 357 | 285 | ||
| 358 | - // Update menu | ||
| 359 | - pw3270ToolBar * tb = PW3270_TOOLBAR(toolbar); | ||
| 360 | - if(tb && tb->popup.menu) { | ||
| 361 | - size_t ix; | ||
| 362 | - for(ix = 0; ix < G_N_ELEMENTS(styles); ix++) { | ||
| 363 | - | ||
| 364 | - gtk_check_menu_item_set_active( | ||
| 365 | - GTK_CHECK_MENU_ITEM(tb->popup.styles[ix]), | ||
| 366 | - styles[ix].style == style | ||
| 367 | - ); | ||
| 368 | - } | ||
| 369 | - } | ||
| 370 | - | ||
| 371 | - // Store value | ||
| 372 | -// pw3270_settings_set_int("toolbar-style",(int) style); | ||
| 373 | - | ||
| 374 | g_object_notify(G_OBJECT(toolbar), "style"); | 286 | g_object_notify(G_OBJECT(toolbar), "style"); |
| 375 | 287 | ||
| 376 | } | 288 | } |
| @@ -379,6 +291,46 @@ | @@ -379,6 +291,46 @@ | ||
| 379 | return PW3270_TOOLBAR(toolbar)->style; | 291 | return PW3270_TOOLBAR(toolbar)->style; |
| 380 | } | 292 | } |
| 381 | 293 | ||
| 294 | + gint pw3270_toolbar_get_icon_type(GtkToolbar *toolbar) { | ||
| 295 | + return PW3270_TOOLBAR(toolbar)->icon_type; | ||
| 296 | + } | ||
| 297 | + | ||
| 298 | + void pw3270_toolbar_set_icon_type(GtkToolbar *toolbar, gint icon_type) { | ||
| 299 | + | ||
| 300 | + if(PW3270_TOOLBAR(toolbar)->icon_type == icon_type) | ||
| 301 | + return; | ||
| 302 | + | ||
| 303 | + PW3270_TOOLBAR(toolbar)->icon_type = icon_type; | ||
| 304 | + | ||
| 305 | + // Redefine icon types | ||
| 306 | + GList * children = gtk_container_get_children(GTK_CONTAINER(toolbar)); | ||
| 307 | + GList * item; | ||
| 308 | + | ||
| 309 | + for(item = children;item;item = g_list_next(item)) { | ||
| 310 | + | ||
| 311 | + if(GTK_IS_TOOL_BUTTON(item->data)) { | ||
| 312 | + | ||
| 313 | + g_autofree gchar * icon_name = g_strdup(gtk_tool_button_get_icon_name(GTK_TOOL_BUTTON(item->data))); | ||
| 314 | + if(g_str_has_suffix(icon_name,"-symbolic")) { | ||
| 315 | + icon_name[strlen(icon_name)-9] = 0; | ||
| 316 | + } | ||
| 317 | + | ||
| 318 | + if(icon_type) { | ||
| 319 | + g_autofree gchar * new_name = g_strconcat(icon_name,"-symbolic",NULL); | ||
| 320 | + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item->data),new_name); | ||
| 321 | + } else { | ||
| 322 | + gtk_tool_button_set_icon_name(GTK_TOOL_BUTTON(item->data),icon_name); | ||
| 323 | + } | ||
| 324 | + | ||
| 325 | + } | ||
| 326 | + | ||
| 327 | + } | ||
| 328 | + | ||
| 329 | + g_list_free(children); | ||
| 330 | + g_object_notify(G_OBJECT(toolbar), "icon-type"); | ||
| 331 | + | ||
| 332 | + } | ||
| 333 | + | ||
| 382 | void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size) { | 334 | void pw3270_toolbar_set_icon_size(GtkToolbar *toolbar, GtkIconSize icon_size) { |
| 383 | 335 | ||
| 384 | debug("%s(%d)",__FUNCTION__,(int) icon_size); | 336 | debug("%s(%d)",__FUNCTION__,(int) icon_size); |
| @@ -388,19 +340,6 @@ | @@ -388,19 +340,6 @@ | ||
| 388 | else | 340 | else |
| 389 | gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),icon_size); | 341 | gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),icon_size); |
| 390 | 342 | ||
| 391 | - // Update menu | ||
| 392 | - pw3270ToolBar * tb = PW3270_TOOLBAR(toolbar); | ||
| 393 | - if(tb && tb->popup.menu) { | ||
| 394 | - size_t ix; | ||
| 395 | - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) { | ||
| 396 | - | ||
| 397 | - gtk_check_menu_item_set_active( | ||
| 398 | - GTK_CHECK_MENU_ITEM(tb->popup.icon_sizes[ix]), | ||
| 399 | - icon_sizes[ix].icon_size == icon_size | ||
| 400 | - ); | ||
| 401 | - } | ||
| 402 | - } | ||
| 403 | - | ||
| 404 | // Store value | 343 | // Store value |
| 405 | g_object_notify(G_OBJECT(toolbar), "icon-size"); | 344 | g_object_notify(G_OBJECT(toolbar), "icon-size"); |
| 406 | 345 | ||
| @@ -424,16 +363,46 @@ | @@ -424,16 +363,46 @@ | ||
| 424 | 363 | ||
| 425 | void pw3270_toolbar_set_actions(GtkWidget *toolbar, const gchar *action_names) { | 364 | void pw3270_toolbar_set_actions(GtkWidget *toolbar, const gchar *action_names) { |
| 426 | 365 | ||
| 427 | - gchar ** actions = g_strsplit(action_names,",",-1); | ||
| 428 | - size_t ix; | 366 | + size_t ix; |
| 367 | + gint pos = 0; | ||
| 368 | + | ||
| 369 | + gchar ** blocks = g_strsplit(action_names,":",-1); | ||
| 429 | 370 | ||
| 430 | gtk_container_remove_all(GTK_CONTAINER(toolbar)); | 371 | gtk_container_remove_all(GTK_CONTAINER(toolbar)); |
| 431 | 372 | ||
| 432 | - for(ix = 0; actions[ix]; ix++) { | ||
| 433 | - pw3270_toolbar_insert_action(toolbar,actions[ix],-1); | 373 | + // Left block |
| 374 | + { | ||
| 375 | + gchar ** actions = g_strsplit(blocks[0],",",-1); | ||
| 376 | + | ||
| 377 | + for(ix = 0; actions[ix]; ix++) { | ||
| 378 | + pw3270_toolbar_insert_action(toolbar,actions[ix],pos++); | ||
| 379 | + } | ||
| 380 | + | ||
| 381 | + g_strfreev(actions); | ||
| 382 | + | ||
| 383 | + } | ||
| 384 | + | ||
| 385 | + // Right block | ||
| 386 | + if(blocks[1]) { | ||
| 387 | + | ||
| 388 | + GtkToolItem * item = gtk_separator_tool_item_new(); | ||
| 389 | + | ||
| 390 | + gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(item),FALSE); | ||
| 391 | + gtk_tool_item_set_expand(item,TRUE); | ||
| 392 | + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), item,pos++); | ||
| 393 | + | ||
| 394 | + gchar ** actions = g_strsplit(blocks[1],",",-1); | ||
| 395 | + | ||
| 396 | + for(ix = 0; actions[ix]; ix++) { | ||
| 397 | + pw3270_toolbar_insert_action(toolbar,actions[ix],pos++); | ||
| 398 | + } | ||
| 399 | + | ||
| 400 | + g_strfreev(actions); | ||
| 401 | + | ||
| 434 | } | 402 | } |
| 435 | 403 | ||
| 436 | - g_strfreev(actions); | 404 | + g_strfreev(blocks); |
| 405 | + | ||
| 437 | 406 | ||
| 438 | g_object_notify(G_OBJECT(toolbar), "action-names"); | 407 | g_object_notify(G_OBJECT(toolbar), "action-names"); |
| 439 | 408 | ||
| @@ -464,71 +433,3 @@ | @@ -464,71 +433,3 @@ | ||
| 464 | return g_string_free(str,FALSE); | 433 | return g_string_free(str,FALSE); |
| 465 | } | 434 | } |
| 466 | 435 | ||
| 467 | - GtkTreeModel * pw3270_toolbar_style_model_new() { | ||
| 468 | - | ||
| 469 | - size_t ix; | ||
| 470 | - GtkTreeIter iter; | ||
| 471 | - GtkListStore * model = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT); | ||
| 472 | - | ||
| 473 | - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) { | ||
| 474 | - gtk_list_store_append(model,&iter); | ||
| 475 | - gtk_list_store_set( model, | ||
| 476 | - &iter, | ||
| 477 | - 0, gettext(styles[ix].label), | ||
| 478 | - 1, (guint) styles[ix].style, | ||
| 479 | - -1); | ||
| 480 | - | ||
| 481 | - } | ||
| 482 | - | ||
| 483 | - return GTK_TREE_MODEL(model); | ||
| 484 | - | ||
| 485 | - } | ||
| 486 | - | ||
| 487 | - GtkTreeModel * pw3270_toolbar_icon_size_model_new() { | ||
| 488 | - | ||
| 489 | - size_t ix; | ||
| 490 | - GtkTreeIter iter; | ||
| 491 | - GtkListStore * model = gtk_list_store_new(2, G_TYPE_STRING,G_TYPE_UINT); | ||
| 492 | - | ||
| 493 | - for(ix = 0; ix < G_N_ELEMENTS(icon_sizes); ix++) { | ||
| 494 | - gtk_list_store_append(model,&iter); | ||
| 495 | - gtk_list_store_set( model, | ||
| 496 | - &iter, | ||
| 497 | - 0, gettext(icon_sizes[ix].label), | ||
| 498 | - 1, (guint) icon_sizes[ix].icon_size, | ||
| 499 | - -1); | ||
| 500 | - | ||
| 501 | - } | ||
| 502 | - | ||
| 503 | - return GTK_TREE_MODEL(model); | ||
| 504 | - } | ||
| 505 | - | ||
| 506 | - void pw3270_model_get_iter_from_value(GtkTreeModel * model, GtkTreeIter *iter, guint value) { | ||
| 507 | - | ||
| 508 | - if(gtk_tree_model_get_iter_first(model,iter)) { | ||
| 509 | - | ||
| 510 | - do { | ||
| 511 | - | ||
| 512 | - GValue gVal = { 0, }; | ||
| 513 | - gtk_tree_model_get_value(model,iter,1,&gVal); | ||
| 514 | - guint iVal = g_value_get_uint(&gVal); | ||
| 515 | - g_value_unset(&gVal); | ||
| 516 | - | ||
| 517 | - if(iVal == value) { | ||
| 518 | - return; | ||
| 519 | - } | ||
| 520 | - | ||
| 521 | - } while(gtk_tree_model_iter_next(model,iter)); | ||
| 522 | - | ||
| 523 | - } | ||
| 524 | - | ||
| 525 | - } | ||
| 526 | - | ||
| 527 | - guint pw3270_model_get_value_from_iter(GtkTreeModel * model, GtkTreeIter *iter) { | ||
| 528 | - GValue gVal = { 0, }; | ||
| 529 | - gtk_tree_model_get_value(model,iter,1,&gVal); | ||
| 530 | - guint iVal = g_value_get_uint(&gVal); | ||
| 531 | - g_value_unset(&gVal); | ||
| 532 | - return iVal; | ||
| 533 | -} | ||
| 534 | - |
src/objects/window/actions/sessionproperties.c
| @@ -33,6 +33,7 @@ | @@ -33,6 +33,7 @@ | ||
| 33 | #include <v3270/settings.h> | 33 | #include <v3270/settings.h> |
| 34 | #include <v3270/dialogs.h> | 34 | #include <v3270/dialogs.h> |
| 35 | #include <v3270/colorscheme.h> | 35 | #include <v3270/colorscheme.h> |
| 36 | + #include <pw3270/application.h> | ||
| 36 | 37 | ||
| 37 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | 38 | static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); |
| 38 | 39 | ||
| @@ -42,7 +43,8 @@ | @@ -42,7 +43,8 @@ | ||
| 42 | 43 | ||
| 43 | action->name = "session.properties"; | 44 | action->name = "session.properties"; |
| 44 | action->icon_name = "preferences-other"; | 45 | action->icon_name = "preferences-other"; |
| 45 | - action->label = _("Session properties"); | 46 | + action->label = _("Session preferences"); |
| 47 | + action->tooltip = _("Change the preferences for the active session"); | ||
| 46 | 48 | ||
| 47 | return G_ACTION(action); | 49 | return G_ACTION(action); |
| 48 | } | 50 | } |
| @@ -52,7 +54,6 @@ | @@ -52,7 +54,6 @@ | ||
| 52 | size_t ix; | 54 | size_t ix; |
| 53 | 55 | ||
| 54 | GtkWidget * dialog = v3270_settings_dialog_new(); | 56 | GtkWidget * dialog = v3270_settings_dialog_new(); |
| 55 | - | ||
| 56 | gtk_window_set_title(GTK_WINDOW(dialog), action->label); | 57 | gtk_window_set_title(GTK_WINDOW(dialog), action->label); |
| 57 | 58 | ||
| 58 | // Add settings pages. | 59 | // Add settings pages. |
| @@ -68,6 +69,12 @@ | @@ -68,6 +69,12 @@ | ||
| 68 | gtk_container_add(GTK_CONTAINER(dialog), elements[ix]); | 69 | gtk_container_add(GTK_CONTAINER(dialog), elements[ix]); |
| 69 | } | 70 | } |
| 70 | 71 | ||
| 72 | + pw3270_application_plugin_call( | ||
| 73 | + g_application_get_default(), | ||
| 74 | + "pw3270_plugin_set_session_properties", | ||
| 75 | + dialog | ||
| 76 | + ); | ||
| 77 | + | ||
| 71 | // Setup dialog box | 78 | // Setup dialog box |
| 72 | gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal))); | 79 | gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(gtk_widget_get_toplevel(terminal))); |
| 73 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | 80 | gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); |
| @@ -0,0 +1,174 @@ | @@ -0,0 +1,174 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | + #include "private.h" | ||
| 31 | + #include <pw3270.h> | ||
| 32 | + #include <pw3270/actions.h> | ||
| 33 | + #include <pw3270/settings.h> | ||
| 34 | + #include <pw3270/application.h> | ||
| 35 | + #include <v3270/dialogs.h> | ||
| 36 | + | ||
| 37 | + static void load(GtkWidget *widget, PW3270SettingsPrivate *settings); | ||
| 38 | + static void apply(GtkWidget *widget, PW3270SettingsPrivate *settings); | ||
| 39 | + | ||
| 40 | +/*--[ Constants ]------------------------------------------------------------------------------------*/ | ||
| 41 | + | ||
| 42 | + struct _PW3270SettingsPrivate { | ||
| 43 | + GtkWidget * editor; | ||
| 44 | + /* | ||
| 45 | + GtkWidget * views[3]; | ||
| 46 | + GtkTreeModel * model; | ||
| 47 | + */ | ||
| 48 | + }; | ||
| 49 | + | ||
| 50 | + /* | ||
| 51 | + static const struct _views { | ||
| 52 | + const char * label; | ||
| 53 | + gint left; | ||
| 54 | + gint top; | ||
| 55 | + gint height; | ||
| 56 | + } views[] = { | ||
| 57 | + { | ||
| 58 | + .label = N_("Left"), | ||
| 59 | + .left = 0, | ||
| 60 | + .top = 0, | ||
| 61 | + .height = 4 | ||
| 62 | + }, | ||
| 63 | + { | ||
| 64 | + .label = N_("Right"), | ||
| 65 | + .left = 0, | ||
| 66 | + .top = 6, | ||
| 67 | + .height = 4 | ||
| 68 | + }, | ||
| 69 | + { | ||
| 70 | + .label = N_("Available"), | ||
| 71 | + .left = 2, | ||
| 72 | + .top = 0, | ||
| 73 | + .height = 10 | ||
| 74 | + } | ||
| 75 | + }; | ||
| 76 | + */ | ||
| 77 | + | ||
| 78 | + /*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
| 79 | + | ||
| 80 | + GtkWidget * pw3270_header_settings_new() { | ||
| 81 | + | ||
| 82 | + size_t ix; | ||
| 83 | + | ||
| 84 | + // Create page widget. | ||
| 85 | + PW3270Settings * settings = pw3270_settings_new(); | ||
| 86 | + settings->label = _("Title bar"); | ||
| 87 | + settings->title = _("Setup title bar"); | ||
| 88 | + settings->apply = apply; | ||
| 89 | + settings->load = load; | ||
| 90 | + | ||
| 91 | + // Create private data. | ||
| 92 | + PW3270SettingsPrivate * page = settings->settings = g_new0(PW3270SettingsPrivate,1); | ||
| 93 | + | ||
| 94 | + page->editor = pw3270_settings_actions_new(); | ||
| 95 | + | ||
| 96 | + gtk_grid_attach( | ||
| 97 | + GTK_GRID(settings), | ||
| 98 | + v3270_dialog_section_new(_("Title bar actions"), _("Change the position of the title bar icons"), page->editor), | ||
| 99 | + 0,0,4,3 | ||
| 100 | + ); | ||
| 101 | + | ||
| 102 | + | ||
| 103 | + gtk_widget_show_all(GTK_WIDGET(settings)); | ||
| 104 | + return GTK_WIDGET(settings); | ||
| 105 | + } | ||
| 106 | + | ||
| 107 | + void load(GtkWidget *widget, PW3270SettingsPrivate *page) { | ||
| 108 | + | ||
| 109 | + g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | ||
| 110 | + | ||
| 111 | + // Get avaliable actions. | ||
| 112 | + Pw3270ActionList * action_list = pw3270_action_list_new(GTK_APPLICATION(g_application_get_default())); | ||
| 113 | + | ||
| 114 | + // Add standard menus | ||
| 115 | + { | ||
| 116 | + static const struct menu { | ||
| 117 | + const gchar * action_name; | ||
| 118 | + const gchar * label; | ||
| 119 | + const gchar * icon_name; | ||
| 120 | + } menus[] = { | ||
| 121 | + { | ||
| 122 | + .action_name = "menu.open-menu", | ||
| 123 | + .label = N_("Application menu"), | ||
| 124 | + .icon_name = "open-menu-symbolic" | ||
| 125 | + } | ||
| 126 | + }; | ||
| 127 | + | ||
| 128 | + size_t ix; | ||
| 129 | + | ||
| 130 | + for(ix = 0; ix < G_N_ELEMENTS(menus); ix++) { | ||
| 131 | + | ||
| 132 | + GError *error = NULL; | ||
| 133 | + | ||
| 134 | + GdkPixbuf * pixbuf = gtk_icon_theme_load_icon( | ||
| 135 | + gtk_icon_theme_get_default(), | ||
| 136 | + menus[ix].icon_name, | ||
| 137 | + GTK_ICON_SIZE_MENU, | ||
| 138 | + GTK_ICON_LOOKUP_GENERIC_FALLBACK, | ||
| 139 | + &error | ||
| 140 | + ); | ||
| 141 | + | ||
| 142 | + if(error) { | ||
| 143 | + g_warning(error->message); | ||
| 144 | + g_error_free(error); | ||
| 145 | + error = NULL; | ||
| 146 | + } | ||
| 147 | + | ||
| 148 | + action_list = pw3270_action_list_append( | ||
| 149 | + action_list, | ||
| 150 | + gettext(menus[ix].label), | ||
| 151 | + pixbuf, | ||
| 152 | + menus[ix].action_name, | ||
| 153 | + PW3270_ACTION_VIEW_ALLOW_MOVE | ||
| 154 | + ); | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + // Load settings | ||
| 160 | + g_autofree gchar * action_names = g_settings_get_string(settings,"header-action-names"); | ||
| 161 | + | ||
| 162 | + action_list = pw3270_settings_action_set(page->editor, action_list, action_names); | ||
| 163 | + | ||
| 164 | + pw3270_action_list_free(action_list); | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + void apply(GtkWidget *widget, PW3270SettingsPrivate *page) { | ||
| 168 | + | ||
| 169 | + g_autofree gchar * action_names = pw3270_settings_action_get(page->editor); | ||
| 170 | + g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | ||
| 171 | + g_settings_set_string(settings,"header-action-names",action_names); | ||
| 172 | + | ||
| 173 | + } | ||
| 174 | + |
src/objects/window/header.c
| @@ -112,9 +112,20 @@ | @@ -112,9 +112,20 @@ | ||
| 112 | 112 | ||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | + static GAction * get_action_from_name(GtkWidget *widget, const gchar *action_name) { | ||
| 116 | + | ||
| 117 | + if(g_str_has_prefix(action_name,"app.")) { | ||
| 118 | + return g_action_map_lookup_action(G_ACTION_MAP(g_application_get_default()),action_name+4); | ||
| 119 | + } | ||
| 120 | + | ||
| 121 | + return g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4); | ||
| 122 | + } | ||
| 123 | + | ||
| 115 | GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) { | 124 | GtkWidget * pw3270_header_button_new_from_builder(GtkWidget *widget, GtkBuilder * builder, const gchar *action_name) { |
| 116 | 125 | ||
| 117 | GtkWidget * button = NULL; | 126 | GtkWidget * button = NULL; |
| 127 | + g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | ||
| 128 | + gboolean symbolic = g_settings_get_int(settings,"header-icon-type") == 1; | ||
| 118 | 129 | ||
| 119 | if(g_str_has_prefix(action_name,"menu.")) { | 130 | if(g_str_has_prefix(action_name,"menu.")) { |
| 120 | 131 | ||
| @@ -127,45 +138,33 @@ | @@ -127,45 +138,33 @@ | ||
| 127 | gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); | 138 | gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(button), G_MENU_MODEL(gtk_builder_get_object(builder, action_name+5))); |
| 128 | gtk_widget_set_visible(button,TRUE); | 139 | gtk_widget_set_visible(button,TRUE); |
| 129 | 140 | ||
| 130 | - } else if(g_str_has_prefix(action_name,"app.")) { | ||
| 131 | - | ||
| 132 | - // It's an application action | ||
| 133 | - | ||
| 134 | - } else if(g_str_has_prefix(action_name,"win.")) { | ||
| 135 | - | ||
| 136 | - // It's a window action. | ||
| 137 | - GAction * action = g_action_map_lookup_action(G_ACTION_MAP(widget),action_name+4); | ||
| 138 | - | ||
| 139 | - if(action) { | ||
| 140 | 141 | ||
| 141 | - button = gtk_button_new_from_action(action,GTK_ICON_SIZE_BUTTON); | ||
| 142 | - | ||
| 143 | - gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name); | ||
| 144 | - gtk_widget_set_visible(button,g_action_get_enabled(action)); | ||
| 145 | - | ||
| 146 | - | ||
| 147 | - } else { | 142 | + } else { |
| 148 | 143 | ||
| 149 | - g_warning("Can't find action \"%s\"",action_name+4); | 144 | + GAction * action = get_action_from_name(widget,action_name); |
| 150 | 145 | ||
| 146 | + if(!action) { | ||
| 147 | + g_warning("Can't find action %s",action_name); | ||
| 148 | + return NULL; | ||
| 151 | } | 149 | } |
| 152 | 150 | ||
| 153 | - } | 151 | + button = gtk_button_new_from_action(action,GTK_ICON_SIZE_BUTTON,symbolic); |
| 154 | 152 | ||
| 155 | - if(button) { | 153 | + gtk_actionable_set_action_name(GTK_ACTIONABLE(button),action_name); |
| 154 | + gtk_widget_set_visible(button,g_action_get_enabled(action)); | ||
| 156 | 155 | ||
| 157 | - g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget); | ||
| 158 | - gtk_widget_set_focus_on_click(button,FALSE); | ||
| 159 | - gtk_widget_set_can_focus(button,FALSE); | ||
| 160 | - gtk_widget_set_can_default(button,FALSE); | ||
| 161 | - gtk_widget_set_name(button,action_name); | ||
| 162 | - | ||
| 163 | - } else { | ||
| 164 | - | ||
| 165 | - g_warning("Can't create button for action \"%s\"",action_name); | 156 | + g_autofree gchar * tooltip = g_action_get_tooltip(action); |
| 157 | + if(tooltip) | ||
| 158 | + gtk_widget_set_tooltip_markup(GTK_WIDGET(button),tooltip); | ||
| 166 | 159 | ||
| 167 | } | 160 | } |
| 168 | 161 | ||
| 162 | + g_signal_connect(button, "notify::sensitive", G_CALLBACK(on_sensitive), widget); | ||
| 163 | + gtk_widget_set_focus_on_click(button,FALSE); | ||
| 164 | + gtk_widget_set_can_focus(button,FALSE); | ||
| 165 | + gtk_widget_set_can_default(button,FALSE); | ||
| 166 | + gtk_widget_set_name(button,action_name); | ||
| 167 | + | ||
| 169 | return button; | 168 | return button; |
| 170 | } | 169 | } |
| 171 | 170 |
| @@ -0,0 +1,366 @@ | @@ -0,0 +1,366 @@ | ||
| 1 | +/* | ||
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | + * | ||
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | + * | ||
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | + * Free Software Foundation. | ||
| 11 | + * | ||
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | + * obter mais detalhes. | ||
| 16 | + * | ||
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | + * | ||
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | + * | ||
| 23 | + * Contatos: | ||
| 24 | + * | ||
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | + * | ||
| 28 | + */ | ||
| 29 | + | ||
| 30 | + #include <config.h> | ||
| 31 | + #include <glib.h> | ||
| 32 | + #include <glib/gstdio.h> | ||
| 33 | + #include <fcntl.h> | ||
| 34 | + #include <sys/types.h> | ||
| 35 | + #include <sys/stat.h> | ||
| 36 | + #include <lib3270.h> | ||
| 37 | + #include <lib3270/log.h> | ||
| 38 | + #include <v3270.h> | ||
| 39 | + #include <v3270/settings.h> | ||
| 40 | + #include <v3270/keyfile.h> | ||
| 41 | + #include <v3270/actions.h> | ||
| 42 | + #include <lib3270/properties.h> | ||
| 43 | + #include <string.h> | ||
| 44 | + #include <stdlib.h> | ||
| 45 | + | ||
| 46 | + struct _V3270KeyFile | ||
| 47 | + { | ||
| 48 | + gboolean changed; ///< @brief Save file? | ||
| 49 | + GKeyFile * key_file; | ||
| 50 | + gchar filename[1]; | ||
| 51 | + }; | ||
| 52 | + | ||
| 53 | + static V3270KeyFile * v3270_get_session_descriptor(GtkWidget *terminal) { | ||
| 54 | + | ||
| 55 | + return (V3270KeyFile *) g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | ||
| 56 | + | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + static void close_keyfile(V3270KeyFile * session) { | ||
| 60 | + | ||
| 61 | + if(session->key_file) { | ||
| 62 | + | ||
| 63 | + if(session->changed) { | ||
| 64 | + g_message("Saving file %s",session->filename); | ||
| 65 | + g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 66 | + session->changed = FALSE; | ||
| 67 | + } else { | ||
| 68 | + g_message("Closing file %s",session->filename); | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + g_key_file_free(session->key_file); | ||
| 72 | + session->key_file = NULL; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + g_free(session); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + V3270KeyFile * v3270_key_file_open(GtkWidget *terminal, const gchar *filename, GError **error) { | ||
| 79 | + | ||
| 80 | + g_return_val_if_fail(GTK_IS_V3270(terminal),FALSE); | ||
| 81 | + g_return_val_if_fail(*error == NULL,FALSE); | ||
| 82 | + | ||
| 83 | + V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename)); | ||
| 84 | + V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | ||
| 85 | + | ||
| 86 | + // Clone session | ||
| 87 | + if(old_session) { | ||
| 88 | + *new_session = *old_session; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + strcpy(new_session->filename,filename); | ||
| 92 | + new_session->key_file = g_key_file_new(); | ||
| 93 | + | ||
| 94 | + // Load file | ||
| 95 | + if(g_file_test(new_session->filename,G_FILE_TEST_IS_REGULAR)) { | ||
| 96 | + | ||
| 97 | + // Found session file, open it. | ||
| 98 | + if(!g_key_file_load_from_file(new_session->key_file,new_session->filename,G_KEY_FILE_NONE,error)) { | ||
| 99 | + g_warning("Can't load \"%s\"",new_session->filename); | ||
| 100 | + } else { | ||
| 101 | + g_message("Loading session preferences from %s",new_session->filename); | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + } else { | ||
| 105 | + | ||
| 106 | + // No session file, load the defaults (if available) and save file | ||
| 107 | + lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL); | ||
| 108 | + | ||
| 109 | + if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) { | ||
| 110 | + if(!g_key_file_load_from_file(new_session->key_file,default_settings,G_KEY_FILE_NONE,error)) { | ||
| 111 | + g_warning("Can't load \"%s\"",default_settings); | ||
| 112 | + } else { | ||
| 113 | + g_message("Loading session preferences from %s",default_settings); | ||
| 114 | + } | ||
| 115 | + } else { | ||
| 116 | +#ifdef DEBUG | ||
| 117 | + g_message("Can't find default settings file \"%s\"",default_settings); | ||
| 118 | +#else | ||
| 119 | + g_warning("Can't find default settings file \"%s\"",default_settings); | ||
| 120 | +#endif // DEBUG | ||
| 121 | + } | ||
| 122 | + | ||
| 123 | + new_session->changed = TRUE; | ||
| 124 | + | ||
| 125 | + } | ||
| 126 | + | ||
| 127 | + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); | ||
| 128 | + if(new_session->changed) { | ||
| 129 | + v3270_key_file_save(terminal,error); | ||
| 130 | + } | ||
| 131 | + | ||
| 132 | + if(!*error) { | ||
| 133 | + | ||
| 134 | + // Got key file, load it. | ||
| 135 | + v3270_load_key_file(terminal,new_session->key_file,NULL); | ||
| 136 | + v3270_accelerator_map_load_key_file(terminal,new_session->key_file,NULL); | ||
| 137 | + | ||
| 138 | + if(g_key_file_has_group(new_session->key_file,"environment")) { | ||
| 139 | + | ||
| 140 | + // Has environment group, set values. | ||
| 141 | + gchar **keys = g_key_file_get_keys(new_session->key_file,"environment",NULL,NULL); | ||
| 142 | + | ||
| 143 | + if(keys) { | ||
| 144 | + size_t ix; | ||
| 145 | + for(ix=0;keys[ix];ix++) { | ||
| 146 | + g_autofree gchar * value = g_key_file_get_string(new_session->key_file,"environment",keys[ix],NULL); | ||
| 147 | + if(value) { | ||
| 148 | +#ifdef _WIN32 | ||
| 149 | + g_autofree gchar * env = g_strconcat(keys[ix],"=",value,NULL); | ||
| 150 | + putenv(env); | ||
| 151 | +#else | ||
| 152 | + if(setenv(keys[ix],value,1)) { | ||
| 153 | + g_warning("Can't set \"%s\" to \"%s\"",keys[ix],value); | ||
| 154 | + } | ||
| 155 | +#endif // _WIN32 | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + g_strfreev(keys); | ||
| 160 | + } | ||
| 161 | + } | ||
| 162 | + | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + return new_session; | ||
| 166 | +} | ||
| 167 | + | ||
| 168 | +void v3270_key_file_close(GtkWidget *terminal) { | ||
| 169 | + | ||
| 170 | + V3270KeyFile *session = g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | ||
| 171 | + | ||
| 172 | + if(session->key_file) { | ||
| 173 | + | ||
| 174 | + if(session->changed) { | ||
| 175 | + g_message("Saving file %s",session->filename); | ||
| 176 | + g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 177 | + session->changed = FALSE; | ||
| 178 | + } else { | ||
| 179 | + g_message("Closing file %s",session->filename); | ||
| 180 | + } | ||
| 181 | + | ||
| 182 | + g_key_file_free(session->key_file); | ||
| 183 | + session->key_file = NULL; | ||
| 184 | + } | ||
| 185 | + | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + GKeyFile * v3270_key_file_get(GtkWidget *terminal) { | ||
| 189 | + return v3270_get_session_descriptor(terminal)->key_file; | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + void v3270_key_file_save_to_file(GtkWidget * terminal, const gchar *filename, GError **error) { | ||
| 193 | + | ||
| 194 | + if(error && *error) | ||
| 195 | + return; | ||
| 196 | + | ||
| 197 | + V3270KeyFile * new_session = (V3270KeyFile *) g_malloc0(sizeof(struct _V3270KeyFile) + strlen(filename)); | ||
| 198 | + V3270KeyFile * old_session = g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | ||
| 199 | + | ||
| 200 | + if(old_session) { | ||
| 201 | + *new_session = *old_session; | ||
| 202 | + } | ||
| 203 | + | ||
| 204 | + strcpy(new_session->filename,filename); | ||
| 205 | + new_session->key_file = g_key_file_new(); | ||
| 206 | + | ||
| 207 | + g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_keyfile); | ||
| 208 | + v3270_key_file_save(terminal,error); | ||
| 209 | + | ||
| 210 | + } | ||
| 211 | + | ||
| 212 | + void v3270_key_file_save(GtkWidget *terminal, GError **error) { | ||
| 213 | + | ||
| 214 | + if(error && *error) | ||
| 215 | + return; | ||
| 216 | + | ||
| 217 | + V3270KeyFile *session = v3270_get_session_descriptor(terminal); | ||
| 218 | + | ||
| 219 | + session->changed = FALSE; | ||
| 220 | + | ||
| 221 | + debug("%s: terminal=%p session=%p key-file=%p)",__FUNCTION__,terminal,session,session->key_file); | ||
| 222 | + | ||
| 223 | + v3270_to_key_file(terminal,session->key_file,"terminal"); | ||
| 224 | + v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators"); | ||
| 225 | + | ||
| 226 | + g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 227 | + | ||
| 228 | + } | ||
| 229 | + | ||
| 230 | + /// @brief Search standard paths. | ||
| 231 | + gchar * v3270_key_file_get_default_path(GtkWidget *terminal) { | ||
| 232 | + | ||
| 233 | + size_t folder; | ||
| 234 | + const gchar *folders[] = { | ||
| 235 | + g_get_user_data_dir(), | ||
| 236 | + g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS), | ||
| 237 | + g_get_user_special_dir(G_USER_DIRECTORY_DESKTOP) | ||
| 238 | + }; | ||
| 239 | + | ||
| 240 | + size_t application; | ||
| 241 | + const gchar *applications[] = { | ||
| 242 | + G_STRINGIFY(PRODUCT_NAME), | ||
| 243 | + PACKAGE_NAME, | ||
| 244 | + "3270", | ||
| 245 | + "tn3270" | ||
| 246 | + }; | ||
| 247 | + | ||
| 248 | + for(folder = 0; folder < G_N_ELEMENTS(folders); folder++) { | ||
| 249 | + | ||
| 250 | + if(!(folders[folder] && g_file_test(folders[folder],G_FILE_TEST_IS_DIR))) | ||
| 251 | + continue; | ||
| 252 | + | ||
| 253 | + for(application = 0; application < G_N_ELEMENTS(applications); application++) { | ||
| 254 | + | ||
| 255 | + gchar * appdir = g_build_filename(folder[folders],application[applications],NULL); | ||
| 256 | + | ||
| 257 | + debug("Testing for \"%s\"",appdir); | ||
| 258 | + if(g_file_test(appdir,G_FILE_TEST_IS_DIR)) { | ||
| 259 | + return appdir; | ||
| 260 | + } | ||
| 261 | + g_free(appdir); | ||
| 262 | + | ||
| 263 | + } | ||
| 264 | + | ||
| 265 | + } | ||
| 266 | + | ||
| 267 | + // Not found, try the current session path. | ||
| 268 | + const gchar * filename = v3270_key_file_get_filename(terminal); | ||
| 269 | + debug("Testing for \"%s\"",filename); | ||
| 270 | + if(filename | ||
| 271 | + && g_file_test(filename,G_FILE_TEST_IS_REGULAR) | ||
| 272 | + && g_str_has_prefix(filename,g_get_user_data_dir()) | ||
| 273 | + && !g_str_has_prefix(filename,g_get_user_config_dir()) | ||
| 274 | + ) { | ||
| 275 | + return g_path_get_dirname(filename); | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + return g_strdup(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS)); | ||
| 279 | + | ||
| 280 | + } | ||
| 281 | + | ||
| 282 | + gchar * v3270_keyfile_get_default_filename(void) { | ||
| 283 | + | ||
| 284 | + gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL); | ||
| 285 | + | ||
| 286 | + g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); | ||
| 287 | + if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR)) | ||
| 288 | + g_rename(compatible,filename); | ||
| 289 | + | ||
| 290 | + return filename; | ||
| 291 | + } | ||
| 292 | + | ||
| 293 | + gchar * v3270_key_file_build_filename(GtkWidget *terminal) { | ||
| 294 | + | ||
| 295 | + g_autofree gchar * defname = v3270_keyfile_get_default_filename(); | ||
| 296 | + const gchar * current = v3270_key_file_get_filename(terminal); | ||
| 297 | + | ||
| 298 | + // If is not the default name, return it. | ||
| 299 | + if(current && *current && g_file_test(current,G_FILE_TEST_IS_REGULAR) && strcmp(defname,current)) { | ||
| 300 | + return g_strdup(current); | ||
| 301 | + } | ||
| 302 | + | ||
| 303 | + g_autofree gchar * folder = v3270_key_file_get_default_path(terminal); | ||
| 304 | + | ||
| 305 | + const char * hostname = lib3270_host_get_name(v3270_get_session(terminal)); | ||
| 306 | + debug("Hostname=\"%s\"",hostname); | ||
| 307 | + | ||
| 308 | + gchar * name = g_strconcat(folder,G_DIR_SEPARATOR_S,(hostname ? hostname : "session"),".3270",NULL); | ||
| 309 | + unsigned int index = 0; | ||
| 310 | + while(g_file_test(name,G_FILE_TEST_EXISTS)) { | ||
| 311 | + g_free(name); | ||
| 312 | + name = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s.%u.3270",folder,hostname,++index); | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + debug("%s returns \"%s\"",__FUNCTION__,name); | ||
| 316 | + | ||
| 317 | + return name; | ||
| 318 | + } | ||
| 319 | + | ||
| 320 | + const gchar * v3270_key_file_get_filename(GtkWidget *terminal) { | ||
| 321 | + | ||
| 322 | + V3270KeyFile *session = v3270_get_session_descriptor(terminal); | ||
| 323 | + | ||
| 324 | + if(session && *session->filename) | ||
| 325 | + return session->filename; | ||
| 326 | + | ||
| 327 | + return NULL; | ||
| 328 | + | ||
| 329 | + } | ||
| 330 | + | ||
| 331 | + void v3270_key_file_set_boolean(GtkWidget *terminal, const gchar *group_name, const gchar *key, gboolean value) { | ||
| 332 | + | ||
| 333 | + V3270KeyFile *session = v3270_get_session_descriptor(terminal); | ||
| 334 | + g_key_file_set_boolean(session->key_file,group_name ? group_name : "terminal",key,value); | ||
| 335 | + session->changed = TRUE; | ||
| 336 | + | ||
| 337 | +} | ||
| 338 | + | ||
| 339 | + gboolean v3270_key_file_can_write(GtkWidget *widget) { | ||
| 340 | + | ||
| 341 | +#if defined(DEBUG) | ||
| 342 | + | ||
| 343 | + return TRUE; | ||
| 344 | + | ||
| 345 | +#else | ||
| 346 | + | ||
| 347 | + const V3270KeyFile * descriptor = v3270_get_session_descriptor(widget); | ||
| 348 | + | ||
| 349 | + if(!(descriptor && *descriptor->filename)) | ||
| 350 | + return FALSE; | ||
| 351 | + | ||
| 352 | + if(g_access(descriptor->filename,W_OK)) | ||
| 353 | + return FALSE; | ||
| 354 | + | ||
| 355 | +#ifdef _WIN32 | ||
| 356 | + return TRUE; | ||
| 357 | +#else | ||
| 358 | + return !g_str_has_prefix(descriptor->filename,g_get_user_config_dir()); | ||
| 359 | +#endif // _WIN32 | ||
| 360 | + | ||
| 361 | +#endif // DEBUG | ||
| 362 | + | ||
| 363 | + } | ||
| 364 | + | ||
| 365 | + | ||
| 366 | + |
src/objects/window/page.c
| @@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
| 35 | #include <v3270/dialogs.h> | 35 | #include <v3270/dialogs.h> |
| 36 | #include <v3270/actions.h> | 36 | #include <v3270/actions.h> |
| 37 | #include <v3270/print.h> | 37 | #include <v3270/print.h> |
| 38 | + #include <v3270/keyfile.h> | ||
| 38 | #include <pw3270.h> | 39 | #include <pw3270.h> |
| 39 | 40 | ||
| 40 | //---[ Gtk Label with customized popup-menu ]--------------------------------------------------------------------------------------- | 41 | //---[ Gtk Label with customized popup-menu ]--------------------------------------------------------------------------------------- |
| @@ -302,30 +303,6 @@ | @@ -302,30 +303,6 @@ | ||
| 302 | // Show dialog. | 303 | // Show dialog. |
| 303 | gtk_widget_show_all(dialog); | 304 | gtk_widget_show_all(dialog); |
| 304 | 305 | ||
| 305 | - | ||
| 306 | - | ||
| 307 | - /* | ||
| 308 | - GtkWidget * dialog = pw3270_settings_dialog_new( | ||
| 309 | - _("Rename session"), | ||
| 310 | - GTK_WINDOW(gtk_widget_get_toplevel(terminal)) | ||
| 311 | - ); | ||
| 312 | - | ||
| 313 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 314 | - gtk_container_set_border_width(GTK_CONTAINER(content),18); | ||
| 315 | - | ||
| 316 | - | ||
| 317 | - gtk_widget_show_all(dialog); | ||
| 318 | - | ||
| 319 | - if(gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_APPLY) { | ||
| 320 | - | ||
| 321 | - v3270_set_session_name(terminal, gtk_entry_get_text(GTK_ENTRY(entry))); | ||
| 322 | - g_signal_emit_by_name(terminal,"save-settings"); | ||
| 323 | - | ||
| 324 | - } | ||
| 325 | - | ||
| 326 | - gtk_widget_destroy(dialog); | ||
| 327 | - */ | ||
| 328 | - | ||
| 329 | } | 306 | } |
| 330 | 307 | ||
| 331 | static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) { | 308 | static gboolean terminal_popup(GtkWidget *widget, gboolean selected, gboolean online, GdkEvent *event, pw3270ApplicationWindow * window) { |
| @@ -387,7 +364,7 @@ | @@ -387,7 +364,7 @@ | ||
| 387 | { | 364 | { |
| 388 | .label = N_("_Rename session"), | 365 | .label = N_("_Rename session"), |
| 389 | .callback = G_CALLBACK(rename_session), | 366 | .callback = G_CALLBACK(rename_session), |
| 390 | - .check_permission = v3270_allow_custom_settings | 367 | + .check_permission = v3270_key_file_can_write |
| 391 | }, | 368 | }, |
| 392 | 369 | ||
| 393 | { | 370 | { |
src/objects/window/private.h
| @@ -90,7 +90,7 @@ | @@ -90,7 +90,7 @@ | ||
| 90 | G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void); | 90 | G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void); |
| 91 | G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void); | 91 | G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void); |
| 92 | G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void); | 92 | G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void); |
| 93 | - G_GNUC_INTERNAL GAction * pw3270_action_save_session_as_new(void); | 93 | + G_GNUC_INTERNAL GAction * pw3270_action_save_session_preferences_new(void); |
| 94 | G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void); | 94 | G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void); |
| 95 | 95 | ||
| 96 | GAction * pw3270_action_session_properties_new(void); | 96 | GAction * pw3270_action_session_properties_new(void); |
src/objects/window/terminal.c
| @@ -40,82 +40,24 @@ | @@ -40,82 +40,24 @@ | ||
| 40 | #include <lib3270/toggle.h> | 40 | #include <lib3270/toggle.h> |
| 41 | #include <v3270/settings.h> | 41 | #include <v3270/settings.h> |
| 42 | #include <v3270/actions.h> | 42 | #include <v3270/actions.h> |
| 43 | + #include <v3270/keyfile.h> | ||
| 43 | #include <v3270/print.h> | 44 | #include <v3270/print.h> |
| 45 | + #include <lib3270/os.h> | ||
| 44 | 46 | ||
| 45 | - struct SessionDescriptor | ||
| 46 | - { | ||
| 47 | - gboolean changed; ///< @brief Save file? | ||
| 48 | - GKeyFile * key_file; | ||
| 49 | - gchar filename[1]; | ||
| 50 | - }; | ||
| 51 | - | ||
| 52 | - static void destroy(GtkWidget G_GNUC_UNUSED(*terminal), struct SessionDescriptor * session) { | ||
| 53 | - | ||
| 54 | - if(session->changed) { | ||
| 55 | - | ||
| 56 | - session->changed = FALSE; | ||
| 57 | - | ||
| 58 | - GError * error = NULL; | ||
| 59 | - g_key_file_save_to_file(session->key_file,session->filename,&error); | ||
| 60 | - | ||
| 61 | - if(error) { | ||
| 62 | - | ||
| 63 | - g_warning("Can't save \"%s\": %s",session->filename,error->message); | ||
| 64 | - g_error_free(error); | ||
| 65 | - | ||
| 66 | - } else { | ||
| 67 | - | ||
| 68 | - g_message("Session was saved to %s",session->filename); | ||
| 69 | - | ||
| 70 | - } | ||
| 71 | - | ||
| 72 | - } | ||
| 73 | - | 47 | + static void destroy(GtkWidget *terminal, gpointer G_GNUC_UNUSED(dunno)) { |
| 48 | + v3270_key_file_close(terminal); | ||
| 74 | } | 49 | } |
| 75 | 50 | ||
| 76 | - static void save_settings(GtkWidget *terminal, struct SessionDescriptor * session) { | ||
| 77 | - | ||
| 78 | - session->changed = FALSE; | ||
| 79 | - | ||
| 80 | - debug("%s(%p,%p)",__FUNCTION__,terminal,session); | ||
| 81 | - | ||
| 82 | - v3270_to_key_file(terminal,session->key_file,"terminal"); | ||
| 83 | - v3270_accelerator_map_to_key_file(terminal, session->key_file, "accelerators"); | ||
| 84 | - | ||
| 85 | - /* | ||
| 86 | - GtkWidget * window = gtk_widget_get_toplevel(terminal); | ||
| 87 | - | ||
| 88 | - if(PW3270_IS_APPLICATION_WINDOW(window) && pw3270_application_window_get_active_terminal(window) == terminal) { | ||
| 89 | - | ||
| 90 | - debug("%s on active terminal, saving window settings",__FUNCTION__); | ||
| 91 | - GList * keypad = pw3270_application_window_get_keypads(window); | ||
| 92 | - | ||
| 93 | - while(keypad) { | ||
| 94 | - | ||
| 95 | - g_key_file_set_boolean( | ||
| 96 | - session->key_file, | ||
| 97 | - "keypads", | ||
| 98 | - gtk_widget_get_name(GTK_WIDGET(keypad->data)), | ||
| 99 | - gtk_widget_get_visible(GTK_WIDGET(keypad->data)) | ||
| 100 | - ); | ||
| 101 | - keypad = g_list_next(keypad); | ||
| 102 | - | ||
| 103 | - } | ||
| 104 | - | ||
| 105 | - } | ||
| 106 | - */ | ||
| 107 | - | ||
| 108 | - g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 109 | - | 51 | + static void toggle_changed(GtkWidget *widget, LIB3270_TOGGLE_ID G_GNUC_UNUSED(toggle_id), gboolean toggle_state, const gchar *toggle_name, gpointer G_GNUC_UNUSED(dunno)) { |
| 52 | + debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF"); | ||
| 53 | + v3270_key_file_set_boolean(widget,"terminal",toggle_name,toggle_state); | ||
| 110 | } | 54 | } |
| 111 | 55 | ||
| 112 | - static void toggle_changed(G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED LIB3270_TOGGLE_ID toggle_id, gboolean toggle_state, const gchar *toggle_name, struct SessionDescriptor * session) { | ||
| 113 | - debug("%s(%s)=%s",__FUNCTION__,toggle_name,toggle_state ? "ON" : "OFF"); | ||
| 114 | - g_key_file_set_boolean(session->key_file,"terminal",toggle_name,toggle_state); | ||
| 115 | - session->changed = TRUE; | 56 | + static void save_settings(GtkWidget *terminal, gpointer G_GNUC_UNUSED(dunno)) { |
| 57 | + v3270_key_file_save(terminal,NULL); | ||
| 116 | } | 58 | } |
| 117 | 59 | ||
| 118 | - static void print_done(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, GtkPrintOperationResult result, struct SessionDescriptor * session) { | 60 | + static void print_done(GtkWidget *widget, GtkPrintOperation *operation, GtkPrintOperationResult result, gpointer G_GNUC_UNUSED(dunno)) { |
| 119 | debug("%s(%u)",__FUNCTION__,(unsigned int) result); | 61 | debug("%s(%u)",__FUNCTION__,(unsigned int) result); |
| 120 | 62 | ||
| 121 | if(result != GTK_PRINT_OPERATION_RESULT_APPLY) | 63 | if(result != GTK_PRINT_OPERATION_RESULT_APPLY) |
| @@ -123,250 +65,113 @@ | @@ -123,250 +65,113 @@ | ||
| 123 | 65 | ||
| 124 | debug("%s: Saving print settings",__FUNCTION__); | 66 | debug("%s: Saving print settings",__FUNCTION__); |
| 125 | 67 | ||
| 126 | - v3270_print_operation_to_key_file(operation,session->key_file); | 68 | + v3270_print_operation_to_key_file(operation,v3270_key_file_get(widget)); |
| 69 | + v3270_emit_save_settings(widget,NULL); | ||
| 127 | 70 | ||
| 128 | - g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 129 | - session->changed = FALSE; | ||
| 130 | } | 71 | } |
| 131 | 72 | ||
| 132 | - static void print_setup(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, struct SessionDescriptor * session) { | 73 | + static void print_setup(G_GNUC_UNUSED GtkWidget *widget, GtkPrintOperation *operation, gpointer G_GNUC_UNUSED(dunno) ) { |
| 133 | 74 | ||
| 134 | debug("%s(%p)",__FUNCTION__,operation); | 75 | debug("%s(%p)",__FUNCTION__,operation); |
| 135 | - v3270_print_operation_load_key_file(operation,session->key_file); | 76 | + v3270_print_operation_load_key_file(operation,v3270_key_file_get(widget)); |
| 136 | 77 | ||
| 137 | } | 78 | } |
| 138 | 79 | ||
| 139 | - static void close_settings(struct SessionDescriptor * session) { | 80 | + static GtkResponseType load_popup_response(GtkWidget *widget, const gchar *popup_name, gpointer G_GNUC_UNUSED(dunno)) { |
| 140 | 81 | ||
| 141 | - if(session->key_file) { | 82 | + GKeyFile * key_file = v3270_key_file_get(widget); |
| 142 | 83 | ||
| 143 | - if(session->changed) { | ||
| 144 | - g_message("Saving file %s",session->filename); | ||
| 145 | - g_key_file_save_to_file(session->key_file,session->filename,NULL); | ||
| 146 | - session->changed = FALSE; | ||
| 147 | - } else { | ||
| 148 | - g_message("Closing file %s",session->filename); | ||
| 149 | - } | 84 | + if(key_file && g_key_file_has_key(key_file,"dialogs",popup_name,NULL)) |
| 85 | + return (GtkResponseType) g_key_file_get_integer(key_file,"dialogs",popup_name,NULL); | ||
| 150 | 86 | ||
| 151 | - g_key_file_free(session->key_file); | ||
| 152 | - session->key_file = NULL; | ||
| 153 | - } | ||
| 154 | - | ||
| 155 | - g_free(session); | ||
| 156 | - } | ||
| 157 | - | ||
| 158 | - const gchar * v3270_get_session_filename(GtkWidget *widget) { | ||
| 159 | - | ||
| 160 | - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | ||
| 161 | - | ||
| 162 | - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor"); | ||
| 163 | - | ||
| 164 | - if(descriptor) | ||
| 165 | - return descriptor->filename; | ||
| 166 | - | ||
| 167 | - return NULL; | ||
| 168 | - } | ||
| 169 | - | ||
| 170 | - void v3270_set_session_filename(GtkWidget *terminal, const gchar *filename) { | ||
| 171 | - | ||
| 172 | - struct SessionDescriptor * old_session = (struct SessionDescriptor *) g_object_get_data(G_OBJECT(terminal),"session-descriptor"); | ||
| 173 | - struct SessionDescriptor * new_session = (struct SessionDescriptor *) g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename)); | ||
| 174 | - | ||
| 175 | - if(old_session) { | ||
| 176 | - memcpy(new_session,old_session,sizeof(struct SessionDescriptor)); | ||
| 177 | - } | ||
| 178 | - | ||
| 179 | - strcpy(new_session->filename,filename); | ||
| 180 | - new_session->key_file = g_key_file_new(); | ||
| 181 | - | ||
| 182 | - v3270_to_key_file(terminal,new_session->key_file,NULL); | ||
| 183 | - v3270_accelerator_map_to_key_file(terminal,new_session->key_file,NULL); | ||
| 184 | - | ||
| 185 | - GError *error = NULL; | ||
| 186 | - g_key_file_save_to_file(new_session->key_file,new_session->filename,&error); | ||
| 187 | - | ||
| 188 | - if(error) { | ||
| 189 | - | ||
| 190 | - g_message("Can't save file \"%s\": %s",new_session->filename,error->message); | ||
| 191 | - | ||
| 192 | - GtkWidget * dialog = gtk_message_dialog_new_with_markup( | ||
| 193 | - GTK_WINDOW(gtk_widget_get_toplevel(terminal)), | ||
| 194 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | ||
| 195 | - GTK_MESSAGE_ERROR, | ||
| 196 | - GTK_BUTTONS_CANCEL, | ||
| 197 | - _("Can't save file \"%s\""),new_session->filename | ||
| 198 | - ); | ||
| 199 | - | ||
| 200 | - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); | ||
| 201 | - | ||
| 202 | - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't save session file")); | ||
| 203 | - | ||
| 204 | - gtk_widget_show_all(dialog); | ||
| 205 | - | ||
| 206 | - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); | ||
| 207 | - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); | 87 | +#ifdef _WIN32 |
| 88 | + { | ||
| 89 | + // Windows - Check predefined responses on system registry. | ||
| 90 | + lib3270_auto_cleanup(HKEY) hKey; | ||
| 208 | 91 | ||
| 209 | - g_error_free(error); | ||
| 210 | - g_key_file_free(new_session->key_file); | ||
| 211 | - g_free(new_session); | 92 | + if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,G_STRINGIFY(PRODUCT_NAME)"\\dialogs",0,KEY_READ,&hKey) == ERROR_SUCCESS) { |
| 212 | 93 | ||
| 213 | - } else { | 94 | + DWORD val = 0; |
| 95 | + DWORD cbData = sizeof(DWORD); | ||
| 214 | 96 | ||
| 215 | - new_session->changed = FALSE; | ||
| 216 | - g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",new_session,(GDestroyNotify) close_settings); | 97 | + if(RegQueryValueEx(hKey, popup_name, NULL, NULL, (LPBYTE) &val, &cbData) == ERROR_SUCCESS) { |
| 98 | + return (GtkResponseType) val; | ||
| 99 | + } | ||
| 217 | 100 | ||
| 101 | + } | ||
| 218 | } | 102 | } |
| 103 | +#endif // _WIN32 | ||
| 219 | 104 | ||
| 220 | - | ||
| 221 | - } | ||
| 222 | - | ||
| 223 | - GKeyFile * v3270_get_session_keyfile(GtkWidget *widget) { | ||
| 224 | - | ||
| 225 | - g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | ||
| 226 | - | ||
| 227 | - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor"); | ||
| 228 | - | ||
| 229 | - if(descriptor) | ||
| 230 | - return descriptor->key_file; | ||
| 231 | - | ||
| 232 | - return NULL; | 105 | + return key_file ? GTK_RESPONSE_NONE : 0; |
| 233 | } | 106 | } |
| 234 | 107 | ||
| 235 | - static GtkResponseType load_popup_response(v3270 G_GNUC_UNUSED(*widget), const gchar *popup_name, struct SessionDescriptor * session) { | 108 | + static gboolean save_popup_response(GtkWidget *widget, const gchar *popup_name, GtkResponseType response, gpointer G_GNUC_UNUSED(dunno)) { |
| 236 | 109 | ||
| 237 | - if(!session->key_file) | ||
| 238 | - return 0; | 110 | + GKeyFile * key_file = v3270_key_file_get(widget); |
| 239 | 111 | ||
| 240 | - if(g_key_file_has_key(session->key_file,"dialogs",popup_name,NULL)) | ||
| 241 | - return (GtkResponseType) g_key_file_get_integer(session->key_file,"dialogs",popup_name,NULL); | ||
| 242 | - | ||
| 243 | - return GTK_RESPONSE_NONE; | ||
| 244 | - } | 112 | + debug("%s(%s)",__FUNCTION__,popup_name); |
| 245 | 113 | ||
| 246 | - static gboolean save_popup_response(GtkWidget *widget, const gchar *popup_name, GtkResponseType response, struct SessionDescriptor * session) { | ||
| 247 | - debug("%s(%s)",__FUNCTION__,popup_name); | ||
| 248 | - | ||
| 249 | - if(!session->key_file) | ||
| 250 | - return FALSE; | 114 | + if(!key_file) |
| 115 | + return FALSE; | ||
| 251 | 116 | ||
| 252 | - g_key_file_set_integer(session->key_file,"dialogs",popup_name,(gint) response); | ||
| 253 | - v3270_emit_save_settings(widget,NULL); | 117 | + g_key_file_set_integer(key_file,"dialogs",popup_name,(gint) response); |
| 118 | + v3270_emit_save_settings(widget,NULL); | ||
| 254 | 119 | ||
| 255 | - return TRUE; | 120 | + return TRUE; |
| 256 | } | 121 | } |
| 257 | 122 | ||
| 258 | GtkWidget * pw3270_terminal_new(const gchar *session_file) { | 123 | GtkWidget * pw3270_terminal_new(const gchar *session_file) { |
| 259 | 124 | ||
| 260 | - GtkWidget * terminal = v3270_new(); | 125 | + GtkWidget * terminal = v3270_new(); |
| 126 | + GError * error = NULL; | ||
| 261 | 127 | ||
| 262 | gtk_widget_show_all(terminal); | 128 | gtk_widget_show_all(terminal); |
| 263 | 129 | ||
| 264 | - struct SessionDescriptor * descriptor = NULL; | ||
| 265 | - | ||
| 266 | if(session_file) { | 130 | if(session_file) { |
| 267 | 131 | ||
| 268 | // Use the supplied session file | 132 | // Use the supplied session file |
| 269 | - descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(session_file)); | ||
| 270 | - strcpy(descriptor->filename,session_file); | 133 | + v3270_key_file_open(terminal,session_file,&error); |
| 271 | 134 | ||
| 272 | } else { | 135 | } else { |
| 273 | 136 | ||
| 274 | // No session file, use the default one. | 137 | // No session file, use the default one. |
| 275 | - g_autofree gchar * compatible = g_build_filename(g_get_user_config_dir(),G_STRINGIFY(PRODUCT_NAME) ".conf",NULL); | ||
| 276 | - g_autofree gchar * filename = g_build_filename(g_get_user_config_dir(),"default.3270",NULL); | ||
| 277 | - | ||
| 278 | - if(g_file_test(compatible,G_FILE_TEST_IS_REGULAR)) | ||
| 279 | - { | ||
| 280 | - g_rename(compatible,filename); | ||
| 281 | - } | ||
| 282 | - | ||
| 283 | - descriptor = g_malloc0(sizeof(struct SessionDescriptor) + strlen(filename)); | ||
| 284 | - strcpy(descriptor->filename,filename); | 138 | + gchar * filename = v3270_keyfile_get_default_filename(); |
| 139 | + v3270_key_file_open(terminal,filename,&error); | ||
| 140 | + g_free(filename); | ||
| 285 | 141 | ||
| 286 | } | 142 | } |
| 287 | 143 | ||
| 288 | - // Setup session file; | ||
| 289 | - GError *error = NULL; | ||
| 290 | - g_object_set_data_full(G_OBJECT(terminal),"session-descriptor",descriptor,(GDestroyNotify) close_settings); | ||
| 291 | - | ||
| 292 | - descriptor->key_file = g_key_file_new(); | 144 | + // Setup signals. |
| 145 | + g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),NULL); | ||
| 146 | + g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),NULL); | ||
| 147 | + g_signal_connect(G_OBJECT(terminal),"print-done",G_CALLBACK(print_done),NULL); | ||
| 148 | + g_signal_connect(G_OBJECT(terminal),"print-setup",G_CALLBACK(print_setup),NULL); | ||
| 149 | + g_signal_connect(G_OBJECT(terminal),"destroy", G_CALLBACK(destroy),NULL); | ||
| 150 | + g_signal_connect(G_OBJECT(terminal),"load-popup-response",G_CALLBACK(load_popup_response),NULL); | ||
| 151 | + g_signal_connect(G_OBJECT(terminal),"save-popup-response",G_CALLBACK(save_popup_response),NULL); | ||
| 293 | 152 | ||
| 294 | - if(g_file_test(descriptor->filename,G_FILE_TEST_IS_REGULAR)) { | 153 | + if(error) { |
| 295 | 154 | ||
| 296 | - // Found session file, open it. | ||
| 297 | - if(!g_key_file_load_from_file(descriptor->key_file,descriptor->filename,G_KEY_FILE_NONE,&error)) { | ||
| 298 | - g_warning("Can't load \"%s\"",descriptor->filename); | ||
| 299 | - } else { | ||
| 300 | - g_message("Loading session properties from %s",descriptor->filename); | ||
| 301 | - } | 155 | + GtkWidget * dialog = gtk_message_dialog_new_with_markup( |
| 156 | + GTK_WINDOW(gtk_widget_get_toplevel(terminal)), | ||
| 157 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | ||
| 158 | + GTK_MESSAGE_ERROR, | ||
| 159 | + GTK_BUTTONS_CANCEL, | ||
| 160 | + _("Can't use \"%s\""),session_file | ||
| 161 | + ); | ||
| 302 | 162 | ||
| 303 | - } else { | 163 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message); |
| 304 | 164 | ||
| 305 | - // No session file, load the defaults (if available). | ||
| 306 | - lib3270_autoptr(char) default_settings = lib3270_build_data_filename("defaults.conf",NULL); | ||
| 307 | - if(g_file_test(default_settings,G_FILE_TEST_IS_REGULAR)) { | ||
| 308 | - if(!g_key_file_load_from_file(descriptor->key_file,default_settings,G_KEY_FILE_NONE,&error)) { | ||
| 309 | - g_warning("Can't load \"%s\"",default_settings); | ||
| 310 | - } else { | ||
| 311 | - g_message("Loading session properties from %s",default_settings); | ||
| 312 | - } | ||
| 313 | - } else { | ||
| 314 | -#ifdef DEBUG | ||
| 315 | - g_message("Can't find default settings file \"%s\"",default_settings); | ||
| 316 | -#else | ||
| 317 | - g_warning("Can't find default settings file \"%s\"",default_settings); | ||
| 318 | -#endif // DEBUG | ||
| 319 | - } | 165 | + gtk_window_set_title(GTK_WINDOW(dialog),_("Can't load session file")); |
| 320 | 166 | ||
| 321 | - } | 167 | + gtk_widget_show_all(dialog); |
| 322 | 168 | ||
| 323 | - if(error) { | 169 | + g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL); |
| 170 | + g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); | ||
| 324 | 171 | ||
| 325 | - g_warning(error->message); | ||
| 326 | g_error_free(error); | 172 | g_error_free(error); |
| 327 | - error = NULL; | ||
| 328 | - | ||
| 329 | - } else { | ||
| 330 | - | ||
| 331 | - // Got key file, load it. | ||
| 332 | - v3270_load_key_file(terminal,descriptor->key_file,NULL); | ||
| 333 | - v3270_accelerator_map_load_key_file(terminal,descriptor->key_file,NULL); | ||
| 334 | - | ||
| 335 | - if(g_key_file_has_group(descriptor->key_file,"environment")) { | ||
| 336 | - | ||
| 337 | - // Has environment group, set values. | ||
| 338 | - gchar **keys = g_key_file_get_keys(descriptor->key_file,"environment",NULL,NULL); | ||
| 339 | - | ||
| 340 | - if(keys) { | ||
| 341 | - size_t ix; | ||
| 342 | - for(ix=0;keys[ix];ix++) { | ||
| 343 | - g_autofree gchar * value = g_key_file_get_string(descriptor->key_file,"environment",keys[ix],NULL); | ||
| 344 | - if(value) { | ||
| 345 | -#ifdef _WIN32 | ||
| 346 | - g_autofree gchar * env = g_strconcat(keys[ix],"=",value,NULL); | ||
| 347 | - putenv(env); | ||
| 348 | -#else | ||
| 349 | - if(setenv(keys[ix],value,1)) { | ||
| 350 | - g_warning("Can't set \"%s\" to \"%s\"",keys[ix],value); | ||
| 351 | - } | ||
| 352 | -#endif // _WIN32 | ||
| 353 | - } | ||
| 354 | - } | ||
| 355 | - | ||
| 356 | - g_strfreev(keys); | ||
| 357 | - } | ||
| 358 | - } | ||
| 359 | } | 173 | } |
| 360 | 174 | ||
| 361 | - // Setup signals. | ||
| 362 | - g_signal_connect(G_OBJECT(terminal),"save-settings",G_CALLBACK(save_settings),descriptor); | ||
| 363 | - g_signal_connect(G_OBJECT(terminal),"toggle_changed",G_CALLBACK(toggle_changed),descriptor); | ||
| 364 | - g_signal_connect(G_OBJECT(terminal),"print-done",G_CALLBACK(print_done),descriptor); | ||
| 365 | - g_signal_connect(G_OBJECT(terminal),"print-setup",G_CALLBACK(print_setup),descriptor); | ||
| 366 | - g_signal_connect(G_OBJECT(terminal),"destroy", G_CALLBACK(destroy),descriptor); | ||
| 367 | - g_signal_connect(G_OBJECT(terminal),"load-popup-response",G_CALLBACK(load_popup_response),descriptor); | ||
| 368 | - g_signal_connect(G_OBJECT(terminal),"save-popup-response",G_CALLBACK(save_popup_response),descriptor); | ||
| 369 | - | ||
| 370 | return terminal; | 175 | return terminal; |
| 371 | } | 176 | } |
| 372 | 177 | ||
| @@ -382,30 +187,4 @@ | @@ -382,30 +187,4 @@ | ||
| 382 | 187 | ||
| 383 | } | 188 | } |
| 384 | 189 | ||
| 385 | - gboolean v3270_allow_custom_settings(GtkWidget *widget) { | ||
| 386 | - | ||
| 387 | -#if defined(DEBUG) | ||
| 388 | - | ||
| 389 | - return TRUE; | ||
| 390 | - | ||
| 391 | -#else | ||
| 392 | - | ||
| 393 | - const struct SessionDescriptor * descriptor = (const struct SessionDescriptor *) g_object_get_data(G_OBJECT(widget),"session-descriptor"); | ||
| 394 | - | ||
| 395 | - if(!(descriptor && *descriptor->filename)) | ||
| 396 | - return FALSE; | ||
| 397 | - | ||
| 398 | - if(g_access(descriptor->filename,W_OK)) | ||
| 399 | - return FALSE; | ||
| 400 | - | ||
| 401 | -#ifdef _WIN32 | ||
| 402 | - return TRUE; | ||
| 403 | -#else | ||
| 404 | - return !g_str_has_prefix(descriptor->filename,g_get_user_config_dir()); | ||
| 405 | -#endif // _WIN32 | ||
| 406 | - | ||
| 407 | -#endif // DEBUG | ||
| 408 | - | ||
| 409 | - } | ||
| 410 | - | ||
| 411 | 190 |
src/objects/window/window.c
| @@ -34,6 +34,7 @@ | @@ -34,6 +34,7 @@ | ||
| 34 | #include <pw3270/actions.h> | 34 | #include <pw3270/actions.h> |
| 35 | #include <pw3270/keypad.h> | 35 | #include <pw3270/keypad.h> |
| 36 | #include <v3270/settings.h> | 36 | #include <v3270/settings.h> |
| 37 | + #include <v3270/keyfile.h> | ||
| 37 | 38 | ||
| 38 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); | 39 | static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); |
| 39 | static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); | 40 | static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); |
| @@ -142,6 +143,26 @@ | @@ -142,6 +143,26 @@ | ||
| 142 | 143 | ||
| 143 | static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) { | 144 | static void pw3270ApplicationWindow_class_init(pw3270ApplicationWindowClass *klass) { |
| 144 | 145 | ||
| 146 | +#ifdef DEBUG | ||
| 147 | + { | ||
| 148 | + gtk_icon_theme_append_search_path( | ||
| 149 | + gtk_icon_theme_get_default(), | ||
| 150 | + "./icons" | ||
| 151 | + ); | ||
| 152 | + } | ||
| 153 | +#else | ||
| 154 | + { | ||
| 155 | + lib3270_autoptr(char) path = lib3270_build_data_filename("icons",NULL); | ||
| 156 | + if(g_file_test(path,G_FILE_TEST_IS_DIR)) { | ||
| 157 | + gtk_icon_theme_append_search_path( | ||
| 158 | + gtk_icon_theme_get_default(), | ||
| 159 | + path | ||
| 160 | + ); | ||
| 161 | + } | ||
| 162 | + } | ||
| 163 | +#endif // DEBUG | ||
| 164 | + | ||
| 165 | + | ||
| 145 | { | 166 | { |
| 146 | GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass); | 167 | GtkWidgetClass *widget = GTK_WIDGET_CLASS(klass); |
| 147 | widget->destroy = destroy; | 168 | widget->destroy = destroy; |
| @@ -191,8 +212,8 @@ | @@ -191,8 +212,8 @@ | ||
| 191 | if(!terminal) | 212 | if(!terminal) |
| 192 | return; | 213 | return; |
| 193 | 214 | ||
| 194 | - GKeyFile * keyfile = v3270_get_session_keyfile(terminal); | ||
| 195 | - if(!terminal) | 215 | + GKeyFile * keyfile = v3270_key_file_get(terminal); |
| 216 | + if(!keyfile) | ||
| 196 | return; | 217 | return; |
| 197 | 218 | ||
| 198 | g_key_file_set_boolean( | 219 | g_key_file_set_boolean( |
| @@ -251,6 +272,16 @@ | @@ -251,6 +272,16 @@ | ||
| 251 | 272 | ||
| 252 | static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { | 273 | static void pw3270ApplicationWindow_init(pw3270ApplicationWindow *widget) { |
| 253 | 274 | ||
| 275 | + // Get settings | ||
| 276 | + g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); | ||
| 277 | + | ||
| 278 | + // Override defaults | ||
| 279 | + { | ||
| 280 | + // https://gitlab.gnome.org/GNOME/gtk/-/blob/gtk-3-24/gtk/gtksettings.c | ||
| 281 | + GtkSettings *settings = gtk_widget_get_settings(GTK_WIDGET (widget)); | ||
| 282 | + g_object_set(settings,"gtk-menu-bar-accel","",NULL); | ||
| 283 | + } | ||
| 284 | + | ||
| 254 | // Setup defaults | 285 | // Setup defaults |
| 255 | widget->state.width = 800; | 286 | widget->state.width = 800; |
| 256 | widget->state.height = 500; | 287 | widget->state.height = 500; |
| @@ -282,17 +313,86 @@ | @@ -282,17 +313,86 @@ | ||
| 282 | gtk_notebook_set_action_widget(widget->notebook,new_tab,GTK_PACK_START); | 313 | gtk_notebook_set_action_widget(widget->notebook,new_tab,GTK_PACK_START); |
| 283 | } | 314 | } |
| 284 | 315 | ||
| 285 | - widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new()); | ||
| 286 | - gtk_box_pack_start(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | 316 | + // Create boxes |
| 317 | + GtkBox * hBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0)); | ||
| 318 | + GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); | ||
| 319 | + | ||
| 320 | + gtk_widget_show(GTK_WIDGET(hBox)); | ||
| 321 | + gtk_widget_show(GTK_WIDGET(vBox)); | ||
| 322 | + | ||
| 323 | + // Create toolbar | ||
| 324 | + { | ||
| 325 | + widget->toolbar = GTK_TOOLBAR(pw3270_toolbar_new()); | ||
| 326 | + | ||
| 327 | + g_action_map_add_action( | ||
| 328 | + G_ACTION_MAP(widget), | ||
| 329 | + G_ACTION(g_property_action_new("toolbar", widget->toolbar, "visible")) | ||
| 330 | + ); | ||
| 331 | + | ||
| 332 | + switch(g_settings_get_int(settings,"toolbar-position")) { | ||
| 333 | + case 1: | ||
| 334 | + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_HORIZONTAL); | ||
| 335 | + gtk_box_pack_end(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | ||
| 336 | + break; | ||
| 337 | + | ||
| 338 | + case 2: | ||
| 339 | + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_VERTICAL); | ||
| 340 | + gtk_box_pack_end(hBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | ||
| 341 | + break; | ||
| 342 | + | ||
| 343 | + case 3: | ||
| 344 | + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_VERTICAL); | ||
| 345 | + gtk_box_pack_start(hBox,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | ||
| 346 | + break; | ||
| 347 | + | ||
| 348 | + default: | ||
| 349 | + gtk_orientable_set_orientation(GTK_ORIENTABLE(widget->toolbar),GTK_ORIENTATION_HORIZONTAL); | ||
| 350 | + gtk_box_pack_start(container,GTK_WIDGET(widget->toolbar),FALSE,TRUE,0); | ||
| 351 | + break; | ||
| 352 | + | ||
| 353 | + } | ||
| 354 | + | ||
| 355 | + g_settings_bind( | ||
| 356 | + settings, | ||
| 357 | + "toolbar-visible", | ||
| 358 | + widget->toolbar, | ||
| 359 | + "visible", | ||
| 360 | + G_SETTINGS_BIND_DEFAULT | ||
| 361 | + ); | ||
| 362 | + | ||
| 363 | + g_settings_bind( | ||
| 364 | + settings, | ||
| 365 | + "toolbar-icon-type", | ||
| 366 | + widget->toolbar, | ||
| 367 | + "icon-type", | ||
| 368 | + G_SETTINGS_BIND_DEFAULT | ||
| 369 | + ); | ||
| 370 | + | ||
| 371 | + g_settings_bind( | ||
| 372 | + settings, | ||
| 373 | + "toolbar-style", | ||
| 374 | + widget->toolbar, | ||
| 375 | + "style", | ||
| 376 | + G_SETTINGS_BIND_DEFAULT | ||
| 377 | + ); | ||
| 378 | + | ||
| 379 | + g_settings_bind( | ||
| 380 | + settings, | ||
| 381 | + "toolbar-icon-size", | ||
| 382 | + widget->toolbar, | ||
| 383 | + "icon-size", | ||
| 384 | + G_SETTINGS_BIND_DEFAULT | ||
| 385 | + ); | ||
| 386 | + | ||
| 387 | + } | ||
| 388 | + | ||
| 389 | + gtk_box_pack_start(container,GTK_WIDGET(hBox),TRUE,TRUE,0); | ||
| 287 | 390 | ||
| 288 | // | 391 | // |
| 289 | - // Do we have keypads? | 392 | + // Create and pack keypads? |
| 290 | // | 393 | // |
| 291 | - GList * keypads = pw3270_application_get_keypad_models(g_application_get_default()); | ||
| 292 | - if(keypads) { | ||
| 293 | - | ||
| 294 | - GtkBox * hBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL,0)); | ||
| 295 | - GtkBox * vBox = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL,0)); | 394 | + { |
| 395 | + GList * keypads = pw3270_application_get_keypad_models(g_application_get_default()); | ||
| 296 | GList * keypad; | 396 | GList * keypad; |
| 297 | 397 | ||
| 298 | // Add top Keypads | 398 | // Add top Keypads |
| @@ -349,15 +449,6 @@ | @@ -349,15 +449,6 @@ | ||
| 349 | } | 449 | } |
| 350 | } | 450 | } |
| 351 | 451 | ||
| 352 | - // Add it to the container | ||
| 353 | - gtk_widget_show(GTK_WIDGET(hBox)); | ||
| 354 | - gtk_widget_show(GTK_WIDGET(vBox)); | ||
| 355 | - gtk_box_pack_start(container,GTK_WIDGET(hBox),TRUE,TRUE,0); | ||
| 356 | - | ||
| 357 | - } else { | ||
| 358 | - | ||
| 359 | - gtk_box_pack_start(container,GTK_WIDGET(widget->notebook),TRUE,TRUE,0); | ||
| 360 | - | ||
| 361 | } | 452 | } |
| 362 | 453 | ||
| 363 | gtk_widget_show_all(GTK_WIDGET(widget->notebook)); | 454 | gtk_widget_show_all(GTK_WIDGET(widget->notebook)); |
| @@ -381,7 +472,7 @@ | @@ -381,7 +472,7 @@ | ||
| 381 | pw3270_action_session_properties_new(), | 472 | pw3270_action_session_properties_new(), |
| 382 | pw3270_set_color_action_new(), | 473 | pw3270_set_color_action_new(), |
| 383 | 474 | ||
| 384 | - pw3270_action_save_session_as_new(), | 475 | + pw3270_action_save_session_preferences_new(), |
| 385 | 476 | ||
| 386 | pw3270_file_transfer_action_new(), | 477 | pw3270_file_transfer_action_new(), |
| 387 | 478 | ||
| @@ -409,22 +500,21 @@ | @@ -409,22 +500,21 @@ | ||
| 409 | } | 500 | } |
| 410 | 501 | ||
| 411 | // | 502 | // |
| 412 | - // Setup toolbar | 503 | + // Bind properties |
| 413 | // | 504 | // |
| 505 | + g_action_map_add_action( | ||
| 506 | + G_ACTION_MAP(widget), | ||
| 507 | + G_ACTION(g_property_action_new("menubar", widget, "show-menubar")) | ||
| 508 | + ); | ||
| 414 | 509 | ||
| 415 | - { | ||
| 416 | - | ||
| 417 | - g_action_map_add_action( | ||
| 418 | - G_ACTION_MAP(widget), | ||
| 419 | - G_ACTION(g_property_action_new("toolbar", widget->toolbar, "visible")) | ||
| 420 | - ); | ||
| 421 | - | ||
| 422 | - g_action_map_add_action( | ||
| 423 | - G_ACTION_MAP(widget), | ||
| 424 | - G_ACTION(g_property_action_new("menubar", widget, "show-menubar")) | ||
| 425 | - ); | 510 | + g_settings_bind( |
| 511 | + settings, | ||
| 512 | + "toolbar-action-names", | ||
| 513 | + widget->toolbar, | ||
| 514 | + "action-names", | ||
| 515 | + G_SETTINGS_BIND_DEFAULT | ||
| 516 | + ); | ||
| 426 | 517 | ||
| 427 | - } | ||
| 428 | 518 | ||
| 429 | } | 519 | } |
| 430 | 520 | ||
| @@ -567,38 +657,6 @@ | @@ -567,38 +657,6 @@ | ||
| 567 | G_SETTINGS_BIND_DEFAULT | 657 | G_SETTINGS_BIND_DEFAULT |
| 568 | ); | 658 | ); |
| 569 | 659 | ||
| 570 | - g_settings_bind( | ||
| 571 | - settings, | ||
| 572 | - "toolbar-visible", | ||
| 573 | - window->toolbar, | ||
| 574 | - "visible", | ||
| 575 | - G_SETTINGS_BIND_DEFAULT | ||
| 576 | - ); | ||
| 577 | - | ||
| 578 | - g_settings_bind( | ||
| 579 | - settings, | ||
| 580 | - "toolbar-action-names", | ||
| 581 | - window->toolbar, | ||
| 582 | - "action-names", | ||
| 583 | - G_SETTINGS_BIND_DEFAULT | ||
| 584 | - ); | ||
| 585 | - | ||
| 586 | - g_settings_bind( | ||
| 587 | - settings, | ||
| 588 | - "toolbar-style", | ||
| 589 | - window->toolbar, | ||
| 590 | - "style", | ||
| 591 | - G_SETTINGS_BIND_DEFAULT | ||
| 592 | - ); | ||
| 593 | - | ||
| 594 | - g_settings_bind( | ||
| 595 | - settings, | ||
| 596 | - "toolbar-icon-size", | ||
| 597 | - window->toolbar, | ||
| 598 | - "icon-size", | ||
| 599 | - G_SETTINGS_BIND_DEFAULT | ||
| 600 | - ); | ||
| 601 | - | ||
| 602 | } | 660 | } |
| 603 | 661 | ||
| 604 | // Setup default position and size | 662 | // Setup default position and size |
| @@ -704,7 +762,7 @@ | @@ -704,7 +762,7 @@ | ||
| 704 | // Setup keypads | 762 | // Setup keypads |
| 705 | if(window->keypads) { | 763 | if(window->keypads) { |
| 706 | 764 | ||
| 707 | - GKeyFile * keyfile = v3270_get_session_keyfile(terminal); | 765 | + GKeyFile * keyfile = v3270_key_file_get(terminal); |
| 708 | 766 | ||
| 709 | if(keyfile) { | 767 | if(keyfile) { |
| 710 | 768 |
src/objects/windows/savedesktopicon.c
| @@ -1,176 +0,0 @@ | @@ -1,176 +0,0 @@ | ||
| 1 | -/* | ||
| 2 | - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | ||
| 3 | - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | ||
| 4 | - * aplicativos mainframe. Registro no INPI sob o nome G3270. | ||
| 5 | - * | ||
| 6 | - * Copyright (C) <2008> <Banco do Brasil S.A.> | ||
| 7 | - * | ||
| 8 | - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | ||
| 9 | - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | ||
| 10 | - * Free Software Foundation. | ||
| 11 | - * | ||
| 12 | - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | ||
| 13 | - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | ||
| 14 | - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | ||
| 15 | - * obter mais detalhes. | ||
| 16 | - * | ||
| 17 | - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | ||
| 18 | - * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | ||
| 19 | - * St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 20 | - * | ||
| 21 | - * Este programa está nomeado como - e possui - linhas de código. | ||
| 22 | - * | ||
| 23 | - * Contatos: | ||
| 24 | - * | ||
| 25 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | ||
| 26 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | ||
| 27 | - * | ||
| 28 | - */ | ||
| 29 | - | ||
| 30 | - /** | ||
| 31 | - * @brief Implement Windows version of the save desktop icon action. | ||
| 32 | - * | ||
| 33 | - * References: | ||
| 34 | - * | ||
| 35 | - * <https://stackoverflow.com/questions/3906974/how-to-programmatically-create-a-shortcut-using-win32> | ||
| 36 | - * <https://docs.microsoft.com/pt-br/windows/win32/shell/links?redirectedfrom=MSDN> | ||
| 37 | - * | ||
| 38 | - */ | ||
| 39 | - | ||
| 40 | - #include <winsock2.h> | ||
| 41 | - #include <windows.h> | ||
| 42 | - | ||
| 43 | - #include <v3270.h> | ||
| 44 | - #include <pw3270.h> | ||
| 45 | - #include <pw3270/application.h> | ||
| 46 | - #include <v3270/actions.h> | ||
| 47 | - #include <lib3270.h> | ||
| 48 | - #include <lib3270/log.h> | ||
| 49 | - | ||
| 50 | - static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); | ||
| 51 | - static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); | ||
| 52 | - | ||
| 53 | - static const struct _entry { | ||
| 54 | - | ||
| 55 | - const gchar * label; | ||
| 56 | - const gchar * tooltip; | ||
| 57 | - gint width; | ||
| 58 | - | ||
| 59 | - } entries[] = { | ||
| 60 | - | ||
| 61 | - { | ||
| 62 | - .label = N_("File name"), | ||
| 63 | - .width = 40, | ||
| 64 | - }, | ||
| 65 | - | ||
| 66 | - { | ||
| 67 | - .label = N_("Launcher name"), | ||
| 68 | - .width = 20, | ||
| 69 | - } | ||
| 70 | - | ||
| 71 | - }; | ||
| 72 | - | ||
| 73 | - GAction * pw3270_action_save_desktop_icon_new(void) { | ||
| 74 | - | ||
| 75 | - V3270SimpleAction * action = v3270_dialog_action_new(factory); | ||
| 76 | - | ||
| 77 | - action->name = "save.launcher"; | ||
| 78 | - action->label = _("Save desktop icon"); | ||
| 79 | - action->tooltip = _("Create a desktop icon for the current session"); | ||
| 80 | - | ||
| 81 | - return G_ACTION(action); | ||
| 82 | - | ||
| 83 | - } | ||
| 84 | - | ||
| 85 | - GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { | ||
| 86 | - | ||
| 87 | - size_t ix; | ||
| 88 | - | ||
| 89 | - gboolean use_header; | ||
| 90 | - g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); | ||
| 91 | - | ||
| 92 | - GtkWidget * dialog = | ||
| 93 | - GTK_WIDGET(g_object_new( | ||
| 94 | - GTK_TYPE_DIALOG, | ||
| 95 | - "use-header-bar", (use_header ? 1 : 0), | ||
| 96 | - NULL | ||
| 97 | - )); | ||
| 98 | - | ||
| 99 | - gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); | ||
| 100 | - gtk_window_set_title(GTK_WINDOW(dialog),action->label); | ||
| 101 | - | ||
| 102 | - gtk_dialog_add_buttons( | ||
| 103 | - GTK_DIALOG(dialog), | ||
| 104 | - _("_Cancel"), GTK_RESPONSE_CANCEL, | ||
| 105 | - _("_Save"), GTK_RESPONSE_APPLY, | ||
| 106 | - NULL | ||
| 107 | - ); | ||
| 108 | - | ||
| 109 | - g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); | ||
| 110 | - | ||
| 111 | - // Create entry fields | ||
| 112 | - GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries)); | ||
| 113 | - g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free); | ||
| 114 | - debug("Dialog=%p inputs=%p",dialog,inputs); | ||
| 115 | - | ||
| 116 | - GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 117 | - | ||
| 118 | - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0); | ||
| 119 | - | ||
| 120 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 121 | - gtk_container_set_border_width(GTK_CONTAINER(grid),18); | ||
| 122 | - gtk_grid_set_row_spacing(GTK_GRID(grid),6); | ||
| 123 | - gtk_grid_set_column_spacing(GTK_GRID(grid),12); | ||
| 124 | - | ||
| 125 | - // https://developer.gnome.org/hig/stable/visual-layout.html.en | ||
| 126 | - // gtk_box_set_spacing(GTK_BOX(content_area),18); | ||
| 127 | - | ||
| 128 | - for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) { | ||
| 129 | - | ||
| 130 | - GtkWidget * label = gtk_label_new(gettext(entries[ix].label)); | ||
| 131 | - gtk_label_set_xalign(GTK_LABEL(label),1); | ||
| 132 | - gtk_grid_attach(grid,label,0,ix,1,1); | ||
| 133 | - | ||
| 134 | - inputs[ix] = gtk_entry_new(); | ||
| 135 | - debug("inputs[%u]=%p",(unsigned int) ix, inputs[ix]); | ||
| 136 | - | ||
| 137 | - gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width); | ||
| 138 | -// gtk_entry_set_max_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].n_chars); | ||
| 139 | - gtk_widget_set_hexpand(inputs[ix],FALSE); | ||
| 140 | - gtk_widget_set_vexpand(inputs[ix],FALSE); | ||
| 141 | - | ||
| 142 | - gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1); | ||
| 143 | - | ||
| 144 | - } | ||
| 145 | - | ||
| 146 | - /* | ||
| 147 | - | ||
| 148 | - gtk_entry_set_text(GTK_ENTRY(inputs[0]),filename); | ||
| 149 | - | ||
| 150 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 151 | - gtk_entry_set_text(GTK_ENTRY(inputs[1]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 152 | - | ||
| 153 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 154 | - gtk_entry_set_text(GTK_ENTRY(inputs[2]),G_STRINGIFY(PRODUCT_NAME)); | ||
| 155 | - | ||
| 156 | - gtk_entry_set_placeholder_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
| 157 | - gtk_entry_set_text(GTK_ENTRY(inputs[3]),v3270_get_url(terminal)); | ||
| 158 | - gtk_entry_set_input_hints(GTK_ENTRY(inputs[3]),GTK_INPUT_HINT_SPELLCHECK); | ||
| 159 | - | ||
| 160 | - */ | ||
| 161 | - | ||
| 162 | - gtk_widget_show_all(GTK_WIDGET(grid)); | ||
| 163 | - return dialog; | ||
| 164 | - } | ||
| 165 | - | ||
| 166 | - void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { | ||
| 167 | - | ||
| 168 | - debug("%s(%d)",__FUNCTION__,response_id); | ||
| 169 | - | ||
| 170 | - if(response_id == GTK_RESPONSE_APPLY) { | ||
| 171 | - | ||
| 172 | - } | ||
| 173 | - | ||
| 174 | - gtk_widget_destroy(dialog); | ||
| 175 | - | ||
| 176 | -} |
ui/application.xml
| @@ -155,12 +155,12 @@ | @@ -155,12 +155,12 @@ | ||
| 155 | <section> | 155 | <section> |
| 156 | 156 | ||
| 157 | <item> | 157 | <item> |
| 158 | - <attribute name="label" translatable="yes">Desktop icon</attribute> | 158 | + <attribute name="label" translatable="yes">Shortcut for this session</attribute> |
| 159 | <attribute name="action">win.save.launcher</attribute> | 159 | <attribute name="action">win.save.launcher</attribute> |
| 160 | </item> | 160 | </item> |
| 161 | 161 | ||
| 162 | <item> | 162 | <item> |
| 163 | - <attribute name="label" translatable="yes">Session properties</attribute> | 163 | + <attribute name="label" translatable="yes">Session preferences</attribute> |
| 164 | <attribute name="action">win.save.session.as</attribute> | 164 | <attribute name="action">win.save.session.as</attribute> |
| 165 | </item> | 165 | </item> |
| 166 | 166 |
ui/window.xml
| @@ -90,13 +90,13 @@ | @@ -90,13 +90,13 @@ | ||
| 90 | <section> | 90 | <section> |
| 91 | 91 | ||
| 92 | <item> | 92 | <item> |
| 93 | - <attribute name="label" translatable="yes">Desktop icon</attribute> | 93 | + <attribute name="label" translatable="yes">Shortcut for this session</attribute> |
| 94 | <attribute name="action">win.save.launcher</attribute> | 94 | <attribute name="action">win.save.launcher</attribute> |
| 95 | </item> | 95 | </item> |
| 96 | 96 | ||
| 97 | <item> | 97 | <item> |
| 98 | - <attribute name="label" translatable="yes">Session properties</attribute> | ||
| 99 | - <attribute name="action">win.save.session.as</attribute> | 98 | + <attribute name="label" translatable="yes">Session preferences</attribute> |
| 99 | + <attribute name="action">win.save.session.preferences</attribute> | ||
| 100 | </item> | 100 | </item> |
| 101 | 101 | ||
| 102 | </section> | 102 | </section> |
| @@ -165,6 +165,16 @@ | @@ -165,6 +165,16 @@ | ||
| 165 | </item> | 165 | </item> |
| 166 | 166 | ||
| 167 | <item> | 167 | <item> |
| 168 | + <attribute name="label" translatable="yes">Copy as HTML</attribute> | ||
| 169 | + <attribute name="action">win.copy-html</attribute> | ||
| 170 | + </item> | ||
| 171 | + | ||
| 172 | + <item> | ||
| 173 | + <attribute name="label" translatable="yes">Copy as image</attribute> | ||
| 174 | + <attribute name="action">win.copy-pixbuff</attribute> | ||
| 175 | + </item> | ||
| 176 | + | ||
| 177 | + <item> | ||
| 168 | <attribute name="label" translatable="yes">Append to copy</attribute> | 178 | <attribute name="label" translatable="yes">Append to copy</attribute> |
| 169 | <attribute name="action">win.copy-append</attribute> | 179 | <attribute name="action">win.copy-append</attribute> |
| 170 | </item> | 180 | </item> |
| @@ -361,6 +371,11 @@ | @@ -361,6 +371,11 @@ | ||
| 361 | </item> | 371 | </item> |
| 362 | 372 | ||
| 363 | <item> | 373 | <item> |
| 374 | + <attribute name="label" translatable="yes">Use +/- for field navigation</attribute> | ||
| 375 | + <attribute name="action">win.kpalternative</attribute> | ||
| 376 | + </item> | ||
| 377 | + | ||
| 378 | + <item> | ||
| 364 | <attribute name="label" translatable="yes">Resize on alternate screen</attribute> | 379 | <attribute name="label" translatable="yes">Resize on alternate screen</attribute> |
| 365 | <attribute name="action">win.altscreen</attribute> | 380 | <attribute name="action">win.altscreen</attribute> |
| 366 | </item> | 381 | </item> |
| @@ -381,7 +396,7 @@ | @@ -381,7 +396,7 @@ | ||
| 381 | <attribute name="label" translatable="yes">Dynamic font spacing</attribute> | 396 | <attribute name="label" translatable="yes">Dynamic font spacing</attribute> |
| 382 | <attribute name="action">win.dynamic-font-spacing</attribute> | 397 | <attribute name="action">win.dynamic-font-spacing</attribute> |
| 383 | </item> | 398 | </item> |
| 384 | - | 399 | + |
| 385 | <section> | 400 | <section> |
| 386 | 401 | ||
| 387 | <item> | 402 | <item> |
| @@ -426,6 +441,11 @@ | @@ -426,6 +441,11 @@ | ||
| 426 | <attribute name="action">win.menubar</attribute> | 441 | <attribute name="action">win.menubar</attribute> |
| 427 | </item> | 442 | </item> |
| 428 | 443 | ||
| 444 | + <item> | ||
| 445 | + <attribute name="label" translatable="yes">Session Trace</attribute> | ||
| 446 | + <attribute name="action">win.trace</attribute> | ||
| 447 | + </item> | ||
| 448 | + | ||
| 429 | </submenu> | 449 | </submenu> |
| 430 | 450 | ||
| 431 | <section> | 451 | <section> |
| @@ -460,7 +480,7 @@ | @@ -460,7 +480,7 @@ | ||
| 460 | </item> | 480 | </item> |
| 461 | 481 | ||
| 462 | </section> | 482 | </section> |
| 463 | - | 483 | + |
| 464 | </menu> | 484 | </menu> |
| 465 | 485 | ||
| 466 | <menu id="popup-over-oia"> | 486 | <menu id="popup-over-oia"> |
| @@ -527,7 +547,7 @@ | @@ -527,7 +547,7 @@ | ||
| 527 | 547 | ||
| 528 | </submenu> | 548 | </submenu> |
| 529 | 549 | ||
| 530 | - <submenu id="view-when-offline-placeholder"> | 550 | + <submenu id="view-when-offline-placeholder"> |
| 531 | 551 | ||
| 532 | <attribute name='label' translatable='yes'>View</attribute> | 552 | <attribute name='label' translatable='yes'>View</attribute> |
| 533 | 553 | ||
| @@ -541,6 +561,11 @@ | @@ -541,6 +561,11 @@ | ||
| 541 | <attribute name="action">win.menubar</attribute> | 561 | <attribute name="action">win.menubar</attribute> |
| 542 | </item> | 562 | </item> |
| 543 | 563 | ||
| 564 | + <item> | ||
| 565 | + <attribute name="label" translatable="yes">Session Trace</attribute> | ||
| 566 | + <attribute name="action">win.trace</attribute> | ||
| 567 | + </item> | ||
| 568 | + | ||
| 544 | </submenu> | 569 | </submenu> |
| 545 | 570 | ||
| 546 | <section> | 571 | <section> |
| @@ -551,7 +576,7 @@ | @@ -551,7 +576,7 @@ | ||
| 551 | </item> | 576 | </item> |
| 552 | 577 | ||
| 553 | <item> | 578 | <item> |
| 554 | - <attribute name="label" translatable="yes">Session properties</attribute> | 579 | + <attribute name="label" translatable="yes">Session preferences</attribute> |
| 555 | <attribute name="action">win.session.properties</attribute> | 580 | <attribute name="action">win.session.properties</attribute> |
| 556 | </item> | 581 | </item> |
| 557 | 582 |
win/makeruntime.sh.in
| @@ -25,6 +25,9 @@ | @@ -25,6 +25,9 @@ | ||
| 25 | # erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) | 25 | # erico.mendonca@gmail.com (Erico Mascarenhas de Mendonça) |
| 26 | # | 26 | # |
| 27 | 27 | ||
| 28 | +# Get myDIR | ||
| 29 | +myDIR=$(dirname $(readlink -f "${0}")) | ||
| 30 | + | ||
| 28 | # Disable i18n | 31 | # Disable i18n |
| 29 | export LANG=C | 32 | export LANG=C |
| 30 | 33 | ||
| @@ -286,6 +289,11 @@ copy_theme() { | @@ -286,6 +289,11 @@ copy_theme() { | ||
| 286 | exit -1 | 289 | exit -1 |
| 287 | fi | 290 | fi |
| 288 | 291 | ||
| 292 | + echo "${myDIR}/gtk.css" | ||
| 293 | + if [ -e "${myDIR}/gtk.css" ]; then | ||
| 294 | + cp "${myDIR}/gtk.css" "${TARGET}/share/themes/${1}/gtk-3.0/gtk.css" | ||
| 295 | + fi | ||
| 296 | + | ||
| 289 | } | 297 | } |
| 290 | 298 | ||
| 291 | # | 299 | # |
win/pack.sh
| @@ -31,10 +31,14 @@ LIBRARY_NAME="lib3270" | @@ -31,10 +31,14 @@ LIBRARY_NAME="lib3270" | ||
| 31 | CORE_LIBRARIES="lib3270 libv3270 libipc3270" | 31 | CORE_LIBRARIES="lib3270 libv3270 libipc3270" |
| 32 | PACKAGE_PLUGINS="" | 32 | PACKAGE_PLUGINS="" |
| 33 | PACKAGE_EXTRAS="libhllapi" | 33 | PACKAGE_EXTRAS="libhllapi" |
| 34 | -TARGET_ARCHS="x86_64 x86_32" | 34 | + |
| 35 | +#TARGET_ARCHS="x86_64 x86_32" | ||
| 36 | +TARGET_ARCHS="x86_64" | ||
| 37 | + | ||
| 35 | GIT_URL="https://github.com/PerryWerneck" | 38 | GIT_URL="https://github.com/PerryWerneck" |
| 36 | BUILD_UNSTABLE=0 | 39 | BUILD_UNSTABLE=0 |
| 37 | MAKE_ZIP=0 | 40 | MAKE_ZIP=0 |
| 41 | +CLEAR_TARGET_PATH=0 | ||
| 38 | 42 | ||
| 39 | PROJECTDIR=$(dirname $(dirname $(readlink -f ${0}))) | 43 | PROJECTDIR=$(dirname $(dirname $(readlink -f ${0}))) |
| 40 | WORKDIR=$(mktemp -d) | 44 | WORKDIR=$(mktemp -d) |
| @@ -80,7 +84,6 @@ failed() | @@ -80,7 +84,6 @@ failed() | ||
| 80 | clone() | 84 | clone() |
| 81 | { | 85 | { |
| 82 | echo -e "\e]2;Cloning ${1}\a" | 86 | echo -e "\e]2;Cloning ${1}\a" |
| 83 | - echo "Cloning ${1}" | ||
| 84 | 87 | ||
| 85 | mkdir -p ${WORKDIR}/sources | 88 | mkdir -p ${WORKDIR}/sources |
| 86 | 89 | ||
| @@ -552,27 +555,40 @@ makeRuntime() | @@ -552,27 +555,40 @@ makeRuntime() | ||
| 552 | # | 555 | # |
| 553 | copy_install_file() { | 556 | copy_install_file() { |
| 554 | 557 | ||
| 555 | - FILENAME=${PROJECTDIR}/$(basename ${1}) | ||
| 556 | - | ||
| 557 | - rm -f "${FILENAME}" | ||
| 558 | - cp -v "${1}" "${FILENAME}" | ||
| 559 | - | ||
| 560 | if [ "$?" != "0" ]; then | 558 | if [ "$?" != "0" ]; then |
| 561 | failed "Can't copy ${1} to ${FILENAME}" | 559 | failed "Can't copy ${1} to ${FILENAME}" |
| 562 | fi | 560 | fi |
| 563 | 561 | ||
| 564 | if [ ${BUILD_UNSTABLE} == "1" ]; then | 562 | if [ ${BUILD_UNSTABLE} == "1" ]; then |
| 565 | TARGET_PATH="/${PRODUCT_NAME}/unstable/${ARCH}" | 563 | TARGET_PATH="/${PRODUCT_NAME}/unstable/${ARCH}" |
| 564 | + FILENAME=${PROJECTDIR}/dist/unstable/${ARCH}/$(basename ${1}) | ||
| 566 | else | 565 | else |
| 567 | TARGET_PATH="/${PRODUCT_NAME}/stable/${ARCH}" | 566 | TARGET_PATH="/${PRODUCT_NAME}/stable/${ARCH}" |
| 567 | + FILENAME=${PROJECTDIR}/dist/stable/${ARCH}/$(basename ${1}) | ||
| 568 | fi | 568 | fi |
| 569 | 569 | ||
| 570 | + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then | ||
| 571 | + rm -fr "$(dirname ${FILENAME})/*" | ||
| 572 | + fi | ||
| 573 | + | ||
| 574 | + mkdir -p $(dirname ${FILENAME}) | ||
| 575 | + ln -f -v "${1}" "${FILENAME}" | ||
| 576 | + if [ "$?" != "0" ]; then | ||
| 577 | + cp -v "${1}" "${FILENAME}" | ||
| 578 | + fi | ||
| 579 | + | ||
| 570 | if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then | 580 | if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then |
| 571 | - mkdir -p ~/public_html/win/${TARGET_PATH} | ||
| 572 | - ln -f -v "${FILENAME}" ~/public_html/win/${TARGET_PATH} | 581 | + |
| 582 | + mkdir -p "~/public_html/win/${TARGET_PATH}" | ||
| 573 | if [ "$?" != "0" ]; then | 583 | if [ "$?" != "0" ]; then |
| 574 | - failed "Can't link ${1} to ~/public_html/win/${TARGET_PATH}" | 584 | + failed "Can't create ~/public_html/win/${TARGET_PATH}" |
| 585 | + fi | ||
| 586 | + | ||
| 587 | + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then | ||
| 588 | + rm -fr ~/public_html/win/${TARGET_PATH}/* | ||
| 575 | fi | 589 | fi |
| 590 | + | ||
| 591 | + ln -f -v "${FILENAME}" ~/public_html/win/${TARGET_PATH} | ||
| 576 | fi | 592 | fi |
| 577 | 593 | ||
| 578 | if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then | 594 | if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then |
| @@ -582,18 +598,21 @@ copy_install_file() { | @@ -582,18 +598,21 @@ copy_install_file() { | ||
| 582 | failed "Can't create ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" | 598 | failed "Can't create ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" |
| 583 | fi | 599 | fi |
| 584 | 600 | ||
| 585 | - ln -f -v "${FILENAME}" ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH} | ||
| 586 | - if [ "$?" != "0" ]; then | ||
| 587 | - failed "Can't link ${1} to ~/${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}" | 601 | + if [ "${CLEAR_TARGET_PATH}" == "1" ]; then |
| 602 | + rm -fr ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH}/* | ||
| 588 | fi | 603 | fi |
| 589 | 604 | ||
| 605 | + ln -f -v "${FILENAME}" ${XDG_PUBLICSHARE_DIR}/${TARGET_PATH} | ||
| 606 | + | ||
| 590 | fi | 607 | fi |
| 591 | 608 | ||
| 592 | - if [ "${PUBLISH}" == "1" ] && [ ! -z ${WIN_PACKAGE_SERVER} ]; then | 609 | + if [ "${PUBLISH}" == "1" ] && [ ! -z "${WIN_PACKAGE_SERVER}" ]; then |
| 593 | 610 | ||
| 594 | - scp "${FILENAME}" ${WIN_PACKAGE_SERVER}/${TARGET_PATH} | 611 | + scp "${FILENAME}" "${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})" |
| 595 | if [ "$?" != "0" ]; then | 612 | if [ "$?" != "0" ]; then |
| 596 | - failed "Can't publish ${1} to ${WIN_PACKAGE_SERVER}/${TARGET_PATH}" | 613 | + failed "Can't publish ${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})" |
| 614 | + else | ||
| 615 | + echo "Published to ${WIN_PACKAGE_SERVER}/${TARGET_PATH}/$(basename ${FILENAME})" | ||
| 597 | fi | 616 | fi |
| 598 | 617 | ||
| 599 | fi | 618 | fi |
| @@ -768,13 +787,21 @@ do | @@ -768,13 +787,21 @@ do | ||
| 768 | ;; | 787 | ;; |
| 769 | 788 | ||
| 770 | CLEAR) | 789 | CLEAR) |
| 771 | - if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then | ||
| 772 | - rm -fr ~/public_html/win/${PRODUCT_NAME}/{x86_32,x86_64} | ||
| 773 | - fi | 790 | + CLEAR_TARGET_PATH=1 |
| 774 | 791 | ||
| 775 | - if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}" ]; then | ||
| 776 | - rm -fr ${XDG_PUBLICSHARE_DIR}/${PRODUCT_NAME}/{x86_32,x86_64} | ||
| 777 | - fi | 792 | +# if [ ${BUILD_UNSTABLE} == "1" ]; then |
| 793 | +# CLEAR_TARGET="${PRODUCT_NAME}/unstable" | ||
| 794 | +# else | ||
| 795 | +# CLEAR_TARGET="${PRODUCT_NAME}/stable" | ||
| 796 | +# fi | ||
| 797 | +# | ||
| 798 | +# if [ -d ~/public_html/win/${STORAGE_PATH} ]; then | ||
| 799 | +# echo rm -fr ~/public_html/win/${CLEAR_TARGET}/{x86_32,x86_64} | ||
| 800 | +# fi | ||
| 801 | +# | ||
| 802 | +# if [ ! -z "${XDG_PUBLICSHARE_DIR}" ] && [ -d "${XDG_PUBLICSHARE_DIR}/${CLEAR_TARGET}" ]; then | ||
| 803 | +# echo rm -fr ${XDG_PUBLICSHARE_DIR}/${CLEAR_TARGET}/{x86_32,x86_64} | ||
| 804 | +# fi | ||
| 778 | 805 | ||
| 779 | ;; | 806 | ;; |
| 780 | 807 | ||
| @@ -783,7 +810,7 @@ do | @@ -783,7 +810,7 @@ do | ||
| 783 | ;; | 810 | ;; |
| 784 | 811 | ||
| 785 | TARGET-ARCHS) | 812 | TARGET-ARCHS) |
| 786 | - TARGET_ARCHS=${value} | 813 | + TARGET_ARCHS=$(echo ${value} | sed "s@,@ @g") |
| 787 | ;; | 814 | ;; |
| 788 | 815 | ||
| 789 | NO-PRE-REQS) | 816 | NO-PRE-REQS) |
| @@ -855,9 +882,7 @@ do | @@ -855,9 +882,7 @@ do | ||
| 855 | 882 | ||
| 856 | fi | 883 | fi |
| 857 | 884 | ||
| 858 | - if [ -d ~/public_html/win/${PRODUCT_NAME} ]; then | ||
| 859 | - echo " --clear Replace the contents of public folders" | ||
| 860 | - fi | 885 | + echo " --clear Replace the contents of public folders" |
| 861 | 886 | ||
| 862 | echo "" | 887 | echo "" |
| 863 | exit 0 | 888 | exit 0 |
win/pw3270.nsi.in
| @@ -133,10 +133,15 @@ SubSection "@PRODUCT_NAME@" SecMain | @@ -133,10 +133,15 @@ SubSection "@PRODUCT_NAME@" SecMain | ||
| 133 | 133 | ||
| 134 | # Locale files | 134 | # Locale files |
| 135 | CreateDirectory "$INSTDIR\locale\pt_BR\LC_MESSAGES" | 135 | CreateDirectory "$INSTDIR\locale\pt_BR\LC_MESSAGES" |
| 136 | - file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\@PACKAGE@.mo" "share\locale\pt_BR\LC_MESSAGES\@PACKAGE@.mo" | 136 | + file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\@PACKAGE_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\@PACKAGE_NAME@.mo" |
| 137 | file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" | 137 | file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" "share\locale\pt_BR\LC_MESSAGES\lib@LIBRARY_NAME@.mo" |
| 138 | file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\libv3270.mo" "share\locale\pt_BR\LC_MESSAGES\libv3270.mo" | 138 | file "/oname=$INSTDIR\locale\pt_BR\LC_MESSAGES\libv3270.mo" "share\locale\pt_BR\LC_MESSAGES\libv3270.mo" |
| 139 | 139 | ||
| 140 | + # Customized icons | ||
| 141 | + CreateDirectory "$INSTDIR\icons" | ||
| 142 | + file "/oname=$INSTDIR\icons\gtk-connect-symbolic.svg" "share\@PRODUCT_NAME@\icons\gtk-connect-symbolic.svg" | ||
| 143 | + file "/oname=$INSTDIR\icons\gtk-disconnect-symbolic.svg" "share\@PRODUCT_NAME@\icons\gtk-disconnect-symbolic.svg" | ||
| 144 | + | ||
| 140 | # define uninstaller name | 145 | # define uninstaller name |
| 141 | SetRegView 32 | 146 | SetRegView 32 |
| 142 | 147 |