# HG changeset patch # User mhessling@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1224641674 0 # Node ID a5deb87b26e472f7b59acd2d22f1cad9f0752bef # Parent 7d93356f250a6aac05ca13f34abd62ed3a5f67f6 Add support for using initial directory in dw_file_browse() diff -r 7d93356f250a -r a5deb87b26e4 Makefile.in --- a/Makefile.in Sat Apr 12 12:22:09 2008 +0000 +++ b/Makefile.in Wed Oct 22 02:14:34 2008 +0000 @@ -9,8 +9,8 @@ TARGET = dw SRCS = $(srcdir)/$(DW_SRC)/dw.c OBJECTS = dw.o browser.o -SRCS2 = $(srcdir)compat.c -OBJECTS2= compat.o +SRCS2 = $(srcdir)compat.c $(DW_SRC)rel2abs.c +OBJECTS2= compat.o rel2abs.o TARGET2 = dwcompat VER_MAJ = @DW_MAJOR_VERSION@ VER_MIN = @DW_MINOR_VERSION@ @@ -108,6 +108,9 @@ compat.o: $(srcdir)/compat.c $(CC) -c $(INCPATH) $(CCFLAGS) -o $@ $(srcdir)/compat.c +rel2abs.o: $(DW_SRC)/rel2abs.c + $(CC) -c $(INCPATH) $(CCFLAGS) -o $@ $(DW_SRC)/rel2abs.c + ci.o: $(srcdir)/ci.c $(CC) -c $(INCPATH) $(CCFLAGS) -o $@ $(srcdir)/ci.c diff -r 7d93356f250a -r a5deb87b26e4 dwtest.c --- a/dwtest.c Sat Apr 12 12:22:09 2008 +0000 +++ b/dwtest.c Wed Oct 22 02:14:34 2008 +0000 @@ -437,7 +437,7 @@ int DWSIGNAL browse_callback(HWND window, void *data) { char *tmp; - tmp = dw_file_browse("test string", NULL, "c", DW_FILE_OPEN ); + tmp = dw_file_browse("test string", ".", "c", DW_FILE_OPEN ); if ( tmp ) { if ( current_file ) diff -r 7d93356f250a -r a5deb87b26e4 gtk/dw.c --- a/gtk/dw.c Sat Apr 12 12:22:09 2008 +0000 +++ b/gtk/dw.c Wed Oct 22 02:14:34 2008 +0000 @@ -10271,6 +10271,8 @@ gchar *button; char *filename = NULL; char buf[1000]; + char mypath[PATH_MAX+1]; + char cwd[PATH_MAX+1]; switch (flags ) { @@ -10318,7 +10320,23 @@ if ( defpath ) { - gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( filew ), defpath ); + if ( g_path_is_absolute( defpath ) ) + { + strcpy( mypath, defpath ); + } + else + { + if ( !getcwd(cwd, PATH_MAX ) ) + { + } + else + { + if ( rel2abs( defpath, cwd, mypath, PATH_MAX ) ) + { + } + } + } + gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER( filew ), mypath ); } if ( gtk_dialog_run( GTK_DIALOG( filew ) ) == GTK_RESPONSE_ACCEPT ) @@ -10568,6 +10586,7 @@ DW_MUTEX_LOCK; _gtk_moz_embed_load_url( GTK_MOZ_EMBED(handle), url ); + gtk_widget_show(GTK_WIDGET(handle)); DW_MUTEX_UNLOCK; return 0; #endif diff -r 7d93356f250a -r a5deb87b26e4 gtk/rel2abs.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/rel2abs.c Wed Oct 22 02:14:34 2008 +0000 @@ -0,0 +1,133 @@ +/* + * Copyright (c) 1997 Shigio Yamaguchi. All rights reserved. + * Copyright (c) 1999 Tama Communications Corporation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include +#include +#include +/* + * rel2abs: convert an relative path name into absolute. + * + * i) path relative path + * i) base base directory (must be absolute path) + * o) result result buffer + * i) size size of result buffer + * r) != NULL: absolute path + * == NULL: error + */ +char * +rel2abs(path, base, result, size) + const char *path; + const char *base; + char *result; + const size_t size; +{ + const char *pp, *bp; + /* + * endp points the last position which is safe in the result buffer. + */ + const char *endp = result + size - 1; + char *rp; + int length; + + if (*path == '/') { + if (strlen(path) >= size) + goto erange; + strcpy(result, path); + goto finish; + } else if (*base != '/' || !size) { + errno = EINVAL; + return (NULL); + } else if (size == 1) + goto erange; + + length = strlen(base); + + if (!strcmp(path, ".") || !strcmp(path, "./")) { + if (length >= size) + goto erange; + strcpy(result, base); + /* + * rp points the last char. + */ + rp = result + length - 1; + /* + * remove the last '/'. + */ + if (*rp == '/') { + if (length > 1) + *rp = 0; + } else + rp++; + /* rp point NULL char */ + if (*++path == '/') { + /* + * Append '/' to the tail of path name. + */ + *rp++ = '/'; + if (rp > endp) + goto erange; + *rp = 0; + } + goto finish; + } + bp = base + length; + if (*(bp - 1) == '/') + --bp; + /* + * up to root. + */ + for (pp = path; *pp && *pp == '.'; ) { + if (!strncmp(pp, "../", 3)) { + pp += 3; + while (bp > base && *--bp != '/') + ; + } else if (!strncmp(pp, "./", 2)) { + pp += 2; + } else if (!strncmp(pp, "..\0", 3)) { + pp += 2; + while (bp > base && *--bp != '/') + ; + } else + break; + } + /* + * down to leaf. + */ + length = bp - base; + if (length >= size) + goto erange; + strncpy(result, base, length); + rp = result + length; + if (*pp || *(pp - 1) == '/' || length == 0) + *rp++ = '/'; + if (rp + strlen(pp) > endp) + goto erange; + strcpy(rp, pp); +finish: + return result; +erange: + errno = ERANGE; + return (NULL); +}