Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'kbuild-v6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild

Pull Kbuild updates from Masahiro Yamada:
"This is the last pull request from me.

I'm grateful to have been able to continue as a maintainer for eight
years. From the next cycle, Nathan and Nicolas will maintain Kbuild.

- Fix a shortcut key issue in menuconfig

- Fix missing rebuild of kheaders

- Sort the symbol dump generated by gendwarfsyms

- Support zboot extraction in scripts/extract-vmlinux

- Migrate gconfig to GTK 3

- Add TAR variable to allow overriding the default tar command

- Hand over Kbuild maintainership"

* tag 'kbuild-v6.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (92 commits)
MAINTAINERS: hand over Kbuild maintenance
kheaders: make it possible to override TAR
kbuild: userprogs: use correct linker when mixing clang and GNU ld
kconfig: lxdialog: replace strcpy() with strncpy() in inputbox.c
kconfig: lxdialog: replace strcpy with snprintf in print_autowrap
kconfig: gconf: refactor text_insert_help()
kconfig: gconf: remove unneeded variable in text_insert_msg
kconfig: gconf: use hyphens in signals
kconfig: gconf: replace GtkImageMenuItem with GtkMenuItem
kconfig: gconf: Fix Back button behavior
kconfig: gconf: fix single view to display dependent symbols correctly
scripts: add zboot support to extract-vmlinux
gendwarfksyms: order -T symtypes output by name
gendwarfksyms: use preferred form of sizeof for allocation
kconfig: qconf: confine {begin,end}Group to constructor and destructor
kconfig: qconf: fix ConfigList::updateListAllforAll()
kconfig: add a function to dump all menu entries in a tree-like format
kconfig: gconf: show GTK version in About dialog
kconfig: gconf: replace GtkHPaned and GtkVPaned with GtkPaned
kconfig: gconf: replace GdkColor with GdkRGBA
...

+1223 -1339
+6
CREDITS
··· 4378 4378 S: New York, New York 10025 4379 4379 S: USA 4380 4380 4381 + N: Masahiro Yamada 4382 + E: masahiroy@kernel.org 4383 + D: Kbuild Maintainer 2017-2025 4384 + D: Kconfig Maintainer 2018-2025 4385 + S: Japan 4386 + 4381 4387 N: Li Yang 4382 4388 E: leoli@freescale.com 4383 4389 D: Freescale Highspeed USB device driver
+4 -4
Documentation/kbuild/kconfig.rst
··· 67 67 with its value when saving the configuration, instead of using the 68 68 default, ``CONFIG_``. 69 69 70 - Environment variables for ``{allyes/allmod/allno/rand}config``: 70 + Environment variables for ``{allyes/allmod/allno/alldef/rand}config``: 71 71 72 72 ``KCONFIG_ALLCONFIG`` 73 - The allyesconfig/allmodconfig/allnoconfig/randconfig variants can also 74 - use the environment variable KCONFIG_ALLCONFIG as a flag or a filename 75 - that contains config symbols that the user requires to be set to a 73 + The allyesconfig/allmodconfig/alldefconfig/allnoconfig/randconfig variants 74 + can also use the environment variable KCONFIG_ALLCONFIG as a flag or a 75 + filename that contains config symbols that the user requires to be set to a 76 76 specific value. If KCONFIG_ALLCONFIG is used without a filename where 77 77 KCONFIG_ALLCONFIG == "" or KCONFIG_ALLCONFIG == "1", ``make *config`` 78 78 checks for a file named "all{yes/mod/no/def/random}.config"
+5 -8
MAINTAINERS
··· 13174 13174 F: scripts/Makefile.kasan 13175 13175 13176 13176 KCONFIG 13177 - M: Masahiro Yamada <masahiroy@kernel.org> 13178 13177 L: linux-kbuild@vger.kernel.org 13179 - S: Maintained 13178 + S: Orphan 13180 13179 Q: https://patchwork.kernel.org/project/linux-kbuild/list/ 13181 - T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kbuild 13182 13180 F: Documentation/kbuild/kconfig* 13183 13181 F: scripts/Kconfig.include 13184 13182 F: scripts/kconfig/ ··· 13241 13243 F: fs/autofs/ 13242 13244 13243 13245 KERNEL BUILD + files below scripts/ (unless maintained elsewhere) 13244 - M: Masahiro Yamada <masahiroy@kernel.org> 13245 - R: Nathan Chancellor <nathan@kernel.org> 13246 - R: Nicolas Schier <nicolas@fjasle.eu> 13246 + M: Nathan Chancellor <nathan@kernel.org> 13247 + M: Nicolas Schier <nicolas@fjasle.eu> 13247 13248 L: linux-kbuild@vger.kernel.org 13248 - S: Maintained 13249 + S: Odd Fixes 13249 13250 Q: https://patchwork.kernel.org/project/linux-kbuild/list/ 13250 - T: git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git 13251 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/kbuild/linux.git 13251 13252 F: Documentation/kbuild/ 13252 13253 F: Makefile 13253 13254 F: scripts/*vmlinux*
+3 -2
Makefile
··· 549 549 LZ4 = lz4 550 550 XZ = xz 551 551 ZSTD = zstd 552 + TAR = tar 552 553 553 554 CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \ 554 555 -Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF) ··· 629 628 export HOSTRUSTC KBUILD_HOSTRUSTFLAGS 630 629 export CPP AR NM STRIP OBJCOPY OBJDUMP READELF PAHOLE RESOLVE_BTFIDS LEX YACC AWK INSTALLKERNEL 631 630 export PERL PYTHON3 CHECK CHECKFLAGS MAKE UTS_MACHINE HOSTCXX 632 - export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD 631 + export KGZIP KBZIP2 KLZOP LZMA LZ4 XZ ZSTD TAR 633 632 export KBUILD_HOSTCXXFLAGS KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS KBUILD_PROCMACROLDFLAGS LDFLAGS_MODULE 634 633 export KBUILD_USERCFLAGS KBUILD_USERLDFLAGS 635 634 ··· 1142 1141 KBUILD_USERLDFLAGS += $(filter -m32 -m64 --target=%, $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS)) 1143 1142 1144 1143 # userspace programs are linked via the compiler, use the correct linker 1145 - ifeq ($(CONFIG_CC_IS_CLANG)$(CONFIG_LD_IS_LLD),yy) 1144 + ifdef CONFIG_CC_IS_CLANG 1146 1145 KBUILD_USERLDFLAGS += --ld-path=$(LD) 1147 1146 endif 1148 1147
+2 -2
include/crypto/algapi.h
··· 43 43 * alias. 44 44 */ 45 45 #define MODULE_ALIAS_CRYPTO(name) \ 46 - __MODULE_INFO(alias, alias_userspace, name); \ 47 - __MODULE_INFO(alias, alias_crypto, "crypto-" name) 46 + MODULE_INFO(alias, name); \ 47 + MODULE_INFO(alias, "crypto-" name) 48 48 49 49 struct crypto_aead; 50 50 struct crypto_instance;
-3
include/linux/module.h
··· 165 165 166 166 struct module_kobject *lookup_or_create_module_kobject(const char *name); 167 167 168 - /* Generic info of form tag = "info" */ 169 - #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) 170 - 171 168 /* For userspace: you can also call me... */ 172 169 #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) 173 170
+5 -4
include/linux/moduleparam.h
··· 24 24 #define __MODULE_INFO_PREFIX KBUILD_MODNAME "." 25 25 #endif 26 26 27 - #define __MODULE_INFO(tag, name, info) \ 28 - static const char __UNIQUE_ID(name)[] \ 27 + /* Generic info of form tag = "info" */ 28 + #define MODULE_INFO(tag, info) \ 29 + static const char __UNIQUE_ID(modinfo)[] \ 29 30 __used __section(".modinfo") __aligned(1) \ 30 31 = __MODULE_INFO_PREFIX __stringify(tag) "=" info 31 32 32 33 #define __MODULE_PARM_TYPE(name, _type) \ 33 - __MODULE_INFO(parmtype, name##type, #name ":" _type) 34 + MODULE_INFO(parmtype, #name ":" _type) 34 35 35 36 /* One for each parameter, describing how to use it. Some files do 36 37 multiple of these per line, so can't just use MODULE_INFO. */ 37 38 #define MODULE_PARM_DESC(_parm, desc) \ 38 - __MODULE_INFO(parm, _parm, #_parm ":" desc) 39 + MODULE_INFO(parm, #_parm ":" desc) 39 40 40 41 struct kernel_param; 41 42
+2 -2
include/net/tcp.h
··· 2655 2655 void (*write_space)(struct sock *sk)); 2656 2656 2657 2657 #define MODULE_ALIAS_TCP_ULP(name) \ 2658 - __MODULE_INFO(alias, alias_userspace, name); \ 2659 - __MODULE_INFO(alias, alias_tcp_ulp, "tcp-ulp-" name) 2658 + MODULE_INFO(alias, name); \ 2659 + MODULE_INFO(alias, "tcp-ulp-" name) 2660 2660 2661 2661 #ifdef CONFIG_NET_SOCK_MSG 2662 2662 struct sk_msg;
+2
kernel/.gitignore
··· 1 1 # SPDX-License-Identifier: GPL-2.0-only 2 2 /config_data 3 3 /kheaders.md5 4 + /kheaders-objlist 5 + /kheaders-srclist
+42 -5
kernel/Makefile
··· 159 159 $(obj)/config_data: $(KCONFIG_CONFIG) FORCE 160 160 $(call filechk,cat) 161 161 162 + # kheaders_data.tar.xz 162 163 $(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz 163 164 164 - quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz 165 - cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@ 166 - $(obj)/kheaders_data.tar.xz: FORCE 167 - $(call cmd,genikh) 165 + quiet_cmd_kheaders_data = GEN $@ 166 + cmd_kheaders_data = "$<" "$@" "$(obj)/kheaders-srclist" "$(obj)/kheaders-objlist" "$(KBUILD_BUILD_TIMESTAMP)" 167 + cmd_kheaders_data_dep = cat $(depfile) >> $(dot-target).cmd; rm -f $(depfile) 168 168 169 - clean-files := kheaders_data.tar.xz kheaders.md5 169 + define rule_kheaders_data 170 + $(call cmd_and_savecmd,kheaders_data) 171 + $(call cmd,kheaders_data_dep) 172 + endef 173 + 174 + targets += kheaders_data.tar.xz 175 + $(obj)/kheaders_data.tar.xz: $(src)/gen_kheaders.sh $(obj)/kheaders-srclist $(obj)/kheaders-objlist $(obj)/kheaders.md5 FORCE 176 + $(call if_changed_rule,kheaders_data) 177 + 178 + # generated headers in objtree 179 + # 180 + # include/generated/utsversion.h is ignored because it is generated 181 + # after gen_kheaders.sh is executed. (utsversion.h is unneeded for kheaders) 182 + filechk_kheaders_objlist = \ 183 + for d in include "arch/$(SRCARCH)/include"; do \ 184 + find "$${d}/generated" ! -path "include/generated/utsversion.h" -a -name "*.h" -print; \ 185 + done 186 + 187 + $(obj)/kheaders-objlist: FORCE 188 + $(call filechk,kheaders_objlist) 189 + 190 + # non-generated headers in srctree 191 + filechk_kheaders_srclist = \ 192 + for d in include "arch/$(SRCARCH)/include"; do \ 193 + find "$(srctree)/$${d}" -path "$(srctree)/$${d}/generated" -prune -o -name "*.h" -print; \ 194 + done 195 + 196 + $(obj)/kheaders-srclist: FORCE 197 + $(call filechk,kheaders_srclist) 198 + 199 + # Some files are symlinks. If symlinks are changed, kheaders_data.tar.xz should 200 + # be rebuilt. 201 + filechk_kheaders_md5sum = xargs -r -a $< stat -c %N | md5sum 202 + 203 + $(obj)/kheaders.md5: $(obj)/kheaders-srclist FORCE 204 + $(call filechk,kheaders_md5sum) 205 + 206 + clean-files := kheaders.md5 kheaders-srclist kheaders-objlist
+22 -71
kernel/gen_kheaders.sh
··· 4 4 # This script generates an archive consisting of kernel headers 5 5 # for CONFIG_IKHEADERS. 6 6 set -e 7 - sfile="$(readlink -f "$0")" 8 - outdir="$(pwd)" 9 7 tarfile=$1 10 - tmpdir=$outdir/${tarfile%/*}/.tmp_dir 8 + srclist=$2 9 + objlist=$3 10 + timestamp=$4 11 11 12 - dir_list=" 13 - include/ 14 - arch/$SRCARCH/include/ 15 - " 12 + dir=$(dirname "${tarfile}") 13 + tmpdir=${dir}/.tmp_dir 14 + depfile=${dir}/.$(basename "${tarfile}").d 16 15 17 - # Support incremental builds by skipping archive generation 18 - # if timestamps of files being archived are not changed. 16 + # generate dependency list. 17 + { 18 + echo 19 + echo "deps_${tarfile} := \\" 20 + sed 's:\(.*\): \1 \\:' "${srclist}" 21 + sed -n '/^include\/generated\/autoconf\.h$/!s:\(.*\): \1 \\:p' "${objlist}" 22 + echo 23 + echo "${tarfile}: \$(deps_${tarfile})" 24 + echo 25 + echo "\$(deps_${tarfile}):" 19 26 20 - # This block is useful for debugging the incremental builds. 21 - # Uncomment it for debugging. 22 - # if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; 23 - # else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi 24 - # find $all_dirs -name "*.h" | xargs ls -l > /tmp/ls-$iter 25 - 26 - all_dirs= 27 - if [ "$building_out_of_srctree" ]; then 28 - for d in $dir_list; do 29 - all_dirs="$all_dirs $srctree/$d" 30 - done 31 - fi 32 - all_dirs="$all_dirs $dir_list" 33 - 34 - # include/generated/utsversion.h is ignored because it is generated after this 35 - # script is executed. (utsversion.h is unneeded for kheaders) 36 - # 37 - # When Kconfig regenerates include/generated/autoconf.h, its timestamp is 38 - # updated, but the contents might be still the same. When any CONFIG option is 39 - # changed, Kconfig touches the corresponding timestamp file include/config/*. 40 - # Hence, the md5sum detects the configuration change anyway. We do not need to 41 - # check include/generated/autoconf.h explicitly. 42 - # 43 - # Ignore them for md5 calculation to avoid pointless regeneration. 44 - headers_md5="$(find $all_dirs -name "*.h" -a \ 45 - ! -path include/generated/utsversion.h -a \ 46 - ! -path include/generated/autoconf.h | 47 - xargs ls -l | md5sum | cut -d ' ' -f1)" 48 - 49 - # Any changes to this script will also cause a rebuild of the archive. 50 - this_file_md5="$(ls -l $sfile | md5sum | cut -d ' ' -f1)" 51 - if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi 52 - if [ -f kernel/kheaders.md5 ] && 53 - [ "$(head -n 1 kernel/kheaders.md5)" = "$headers_md5" ] && 54 - [ "$(head -n 2 kernel/kheaders.md5 | tail -n 1)" = "$this_file_md5" ] && 55 - [ "$(tail -n 1 kernel/kheaders.md5)" = "$tarfile_md5" ]; then 56 - exit 57 - fi 58 - 59 - echo " GEN $tarfile" 27 + } > "${depfile}" 60 28 61 29 rm -rf "${tmpdir}" 62 30 mkdir "${tmpdir}" 63 31 64 - if [ "$building_out_of_srctree" ]; then 65 - ( 66 - cd $srctree 67 - for f in $dir_list 68 - do find "$f" -name "*.h"; 69 - done | tar -c -f - -T - | tar -xf - -C "${tmpdir}" 70 - ) 71 - fi 72 - 73 - for f in $dir_list; 74 - do find "$f" -name "*.h"; 75 - done | tar -c -f - -T - | tar -xf - -C "${tmpdir}" 76 - 77 - # Always exclude include/generated/utsversion.h 78 - # Otherwise, the contents of the tarball may vary depending on the build steps. 79 - rm -f "${tmpdir}/include/generated/utsversion.h" 32 + # shellcheck disable=SC2154 # srctree is passed as an env variable 33 + sed "s:^${srctree}/::" "${srclist}" | ${TAR} -c -f - -C "${srctree}" -T - | ${TAR} -xf - -C "${tmpdir}" 34 + ${TAR} -c -f - -T "${objlist}" | ${TAR} -xf - -C "${tmpdir}" 80 35 81 36 # Remove comments except SDPX lines 82 37 # Use a temporary file to store directory contents to prevent find/xargs from ··· 43 88 rm -f "${tmpdir}.contents.txt" 44 89 45 90 # Create archive and try to normalize metadata for reproducibility. 46 - tar "${KBUILD_BUILD_TIMESTAMP:+--mtime=$KBUILD_BUILD_TIMESTAMP}" \ 91 + ${TAR} "${timestamp:+--mtime=$timestamp}" \ 47 92 --owner=0 --group=0 --sort=name --numeric-owner --mode=u=rw,go=r,a+X \ 48 - -I $XZ -cf $tarfile -C "${tmpdir}/" . > /dev/null 49 - 50 - echo $headers_md5 > kernel/kheaders.md5 51 - echo "$this_file_md5" >> kernel/kheaders.md5 52 - echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5 93 + -I "${XZ}" -cf "${tarfile}" -C "${tmpdir}/" . > /dev/null 53 94 54 95 rm -rf "${tmpdir}"
+6 -7
scripts/extract-vmlinux
··· 12 12 13 13 check_vmlinux() 14 14 { 15 - # Use readelf to check if it's a valid ELF 16 - # TODO: find a better to way to check that it's really vmlinux 17 - # and not just an elf 18 - readelf -h $1 > /dev/null 2>&1 || return 1 19 - 20 - cat $1 21 - exit 0 15 + if file "$1" | grep -q 'Linux kernel.*boot executable' || 16 + readelf -h "$1" > /dev/null 2>&1 17 + then 18 + cat "$1" 19 + exit 0 20 + fi 22 21 } 23 22 24 23 try_decompress()
+1 -1
scripts/gendwarfksyms/cache.c
··· 15 15 { 16 16 struct cache_item *ci; 17 17 18 - ci = xmalloc(sizeof(struct cache_item)); 18 + ci = xmalloc(sizeof(*ci)); 19 19 ci->key = key; 20 20 ci->value = value; 21 21 hash_add(cache->cache, &ci->hash, hash_32(key));
+2 -2
scripts/gendwarfksyms/die.c
··· 33 33 { 34 34 struct die *cd; 35 35 36 - cd = xmalloc(sizeof(struct die)); 36 + cd = xmalloc(sizeof(*cd)); 37 37 init_die(cd); 38 38 cd->addr = (uintptr_t)die->addr; 39 39 ··· 123 123 { 124 124 struct die_fragment *df; 125 125 126 - df = xmalloc(sizeof(struct die_fragment)); 126 + df = xmalloc(sizeof(*df)); 127 127 df->type = FRAGMENT_EMPTY; 128 128 list_add_tail(&df->list, &cd->fragments); 129 129 return df;
+1 -1
scripts/gendwarfksyms/dwarf.c
··· 634 634 * Note that the user of this feature is responsible for ensuring 635 635 * that the structure actually remains ABI compatible. 636 636 */ 637 - memset(&state.kabi, 0, sizeof(struct kabi_state)); 637 + memset(&state.kabi, 0, sizeof(state.kabi)); 638 638 639 639 res = checkp(process_die_container(&state, NULL, die, 640 640 check_union_member_kabi_status,
+1 -1
scripts/gendwarfksyms/kabi.c
··· 228 228 if (type == KABI_RULE_TYPE_UNKNOWN) 229 229 error("unsupported kABI rule type: '%s'", field); 230 230 231 - rule = xmalloc(sizeof(struct rule)); 231 + rule = xmalloc(sizeof(*rule)); 232 232 233 233 rule->type = type; 234 234 rule->target = xstrdup(get_rule_field(&rule_str, &left));
+1 -1
scripts/gendwarfksyms/symbols.c
··· 146 146 continue; 147 147 } 148 148 149 - sym = xcalloc(1, sizeof(struct symbol)); 149 + sym = xcalloc(1, sizeof(*sym)); 150 150 sym->name = name; 151 151 sym->addr.section = SHN_UNDEF; 152 152 sym->state = SYMBOL_UNPROCESSED;
+28 -5
scripts/gendwarfksyms/types.c
··· 6 6 #define _GNU_SOURCE 7 7 #include <inttypes.h> 8 8 #include <stdio.h> 9 + #include <stdlib.h> 10 + #include <string.h> 9 11 #include <zlib.h> 10 12 11 13 #include "gendwarfksyms.h" ··· 45 43 if (!s) 46 44 return 0; 47 45 48 - entry = xmalloc(sizeof(struct type_list_entry)); 46 + entry = xmalloc(sizeof(*entry)); 49 47 entry->str = s; 50 48 entry->owned = owned; 51 49 list_add_tail(&entry->list, list); ··· 122 120 struct type_expansion *e; 123 121 124 122 if (__type_map_get(name, &e)) { 125 - e = xmalloc(sizeof(struct type_expansion)); 123 + e = xmalloc(sizeof(*e)); 126 124 type_expansion_init(e); 127 125 e->name = xstrdup(name); 128 126 ··· 181 179 return -1; 182 180 } 183 181 182 + static int cmp_expansion_name(const void *p1, const void *p2) 183 + { 184 + struct type_expansion *const *e1 = p1; 185 + struct type_expansion *const *e2 = p2; 186 + 187 + return strcmp((*e1)->name, (*e2)->name); 188 + } 189 + 184 190 static void type_map_write(FILE *file) 185 191 { 186 192 struct type_expansion *e; 187 193 struct hlist_node *tmp; 194 + struct type_expansion **es; 195 + size_t count = 0; 196 + size_t i = 0; 188 197 189 198 if (!file) 190 199 return; 191 200 192 - hash_for_each_safe(type_map, e, tmp, hash) { 193 - checkp(fputs(e->name, file)); 201 + hash_for_each_safe(type_map, e, tmp, hash) 202 + ++count; 203 + es = xmalloc(count * sizeof(*es)); 204 + hash_for_each_safe(type_map, e, tmp, hash) 205 + es[i++] = e; 206 + 207 + qsort(es, count, sizeof(*es), cmp_expansion_name); 208 + 209 + for (i = 0; i < count; ++i) { 210 + checkp(fputs(es[i]->name, file)); 194 211 checkp(fputs(" ", file)); 195 - type_list_write(&e->expanded, file); 212 + type_list_write(&es[i]->expanded, file); 196 213 checkp(fputs("\n", file)); 197 214 } 215 + 216 + free(es); 198 217 } 199 218 200 219 static void type_map_free(void)
+1 -1
scripts/kconfig/conf.c
··· 594 594 default: 595 595 if (!conf_cnt++) 596 596 printf("*\n* Restart config...\n*\n"); 597 - rootEntry = menu_get_parent_menu(menu); 597 + rootEntry = menu_get_menu_or_parent_menu(menu); 598 598 conf(rootEntry); 599 599 break; 600 600 }
+1 -1
scripts/kconfig/confdata.c
··· 77 77 if (map2 == MAP_FAILED) 78 78 goto close2; 79 79 80 - if (bcmp(map1, map2, st1.st_size)) 80 + if (memcmp(map1, map2, st1.st_size)) 81 81 goto close2; 82 82 83 83 ret = true;
+2 -9
scripts/kconfig/gconf-cfg.sh
··· 6 6 cflags=$1 7 7 libs=$2 8 8 9 - PKG="gtk+-2.0 gmodule-2.0 libglade-2.0" 9 + PKG=gtk+-3.0 10 10 11 11 if [ -z "$(command -v ${HOSTPKG_CONFIG})" ]; then 12 12 echo >&2 "*" ··· 18 18 if ! ${HOSTPKG_CONFIG} --exists $PKG; then 19 19 echo >&2 "*" 20 20 echo >&2 "* Unable to find the GTK+ installation. Please make sure that" 21 - echo >&2 "* the GTK+ 2.0 development package is correctly installed." 21 + echo >&2 "* the GTK 3 development package is correctly installed." 22 22 echo >&2 "* You need $PKG" 23 - echo >&2 "*" 24 - exit 1 25 - fi 26 - 27 - if ! ${HOSTPKG_CONFIG} --atleast-version=2.0.0 gtk+-2.0; then 28 - echo >&2 "*" 29 - echo >&2 "* GTK+ is present but version >= 2.0.0 is required." 30 23 echo >&2 "*" 31 24 exit 1 32 25 fi
+834 -949
scripts/kconfig/gconf.c
··· 7 7 #include "lkc.h" 8 8 #include "images.h" 9 9 10 - #include <glade/glade.h> 11 10 #include <gtk/gtk.h> 12 - #include <glib.h> 13 - #include <gdk/gdkkeysyms.h> 14 11 15 12 #include <stdio.h> 16 13 #include <string.h> ··· 15 18 #include <unistd.h> 16 19 #include <time.h> 17 20 18 - enum { 21 + enum view_mode { 19 22 SINGLE_VIEW, SPLIT_VIEW, FULL_VIEW 20 23 }; 21 24 ··· 27 30 static gboolean show_name = TRUE; 28 31 static gboolean show_range = TRUE; 29 32 static gboolean show_value = TRUE; 30 - static gboolean resizeable = FALSE; 31 33 static int opt_mode = OPT_NORMAL; 32 34 33 - GtkWidget *main_wnd = NULL; 34 - GtkWidget *tree1_w = NULL; // left frame 35 - GtkWidget *tree2_w = NULL; // right frame 36 - GtkWidget *text_w = NULL; 37 - GtkWidget *hpaned = NULL; 38 - GtkWidget *vpaned = NULL; 39 - GtkWidget *back_btn = NULL; 40 - GtkWidget *save_btn = NULL; 41 - GtkWidget *save_menu_item = NULL; 35 + static GtkWidget *main_wnd; 36 + static GtkWidget *tree1_w; // left frame 37 + static GtkWidget *tree2_w; // right frame 38 + static GtkWidget *text_w; 39 + static GtkWidget *hpaned; 40 + static GtkWidget *vpaned; 41 + static GtkWidget *back_btn, *save_btn, *single_btn, *split_btn, *full_btn; 42 + static GtkWidget *save_menu_item; 42 43 43 - GtkTextTag *tag1, *tag2; 44 - GdkColor color; 44 + static GtkTextTag *tag1, *tag2; 45 45 46 - GtkTreeStore *tree1, *tree2, *tree; 47 - GtkTreeModel *model1, *model2; 48 - static GtkTreeIter *parents[256]; 49 - static gint indent; 46 + static GtkTreeStore *tree1, *tree2; 47 + static GdkPixbuf *pix_menu; 50 48 51 - static struct menu *current; // current node for SINGLE view 52 - static struct menu *browsed; // browsed node for SPLIT view 49 + static struct menu *browsed; // browsed menu for SINGLE/SPLIT view 50 + static struct menu *selected; // selected entry 53 51 54 52 enum { 55 53 COL_OPTION, COL_NAME, COL_NO, COL_MOD, COL_YES, COL_VALUE, ··· 53 61 COL_NUMBER 54 62 }; 55 63 56 - static void display_list(void); 57 - static void display_tree(struct menu *menu); 58 - static void display_tree_part(void); 59 - static void update_tree(struct menu *src, GtkTreeIter * dst); 60 - 61 - static void replace_button_icon(GladeXML *xml, GdkDrawable *window, 62 - GtkStyle *style, gchar *btn_name, gchar **xpm) 63 - { 64 - GdkPixmap *pixmap; 65 - GdkBitmap *mask; 66 - GtkToolButton *button; 67 - GtkWidget *image; 68 - 69 - pixmap = gdk_pixmap_create_from_xpm_d(window, &mask, 70 - &style->bg[GTK_STATE_NORMAL], 71 - xpm); 72 - 73 - button = GTK_TOOL_BUTTON(glade_xml_get_widget(xml, btn_name)); 74 - image = gtk_image_new_from_pixmap(pixmap, mask); 75 - gtk_widget_show(image); 76 - gtk_tool_button_set_icon_widget(button, image); 77 - } 64 + static void display_tree(GtkTreeStore *store, struct menu *menu); 65 + static void recreate_tree(void); 78 66 79 67 static void conf_changed(bool dirty) 80 68 { ··· 62 90 gtk_widget_set_sensitive(save_menu_item, dirty); 63 91 } 64 92 65 - /* Main Window Initialization */ 66 - static void init_main_window(const gchar *glade_file) 67 - { 68 - GladeXML *xml; 69 - GtkWidget *widget; 70 - GtkTextBuffer *txtbuf; 71 - GtkStyle *style; 72 - 73 - xml = glade_xml_new(glade_file, "window1", NULL); 74 - if (!xml) 75 - g_error("GUI loading failed !\n"); 76 - glade_xml_signal_autoconnect(xml); 77 - 78 - main_wnd = glade_xml_get_widget(xml, "window1"); 79 - hpaned = glade_xml_get_widget(xml, "hpaned1"); 80 - vpaned = glade_xml_get_widget(xml, "vpaned1"); 81 - tree1_w = glade_xml_get_widget(xml, "treeview1"); 82 - tree2_w = glade_xml_get_widget(xml, "treeview2"); 83 - text_w = glade_xml_get_widget(xml, "textview3"); 84 - 85 - back_btn = glade_xml_get_widget(xml, "button1"); 86 - gtk_widget_set_sensitive(back_btn, FALSE); 87 - 88 - widget = glade_xml_get_widget(xml, "show_name1"); 89 - gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 90 - show_name); 91 - 92 - widget = glade_xml_get_widget(xml, "show_range1"); 93 - gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 94 - show_range); 95 - 96 - widget = glade_xml_get_widget(xml, "show_data1"); 97 - gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 98 - show_value); 99 - 100 - save_btn = glade_xml_get_widget(xml, "button3"); 101 - save_menu_item = glade_xml_get_widget(xml, "save1"); 102 - conf_set_changed_callback(conf_changed); 103 - 104 - style = gtk_widget_get_style(main_wnd); 105 - widget = glade_xml_get_widget(xml, "toolbar1"); 106 - 107 - replace_button_icon(xml, main_wnd->window, style, 108 - "button4", (gchar **) xpm_single_view); 109 - replace_button_icon(xml, main_wnd->window, style, 110 - "button5", (gchar **) xpm_split_view); 111 - replace_button_icon(xml, main_wnd->window, style, 112 - "button6", (gchar **) xpm_tree_view); 113 - 114 - txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 115 - tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1", 116 - "foreground", "red", 117 - "weight", PANGO_WEIGHT_BOLD, 118 - NULL); 119 - tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2", 120 - /*"style", PANGO_STYLE_OBLIQUE, */ 121 - NULL); 122 - 123 - gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text); 124 - 125 - gtk_widget_show(main_wnd); 126 - } 127 - 128 - static void init_tree_model(void) 129 - { 130 - gint i; 131 - 132 - tree = tree2 = gtk_tree_store_new(COL_NUMBER, 133 - G_TYPE_STRING, G_TYPE_STRING, 134 - G_TYPE_STRING, G_TYPE_STRING, 135 - G_TYPE_STRING, G_TYPE_STRING, 136 - G_TYPE_POINTER, GDK_TYPE_COLOR, 137 - G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 138 - G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 139 - G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 140 - G_TYPE_BOOLEAN); 141 - model2 = GTK_TREE_MODEL(tree2); 142 - 143 - for (parents[0] = NULL, i = 1; i < 256; i++) 144 - parents[i] = (GtkTreeIter *) g_malloc(sizeof(GtkTreeIter)); 145 - 146 - tree1 = gtk_tree_store_new(COL_NUMBER, 147 - G_TYPE_STRING, G_TYPE_STRING, 148 - G_TYPE_STRING, G_TYPE_STRING, 149 - G_TYPE_STRING, G_TYPE_STRING, 150 - G_TYPE_POINTER, GDK_TYPE_COLOR, 151 - G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 152 - G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 153 - G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 154 - G_TYPE_BOOLEAN); 155 - model1 = GTK_TREE_MODEL(tree1); 156 - } 157 - 158 - static void init_left_tree(void) 159 - { 160 - GtkTreeView *view = GTK_TREE_VIEW(tree1_w); 161 - GtkCellRenderer *renderer; 162 - GtkTreeSelection *sel; 163 - GtkTreeViewColumn *column; 164 - 165 - gtk_tree_view_set_model(view, model1); 166 - gtk_tree_view_set_headers_visible(view, TRUE); 167 - gtk_tree_view_set_rules_hint(view, TRUE); 168 - 169 - column = gtk_tree_view_column_new(); 170 - gtk_tree_view_append_column(view, column); 171 - gtk_tree_view_column_set_title(column, "Options"); 172 - 173 - renderer = gtk_cell_renderer_toggle_new(); 174 - gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 175 - renderer, FALSE); 176 - gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 177 - renderer, 178 - "active", COL_BTNACT, 179 - "inconsistent", COL_BTNINC, 180 - "visible", COL_BTNVIS, 181 - "radio", COL_BTNRAD, NULL); 182 - renderer = gtk_cell_renderer_text_new(); 183 - gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 184 - renderer, FALSE); 185 - gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 186 - renderer, 187 - "text", COL_OPTION, 188 - "foreground-gdk", 189 - COL_COLOR, NULL); 190 - 191 - sel = gtk_tree_view_get_selection(view); 192 - gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 193 - gtk_widget_realize(tree1_w); 194 - } 195 - 196 - static void renderer_edited(GtkCellRendererText * cell, 197 - const gchar * path_string, 198 - const gchar * new_text, gpointer user_data); 199 - 200 - static void init_right_tree(void) 201 - { 202 - GtkTreeView *view = GTK_TREE_VIEW(tree2_w); 203 - GtkCellRenderer *renderer; 204 - GtkTreeSelection *sel; 205 - GtkTreeViewColumn *column; 206 - gint i; 207 - 208 - gtk_tree_view_set_model(view, model2); 209 - gtk_tree_view_set_headers_visible(view, TRUE); 210 - gtk_tree_view_set_rules_hint(view, TRUE); 211 - 212 - column = gtk_tree_view_column_new(); 213 - gtk_tree_view_append_column(view, column); 214 - gtk_tree_view_column_set_title(column, "Options"); 215 - 216 - renderer = gtk_cell_renderer_pixbuf_new(); 217 - gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 218 - renderer, FALSE); 219 - gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 220 - renderer, 221 - "pixbuf", COL_PIXBUF, 222 - "visible", COL_PIXVIS, NULL); 223 - renderer = gtk_cell_renderer_toggle_new(); 224 - gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 225 - renderer, FALSE); 226 - gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 227 - renderer, 228 - "active", COL_BTNACT, 229 - "inconsistent", COL_BTNINC, 230 - "visible", COL_BTNVIS, 231 - "radio", COL_BTNRAD, NULL); 232 - renderer = gtk_cell_renderer_text_new(); 233 - gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 234 - renderer, FALSE); 235 - gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 236 - renderer, 237 - "text", COL_OPTION, 238 - "foreground-gdk", 239 - COL_COLOR, NULL); 240 - 241 - renderer = gtk_cell_renderer_text_new(); 242 - gtk_tree_view_insert_column_with_attributes(view, -1, 243 - "Name", renderer, 244 - "text", COL_NAME, 245 - "foreground-gdk", 246 - COL_COLOR, NULL); 247 - renderer = gtk_cell_renderer_text_new(); 248 - gtk_tree_view_insert_column_with_attributes(view, -1, 249 - "N", renderer, 250 - "text", COL_NO, 251 - "foreground-gdk", 252 - COL_COLOR, NULL); 253 - renderer = gtk_cell_renderer_text_new(); 254 - gtk_tree_view_insert_column_with_attributes(view, -1, 255 - "M", renderer, 256 - "text", COL_MOD, 257 - "foreground-gdk", 258 - COL_COLOR, NULL); 259 - renderer = gtk_cell_renderer_text_new(); 260 - gtk_tree_view_insert_column_with_attributes(view, -1, 261 - "Y", renderer, 262 - "text", COL_YES, 263 - "foreground-gdk", 264 - COL_COLOR, NULL); 265 - renderer = gtk_cell_renderer_text_new(); 266 - gtk_tree_view_insert_column_with_attributes(view, -1, 267 - "Value", renderer, 268 - "text", COL_VALUE, 269 - "editable", 270 - COL_EDIT, 271 - "foreground-gdk", 272 - COL_COLOR, NULL); 273 - g_signal_connect(G_OBJECT(renderer), "edited", 274 - G_CALLBACK(renderer_edited), NULL); 275 - 276 - column = gtk_tree_view_get_column(view, COL_NAME); 277 - gtk_tree_view_column_set_visible(column, show_name); 278 - column = gtk_tree_view_get_column(view, COL_NO); 279 - gtk_tree_view_column_set_visible(column, show_range); 280 - column = gtk_tree_view_get_column(view, COL_MOD); 281 - gtk_tree_view_column_set_visible(column, show_range); 282 - column = gtk_tree_view_get_column(view, COL_YES); 283 - gtk_tree_view_column_set_visible(column, show_range); 284 - column = gtk_tree_view_get_column(view, COL_VALUE); 285 - gtk_tree_view_column_set_visible(column, show_value); 286 - 287 - if (resizeable) { 288 - for (i = 0; i < COL_VALUE; i++) { 289 - column = gtk_tree_view_get_column(view, i); 290 - gtk_tree_view_column_set_resizable(column, TRUE); 291 - } 292 - } 293 - 294 - sel = gtk_tree_view_get_selection(view); 295 - gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 296 - } 297 - 298 - 299 93 /* Utility Functions */ 300 94 301 - 302 - static void text_insert_help(struct menu *menu) 95 + static void text_insert_msg(const char *title, const char *msg) 303 96 { 304 97 GtkTextBuffer *buffer; 305 98 GtkTextIter start, end; 306 - const char *prompt = menu_get_prompt(menu); 307 - struct gstr help = str_new(); 308 - 309 - menu_get_ext_help(menu, &help); 310 - 311 - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 312 - gtk_text_buffer_get_bounds(buffer, &start, &end); 313 - gtk_text_buffer_delete(buffer, &start, &end); 314 - gtk_text_view_set_left_margin(GTK_TEXT_VIEW(text_w), 15); 315 - 316 - gtk_text_buffer_get_end_iter(buffer, &end); 317 - gtk_text_buffer_insert_with_tags(buffer, &end, prompt, -1, tag1, 318 - NULL); 319 - gtk_text_buffer_insert_at_cursor(buffer, "\n\n", 2); 320 - gtk_text_buffer_get_end_iter(buffer, &end); 321 - gtk_text_buffer_insert_with_tags(buffer, &end, str_get(&help), -1, tag2, 322 - NULL); 323 - str_free(&help); 324 - } 325 - 326 - 327 - static void text_insert_msg(const char *title, const char *message) 328 - { 329 - GtkTextBuffer *buffer; 330 - GtkTextIter start, end; 331 - const char *msg = message; 332 99 333 100 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 334 101 gtk_text_buffer_get_bounds(buffer, &start, &end); ··· 83 372 NULL); 84 373 } 85 374 86 - 87 - /* Main Windows Callbacks */ 88 - 89 - void on_save_activate(GtkMenuItem * menuitem, gpointer user_data); 90 - gboolean on_window1_delete_event(GtkWidget * widget, GdkEvent * event, 91 - gpointer user_data) 375 + static void text_insert_help(struct menu *menu) 92 376 { 93 - GtkWidget *dialog, *label; 94 - gint result; 377 + struct gstr help = str_new(); 95 378 96 - if (!conf_get_changed()) 97 - return FALSE; 379 + menu_get_ext_help(menu, &help); 380 + text_insert_msg(menu_get_prompt(menu), str_get(&help)); 381 + str_free(&help); 382 + } 98 383 99 - dialog = gtk_dialog_new_with_buttons("Warning !", 100 - GTK_WINDOW(main_wnd), 101 - (GtkDialogFlags) 102 - (GTK_DIALOG_MODAL | 103 - GTK_DIALOG_DESTROY_WITH_PARENT), 104 - GTK_STOCK_OK, 105 - GTK_RESPONSE_YES, 106 - GTK_STOCK_NO, 107 - GTK_RESPONSE_NO, 108 - GTK_STOCK_CANCEL, 109 - GTK_RESPONSE_CANCEL, NULL); 110 - gtk_dialog_set_default_response(GTK_DIALOG(dialog), 111 - GTK_RESPONSE_CANCEL); 384 + static void _select_menu(GtkTreeView *view, GtkTreeModel *model, 385 + GtkTreeIter *parent, struct menu *match) 386 + { 387 + GtkTreeIter iter; 388 + gboolean valid; 112 389 113 - label = gtk_label_new("\nSave configuration ?\n"); 114 - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), label); 115 - gtk_widget_show(label); 390 + valid = gtk_tree_model_iter_children(model, &iter, parent); 391 + while (valid) { 392 + struct menu *menu; 116 393 117 - result = gtk_dialog_run(GTK_DIALOG(dialog)); 118 - switch (result) { 119 - case GTK_RESPONSE_YES: 120 - on_save_activate(NULL, NULL); 121 - return FALSE; 122 - case GTK_RESPONSE_NO: 123 - return FALSE; 124 - case GTK_RESPONSE_CANCEL: 125 - case GTK_RESPONSE_DELETE_EVENT: 126 - default: 127 - gtk_widget_destroy(dialog); 128 - return TRUE; 394 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 395 + 396 + if (menu == match) { 397 + GtkTreeSelection *selection; 398 + GtkTreePath *path; 399 + 400 + /* 401 + * Expand parents to reflect the selection, and 402 + * scroll down to it. 403 + */ 404 + path = gtk_tree_model_get_path(model, &iter); 405 + gtk_tree_view_expand_to_path(view, path); 406 + gtk_tree_view_scroll_to_cell(view, path, NULL, TRUE, 407 + 0.5, 0.0); 408 + gtk_tree_path_free(path); 409 + 410 + selection = gtk_tree_view_get_selection(view); 411 + gtk_tree_selection_select_iter(selection, &iter); 412 + 413 + text_insert_help(menu); 414 + } 415 + 416 + _select_menu(view, model, &iter, match); 417 + 418 + valid = gtk_tree_model_iter_next(model, &iter); 419 + } 420 + } 421 + 422 + static void select_menu(GtkTreeView *view, struct menu *match) 423 + { 424 + _select_menu(view, gtk_tree_view_get_model(view), NULL, match); 425 + } 426 + 427 + static void _update_row_visibility(GtkTreeView *view) 428 + { 429 + GtkTreeModelFilter *filter = GTK_TREE_MODEL_FILTER(gtk_tree_view_get_model(view)); 430 + 431 + gtk_tree_model_filter_refilter(filter); 432 + } 433 + 434 + static void update_row_visibility(void) 435 + { 436 + if (view_mode == SPLIT_VIEW) 437 + _update_row_visibility(GTK_TREE_VIEW(tree1_w)); 438 + _update_row_visibility(GTK_TREE_VIEW(tree2_w)); 439 + } 440 + 441 + static void set_node(GtkTreeStore *tree, GtkTreeIter *node, struct menu *menu) 442 + { 443 + struct symbol *sym = menu->sym; 444 + tristate val; 445 + gchar *option; 446 + const gchar *_no = ""; 447 + const gchar *_mod = ""; 448 + const gchar *_yes = ""; 449 + const gchar *value = ""; 450 + GdkRGBA color; 451 + gboolean editable = FALSE; 452 + gboolean btnvis = FALSE; 453 + 454 + option = g_strdup_printf("%s %s %s %s", 455 + menu->type == M_COMMENT ? "***" : "", 456 + menu_get_prompt(menu), 457 + menu->type == M_COMMENT ? "***" : "", 458 + sym && !sym_has_value(sym) ? "(NEW)" : ""); 459 + 460 + gdk_rgba_parse(&color, menu_is_visible(menu) ? "Black" : "DarkGray"); 461 + 462 + if (!sym) 463 + goto set; 464 + 465 + sym_calc_value(sym); 466 + 467 + if (menu->type == M_CHOICE) { // parse children to get a final value 468 + struct symbol *def_sym = sym_calc_choice(menu); 469 + struct menu *def_menu = NULL; 470 + 471 + for (struct menu *child = menu->list; child; child = child->next) { 472 + if (menu_is_visible(child) && child->sym == def_sym) 473 + def_menu = child; 474 + } 475 + 476 + if (def_menu) 477 + value = menu_get_prompt(def_menu); 478 + 479 + goto set; 129 480 } 130 481 131 - return FALSE; 482 + switch (sym_get_type(sym)) { 483 + case S_BOOLEAN: 484 + case S_TRISTATE: 485 + 486 + btnvis = TRUE; 487 + 488 + val = sym_get_tristate_value(sym); 489 + switch (val) { 490 + case no: 491 + _no = "N"; 492 + value = "N"; 493 + break; 494 + case mod: 495 + _mod = "M"; 496 + value = "M"; 497 + break; 498 + case yes: 499 + _yes = "Y"; 500 + value = "Y"; 501 + break; 502 + } 503 + 504 + if (val != no && sym_tristate_within_range(sym, no)) 505 + _no = "_"; 506 + if (val != mod && sym_tristate_within_range(sym, mod)) 507 + _mod = "_"; 508 + if (val != yes && sym_tristate_within_range(sym, yes)) 509 + _yes = "_"; 510 + break; 511 + default: 512 + value = sym_get_string_value(sym); 513 + editable = TRUE; 514 + break; 515 + } 516 + 517 + set: 518 + gtk_tree_store_set(tree, node, 519 + COL_OPTION, option, 520 + COL_NAME, sym ? sym->name : "", 521 + COL_NO, _no, 522 + COL_MOD, _mod, 523 + COL_YES, _yes, 524 + COL_VALUE, value, 525 + COL_MENU, (gpointer) menu, 526 + COL_COLOR, &color, 527 + COL_EDIT, editable, 528 + COL_PIXBUF, pix_menu, 529 + COL_PIXVIS, view_mode == SINGLE_VIEW && menu->type == M_MENU, 530 + COL_BTNVIS, btnvis, 531 + COL_BTNACT, _yes[0] == 'Y', 532 + COL_BTNINC, _mod[0] == 'M', 533 + COL_BTNRAD, sym && sym_is_choice_value(sym), 534 + -1); 535 + 536 + g_free(option); 132 537 } 133 538 134 - 135 - void on_window1_destroy(GtkObject * object, gpointer user_data) 539 + static void _update_tree(GtkTreeStore *store, GtkTreeIter *parent) 136 540 { 137 - gtk_main_quit(); 541 + GtkTreeModel *model = GTK_TREE_MODEL(store); 542 + GtkTreeIter iter; 543 + gboolean valid; 544 + 545 + valid = gtk_tree_model_iter_children(model, &iter, parent); 546 + while (valid) { 547 + struct menu *menu; 548 + 549 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 550 + 551 + if (menu) 552 + set_node(store, &iter, menu); 553 + 554 + _update_tree(store, &iter); 555 + 556 + valid = gtk_tree_model_iter_next(model, &iter); 557 + } 138 558 } 139 559 140 - 141 - void 142 - on_window1_size_request(GtkWidget * widget, 143 - GtkRequisition * requisition, gpointer user_data) 560 + static void update_tree(GtkTreeStore *store) 144 561 { 145 - static gint old_h; 146 - gint w, h; 147 - 148 - if (widget->window == NULL) 149 - gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); 150 - else 151 - gdk_window_get_size(widget->window, &w, &h); 152 - 153 - if (h == old_h) 154 - return; 155 - old_h = h; 156 - 157 - gtk_paned_set_position(GTK_PANED(vpaned), 2 * h / 3); 562 + _update_tree(store, NULL); 563 + update_row_visibility(); 158 564 } 159 565 566 + static void update_trees(void) 567 + { 568 + if (view_mode == SPLIT_VIEW) 569 + update_tree(tree1); 570 + update_tree(tree2); 571 + } 572 + 573 + static void set_view_mode(enum view_mode mode) 574 + { 575 + view_mode = mode; 576 + 577 + if (mode == SPLIT_VIEW) { // two panes 578 + gint w; 579 + 580 + gtk_widget_show(tree1_w); 581 + gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, NULL); 582 + gtk_paned_set_position(GTK_PANED(hpaned), w / 2); 583 + } else { 584 + gtk_widget_hide(tree1_w); 585 + gtk_paned_set_position(GTK_PANED(hpaned), 0); 586 + } 587 + 588 + gtk_widget_set_sensitive(single_btn, TRUE); 589 + gtk_widget_set_sensitive(split_btn, TRUE); 590 + gtk_widget_set_sensitive(full_btn, TRUE); 591 + 592 + switch (mode) { 593 + case SINGLE_VIEW: 594 + if (selected) 595 + browsed = menu_get_parent_menu(selected) ?: &rootmenu; 596 + else 597 + browsed = &rootmenu; 598 + recreate_tree(); 599 + text_insert_msg("", ""); 600 + select_menu(GTK_TREE_VIEW(tree2_w), selected); 601 + gtk_widget_set_sensitive(single_btn, FALSE); 602 + break; 603 + case SPLIT_VIEW: 604 + browsed = selected; 605 + while (browsed && !(browsed->flags & MENU_ROOT)) 606 + browsed = browsed->parent; 607 + gtk_tree_store_clear(tree1); 608 + display_tree(tree1, &rootmenu); 609 + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w)); 610 + gtk_tree_store_clear(tree2); 611 + if (browsed) 612 + display_tree(tree2, browsed); 613 + text_insert_msg("", ""); 614 + select_menu(GTK_TREE_VIEW(tree1_w), browsed); 615 + select_menu(GTK_TREE_VIEW(tree2_w), selected); 616 + gtk_widget_set_sensitive(split_btn, FALSE); 617 + break; 618 + case FULL_VIEW: 619 + gtk_tree_store_clear(tree2); 620 + display_tree(tree2, &rootmenu); 621 + text_insert_msg("", ""); 622 + select_menu(GTK_TREE_VIEW(tree2_w), selected); 623 + gtk_widget_set_sensitive(full_btn, FALSE); 624 + break; 625 + } 626 + 627 + gtk_widget_set_sensitive(back_btn, 628 + mode == SINGLE_VIEW && browsed != &rootmenu); 629 + } 160 630 161 631 /* Menu & Toolbar Callbacks */ 162 632 163 - 164 - static void 165 - load_filename(GtkFileSelection * file_selector, gpointer user_data) 633 + static void on_load1_activate(GtkMenuItem *menuitem, gpointer user_data) 166 634 { 167 - const gchar *fn; 635 + GtkWidget *dialog; 636 + GtkFileChooser *chooser; 637 + gint res; 168 638 169 - fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION 170 - (user_data)); 639 + dialog = gtk_file_chooser_dialog_new("Load file...", 640 + GTK_WINDOW(user_data), 641 + GTK_FILE_CHOOSER_ACTION_OPEN, 642 + "_Cancel", GTK_RESPONSE_CANCEL, 643 + "_Open", GTK_RESPONSE_ACCEPT, 644 + NULL); 171 645 172 - if (conf_read(fn)) 173 - text_insert_msg("Error", "Unable to load configuration !"); 174 - else 175 - display_tree_part(); 646 + chooser = GTK_FILE_CHOOSER(dialog); 647 + gtk_file_chooser_set_filename(chooser, conf_get_configname()); 648 + 649 + res = gtk_dialog_run(GTK_DIALOG(dialog)); 650 + if (res == GTK_RESPONSE_ACCEPT) { 651 + char *filename; 652 + 653 + filename = gtk_file_chooser_get_filename(chooser); 654 + 655 + if (conf_read(filename)) 656 + text_insert_msg("Error", 657 + "Unable to load configuration!"); 658 + else 659 + update_trees(); 660 + 661 + g_free(filename); 662 + } 663 + 664 + gtk_widget_destroy(GTK_WIDGET(dialog)); 176 665 } 177 666 178 - void on_load1_activate(GtkMenuItem * menuitem, gpointer user_data) 179 - { 180 - GtkWidget *fs; 181 - 182 - fs = gtk_file_selection_new("Load file..."); 183 - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), 184 - "clicked", 185 - G_CALLBACK(load_filename), (gpointer) fs); 186 - g_signal_connect_swapped(GTK_OBJECT 187 - (GTK_FILE_SELECTION(fs)->ok_button), 188 - "clicked", G_CALLBACK(gtk_widget_destroy), 189 - (gpointer) fs); 190 - g_signal_connect_swapped(GTK_OBJECT 191 - (GTK_FILE_SELECTION(fs)->cancel_button), 192 - "clicked", G_CALLBACK(gtk_widget_destroy), 193 - (gpointer) fs); 194 - gtk_widget_show(fs); 195 - } 196 - 197 - 198 - void on_save_activate(GtkMenuItem * menuitem, gpointer user_data) 667 + static void on_save_activate(GtkMenuItem *menuitem, gpointer user_data) 199 668 { 200 669 if (conf_write(NULL)) 201 670 text_insert_msg("Error", "Unable to save configuration !"); 202 671 conf_write_autoconf(0); 203 672 } 204 673 205 - 206 - static void 207 - store_filename(GtkFileSelection * file_selector, gpointer user_data) 674 + static void on_save_as1_activate(GtkMenuItem *menuitem, gpointer user_data) 208 675 { 209 - const gchar *fn; 676 + GtkWidget *dialog; 677 + GtkFileChooser *chooser; 678 + gint res; 210 679 211 - fn = gtk_file_selection_get_filename(GTK_FILE_SELECTION 212 - (user_data)); 680 + dialog = gtk_file_chooser_dialog_new("Save file as...", 681 + GTK_WINDOW(user_data), 682 + GTK_FILE_CHOOSER_ACTION_SAVE, 683 + "_Cancel", GTK_RESPONSE_CANCEL, 684 + "_Save", GTK_RESPONSE_ACCEPT, 685 + NULL); 213 686 214 - if (conf_write(fn)) 215 - text_insert_msg("Error", "Unable to save configuration !"); 687 + chooser = GTK_FILE_CHOOSER(dialog); 688 + gtk_file_chooser_set_filename(chooser, conf_get_configname()); 216 689 217 - gtk_widget_destroy(GTK_WIDGET(user_data)); 690 + res = gtk_dialog_run(GTK_DIALOG(dialog)); 691 + if (res == GTK_RESPONSE_ACCEPT) { 692 + char *filename; 693 + 694 + filename = gtk_file_chooser_get_filename(chooser); 695 + 696 + if (conf_write(filename)) 697 + text_insert_msg("Error", 698 + "Unable to save configuration !"); 699 + 700 + g_free(filename); 701 + } 702 + 703 + gtk_widget_destroy(dialog); 218 704 } 219 705 220 - void on_save_as1_activate(GtkMenuItem * menuitem, gpointer user_data) 221 - { 222 - GtkWidget *fs; 223 - 224 - fs = gtk_file_selection_new("Save file as..."); 225 - g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(fs)->ok_button), 226 - "clicked", 227 - G_CALLBACK(store_filename), (gpointer) fs); 228 - g_signal_connect_swapped(GTK_OBJECT 229 - (GTK_FILE_SELECTION(fs)->ok_button), 230 - "clicked", G_CALLBACK(gtk_widget_destroy), 231 - (gpointer) fs); 232 - g_signal_connect_swapped(GTK_OBJECT 233 - (GTK_FILE_SELECTION(fs)->cancel_button), 234 - "clicked", G_CALLBACK(gtk_widget_destroy), 235 - (gpointer) fs); 236 - gtk_widget_show(fs); 237 - } 238 - 239 - 240 - void on_quit1_activate(GtkMenuItem * menuitem, gpointer user_data) 241 - { 242 - if (!on_window1_delete_event(NULL, NULL, NULL)) 243 - gtk_widget_destroy(GTK_WIDGET(main_wnd)); 244 - } 245 - 246 - 247 - void on_show_name1_activate(GtkMenuItem * menuitem, gpointer user_data) 706 + static void on_show_name1_activate(GtkMenuItem *menuitem, gpointer user_data) 248 707 { 249 708 GtkTreeViewColumn *col; 250 709 251 - show_name = GTK_CHECK_MENU_ITEM(menuitem)->active; 710 + show_name = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); 252 711 col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NAME); 253 712 if (col) 254 713 gtk_tree_view_column_set_visible(col, show_name); 255 714 } 256 715 257 - 258 - void on_show_range1_activate(GtkMenuItem * menuitem, gpointer user_data) 716 + static void on_show_range1_activate(GtkMenuItem *menuitem, gpointer user_data) 259 717 { 260 718 GtkTreeViewColumn *col; 261 719 262 - show_range = GTK_CHECK_MENU_ITEM(menuitem)->active; 720 + show_range = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); 263 721 col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_NO); 264 722 if (col) 265 723 gtk_tree_view_column_set_visible(col, show_range); ··· 441 561 442 562 } 443 563 444 - 445 - void on_show_data1_activate(GtkMenuItem * menuitem, gpointer user_data) 564 + static void on_show_data1_activate(GtkMenuItem *menuitem, gpointer user_data) 446 565 { 447 566 GtkTreeViewColumn *col; 448 567 449 - show_value = GTK_CHECK_MENU_ITEM(menuitem)->active; 568 + show_value = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); 450 569 col = gtk_tree_view_get_column(GTK_TREE_VIEW(tree2_w), COL_VALUE); 451 570 if (col) 452 571 gtk_tree_view_column_set_visible(col, show_value); 453 572 } 454 573 455 - 456 - void 457 - on_set_option_mode1_activate(GtkMenuItem *menuitem, gpointer user_data) 574 + static void on_set_option_mode1_activate(GtkMenuItem *menuitem, 575 + gpointer user_data) 458 576 { 459 577 opt_mode = OPT_NORMAL; 460 - gtk_tree_store_clear(tree2); 461 - display_tree(&rootmenu); /* instead of update_tree to speed-up */ 578 + update_row_visibility(); 462 579 } 463 580 464 - 465 - void 466 - on_set_option_mode2_activate(GtkMenuItem *menuitem, gpointer user_data) 581 + static void on_set_option_mode2_activate(GtkMenuItem *menuitem, 582 + gpointer user_data) 467 583 { 468 584 opt_mode = OPT_ALL; 469 - gtk_tree_store_clear(tree2); 470 - display_tree(&rootmenu); /* instead of update_tree to speed-up */ 585 + update_row_visibility(); 471 586 } 472 587 473 - 474 - void 475 - on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data) 588 + static void on_set_option_mode3_activate(GtkMenuItem *menuitem, 589 + gpointer user_data) 476 590 { 477 591 opt_mode = OPT_PROMPT; 478 - gtk_tree_store_clear(tree2); 479 - display_tree(&rootmenu); /* instead of update_tree to speed-up */ 592 + update_row_visibility(); 480 593 } 481 594 482 - 483 - void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) 595 + static void on_introduction1_activate(GtkMenuItem *menuitem, gpointer user_data) 484 596 { 485 597 GtkWidget *dialog; 486 598 const gchar *intro_text = ··· 493 621 GTK_DIALOG_DESTROY_WITH_PARENT, 494 622 GTK_MESSAGE_INFO, 495 623 GTK_BUTTONS_CLOSE, "%s", intro_text); 496 - g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 497 - G_CALLBACK(gtk_widget_destroy), 498 - GTK_OBJECT(dialog)); 499 - gtk_widget_show_all(dialog); 624 + gtk_dialog_run(GTK_DIALOG(dialog)); 625 + gtk_widget_destroy(dialog); 500 626 } 501 627 502 - 503 - void on_about1_activate(GtkMenuItem * menuitem, gpointer user_data) 628 + static void on_about1_activate(GtkMenuItem *menuitem, gpointer user_data) 504 629 { 505 630 GtkWidget *dialog; 506 631 const gchar *about_text = ··· 507 638 dialog = gtk_message_dialog_new(GTK_WINDOW(main_wnd), 508 639 GTK_DIALOG_DESTROY_WITH_PARENT, 509 640 GTK_MESSAGE_INFO, 510 - GTK_BUTTONS_CLOSE, "%s", about_text); 511 - g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 512 - G_CALLBACK(gtk_widget_destroy), 513 - GTK_OBJECT(dialog)); 514 - gtk_widget_show_all(dialog); 641 + GTK_BUTTONS_CLOSE, "%s\nGTK version: %d.%d.%d", 642 + about_text, 643 + gtk_get_major_version(), 644 + gtk_get_minor_version(), 645 + gtk_get_micro_version()); 646 + gtk_dialog_run(GTK_DIALOG(dialog)); 647 + gtk_widget_destroy(dialog); 515 648 } 516 649 517 - 518 - void on_license1_activate(GtkMenuItem * menuitem, gpointer user_data) 650 + static void on_license1_activate(GtkMenuItem *menuitem, gpointer user_data) 519 651 { 520 652 GtkWidget *dialog; 521 653 const gchar *license_text = ··· 528 658 GTK_DIALOG_DESTROY_WITH_PARENT, 529 659 GTK_MESSAGE_INFO, 530 660 GTK_BUTTONS_CLOSE, "%s", license_text); 531 - g_signal_connect_swapped(GTK_OBJECT(dialog), "response", 532 - G_CALLBACK(gtk_widget_destroy), 533 - GTK_OBJECT(dialog)); 534 - gtk_widget_show_all(dialog); 661 + gtk_dialog_run(GTK_DIALOG(dialog)); 662 + gtk_widget_destroy(dialog); 535 663 } 536 664 537 - 538 - void on_back_clicked(GtkButton * button, gpointer user_data) 665 + /* toolbar handlers */ 666 + static void on_back_clicked(GtkButton *button, gpointer user_data) 539 667 { 540 - enum prop_type ptype; 668 + browsed = menu_get_parent_menu(browsed) ?: &rootmenu; 541 669 542 - current = current->parent; 543 - ptype = current->prompt ? current->prompt->type : P_UNKNOWN; 544 - if (ptype != P_MENU) 545 - current = current->parent; 546 - display_tree_part(); 670 + recreate_tree(); 547 671 548 - if (current == &rootmenu) 672 + if (browsed == &rootmenu) 549 673 gtk_widget_set_sensitive(back_btn, FALSE); 550 674 } 551 675 552 - 553 - void on_load_clicked(GtkButton * button, gpointer user_data) 676 + static void on_load_clicked(GtkButton *button, gpointer user_data) 554 677 { 555 678 on_load1_activate(NULL, user_data); 556 679 } 557 680 558 - 559 - void on_single_clicked(GtkButton * button, gpointer user_data) 681 + static void on_save_clicked(GtkButton *button, gpointer user_data) 560 682 { 561 - view_mode = SINGLE_VIEW; 562 - gtk_widget_hide(tree1_w); 563 - current = &rootmenu; 564 - display_tree_part(); 683 + on_save_activate(NULL, user_data); 565 684 } 566 685 567 - 568 - void on_split_clicked(GtkButton * button, gpointer user_data) 686 + static void on_single_clicked(GtkButton *button, gpointer user_data) 569 687 { 570 - gint w, h; 571 - view_mode = SPLIT_VIEW; 572 - gtk_widget_show(tree1_w); 573 - gtk_window_get_default_size(GTK_WINDOW(main_wnd), &w, &h); 574 - gtk_paned_set_position(GTK_PANED(hpaned), w / 2); 575 - if (tree2) 576 - gtk_tree_store_clear(tree2); 577 - display_list(); 578 - 579 - /* Disable back btn, like in full mode. */ 580 - gtk_widget_set_sensitive(back_btn, FALSE); 688 + set_view_mode(SINGLE_VIEW); 581 689 } 582 690 583 - 584 - void on_full_clicked(GtkButton * button, gpointer user_data) 691 + static void on_split_clicked(GtkButton *button, gpointer user_data) 585 692 { 586 - view_mode = FULL_VIEW; 587 - gtk_widget_hide(tree1_w); 588 - if (tree2) 589 - gtk_tree_store_clear(tree2); 590 - display_tree(&rootmenu); 591 - gtk_widget_set_sensitive(back_btn, FALSE); 693 + set_view_mode(SPLIT_VIEW); 592 694 } 593 695 696 + static void on_full_clicked(GtkButton *button, gpointer user_data) 697 + { 698 + set_view_mode(FULL_VIEW); 699 + } 594 700 595 - void on_collapse_clicked(GtkButton * button, gpointer user_data) 701 + static void on_collapse_clicked(GtkButton *button, gpointer user_data) 596 702 { 597 703 gtk_tree_view_collapse_all(GTK_TREE_VIEW(tree2_w)); 598 704 } 599 705 600 - 601 - void on_expand_clicked(GtkButton * button, gpointer user_data) 706 + static void on_expand_clicked(GtkButton *button, gpointer user_data) 602 707 { 603 708 gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); 604 709 } 605 710 711 + /* Main Windows Callbacks */ 712 + 713 + static void on_window1_destroy(GtkWidget *widget, gpointer user_data) 714 + { 715 + gtk_main_quit(); 716 + } 717 + 718 + static gboolean on_window1_configure(GtkWidget *self, 719 + GdkEventConfigure *event, 720 + gpointer user_data) 721 + { 722 + gtk_paned_set_position(GTK_PANED(vpaned), 2 * event->height / 3); 723 + return FALSE; 724 + } 725 + 726 + static gboolean on_window1_delete_event(GtkWidget *widget, GdkEvent *event, 727 + gpointer user_data) 728 + { 729 + GtkWidget *dialog, *label, *content_area; 730 + gint result; 731 + gint ret = FALSE; 732 + 733 + if (!conf_get_changed()) 734 + return FALSE; 735 + 736 + dialog = gtk_dialog_new_with_buttons("Warning !", 737 + GTK_WINDOW(main_wnd), 738 + (GtkDialogFlags) 739 + (GTK_DIALOG_MODAL | 740 + GTK_DIALOG_DESTROY_WITH_PARENT), 741 + "_OK", 742 + GTK_RESPONSE_YES, 743 + "_No", 744 + GTK_RESPONSE_NO, 745 + "_Cancel", 746 + GTK_RESPONSE_CANCEL, NULL); 747 + gtk_dialog_set_default_response(GTK_DIALOG(dialog), 748 + GTK_RESPONSE_CANCEL); 749 + 750 + label = gtk_label_new("\nSave configuration ?\n"); 751 + content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); 752 + gtk_container_add(GTK_CONTAINER(content_area), label); 753 + gtk_widget_show(label); 754 + 755 + result = gtk_dialog_run(GTK_DIALOG(dialog)); 756 + switch (result) { 757 + case GTK_RESPONSE_YES: 758 + on_save_activate(NULL, NULL); 759 + break; 760 + case GTK_RESPONSE_NO: 761 + break; 762 + case GTK_RESPONSE_CANCEL: 763 + case GTK_RESPONSE_DELETE_EVENT: 764 + default: 765 + ret = TRUE; 766 + break; 767 + } 768 + 769 + gtk_widget_destroy(dialog); 770 + 771 + if (!ret) 772 + g_object_unref(pix_menu); 773 + 774 + return ret; 775 + } 776 + 777 + static void on_quit1_activate(GtkMenuItem *menuitem, gpointer user_data) 778 + { 779 + if (!on_window1_delete_event(NULL, NULL, NULL)) 780 + gtk_widget_destroy(GTK_WIDGET(main_wnd)); 781 + } 606 782 607 783 /* CTree Callbacks */ 608 784 ··· 657 741 const gchar * path_string, 658 742 const gchar * new_text, gpointer user_data) 659 743 { 744 + GtkTreeView *view = GTK_TREE_VIEW(user_data); 745 + GtkTreeModel *model = gtk_tree_view_get_model(view); 660 746 GtkTreePath *path = gtk_tree_path_new_from_string(path_string); 661 747 GtkTreeIter iter; 662 748 const char *old_def, *new_def; 663 749 struct menu *menu; 664 750 struct symbol *sym; 665 751 666 - if (!gtk_tree_model_get_iter(model2, &iter, path)) 667 - return; 752 + if (!gtk_tree_model_get_iter(model, &iter, path)) 753 + goto free; 668 754 669 - gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 755 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 670 756 sym = menu->sym; 671 757 672 - gtk_tree_model_get(model2, &iter, COL_VALUE, &old_def, -1); 758 + gtk_tree_model_get(model, &iter, COL_VALUE, &old_def, -1); 673 759 new_def = new_text; 674 760 675 761 sym_set_string_value(sym, new_def); 676 762 677 - update_tree(&rootmenu, NULL); 763 + update_trees(); 678 764 765 + free: 679 766 gtk_tree_path_free(path); 680 767 } 681 768 ··· 706 787 if (!sym_tristate_within_range(sym, newval)) 707 788 newval = yes; 708 789 sym_set_tristate_value(sym, newval); 709 - if (view_mode == FULL_VIEW) 710 - update_tree(&rootmenu, NULL); 711 - else if (view_mode == SPLIT_VIEW) { 712 - update_tree(browsed, NULL); 713 - display_list(); 714 - } 715 - else if (view_mode == SINGLE_VIEW) 716 - display_tree_part(); //fixme: keep exp/coll 790 + update_trees(); 717 791 break; 718 792 case S_INT: 719 793 case S_HEX: ··· 722 810 return; 723 811 724 812 sym_toggle_tristate_value(menu->sym); 725 - if (view_mode == FULL_VIEW) 726 - update_tree(&rootmenu, NULL); 727 - else if (view_mode == SPLIT_VIEW) { 728 - update_tree(browsed, NULL); 729 - display_list(); 730 - } 731 - else if (view_mode == SINGLE_VIEW) 732 - display_tree_part(); //fixme: keep exp/coll 813 + update_trees(); 733 814 } 734 815 735 816 static gint column2index(GtkTreeViewColumn * column) ··· 742 837 743 838 744 839 /* User click: update choice (full) or goes down (single) */ 745 - gboolean 746 - on_treeview2_button_press_event(GtkWidget * widget, 747 - GdkEventButton * event, gpointer user_data) 840 + static gboolean on_treeview2_button_press_event(GtkWidget *widget, 841 + GdkEventButton *event, 842 + gpointer user_data) 748 843 { 749 844 GtkTreeView *view = GTK_TREE_VIEW(widget); 845 + GtkTreeModel *model = gtk_tree_view_get_model(view); 750 846 GtkTreePath *path; 751 847 GtkTreeViewColumn *column; 752 848 GtkTreeIter iter; 753 849 struct menu *menu; 754 850 gint col; 755 - 756 - #if GTK_CHECK_VERSION(2,1,4) // bug in ctree with earlier version of GTK 757 851 gint tx = (gint) event->x; 758 852 gint ty = (gint) event->y; 759 - gint cx, cy; 760 853 761 - gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, 762 - &cy); 763 - #else 764 - gtk_tree_view_get_cursor(view, &path, &column); 765 - #endif 854 + gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, NULL, NULL); 766 855 if (path == NULL) 767 856 return FALSE; 768 857 769 - if (!gtk_tree_model_get_iter(model2, &iter, path)) 858 + if (!gtk_tree_model_get_iter(model, &iter, path)) 770 859 return FALSE; 771 - gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 860 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 861 + 862 + selected = menu; 772 863 773 864 col = column2index(column); 774 865 if (event->type == GDK_2BUTTON_PRESS) { 775 866 enum prop_type ptype; 776 867 ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 777 868 778 - if (ptype == P_MENU && view_mode != FULL_VIEW && col == COL_OPTION) { 869 + if (ptype == P_MENU && view_mode == SINGLE_VIEW && col == COL_OPTION) { 779 870 // goes down into menu 780 - current = menu; 781 - display_tree_part(); 871 + browsed = menu; 872 + recreate_tree(); 782 873 gtk_widget_set_sensitive(back_btn, TRUE); 783 874 } else if (col == COL_OPTION) { 784 875 toggle_sym_value(menu); ··· 795 894 } 796 895 797 896 /* Key pressed: update choice */ 798 - gboolean 799 - on_treeview2_key_press_event(GtkWidget * widget, 800 - GdkEventKey * event, gpointer user_data) 897 + static gboolean on_treeview2_key_press_event(GtkWidget *widget, 898 + GdkEventKey *event, 899 + gpointer user_data) 801 900 { 802 901 GtkTreeView *view = GTK_TREE_VIEW(widget); 902 + GtkTreeModel *model = gtk_tree_view_get_model(view); 803 903 GtkTreePath *path; 804 - GtkTreeViewColumn *column; 805 904 GtkTreeIter iter; 806 905 struct menu *menu; 807 906 gint col; 808 907 809 - gtk_tree_view_get_cursor(view, &path, &column); 908 + gtk_tree_view_get_cursor(view, &path, NULL); 810 909 if (path == NULL) 811 910 return FALSE; 812 911 813 - if (event->keyval == GDK_space) { 912 + if (event->keyval == GDK_KEY_space) { 814 913 if (gtk_tree_view_row_expanded(view, path)) 815 914 gtk_tree_view_collapse_row(view, path); 816 915 else 817 916 gtk_tree_view_expand_row(view, path, FALSE); 818 917 return TRUE; 819 918 } 820 - if (event->keyval == GDK_KP_Enter) { 821 - } 822 - if (widget == tree1_w) 823 - return FALSE; 824 919 825 - gtk_tree_model_get_iter(model2, &iter, path); 826 - gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 920 + gtk_tree_model_get_iter(model, &iter, path); 921 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 827 922 828 923 if (!strcasecmp(event->string, "n")) 829 924 col = COL_NO; ··· 836 939 837 940 838 941 /* Row selection changed: update help */ 839 - void 840 - on_treeview2_cursor_changed(GtkTreeView * treeview, gpointer user_data) 942 + static void on_treeview2_cursor_changed(GtkTreeView *treeview, 943 + gpointer user_data) 841 944 { 945 + GtkTreeModel *model = gtk_tree_view_get_model(treeview); 842 946 GtkTreeSelection *selection; 843 947 GtkTreeIter iter; 844 948 struct menu *menu; 845 949 846 950 selection = gtk_tree_view_get_selection(treeview); 847 - if (gtk_tree_selection_get_selected(selection, &model2, &iter)) { 848 - gtk_tree_model_get(model2, &iter, COL_MENU, &menu, -1); 951 + if (gtk_tree_selection_get_selected(selection, &model, &iter)) { 952 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 849 953 text_insert_help(menu); 850 954 } 851 955 } 852 956 853 957 854 958 /* User click: display sub-tree in the right frame. */ 855 - gboolean 856 - on_treeview1_button_press_event(GtkWidget * widget, 857 - GdkEventButton * event, gpointer user_data) 959 + static gboolean on_treeview1_button_press_event(GtkWidget *widget, 960 + GdkEventButton *event, 961 + gpointer user_data) 858 962 { 859 963 GtkTreeView *view = GTK_TREE_VIEW(widget); 964 + GtkTreeModel *model = gtk_tree_view_get_model(view); 860 965 GtkTreePath *path; 861 - GtkTreeViewColumn *column; 862 966 GtkTreeIter iter; 863 967 struct menu *menu; 864 - 865 968 gint tx = (gint) event->x; 866 969 gint ty = (gint) event->y; 867 - gint cx, cy; 868 970 869 - gtk_tree_view_get_path_at_pos(view, tx, ty, &path, &column, &cx, 870 - &cy); 971 + gtk_tree_view_get_path_at_pos(view, tx, ty, &path, NULL, NULL, NULL); 871 972 if (path == NULL) 872 973 return FALSE; 873 974 874 - gtk_tree_model_get_iter(model1, &iter, path); 875 - gtk_tree_model_get(model1, &iter, COL_MENU, &menu, -1); 975 + gtk_tree_model_get_iter(model, &iter, path); 976 + gtk_tree_model_get(model, &iter, COL_MENU, &menu, -1); 876 977 877 - if (event->type == GDK_2BUTTON_PRESS) { 978 + if (event->type == GDK_2BUTTON_PRESS) 878 979 toggle_sym_value(menu); 879 - current = menu; 880 - display_tree_part(); 881 - } else { 980 + 981 + selected = menu; 982 + 983 + if (menu->type == M_MENU) { 882 984 browsed = menu; 883 - display_tree_part(); 985 + recreate_tree(); 884 986 } 885 987 886 - gtk_widget_realize(tree2_w); 887 988 gtk_tree_view_set_cursor(view, path, NULL, FALSE); 888 989 gtk_widget_grab_focus(tree2_w); 889 990 890 991 return FALSE; 891 992 } 892 993 893 - 894 - /* Fill a row of strings */ 895 - static gchar **fill_row(struct menu *menu) 896 - { 897 - static gchar *row[COL_NUMBER]; 898 - struct symbol *sym = menu->sym; 899 - const char *def; 900 - int stype; 901 - tristate val; 902 - enum prop_type ptype; 903 - int i; 904 - 905 - for (i = COL_OPTION; i <= COL_COLOR; i++) 906 - g_free(row[i]); 907 - bzero(row, sizeof(row)); 908 - 909 - ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; 910 - 911 - row[COL_OPTION] = 912 - g_strdup_printf("%s %s %s %s", 913 - ptype == P_COMMENT ? "***" : "", 914 - menu_get_prompt(menu), 915 - ptype == P_COMMENT ? "***" : "", 916 - sym && !sym_has_value(sym) ? "(NEW)" : ""); 917 - 918 - if (opt_mode == OPT_ALL && !menu_is_visible(menu)) 919 - row[COL_COLOR] = g_strdup("DarkGray"); 920 - else if (opt_mode == OPT_PROMPT && 921 - menu_has_prompt(menu) && !menu_is_visible(menu)) 922 - row[COL_COLOR] = g_strdup("DarkGray"); 923 - else 924 - row[COL_COLOR] = g_strdup("Black"); 925 - 926 - switch (ptype) { 927 - case P_MENU: 928 - row[COL_PIXBUF] = (gchar *) xpm_menu; 929 - if (view_mode == SINGLE_VIEW) 930 - row[COL_PIXVIS] = GINT_TO_POINTER(TRUE); 931 - row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 932 - break; 933 - case P_COMMENT: 934 - row[COL_PIXBUF] = (gchar *) xpm_void; 935 - row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); 936 - row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 937 - break; 938 - default: 939 - row[COL_PIXBUF] = (gchar *) xpm_void; 940 - row[COL_PIXVIS] = GINT_TO_POINTER(FALSE); 941 - row[COL_BTNVIS] = GINT_TO_POINTER(TRUE); 942 - break; 943 - } 944 - 945 - if (!sym) 946 - return row; 947 - row[COL_NAME] = g_strdup(sym->name); 948 - 949 - sym_calc_value(sym); 950 - menu->flags &= ~MENU_CHANGED; 951 - 952 - if (sym_is_choice(sym)) { // parse childs for getting final value 953 - struct menu *child; 954 - struct symbol *def_sym = sym_calc_choice(menu); 955 - struct menu *def_menu = NULL; 956 - 957 - for (child = menu->list; child; child = child->next) { 958 - if (menu_is_visible(child) 959 - && child->sym == def_sym) 960 - def_menu = child; 961 - } 962 - 963 - if (def_menu) 964 - row[COL_VALUE] = 965 - g_strdup(menu_get_prompt(def_menu)); 966 - 967 - row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 968 - return row; 969 - } 970 - if (sym_is_choice_value(sym)) 971 - row[COL_BTNRAD] = GINT_TO_POINTER(TRUE); 972 - 973 - stype = sym_get_type(sym); 974 - switch (stype) { 975 - case S_BOOLEAN: 976 - case S_TRISTATE: 977 - val = sym_get_tristate_value(sym); 978 - switch (val) { 979 - case no: 980 - row[COL_NO] = g_strdup("N"); 981 - row[COL_VALUE] = g_strdup("N"); 982 - row[COL_BTNACT] = GINT_TO_POINTER(FALSE); 983 - row[COL_BTNINC] = GINT_TO_POINTER(FALSE); 984 - break; 985 - case mod: 986 - row[COL_MOD] = g_strdup("M"); 987 - row[COL_VALUE] = g_strdup("M"); 988 - row[COL_BTNINC] = GINT_TO_POINTER(TRUE); 989 - break; 990 - case yes: 991 - row[COL_YES] = g_strdup("Y"); 992 - row[COL_VALUE] = g_strdup("Y"); 993 - row[COL_BTNACT] = GINT_TO_POINTER(TRUE); 994 - row[COL_BTNINC] = GINT_TO_POINTER(FALSE); 995 - break; 996 - } 997 - 998 - if (val != no && sym_tristate_within_range(sym, no)) 999 - row[COL_NO] = g_strdup("_"); 1000 - if (val != mod && sym_tristate_within_range(sym, mod)) 1001 - row[COL_MOD] = g_strdup("_"); 1002 - if (val != yes && sym_tristate_within_range(sym, yes)) 1003 - row[COL_YES] = g_strdup("_"); 1004 - break; 1005 - case S_INT: 1006 - case S_HEX: 1007 - case S_STRING: 1008 - def = sym_get_string_value(sym); 1009 - row[COL_VALUE] = g_strdup(def); 1010 - row[COL_EDIT] = GINT_TO_POINTER(TRUE); 1011 - row[COL_BTNVIS] = GINT_TO_POINTER(FALSE); 1012 - break; 1013 - } 1014 - 1015 - return row; 1016 - } 1017 - 1018 - 1019 - /* Set the node content with a row of strings */ 1020 - static void set_node(GtkTreeIter * node, struct menu *menu, gchar ** row) 1021 - { 1022 - GdkColor color; 1023 - gboolean success; 1024 - GdkPixbuf *pix; 1025 - 1026 - pix = gdk_pixbuf_new_from_xpm_data((const char **) 1027 - row[COL_PIXBUF]); 1028 - 1029 - gdk_color_parse(row[COL_COLOR], &color); 1030 - gdk_colormap_alloc_colors(gdk_colormap_get_system(), &color, 1, 1031 - FALSE, FALSE, &success); 1032 - 1033 - gtk_tree_store_set(tree, node, 1034 - COL_OPTION, row[COL_OPTION], 1035 - COL_NAME, row[COL_NAME], 1036 - COL_NO, row[COL_NO], 1037 - COL_MOD, row[COL_MOD], 1038 - COL_YES, row[COL_YES], 1039 - COL_VALUE, row[COL_VALUE], 1040 - COL_MENU, (gpointer) menu, 1041 - COL_COLOR, &color, 1042 - COL_EDIT, GPOINTER_TO_INT(row[COL_EDIT]), 1043 - COL_PIXBUF, pix, 1044 - COL_PIXVIS, GPOINTER_TO_INT(row[COL_PIXVIS]), 1045 - COL_BTNVIS, GPOINTER_TO_INT(row[COL_BTNVIS]), 1046 - COL_BTNACT, GPOINTER_TO_INT(row[COL_BTNACT]), 1047 - COL_BTNINC, GPOINTER_TO_INT(row[COL_BTNINC]), 1048 - COL_BTNRAD, GPOINTER_TO_INT(row[COL_BTNRAD]), 1049 - -1); 1050 - 1051 - g_object_unref(pix); 1052 - } 1053 - 1054 - 1055 - /* Add a node to the tree */ 1056 - static void place_node(struct menu *menu, char **row) 1057 - { 1058 - GtkTreeIter *parent = parents[indent - 1]; 1059 - GtkTreeIter *node = parents[indent]; 1060 - 1061 - gtk_tree_store_append(tree, node, parent); 1062 - set_node(node, menu, row); 1063 - } 1064 - 1065 - 1066 - /* Find a node in the GTK+ tree */ 1067 - static GtkTreeIter found; 1068 - 1069 - /* 1070 - * Find a menu in the GtkTree starting at parent. 1071 - */ 1072 - static GtkTreeIter *gtktree_iter_find_node(GtkTreeIter *parent, 1073 - struct menu *tofind) 1074 - { 1075 - GtkTreeIter iter; 1076 - GtkTreeIter *child = &iter; 1077 - gboolean valid; 1078 - GtkTreeIter *ret; 1079 - 1080 - valid = gtk_tree_model_iter_children(model2, child, parent); 1081 - while (valid) { 1082 - struct menu *menu; 1083 - 1084 - gtk_tree_model_get(model2, child, 6, &menu, -1); 1085 - 1086 - if (menu == tofind) { 1087 - memcpy(&found, child, sizeof(GtkTreeIter)); 1088 - return &found; 1089 - } 1090 - 1091 - ret = gtktree_iter_find_node(child, tofind); 1092 - if (ret) 1093 - return ret; 1094 - 1095 - valid = gtk_tree_model_iter_next(model2, child); 1096 - } 1097 - 1098 - return NULL; 1099 - } 1100 - 1101 - 1102 - /* 1103 - * Update the tree by adding/removing entries 1104 - * Does not change other nodes 1105 - */ 1106 - static void update_tree(struct menu *src, GtkTreeIter * dst) 1107 - { 1108 - struct menu *child1; 1109 - GtkTreeIter iter, tmp; 1110 - GtkTreeIter *child2 = &iter; 1111 - gboolean valid; 1112 - GtkTreeIter *sibling; 1113 - struct symbol *sym; 1114 - struct menu *menu1, *menu2; 1115 - 1116 - if (src == &rootmenu) 1117 - indent = 1; 1118 - 1119 - valid = gtk_tree_model_iter_children(model2, child2, dst); 1120 - for (child1 = src->list; child1; child1 = child1->next) { 1121 - 1122 - sym = child1->sym; 1123 - 1124 - reparse: 1125 - menu1 = child1; 1126 - if (valid) 1127 - gtk_tree_model_get(model2, child2, COL_MENU, 1128 - &menu2, -1); 1129 - else 1130 - menu2 = NULL; // force adding of a first child 1131 - 1132 - if ((opt_mode == OPT_NORMAL && !menu_is_visible(child1)) || 1133 - (opt_mode == OPT_PROMPT && !menu_has_prompt(child1)) || 1134 - (opt_mode == OPT_ALL && !menu_get_prompt(child1))) { 1135 - 1136 - /* remove node */ 1137 - if (gtktree_iter_find_node(dst, menu1) != NULL) { 1138 - memcpy(&tmp, child2, sizeof(GtkTreeIter)); 1139 - valid = gtk_tree_model_iter_next(model2, 1140 - child2); 1141 - gtk_tree_store_remove(tree2, &tmp); 1142 - if (!valid) 1143 - return; /* next parent */ 1144 - else 1145 - goto reparse; /* next child */ 1146 - } else 1147 - continue; 1148 - } 1149 - 1150 - if (menu1 != menu2) { 1151 - if (gtktree_iter_find_node(dst, menu1) == NULL) { // add node 1152 - if (!valid && !menu2) 1153 - sibling = NULL; 1154 - else 1155 - sibling = child2; 1156 - gtk_tree_store_insert_before(tree2, 1157 - child2, 1158 - dst, sibling); 1159 - set_node(child2, menu1, fill_row(menu1)); 1160 - if (menu2 == NULL) 1161 - valid = TRUE; 1162 - } else { // remove node 1163 - memcpy(&tmp, child2, sizeof(GtkTreeIter)); 1164 - valid = gtk_tree_model_iter_next(model2, 1165 - child2); 1166 - gtk_tree_store_remove(tree2, &tmp); 1167 - if (!valid) 1168 - return; // next parent 1169 - else 1170 - goto reparse; // next child 1171 - } 1172 - } else if (sym && (child1->flags & MENU_CHANGED)) { 1173 - set_node(child2, menu1, fill_row(menu1)); 1174 - } 1175 - 1176 - indent++; 1177 - update_tree(child1, child2); 1178 - indent--; 1179 - 1180 - valid = gtk_tree_model_iter_next(model2, child2); 1181 - } 1182 - } 1183 - 1184 - 1185 994 /* Display the whole tree (single/split/full view) */ 1186 - static void display_tree(struct menu *menu) 995 + static void _display_tree(GtkTreeStore *tree, struct menu *menu, 996 + GtkTreeIter *parent) 1187 997 { 1188 - struct property *prop; 1189 998 struct menu *child; 1190 - enum prop_type ptype; 1191 - 1192 - if (menu == &rootmenu) { 1193 - indent = 1; 1194 - current = &rootmenu; 1195 - } 999 + GtkTreeIter iter; 1196 1000 1197 1001 for (child = menu->list; child; child = child->next) { 1198 - prop = child->prompt; 1199 - ptype = prop ? prop->type : P_UNKNOWN; 1200 - 1201 - menu->flags &= ~MENU_CHANGED; 1002 + /* 1003 + * REVISIT: 1004 + * menu_finalize() creates empty "if" entries. 1005 + * Do not confuse gtk_tree_model_get(), which would otherwise 1006 + * return "if" menu entry. 1007 + */ 1008 + if (child->type == M_IF) 1009 + continue; 1202 1010 1203 1011 if ((view_mode == SPLIT_VIEW) 1204 1012 && !(child->flags & MENU_ROOT) && (tree == tree1)) ··· 913 1311 && (tree == tree2)) 914 1312 continue; 915 1313 916 - if ((opt_mode == OPT_NORMAL && menu_is_visible(child)) || 917 - (opt_mode == OPT_PROMPT && menu_has_prompt(child)) || 918 - (opt_mode == OPT_ALL && menu_get_prompt(child))) 919 - place_node(child, fill_row(child)); 1314 + gtk_tree_store_append(tree, &iter, parent); 1315 + set_node(tree, &iter, child); 920 1316 921 - if ((view_mode != FULL_VIEW) && (ptype == P_MENU) 922 - && (tree == tree2)) 923 - continue; 924 - /* 925 - if (((menu != &rootmenu) && !(menu->flags & MENU_ROOT)) 926 - || (view_mode == FULL_VIEW) 927 - || (view_mode == SPLIT_VIEW))*/ 928 - 929 - /* Change paned position if the view is not in 'split mode' */ 930 - if (view_mode == SINGLE_VIEW || view_mode == FULL_VIEW) { 931 - gtk_paned_set_position(GTK_PANED(hpaned), 0); 932 - } 933 - 934 - if (((view_mode == SINGLE_VIEW) && (menu->flags & MENU_ROOT)) 935 - || (view_mode == FULL_VIEW) 936 - || (view_mode == SPLIT_VIEW)) { 937 - indent++; 938 - display_tree(child); 939 - indent--; 940 - } 1317 + if (view_mode != SINGLE_VIEW || child->type != M_MENU) 1318 + _display_tree(tree, child, &iter); 941 1319 } 942 1320 } 943 1321 944 - /* Display a part of the tree starting at current node (single/split view) */ 945 - static void display_tree_part(void) 1322 + static void display_tree(GtkTreeStore *store, struct menu *menu) 946 1323 { 947 - if (tree2) 948 - gtk_tree_store_clear(tree2); 949 - if (view_mode == SINGLE_VIEW) 950 - display_tree(current); 951 - else if (view_mode == SPLIT_VIEW) 952 - display_tree(browsed); 953 - else if (view_mode == FULL_VIEW) 954 - display_tree(&rootmenu); 955 - gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); 1324 + _display_tree(store, menu, NULL); 956 1325 } 957 1326 958 - /* Display the list in the left frame (split view) */ 959 - static void display_list(void) 1327 + /* Recreate the tree store starting at 'browsed' node */ 1328 + static void recreate_tree(void) 960 1329 { 961 - if (tree1) 962 - gtk_tree_store_clear(tree1); 963 - 964 - tree = tree1; 965 - display_tree(&rootmenu); 966 - gtk_tree_view_expand_all(GTK_TREE_VIEW(tree1_w)); 967 - tree = tree2; 1330 + gtk_tree_store_clear(tree2); 1331 + display_tree(tree2, browsed); 1332 + gtk_tree_view_expand_all(GTK_TREE_VIEW(tree2_w)); 968 1333 } 969 1334 970 1335 static void fixup_rootmenu(struct menu *menu) ··· 950 1381 } 951 1382 } 952 1383 1384 + /* Main Window Initialization */ 1385 + static void replace_button_icon(GtkWidget *widget, const char * const xpm[]) 1386 + { 1387 + GdkPixbuf *pixbuf; 1388 + GtkWidget *image; 1389 + 1390 + pixbuf = gdk_pixbuf_new_from_xpm_data((const char **)xpm); 1391 + image = gtk_image_new_from_pixbuf(pixbuf); 1392 + g_object_unref(pixbuf); 1393 + 1394 + gtk_widget_show(image); 1395 + gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(widget), image); 1396 + } 1397 + 1398 + static void init_main_window(const gchar *glade_file) 1399 + { 1400 + GtkBuilder *builder; 1401 + GtkWidget *widget; 1402 + GtkTextBuffer *txtbuf; 1403 + 1404 + builder = gtk_builder_new_from_file(glade_file); 1405 + if (!builder) 1406 + g_error("GUI loading failed !\n"); 1407 + 1408 + main_wnd = GTK_WIDGET(gtk_builder_get_object(builder, "window1")); 1409 + g_signal_connect(main_wnd, "destroy", 1410 + G_CALLBACK(on_window1_destroy), NULL); 1411 + g_signal_connect(main_wnd, "configure-event", 1412 + G_CALLBACK(on_window1_configure), NULL); 1413 + g_signal_connect(main_wnd, "delete-event", 1414 + G_CALLBACK(on_window1_delete_event), NULL); 1415 + 1416 + hpaned = GTK_WIDGET(gtk_builder_get_object(builder, "hpaned1")); 1417 + vpaned = GTK_WIDGET(gtk_builder_get_object(builder, "vpaned1")); 1418 + tree1_w = GTK_WIDGET(gtk_builder_get_object(builder, "treeview1")); 1419 + g_signal_connect(tree1_w, "cursor-changed", 1420 + G_CALLBACK(on_treeview2_cursor_changed), NULL); 1421 + g_signal_connect(tree1_w, "button-press-event", 1422 + G_CALLBACK(on_treeview1_button_press_event), NULL); 1423 + g_signal_connect(tree1_w, "key-press-event", 1424 + G_CALLBACK(on_treeview2_key_press_event), NULL); 1425 + 1426 + tree2_w = GTK_WIDGET(gtk_builder_get_object(builder, "treeview2")); 1427 + g_signal_connect(tree2_w, "cursor-changed", 1428 + G_CALLBACK(on_treeview2_cursor_changed), NULL); 1429 + g_signal_connect(tree2_w, "button-press-event", 1430 + G_CALLBACK(on_treeview2_button_press_event), NULL); 1431 + g_signal_connect(tree2_w, "key-press-event", 1432 + G_CALLBACK(on_treeview2_key_press_event), NULL); 1433 + 1434 + text_w = GTK_WIDGET(gtk_builder_get_object(builder, "textview3")); 1435 + 1436 + /* menubar */ 1437 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "load1")); 1438 + g_signal_connect(widget, "activate", 1439 + G_CALLBACK(on_load1_activate), NULL); 1440 + 1441 + save_menu_item = GTK_WIDGET(gtk_builder_get_object(builder, "save1")); 1442 + g_signal_connect(save_menu_item, "activate", 1443 + G_CALLBACK(on_save_activate), NULL); 1444 + 1445 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "save_as1")); 1446 + g_signal_connect(widget, "activate", 1447 + G_CALLBACK(on_save_as1_activate), NULL); 1448 + 1449 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "quit1")); 1450 + g_signal_connect(widget, "activate", 1451 + G_CALLBACK(on_quit1_activate), NULL); 1452 + 1453 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "show_name1")); 1454 + g_signal_connect(widget, "activate", 1455 + G_CALLBACK(on_show_name1_activate), NULL); 1456 + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 1457 + show_name); 1458 + 1459 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "show_range1")); 1460 + g_signal_connect(widget, "activate", 1461 + G_CALLBACK(on_show_range1_activate), NULL); 1462 + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 1463 + show_range); 1464 + 1465 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "show_data1")); 1466 + g_signal_connect(widget, "activate", 1467 + G_CALLBACK(on_show_data1_activate), NULL); 1468 + gtk_check_menu_item_set_active((GtkCheckMenuItem *) widget, 1469 + show_value); 1470 + 1471 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "set_option_mode1")); 1472 + g_signal_connect(widget, "activate", 1473 + G_CALLBACK(on_set_option_mode1_activate), NULL); 1474 + 1475 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "set_option_mode2")); 1476 + g_signal_connect(widget, "activate", 1477 + G_CALLBACK(on_set_option_mode2_activate), NULL); 1478 + 1479 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "set_option_mode3")); 1480 + g_signal_connect(widget, "activate", 1481 + G_CALLBACK(on_set_option_mode3_activate), NULL); 1482 + 1483 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "introduction1")); 1484 + g_signal_connect(widget, "activate", 1485 + G_CALLBACK(on_introduction1_activate), NULL); 1486 + 1487 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "about1")); 1488 + g_signal_connect(widget, "activate", 1489 + G_CALLBACK(on_about1_activate), NULL); 1490 + 1491 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "license1")); 1492 + g_signal_connect(widget, "activate", 1493 + G_CALLBACK(on_license1_activate), NULL); 1494 + 1495 + /* toolbar */ 1496 + back_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button1")); 1497 + g_signal_connect(back_btn, "clicked", 1498 + G_CALLBACK(on_back_clicked), NULL); 1499 + gtk_widget_set_sensitive(back_btn, FALSE); 1500 + 1501 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "button2")); 1502 + g_signal_connect(widget, "clicked", 1503 + G_CALLBACK(on_load_clicked), NULL); 1504 + 1505 + save_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button3")); 1506 + g_signal_connect(save_btn, "clicked", 1507 + G_CALLBACK(on_save_clicked), NULL); 1508 + 1509 + single_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button4")); 1510 + g_signal_connect(single_btn, "clicked", 1511 + G_CALLBACK(on_single_clicked), NULL); 1512 + replace_button_icon(single_btn, xpm_single_view); 1513 + 1514 + split_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button5")); 1515 + g_signal_connect(split_btn, "clicked", 1516 + G_CALLBACK(on_split_clicked), NULL); 1517 + replace_button_icon(split_btn, xpm_split_view); 1518 + 1519 + full_btn = GTK_WIDGET(gtk_builder_get_object(builder, "button6")); 1520 + g_signal_connect(full_btn, "clicked", 1521 + G_CALLBACK(on_full_clicked), NULL); 1522 + replace_button_icon(full_btn, xpm_tree_view); 1523 + 1524 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "button7")); 1525 + g_signal_connect(widget, "clicked", 1526 + G_CALLBACK(on_collapse_clicked), NULL); 1527 + 1528 + widget = GTK_WIDGET(gtk_builder_get_object(builder, "button8")); 1529 + g_signal_connect(widget, "clicked", 1530 + G_CALLBACK(on_expand_clicked), NULL); 1531 + 1532 + txtbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_w)); 1533 + tag1 = gtk_text_buffer_create_tag(txtbuf, "mytag1", 1534 + "foreground", "red", 1535 + "weight", PANGO_WEIGHT_BOLD, 1536 + NULL); 1537 + tag2 = gtk_text_buffer_create_tag(txtbuf, "mytag2", 1538 + /*"style", PANGO_STYLE_OBLIQUE, */ 1539 + NULL); 1540 + 1541 + gtk_window_set_title(GTK_WINDOW(main_wnd), rootmenu.prompt->text); 1542 + 1543 + gtk_widget_show_all(main_wnd); 1544 + 1545 + g_object_unref(builder); 1546 + 1547 + conf_set_changed_callback(conf_changed); 1548 + } 1549 + 1550 + static gboolean visible_func(GtkTreeModel *model, GtkTreeIter *iter, 1551 + gpointer data) 1552 + { 1553 + struct menu *menu; 1554 + 1555 + gtk_tree_model_get(model, iter, COL_MENU, &menu, -1); 1556 + 1557 + if (!menu) 1558 + return FALSE; 1559 + 1560 + return menu_is_visible(menu) || opt_mode == OPT_ALL || 1561 + (opt_mode == OPT_PROMPT && menu_has_prompt(menu)); 1562 + } 1563 + 1564 + static void init_left_tree(void) 1565 + { 1566 + GtkTreeView *view = GTK_TREE_VIEW(tree1_w); 1567 + GtkCellRenderer *renderer; 1568 + GtkTreeSelection *sel; 1569 + GtkTreeViewColumn *column; 1570 + GtkTreeModel *filter; 1571 + 1572 + tree1 = gtk_tree_store_new(COL_NUMBER, 1573 + G_TYPE_STRING, G_TYPE_STRING, 1574 + G_TYPE_STRING, G_TYPE_STRING, 1575 + G_TYPE_STRING, G_TYPE_STRING, 1576 + G_TYPE_POINTER, GDK_TYPE_RGBA, 1577 + G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 1578 + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 1579 + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 1580 + G_TYPE_BOOLEAN); 1581 + 1582 + filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(tree1), NULL); 1583 + 1584 + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter), 1585 + visible_func, NULL, NULL); 1586 + gtk_tree_view_set_model(view, filter); 1587 + 1588 + column = gtk_tree_view_column_new(); 1589 + gtk_tree_view_append_column(view, column); 1590 + gtk_tree_view_column_set_title(column, "Options"); 1591 + 1592 + renderer = gtk_cell_renderer_toggle_new(); 1593 + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 1594 + renderer, FALSE); 1595 + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 1596 + renderer, 1597 + "active", COL_BTNACT, 1598 + "inconsistent", COL_BTNINC, 1599 + "visible", COL_BTNVIS, 1600 + "radio", COL_BTNRAD, NULL); 1601 + renderer = gtk_cell_renderer_text_new(); 1602 + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 1603 + renderer, FALSE); 1604 + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 1605 + renderer, 1606 + "text", COL_OPTION, 1607 + "foreground-rgba", 1608 + COL_COLOR, NULL); 1609 + 1610 + sel = gtk_tree_view_get_selection(view); 1611 + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 1612 + } 1613 + 1614 + static void init_right_tree(void) 1615 + { 1616 + GtkTreeView *view = GTK_TREE_VIEW(tree2_w); 1617 + GtkCellRenderer *renderer; 1618 + GtkTreeSelection *sel; 1619 + GtkTreeViewColumn *column; 1620 + GtkTreeModel *filter; 1621 + gint i; 1622 + 1623 + tree2 = gtk_tree_store_new(COL_NUMBER, 1624 + G_TYPE_STRING, G_TYPE_STRING, 1625 + G_TYPE_STRING, G_TYPE_STRING, 1626 + G_TYPE_STRING, G_TYPE_STRING, 1627 + G_TYPE_POINTER, GDK_TYPE_RGBA, 1628 + G_TYPE_BOOLEAN, GDK_TYPE_PIXBUF, 1629 + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 1630 + G_TYPE_BOOLEAN, G_TYPE_BOOLEAN, 1631 + G_TYPE_BOOLEAN); 1632 + 1633 + filter = gtk_tree_model_filter_new(GTK_TREE_MODEL(tree2), NULL); 1634 + 1635 + gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(filter), 1636 + visible_func, NULL, NULL); 1637 + gtk_tree_view_set_model(view, filter); 1638 + 1639 + column = gtk_tree_view_column_new(); 1640 + gtk_tree_view_append_column(view, column); 1641 + gtk_tree_view_column_set_title(column, "Options"); 1642 + 1643 + renderer = gtk_cell_renderer_pixbuf_new(); 1644 + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 1645 + renderer, FALSE); 1646 + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 1647 + renderer, 1648 + "pixbuf", COL_PIXBUF, 1649 + "visible", COL_PIXVIS, NULL); 1650 + renderer = gtk_cell_renderer_toggle_new(); 1651 + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 1652 + renderer, FALSE); 1653 + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 1654 + renderer, 1655 + "active", COL_BTNACT, 1656 + "inconsistent", COL_BTNINC, 1657 + "visible", COL_BTNVIS, 1658 + "radio", COL_BTNRAD, NULL); 1659 + renderer = gtk_cell_renderer_text_new(); 1660 + gtk_tree_view_column_pack_start(GTK_TREE_VIEW_COLUMN(column), 1661 + renderer, FALSE); 1662 + gtk_tree_view_column_set_attributes(GTK_TREE_VIEW_COLUMN(column), 1663 + renderer, 1664 + "text", COL_OPTION, 1665 + "foreground-rgba", 1666 + COL_COLOR, NULL); 1667 + 1668 + renderer = gtk_cell_renderer_text_new(); 1669 + gtk_tree_view_insert_column_with_attributes(view, -1, 1670 + "Name", renderer, 1671 + "text", COL_NAME, 1672 + "foreground-rgba", 1673 + COL_COLOR, NULL); 1674 + renderer = gtk_cell_renderer_text_new(); 1675 + gtk_tree_view_insert_column_with_attributes(view, -1, 1676 + "N", renderer, 1677 + "text", COL_NO, 1678 + "foreground-rgba", 1679 + COL_COLOR, NULL); 1680 + renderer = gtk_cell_renderer_text_new(); 1681 + gtk_tree_view_insert_column_with_attributes(view, -1, 1682 + "M", renderer, 1683 + "text", COL_MOD, 1684 + "foreground-rgba", 1685 + COL_COLOR, NULL); 1686 + renderer = gtk_cell_renderer_text_new(); 1687 + gtk_tree_view_insert_column_with_attributes(view, -1, 1688 + "Y", renderer, 1689 + "text", COL_YES, 1690 + "foreground-rgba", 1691 + COL_COLOR, NULL); 1692 + renderer = gtk_cell_renderer_text_new(); 1693 + gtk_tree_view_insert_column_with_attributes(view, -1, 1694 + "Value", renderer, 1695 + "text", COL_VALUE, 1696 + "editable", 1697 + COL_EDIT, 1698 + "foreground-rgba", 1699 + COL_COLOR, NULL); 1700 + g_signal_connect(G_OBJECT(renderer), "edited", 1701 + G_CALLBACK(renderer_edited), tree2_w); 1702 + 1703 + pix_menu = gdk_pixbuf_new_from_xpm_data((const char **)xpm_menu); 1704 + 1705 + for (i = 0; i < COL_VALUE; i++) { 1706 + column = gtk_tree_view_get_column(view, i); 1707 + gtk_tree_view_column_set_resizable(column, TRUE); 1708 + } 1709 + 1710 + sel = gtk_tree_view_get_selection(view); 1711 + gtk_tree_selection_set_mode(sel, GTK_SELECTION_SINGLE); 1712 + } 953 1713 954 1714 /* Main */ 955 1715 int main(int ac, char *av[]) ··· 1288 1390 gchar *glade_file; 1289 1391 1290 1392 /* GTK stuffs */ 1291 - gtk_set_locale(); 1292 1393 gtk_init(&ac, &av); 1293 - glade_init(); 1294 1394 1295 1395 /* Determine GUI path */ 1296 1396 env = getenv(SRCTREE); 1297 1397 if (env) 1298 - glade_file = g_strconcat(env, "/scripts/kconfig/gconf.glade", NULL); 1398 + glade_file = g_strconcat(env, "/scripts/kconfig/gconf.ui", NULL); 1299 1399 else if (av[0][0] == '/') 1300 - glade_file = g_strconcat(av[0], ".glade", NULL); 1400 + glade_file = g_strconcat(av[0], ".ui", NULL); 1301 1401 else 1302 - glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".glade", NULL); 1402 + glade_file = g_strconcat(g_get_current_dir(), "/", av[0], ".ui", NULL); 1303 1403 1304 1404 /* Conf stuffs */ 1305 1405 if (ac > 1 && av[1][0] == '-') { ··· 1322 1426 1323 1427 /* Load the interface and connect signals */ 1324 1428 init_main_window(glade_file); 1325 - init_tree_model(); 1326 1429 init_left_tree(); 1327 1430 init_right_tree(); 1328 1431 1329 1432 conf_read(NULL); 1330 1433 1331 - switch (view_mode) { 1332 - case SINGLE_VIEW: 1333 - display_tree_part(); 1334 - break; 1335 - case SPLIT_VIEW: 1336 - display_list(); 1337 - break; 1338 - case FULL_VIEW: 1339 - display_tree(&rootmenu); 1340 - break; 1341 - } 1434 + set_view_mode(view_mode); 1342 1435 1343 1436 gtk_main(); 1344 1437
+118 -243
scripts/kconfig/gconf.glade scripts/kconfig/gconf.ui
··· 1 1 <?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> 2 2 3 - <glade-interface> 3 + <interface> 4 4 5 - <widget class="GtkWindow" id="window1"> 5 + <object class="GtkWindow" id="window1"> 6 6 <property name="visible">True</property> 7 7 <property name="title" translatable="yes">Gtk Kernel Configurator</property> 8 8 <property name="type">GTK_WINDOW_TOPLEVEL</property> ··· 17 17 <property name="skip_pager_hint">False</property> 18 18 <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property> 19 19 <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 20 - <signal name="destroy" handler="on_window1_destroy" object="window1"/> 21 - <signal name="size_request" handler="on_window1_size_request" object="vpaned1" last_modification_time="Fri, 11 Jan 2002 16:17:11 GMT"/> 22 - <signal name="delete_event" handler="on_window1_delete_event" object="window1" last_modification_time="Sun, 09 Mar 2003 19:42:46 GMT"/> 23 20 24 21 <child> 25 - <widget class="GtkVBox" id="vbox1"> 22 + <object class="GtkBox" id="vbox1"> 23 + <property name="orientation">vertical</property> 26 24 <property name="visible">True</property> 27 25 <property name="homogeneous">False</property> 28 26 <property name="spacing">0</property> 29 27 30 28 <child> 31 - <widget class="GtkMenuBar" id="menubar1"> 29 + <object class="GtkMenuBar" id="menubar1"> 32 30 <property name="visible">True</property> 33 31 34 32 <child> 35 - <widget class="GtkMenuItem" id="file1"> 33 + <object class="GtkMenuItem" id="file1"> 36 34 <property name="visible">True</property> 37 35 <property name="label" translatable="yes">_File</property> 38 36 <property name="use_underline">True</property> 39 37 40 - <child> 41 - <widget class="GtkMenu" id="file1_menu"> 38 + <child type="submenu"> 39 + <object class="GtkMenu" id="file1_menu"> 42 40 43 41 <child> 44 - <widget class="GtkImageMenuItem" id="load1"> 42 + <object class="GtkMenuItem" id="load1"> 45 43 <property name="visible">True</property> 46 - <property name="tooltip" translatable="yes">Load a config file</property> 44 + <property name="tooltip-text" translatable="yes">Load a config file</property> 47 45 <property name="label" translatable="yes">_Load</property> 48 46 <property name="use_underline">True</property> 49 - <signal name="activate" handler="on_load1_activate"/> 50 47 <accelerator key="L" modifiers="GDK_CONTROL_MASK" signal="activate"/> 51 - 52 - <child internal-child="image"> 53 - <widget class="GtkImage" id="image39"> 54 - <property name="visible">True</property> 55 - <property name="stock">gtk-open</property> 56 - <property name="icon_size">1</property> 57 - <property name="xalign">0.5</property> 58 - <property name="yalign">0.5</property> 59 - <property name="xpad">0</property> 60 - <property name="ypad">0</property> 61 - </widget> 62 - </child> 63 - </widget> 48 + </object> 64 49 </child> 65 50 66 51 <child> 67 - <widget class="GtkImageMenuItem" id="save1"> 52 + <object class="GtkMenuItem" id="save1"> 68 53 <property name="visible">True</property> 69 - <property name="tooltip" translatable="yes">Save the config in .config</property> 54 + <property name="tooltip-text" translatable="yes">Save the config in .config</property> 70 55 <property name="label" translatable="yes">_Save</property> 71 56 <property name="use_underline">True</property> 72 - <signal name="activate" handler="on_save_activate"/> 73 57 <accelerator key="S" modifiers="GDK_CONTROL_MASK" signal="activate"/> 74 - 75 - <child internal-child="image"> 76 - <widget class="GtkImage" id="image40"> 77 - <property name="visible">True</property> 78 - <property name="stock">gtk-save</property> 79 - <property name="icon_size">1</property> 80 - <property name="xalign">0.5</property> 81 - <property name="yalign">0.5</property> 82 - <property name="xpad">0</property> 83 - <property name="ypad">0</property> 84 - </widget> 85 - </child> 86 - </widget> 58 + </object> 87 59 </child> 88 60 89 61 <child> 90 - <widget class="GtkImageMenuItem" id="save_as1"> 62 + <object class="GtkMenuItem" id="save_as1"> 91 63 <property name="visible">True</property> 92 - <property name="tooltip" translatable="yes">Save the config in a file</property> 64 + <property name="tooltip-text" translatable="yes">Save the config in a file</property> 93 65 <property name="label" translatable="yes">Save _as</property> 94 66 <property name="use_underline">True</property> 95 - <signal name="activate" handler="on_save_as1_activate"/> 96 - 97 - <child internal-child="image"> 98 - <widget class="GtkImage" id="image41"> 99 - <property name="visible">True</property> 100 - <property name="stock">gtk-save-as</property> 101 - <property name="icon_size">1</property> 102 - <property name="xalign">0.5</property> 103 - <property name="yalign">0.5</property> 104 - <property name="xpad">0</property> 105 - <property name="ypad">0</property> 106 - </widget> 107 - </child> 108 - </widget> 67 + </object> 109 68 </child> 110 69 111 70 <child> 112 - <widget class="GtkSeparatorMenuItem" id="separator1"> 71 + <object class="GtkSeparatorMenuItem" id="separator1"> 113 72 <property name="visible">True</property> 114 - </widget> 73 + </object> 115 74 </child> 116 75 117 76 <child> 118 - <widget class="GtkImageMenuItem" id="quit1"> 77 + <object class="GtkMenuItem" id="quit1"> 119 78 <property name="visible">True</property> 120 79 <property name="label" translatable="yes">_Quit</property> 121 80 <property name="use_underline">True</property> 122 - <signal name="activate" handler="on_quit1_activate"/> 123 81 <accelerator key="Q" modifiers="GDK_CONTROL_MASK" signal="activate"/> 124 - 125 - <child internal-child="image"> 126 - <widget class="GtkImage" id="image42"> 127 - <property name="visible">True</property> 128 - <property name="stock">gtk-quit</property> 129 - <property name="icon_size">1</property> 130 - <property name="xalign">0.5</property> 131 - <property name="yalign">0.5</property> 132 - <property name="xpad">0</property> 133 - <property name="ypad">0</property> 134 - </widget> 135 - </child> 136 - </widget> 82 + </object> 137 83 </child> 138 - </widget> 84 + </object> 139 85 </child> 140 - </widget> 86 + </object> 141 87 </child> 142 88 143 89 <child> 144 - <widget class="GtkMenuItem" id="options1"> 90 + <object class="GtkMenuItem" id="options1"> 145 91 <property name="visible">True</property> 146 92 <property name="label" translatable="yes">_Options</property> 147 93 <property name="use_underline">True</property> 148 94 149 - <child> 150 - <widget class="GtkMenu" id="options1_menu"> 95 + <child type="submenu"> 96 + <object class="GtkMenu" id="options1_menu"> 151 97 152 98 <child> 153 - <widget class="GtkCheckMenuItem" id="show_name1"> 99 + <object class="GtkCheckMenuItem" id="show_name1"> 154 100 <property name="visible">True</property> 155 - <property name="tooltip" translatable="yes">Show name</property> 101 + <property name="tooltip-text" translatable="yes">Show name</property> 156 102 <property name="label" translatable="yes">Show _name</property> 157 103 <property name="use_underline">True</property> 158 104 <property name="active">False</property> 159 - <signal name="activate" handler="on_show_name1_activate"/> 160 - </widget> 105 + </object> 161 106 </child> 162 107 163 108 <child> 164 - <widget class="GtkCheckMenuItem" id="show_range1"> 109 + <object class="GtkCheckMenuItem" id="show_range1"> 165 110 <property name="visible">True</property> 166 - <property name="tooltip" translatable="yes">Show range (Y/M/N)</property> 111 + <property name="tooltip-text" translatable="yes">Show range (Y/M/N)</property> 167 112 <property name="label" translatable="yes">Show _range</property> 168 113 <property name="use_underline">True</property> 169 114 <property name="active">False</property> 170 - <signal name="activate" handler="on_show_range1_activate"/> 171 - </widget> 115 + </object> 172 116 </child> 173 117 174 118 <child> 175 - <widget class="GtkCheckMenuItem" id="show_data1"> 119 + <object class="GtkCheckMenuItem" id="show_data1"> 176 120 <property name="visible">True</property> 177 - <property name="tooltip" translatable="yes">Show value of the option</property> 121 + <property name="tooltip-text" translatable="yes">Show value of the option</property> 178 122 <property name="label" translatable="yes">Show _data</property> 179 123 <property name="use_underline">True</property> 180 124 <property name="active">False</property> 181 - <signal name="activate" handler="on_show_data1_activate"/> 182 - </widget> 125 + </object> 183 126 </child> 184 127 185 128 <child> 186 - <widget class="GtkSeparatorMenuItem" id="separator2"> 129 + <object class="GtkSeparatorMenuItem" id="separator2"> 187 130 <property name="visible">True</property> 188 - </widget> 131 + </object> 189 132 </child> 190 133 191 134 <child> 192 - <widget class="GtkRadioMenuItem" id="set_option_mode1"> 135 + <object class="GtkRadioMenuItem" id="set_option_mode1"> 193 136 <property name="visible">True</property> 194 - <property name="tooltip" translatable="yes">Show normal options</property> 137 + <property name="tooltip-text" translatable="yes">Show normal options</property> 195 138 <property name="label" translatable="yes">Show normal options</property> 196 139 <property name="use_underline">True</property> 197 140 <property name="active">True</property> 198 - <signal name="activate" handler="on_set_option_mode1_activate"/> 199 - </widget> 141 + </object> 200 142 </child> 201 143 202 144 <child> 203 - <widget class="GtkRadioMenuItem" id="set_option_mode2"> 145 + <object class="GtkRadioMenuItem" id="set_option_mode2"> 204 146 <property name="visible">True</property> 205 - <property name="tooltip" translatable="yes">Show all options</property> 147 + <property name="tooltip-text" translatable="yes">Show all options</property> 206 148 <property name="label" translatable="yes">Show all _options</property> 207 149 <property name="use_underline">True</property> 208 150 <property name="active">False</property> 209 151 <property name="group">set_option_mode1</property> 210 - <signal name="activate" handler="on_set_option_mode2_activate"/> 211 - </widget> 152 + </object> 212 153 </child> 213 154 214 155 <child> 215 - <widget class="GtkRadioMenuItem" id="set_option_mode3"> 156 + <object class="GtkRadioMenuItem" id="set_option_mode3"> 216 157 <property name="visible">True</property> 217 - <property name="tooltip" translatable="yes">Show all options with prompts</property> 158 + <property name="tooltip-text" translatable="yes">Show all options with prompts</property> 218 159 <property name="label" translatable="yes">Show all prompt options</property> 219 160 <property name="use_underline">True</property> 220 161 <property name="active">False</property> 221 162 <property name="group">set_option_mode1</property> 222 - <signal name="activate" handler="on_set_option_mode3_activate"/> 223 - </widget> 163 + </object> 224 164 </child> 225 165 226 - </widget> 166 + </object> 227 167 </child> 228 - </widget> 168 + </object> 229 169 </child> 230 170 231 171 <child> 232 - <widget class="GtkMenuItem" id="help1"> 172 + <object class="GtkMenuItem" id="help1"> 233 173 <property name="visible">True</property> 234 174 <property name="label" translatable="yes">_Help</property> 235 175 <property name="use_underline">True</property> 236 176 237 - <child> 238 - <widget class="GtkMenu" id="help1_menu"> 177 + <child type="submenu"> 178 + <object class="GtkMenu" id="help1_menu"> 239 179 240 180 <child> 241 - <widget class="GtkImageMenuItem" id="introduction1"> 181 + <object class="GtkMenuItem" id="introduction1"> 242 182 <property name="visible">True</property> 243 183 <property name="label" translatable="yes">_Introduction</property> 244 184 <property name="use_underline">True</property> 245 - <signal name="activate" handler="on_introduction1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> 246 185 <accelerator key="I" modifiers="GDK_CONTROL_MASK" signal="activate"/> 247 - 248 - <child internal-child="image"> 249 - <widget class="GtkImage" id="image43"> 250 - <property name="visible">True</property> 251 - <property name="stock">gtk-dialog-question</property> 252 - <property name="icon_size">1</property> 253 - <property name="xalign">0.5</property> 254 - <property name="yalign">0.5</property> 255 - <property name="xpad">0</property> 256 - <property name="ypad">0</property> 257 - </widget> 258 - </child> 259 - </widget> 186 + </object> 260 187 </child> 261 188 262 189 <child> 263 - <widget class="GtkImageMenuItem" id="about1"> 190 + <object class="GtkMenuItem" id="about1"> 264 191 <property name="visible">True</property> 265 192 <property name="label" translatable="yes">_About</property> 266 193 <property name="use_underline">True</property> 267 - <signal name="activate" handler="on_about1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> 268 194 <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/> 269 - 270 - <child internal-child="image"> 271 - <widget class="GtkImage" id="image44"> 272 - <property name="visible">True</property> 273 - <property name="stock">gtk-properties</property> 274 - <property name="icon_size">1</property> 275 - <property name="xalign">0.5</property> 276 - <property name="yalign">0.5</property> 277 - <property name="xpad">0</property> 278 - <property name="ypad">0</property> 279 - </widget> 280 - </child> 281 - </widget> 195 + </object> 282 196 </child> 283 197 284 198 <child> 285 - <widget class="GtkImageMenuItem" id="license1"> 199 + <object class="GtkMenuItem" id="license1"> 286 200 <property name="visible">True</property> 287 201 <property name="label" translatable="yes">_License</property> 288 202 <property name="use_underline">True</property> 289 - <signal name="activate" handler="on_license1_activate" last_modification_time="Fri, 15 Nov 2002 20:26:30 GMT"/> 290 - 291 - <child internal-child="image"> 292 - <widget class="GtkImage" id="image45"> 293 - <property name="visible">True</property> 294 - <property name="stock">gtk-justify-fill</property> 295 - <property name="icon_size">1</property> 296 - <property name="xalign">0.5</property> 297 - <property name="yalign">0.5</property> 298 - <property name="xpad">0</property> 299 - <property name="ypad">0</property> 300 - </widget> 301 - </child> 302 - </widget> 203 + </object> 303 204 </child> 304 - </widget> 205 + </object> 305 206 </child> 306 - </widget> 207 + </object> 307 208 </child> 308 - </widget> 209 + </object> 309 210 <packing> 310 211 <property name="padding">0</property> 311 212 <property name="expand">False</property> ··· 215 314 </child> 216 315 217 316 <child> 218 - <widget class="GtkHandleBox" id="handlebox1"> 219 - <property name="visible">True</property> 220 - <property name="shadow_type">GTK_SHADOW_OUT</property> 221 - <property name="handle_position">GTK_POS_LEFT</property> 222 - <property name="snap_edge">GTK_POS_TOP</property> 223 - 224 - <child> 225 - <widget class="GtkToolbar" id="toolbar1"> 317 + <object class="GtkToolbar" id="toolbar1"> 226 318 <property name="visible">True</property> 227 319 <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property> 228 320 <property name="toolbar_style">GTK_TOOLBAR_BOTH</property> 229 - <property name="tooltips">True</property> 230 321 <property name="show_arrow">True</property> 231 322 232 323 <child> 233 - <widget class="GtkToolButton" id="button1"> 324 + <object class="GtkToolButton" id="button1"> 234 325 <property name="visible">True</property> 235 - <property name="tooltip" translatable="yes">Goes up of one level (single view)</property> 326 + <property name="tooltip-text" translatable="yes">Goes up one level (single view)</property> 236 327 <property name="label" translatable="yes">Back</property> 237 328 <property name="use_underline">True</property> 238 329 <property name="stock_id">gtk-undo</property> 239 330 <property name="visible_horizontal">True</property> 240 331 <property name="visible_vertical">True</property> 241 332 <property name="is_important">False</property> 242 - <signal name="clicked" handler="on_back_clicked"/> 243 - </widget> 333 + </object> 244 334 <packing> 245 335 <property name="expand">False</property> 246 336 <property name="homogeneous">True</property> ··· 239 347 </child> 240 348 241 349 <child> 242 - <widget class="GtkToolItem" id="toolitem1"> 350 + <object class="GtkToolItem" id="toolitem1"> 243 351 <property name="visible">True</property> 244 352 <property name="visible_horizontal">True</property> 245 353 <property name="visible_vertical">True</property> 246 354 <property name="is_important">False</property> 247 355 248 356 <child> 249 - <widget class="GtkVSeparator" id="vseparator1"> 357 + <object class="GtkVSeparator" id="vseparator1"> 250 358 <property name="visible">True</property> 251 - </widget> 359 + </object> 252 360 </child> 253 - </widget> 361 + </object> 254 362 <packing> 255 363 <property name="expand">False</property> 256 364 <property name="homogeneous">False</property> ··· 258 366 </child> 259 367 260 368 <child> 261 - <widget class="GtkToolButton" id="button2"> 369 + <object class="GtkToolButton" id="button2"> 262 370 <property name="visible">True</property> 263 - <property name="tooltip" translatable="yes">Load a config file</property> 371 + <property name="tooltip-text" translatable="yes">Load a config file</property> 264 372 <property name="label" translatable="yes">Load</property> 265 373 <property name="use_underline">True</property> 266 374 <property name="stock_id">gtk-open</property> 267 375 <property name="visible_horizontal">True</property> 268 376 <property name="visible_vertical">True</property> 269 377 <property name="is_important">False</property> 270 - <signal name="clicked" handler="on_load_clicked"/> 271 - </widget> 378 + </object> 272 379 <packing> 273 380 <property name="expand">False</property> 274 381 <property name="homogeneous">True</property> ··· 275 384 </child> 276 385 277 386 <child> 278 - <widget class="GtkToolButton" id="button3"> 387 + <object class="GtkToolButton" id="button3"> 279 388 <property name="visible">True</property> 280 - <property name="tooltip" translatable="yes">Save a config file</property> 389 + <property name="tooltip-text" translatable="yes">Save a config file</property> 281 390 <property name="label" translatable="yes">Save</property> 282 391 <property name="use_underline">True</property> 283 392 <property name="stock_id">gtk-save</property> 284 393 <property name="visible_horizontal">True</property> 285 394 <property name="visible_vertical">True</property> 286 395 <property name="is_important">False</property> 287 - <signal name="clicked" handler="on_save_activate"/> 288 - </widget> 396 + </object> 289 397 <packing> 290 398 <property name="expand">False</property> 291 399 <property name="homogeneous">True</property> ··· 292 402 </child> 293 403 294 404 <child> 295 - <widget class="GtkToolItem" id="toolitem2"> 405 + <object class="GtkToolItem" id="toolitem2"> 296 406 <property name="visible">True</property> 297 407 <property name="visible_horizontal">True</property> 298 408 <property name="visible_vertical">True</property> 299 409 <property name="is_important">False</property> 300 410 301 411 <child> 302 - <widget class="GtkVSeparator" id="vseparator2"> 412 + <object class="GtkVSeparator" id="vseparator2"> 303 413 <property name="visible">True</property> 304 - </widget> 414 + </object> 305 415 </child> 306 - </widget> 416 + </object> 307 417 <packing> 308 418 <property name="expand">False</property> 309 419 <property name="homogeneous">False</property> ··· 311 421 </child> 312 422 313 423 <child> 314 - <widget class="GtkToolButton" id="button4"> 424 + <object class="GtkToolButton" id="button4"> 315 425 <property name="visible">True</property> 316 - <property name="tooltip" translatable="yes">Single view</property> 426 + <property name="tooltip-text" translatable="yes">Single view</property> 317 427 <property name="label" translatable="yes">Single</property> 318 428 <property name="use_underline">True</property> 319 429 <property name="stock_id">gtk-missing-image</property> 320 430 <property name="visible_horizontal">True</property> 321 431 <property name="visible_vertical">True</property> 322 432 <property name="is_important">False</property> 323 - <signal name="clicked" handler="on_single_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:39 GMT"/> 324 - </widget> 433 + </object> 325 434 <packing> 326 435 <property name="expand">False</property> 327 436 <property name="homogeneous">True</property> ··· 328 439 </child> 329 440 330 441 <child> 331 - <widget class="GtkToolButton" id="button5"> 442 + <object class="GtkToolButton" id="button5"> 332 443 <property name="visible">True</property> 333 - <property name="tooltip" translatable="yes">Split view</property> 444 + <property name="tooltip-text" translatable="yes">Split view</property> 334 445 <property name="label" translatable="yes">Split</property> 335 446 <property name="use_underline">True</property> 336 447 <property name="stock_id">gtk-missing-image</property> 337 448 <property name="visible_horizontal">True</property> 338 449 <property name="visible_vertical">True</property> 339 450 <property name="is_important">False</property> 340 - <signal name="clicked" handler="on_split_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:45 GMT"/> 341 - </widget> 451 + </object> 342 452 <packing> 343 453 <property name="expand">False</property> 344 454 <property name="homogeneous">True</property> ··· 345 457 </child> 346 458 347 459 <child> 348 - <widget class="GtkToolButton" id="button6"> 460 + <object class="GtkToolButton" id="button6"> 349 461 <property name="visible">True</property> 350 - <property name="tooltip" translatable="yes">Full view</property> 462 + <property name="tooltip-text" translatable="yes">Full view</property> 351 463 <property name="label" translatable="yes">Full</property> 352 464 <property name="use_underline">True</property> 353 465 <property name="stock_id">gtk-missing-image</property> 354 466 <property name="visible_horizontal">True</property> 355 467 <property name="visible_vertical">True</property> 356 468 <property name="is_important">False</property> 357 - <signal name="clicked" handler="on_full_clicked" last_modification_time="Sun, 12 Jan 2003 14:28:50 GMT"/> 358 - </widget> 469 + </object> 359 470 <packing> 360 471 <property name="expand">False</property> 361 472 <property name="homogeneous">True</property> ··· 362 475 </child> 363 476 364 477 <child> 365 - <widget class="GtkToolItem" id="toolitem3"> 478 + <object class="GtkToolItem" id="toolitem3"> 366 479 <property name="visible">True</property> 367 480 <property name="visible_horizontal">True</property> 368 481 <property name="visible_vertical">True</property> 369 482 <property name="is_important">False</property> 370 483 371 484 <child> 372 - <widget class="GtkVSeparator" id="vseparator3"> 485 + <object class="GtkVSeparator" id="vseparator3"> 373 486 <property name="visible">True</property> 374 - </widget> 487 + </object> 375 488 </child> 376 - </widget> 489 + </object> 377 490 <packing> 378 491 <property name="expand">False</property> 379 492 <property name="homogeneous">False</property> ··· 381 494 </child> 382 495 383 496 <child> 384 - <widget class="GtkToolButton" id="button7"> 497 + <object class="GtkToolButton" id="button7"> 385 498 <property name="visible">True</property> 386 - <property name="tooltip" translatable="yes">Collapse the whole tree in the right frame</property> 499 + <property name="tooltip-text" translatable="yes">Collapse the whole tree in the right frame</property> 387 500 <property name="label" translatable="yes">Collapse</property> 388 501 <property name="use_underline">True</property> 389 502 <property name="stock_id">gtk-remove</property> 390 503 <property name="visible_horizontal">True</property> 391 504 <property name="visible_vertical">True</property> 392 505 <property name="is_important">False</property> 393 - <signal name="clicked" handler="on_collapse_clicked"/> 394 - </widget> 506 + </object> 395 507 <packing> 396 508 <property name="expand">False</property> 397 509 <property name="homogeneous">True</property> ··· 398 512 </child> 399 513 400 514 <child> 401 - <widget class="GtkToolButton" id="button8"> 515 + <object class="GtkToolButton" id="button8"> 402 516 <property name="visible">True</property> 403 - <property name="tooltip" translatable="yes">Expand the whole tree in the right frame</property> 517 + <property name="tooltip-text" translatable="yes">Expand the whole tree in the right frame</property> 404 518 <property name="label" translatable="yes">Expand</property> 405 519 <property name="use_underline">True</property> 406 520 <property name="stock_id">gtk-add</property> 407 521 <property name="visible_horizontal">True</property> 408 522 <property name="visible_vertical">True</property> 409 523 <property name="is_important">False</property> 410 - <signal name="clicked" handler="on_expand_clicked"/> 411 - </widget> 524 + </object> 412 525 <packing> 413 526 <property name="expand">False</property> 414 527 <property name="homogeneous">True</property> 415 528 </packing> 416 529 </child> 417 - </widget> 418 - </child> 419 - </widget> 530 + </object> 420 531 <packing> 421 532 <property name="padding">0</property> 422 533 <property name="expand">False</property> ··· 422 539 </child> 423 540 424 541 <child> 425 - <widget class="GtkHPaned" id="hpaned1"> 542 + <object class="GtkPaned" id="hpaned1"> 426 543 <property name="width_request">1</property> 427 544 <property name="visible">True</property> 428 545 <property name="can_focus">True</property> 429 - <property name="position">0</property> 430 546 431 547 <child> 432 - <widget class="GtkScrolledWindow" id="scrolledwindow1"> 548 + <object class="GtkScrolledWindow" id="scrolledwindow1"> 433 549 <property name="visible">True</property> 434 550 <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> 435 551 <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> ··· 436 554 <property name="window_placement">GTK_CORNER_TOP_LEFT</property> 437 555 438 556 <child> 439 - <widget class="GtkTreeView" id="treeview1"> 557 + <object class="GtkTreeView" id="treeview1"> 440 558 <property name="visible">True</property> 441 559 <property name="can_focus">True</property> 442 560 <property name="headers_visible">True</property> 443 561 <property name="rules_hint">False</property> 444 562 <property name="reorderable">False</property> 445 563 <property name="enable_search">False</property> 446 - <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:58:22 GMT"/> 447 - <signal name="button_press_event" handler="on_treeview1_button_press_event" last_modification_time="Sun, 12 Jan 2003 16:03:52 GMT"/> 448 - <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 16:11:44 GMT"/> 449 - </widget> 564 + </object> 450 565 </child> 451 - </widget> 566 + </object> 452 567 <packing> 453 568 <property name="shrink">True</property> 454 569 <property name="resize">False</property> ··· 453 574 </child> 454 575 455 576 <child> 456 - <widget class="GtkVPaned" id="vpaned1"> 577 + <object class="GtkPaned" id="vpaned1"> 578 + <property name="orientation">vertical</property> 457 579 <property name="visible">True</property> 458 580 <property name="can_focus">True</property> 459 - <property name="position">0</property> 460 581 461 582 <child> 462 - <widget class="GtkScrolledWindow" id="scrolledwindow2"> 583 + <object class="GtkScrolledWindow" id="scrolledwindow2"> 463 584 <property name="visible">True</property> 464 585 <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property> 465 586 <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> ··· 467 588 <property name="window_placement">GTK_CORNER_TOP_LEFT</property> 468 589 469 590 <child> 470 - <widget class="GtkTreeView" id="treeview2"> 591 + <object class="GtkTreeView" id="treeview2"> 471 592 <property name="visible">True</property> 472 593 <property name="can_focus">True</property> 473 594 <property name="has_focus">True</property> ··· 475 596 <property name="rules_hint">False</property> 476 597 <property name="reorderable">False</property> 477 598 <property name="enable_search">False</property> 478 - <signal name="cursor_changed" handler="on_treeview2_cursor_changed" last_modification_time="Sun, 12 Jan 2003 15:57:55 GMT"/> 479 - <signal name="button_press_event" handler="on_treeview2_button_press_event" last_modification_time="Sun, 12 Jan 2003 15:57:58 GMT"/> 480 - <signal name="key_press_event" handler="on_treeview2_key_press_event" last_modification_time="Sun, 12 Jan 2003 15:58:01 GMT"/> 481 - </widget> 599 + </object> 482 600 </child> 483 - </widget> 601 + </object> 484 602 <packing> 485 603 <property name="shrink">True</property> 486 604 <property name="resize">False</property> ··· 485 609 </child> 486 610 487 611 <child> 488 - <widget class="GtkScrolledWindow" id="scrolledwindow3"> 612 + <object class="GtkScrolledWindow" id="scrolledwindow3"> 489 613 <property name="visible">True</property> 490 614 <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> 491 615 <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> ··· 493 617 <property name="window_placement">GTK_CORNER_TOP_LEFT</property> 494 618 495 619 <child> 496 - <widget class="GtkTextView" id="textview3"> 620 + <object class="GtkTextView" id="textview3"> 497 621 <property name="visible">True</property> 498 622 <property name="can_focus">True</property> 499 623 <property name="editable">False</property> ··· 508 632 <property name="left_margin">0</property> 509 633 <property name="right_margin">0</property> 510 634 <property name="indent">0</property> 511 - <property name="text" translatable="yes">Sorry, no help available for this option yet.</property> 512 - </widget> 635 + </object> 513 636 </child> 514 - </widget> 637 + </object> 515 638 <packing> 516 639 <property name="shrink">True</property> 517 640 <property name="resize">True</property> 518 641 </packing> 519 642 </child> 520 - </widget> 643 + </object> 521 644 <packing> 522 645 <property name="shrink">True</property> 523 646 <property name="resize">True</property> 524 647 </packing> 525 648 </child> 526 - </widget> 649 + </object> 527 650 <packing> 528 651 <property name="padding">0</property> 529 652 <property name="expand">True</property> 530 653 <property name="fill">True</property> 531 654 </packing> 532 655 </child> 533 - </widget> 656 + </object> 534 657 </child> 535 - </widget> 658 + </object> 536 659 537 - </glade-interface> 660 + </interface>
+2
scripts/kconfig/lkc.h
··· 98 98 bool menu_has_prompt(const struct menu *menu); 99 99 const char *menu_get_prompt(const struct menu *menu); 100 100 struct menu *menu_get_parent_menu(struct menu *menu); 101 + struct menu *menu_get_menu_or_parent_menu(struct menu *menu); 101 102 int get_jump_key_char(void); 102 103 struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head); 103 104 void menu_get_ext_help(struct menu *menu, struct gstr *help); 105 + void menu_dump(void); 104 106 105 107 /* symbol.c */ 106 108 void sym_clear_all_valid(void);
+4 -2
scripts/kconfig/lxdialog/inputbox.c
··· 39 39 40 40 if (!init) 41 41 instr[0] = '\0'; 42 - else 43 - strcpy(instr, init); 42 + else { 43 + strncpy(instr, init, sizeof(dialog_input_result) - 1); 44 + instr[sizeof(dialog_input_result) - 1] = '\0'; 45 + } 44 46 45 47 do_resize: 46 48 if (getmaxy(stdscr) <= (height - INPUTBOX_HEIGHT_MIN))
+1 -1
scripts/kconfig/lxdialog/menubox.c
··· 264 264 if (key < 256 && isalpha(key)) 265 265 key = tolower(key); 266 266 267 - if (strchr("ynmh", key)) 267 + if (strchr("ynmh ", key)) 268 268 i = max_choice; 269 269 else { 270 270 for (i = choice + 1; i < max_choice; i++) {
+1 -2
scripts/kconfig/lxdialog/util.c
··· 345 345 int prompt_len, room, wlen; 346 346 char tempstr[MAX_LEN + 1], *word, *sp, *sp2, *newline_separator = 0; 347 347 348 - strcpy(tempstr, prompt); 349 - 348 + snprintf(tempstr, sizeof(tempstr), "%s", prompt); 350 349 prompt_len = strlen(tempstr); 351 350 352 351 if (prompt_len <= width - x * 2) { /* If prompt is short */
+94
scripts/kconfig/menu.c
··· 575 575 return NULL; 576 576 } 577 577 578 + /** 579 + * menu_get_parent_menu - return the parent menu or NULL 580 + * @menu: pointer to the menu 581 + * return: the parent menu, or NULL if there is no parent. 582 + */ 578 583 struct menu *menu_get_parent_menu(struct menu *menu) 584 + { 585 + for (menu = menu->parent; menu; menu = menu->parent) 586 + if (menu->type == M_MENU) 587 + return menu; 588 + 589 + return NULL; 590 + } 591 + 592 + /** 593 + * menu_get_menu_or_parent_menu - return the parent menu or the menu itself 594 + * @menu: pointer to the menu 595 + * return: the parent menu. If the given argument is already a menu, return 596 + * itself. 597 + */ 598 + struct menu *menu_get_menu_or_parent_menu(struct menu *menu) 579 599 { 580 600 enum prop_type type; 581 601 ··· 787 767 str_printf(help, "%s\n", help_text); 788 768 if (sym) 789 769 get_symbol_str(help, sym, NULL); 770 + } 771 + 772 + /** 773 + * menu_dump - dump all menu entries in a tree-like format 774 + */ 775 + void menu_dump(void) 776 + { 777 + struct menu *menu = &rootmenu; 778 + unsigned long long bits = 0; 779 + int indent = 0; 780 + 781 + while (menu) { 782 + 783 + for (int i = indent - 1; i >= 0; i--) { 784 + if (bits & (1ULL << i)) { 785 + if (i > 0) 786 + printf("| "); 787 + else 788 + printf("|-- "); 789 + } else { 790 + if (i > 0) 791 + printf(" "); 792 + else 793 + printf("`-- "); 794 + } 795 + } 796 + 797 + switch (menu->type) { 798 + case M_CHOICE: 799 + printf("choice \"%s\"\n", menu->prompt->text); 800 + break; 801 + case M_COMMENT: 802 + printf("comment \"%s\"\n", menu->prompt->text); 803 + break; 804 + case M_IF: 805 + printf("if\n"); 806 + break; 807 + case M_MENU: 808 + printf("menu \"%s\"", menu->prompt->text); 809 + if (!menu->sym) { 810 + printf("\n"); 811 + break; 812 + } 813 + printf(" + "); 814 + /* fallthrough */ 815 + case M_NORMAL: 816 + printf("symbol %s\n", menu->sym->name); 817 + break; 818 + } 819 + if (menu->list) { 820 + bits <<= 1; 821 + menu = menu->list; 822 + if (menu->next) 823 + bits |= 1; 824 + else 825 + bits &= ~1; 826 + indent++; 827 + continue; 828 + } 829 + 830 + while (menu && !menu->next) { 831 + menu = menu->parent; 832 + bits >>= 1; 833 + indent--; 834 + } 835 + 836 + if (menu) { 837 + menu = menu->next; 838 + if (menu->next) 839 + bits |= 1; 840 + else 841 + bits &= ~1; 842 + } 843 + } 790 844 }
+2
scripts/kconfig/nconf.c
··· 593 593 tmp_str, 594 594 sizeof(k_menu_items[index].str)); 595 595 596 + k_menu_items[index].str[sizeof(k_menu_items[index].str) - 1] = '\0'; 597 + 596 598 free_item(curses_menu_items[index]); 597 599 curses_menu_items[index] = new_item( 598 600 k_menu_items[index].str,
+1
scripts/kconfig/nconf.gui.c
··· 359 359 x = (columns-win_cols)/2; 360 360 361 361 strncpy(result, init, *result_len); 362 + result[*result_len - 1] = '\0'; 362 363 363 364 /* create the windows */ 364 365 win = newwin(win_lines, win_cols, y, x);
+24 -12
scripts/kconfig/qconf.cc
··· 37 37 ConfigSettings::ConfigSettings() 38 38 : QSettings("kernel.org", "qconf") 39 39 { 40 + beginGroup("/kconfig/qconf"); 41 + } 42 + 43 + ConfigSettings::~ConfigSettings() 44 + { 45 + endGroup(); 40 46 } 41 47 42 48 /** ··· 98 92 { 99 93 ConfigList* list; 100 94 struct symbol* sym; 101 - struct property *prop; 102 95 QString prompt; 103 96 int type; 104 97 tristate expr; ··· 110 105 } 111 106 112 107 sym = menu->sym; 113 - prop = menu->prompt; 114 108 prompt = menu_get_prompt(menu); 115 109 116 - if (prop) switch (prop->type) { 117 - case P_MENU: 110 + switch (menu->type) { 111 + case M_MENU: 118 112 if (list->mode == singleMode) { 119 113 /* a menuconfig entry is displayed differently 120 114 * depending whether it's at the view root or a child. ··· 127 123 setIcon(promptColIdx, QIcon()); 128 124 } 129 125 goto set_prompt; 130 - case P_COMMENT: 126 + case M_COMMENT: 131 127 setIcon(promptColIdx, QIcon()); 132 128 prompt = "*** " + prompt + " ***"; 129 + goto set_prompt; 130 + case M_CHOICE: 131 + setIcon(promptColIdx, QIcon()); 132 + sym = sym_calc_choice(menu); 133 + if (sym) 134 + setText(dataColIdx, sym->name); 133 135 goto set_prompt; 134 136 default: 135 137 ; ··· 198 188 if (!menu) 199 189 return; 200 190 201 - sym_calc_value(menu->sym); 191 + if (menu->type == M_CHOICE) 192 + sym_calc_choice(menu); 193 + else 194 + sym_calc_value(menu->sym); 195 + 202 196 if (menu->flags & MENU_CHANGED) { 203 197 /* the menu entry changed, so update all list items */ 204 198 menu->flags &= ~MENU_CHANGED; ··· 492 478 while (it.hasNext()) { 493 479 ConfigList *list = it.next(); 494 480 495 - list->updateList(); 481 + list->updateListAll(); 496 482 } 497 483 } 498 484 ··· 583 569 oldroot = rootEntry; 584 570 if (rootEntry == &rootmenu) 585 571 return; 586 - setRootMenu(menu_get_parent_menu(rootEntry->parent)); 572 + setRootMenu(menu_get_menu_or_parent_menu(rootEntry->parent)); 587 573 588 574 QTreeWidgetItemIterator it(this); 589 575 while (*it) { ··· 1546 1532 switch (configList->mode) { 1547 1533 case singleMode: 1548 1534 list = configList; 1549 - parent = menu_get_parent_menu(menu); 1535 + parent = menu_get_menu_or_parent_menu(menu); 1550 1536 if (!parent) 1551 1537 return; 1552 1538 list->setRootMenu(parent); ··· 1557 1543 configList->clearSelection(); 1558 1544 list = configList; 1559 1545 } else { 1560 - parent = menu_get_parent_menu(menu->parent); 1546 + parent = menu_get_menu_or_parent_menu(menu->parent); 1561 1547 if (!parent) 1562 1548 return; 1563 1549 ··· 1835 1821 configApp = new QApplication(ac, av); 1836 1822 1837 1823 configSettings = new ConfigSettings(); 1838 - configSettings->beginGroup("/kconfig/qconf"); 1839 1824 v = new ConfigMainWindow(); 1840 1825 1841 1826 //zconfdump(stdout); ··· 1842 1829 v->show(); 1843 1830 configApp->exec(); 1844 1831 1845 - configSettings->endGroup(); 1846 1832 delete configSettings; 1847 1833 delete v; 1848 1834 delete configApp;
+1
scripts/kconfig/qconf.h
··· 24 24 class ConfigSettings : public QSettings { 25 25 public: 26 26 ConfigSettings(); 27 + ~ConfigSettings(void); 27 28 QList<int> readSizes(const QString& key, bool *ok); 28 29 bool writeSizes(const QString& key, const QList<int>& value); 29 30 };
+4
scripts/kconfig/symbol.c
··· 195 195 196 196 list_for_each_entry(menu, &sym->menus, link) 197 197 menu->flags |= MENU_CHANGED; 198 + 199 + menu = sym_get_choice_menu(sym); 200 + if (menu) 201 + menu->flags |= MENU_CHANGED; 198 202 } 199 203 200 204 static void sym_set_all_changed(void)