diff options
author | berkeviktor@aol.com <berkeviktor@aol.com> | 2010-10-05 05:30:22 +0200 |
---|---|---|
committer | berkeviktor@aol.com <berkeviktor@aol.com> | 2010-10-05 05:30:22 +0200 |
commit | dede76e56ac0b35a65b27bb93a1a7110ef6f0e8a (patch) | |
tree | 61daa7b2835074d6c5163e3a9f411459c10da014 /xchat-wdk.patch | |
parent | b70d524749a2deea940f776ae63e39e2c1cef394 (diff) |
native file open/save dialogs
Diffstat (limited to 'xchat-wdk.patch')
-rw-r--r-- | xchat-wdk.patch | 292 |
1 files changed, 290 insertions, 2 deletions
diff --git a/xchat-wdk.patch b/xchat-wdk.patch index 5666685e..2420d0b3 100644 --- a/xchat-wdk.patch +++ b/xchat-wdk.patch @@ -882,7 +882,7 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/fkeys.c xchat-wdk/src/fe #include <ctype.h> diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/gtkutil.c xchat-wdk/src/fe-gtk/gtkutil.c --- xchat-wdk.orig/src/fe-gtk/gtkutil.c 2009-07-18 14:38:10 +0200 -+++ xchat-wdk/src/fe-gtk/gtkutil.c 2010-10-05 03:55:27 +0200 ++++ xchat-wdk/src/fe-gtk/gtkutil.c 2010-10-05 05:22:28 +0200 @@ -22,7 +22,6 @@ #include <stdarg.h> #include <sys/types.h> @@ -891,6 +891,283 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/gtkutil.c xchat-wdk/src/ #include <fcntl.h> #include "fe-gtk.h" +@@ -51,6 +50,10 @@ + #include "../common/util.h" + #include "gtkutil.h" + #include "pixmaps.h" ++#ifdef WIN32 ++#include "../common/fe.h" ++#include "../common/thread.h" ++#endif + + /* gtkutil.c, just some gtk wrappers */ + +@@ -63,6 +66,13 @@ + void *userdata; + filereqcallback callback; + int flags; /* FRF_* flags */ ++ ++#ifdef WIN32 ++ int multiple; ++ thread *th; ++ char *title; /* native locale */ ++ char *filter; ++#endif + }; + + static char last_dir[256] = ""; +@@ -164,6 +174,196 @@ + } + } + ++#ifdef WIN32 ++static int ++win32_openfile (char *file_buf, int file_buf_len, char *title_text, char *filter, ++ int multiple) ++{ ++ OPENFILENAME o; ++ ++ memset (&o, 0, sizeof (o)); ++ ++ o.lStructSize = sizeof (o); ++ o.lpstrFilter = filter; ++ o.lpstrFile = file_buf; ++ o.nMaxFile = file_buf_len; ++ o.lpstrTitle = title_text; ++ o.Flags = 0x02000000 | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | ++ OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_LONGNAMES | OFN_NONETWORKBUTTON; ++ if (multiple) ++ o.Flags |= OFN_ALLOWMULTISELECT; ++ ++ return GetOpenFileName (&o); ++} ++ ++static int ++win32_savefile (char *file_buf, int file_buf_len, char *title_text, char *filter, ++ int multiple) ++{ ++ OPENFILENAME o; ++ ++ memset (&o, 0, sizeof (o)); ++ ++ o.lStructSize = sizeof (o); ++ o.lpstrFilter = filter; ++ o.lpstrFile = file_buf; ++ o.nMaxFile = file_buf_len; ++ o.lpstrTitle = title_text; ++ o.Flags = 0x02000000 | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | ++ OFN_NOCHANGEDIR | OFN_EXPLORER | OFN_LONGNAMES | OFN_NONETWORKBUTTON; ++ if (multiple) ++ o.Flags |= OFN_ALLOWMULTISELECT; ++ ++ return GetSaveFileName (&o); ++} ++ ++static void * ++win32_thread (struct file_req *freq) ++{ ++ char buf[1024 + 32]; ++ char file[1024]; ++ ++ memset (file, 0, sizeof (file)); ++ safe_strcpy (file, last_dir, sizeof (file)); ++ ++ if (win32_openfile (file, sizeof (file), freq->title, freq->filter, freq->multiple)) ++ { ++ if (freq->multiple) ++ { ++ char *f = file; ++ ++ if (f[strlen (f) + 1] == 0) /* only selected one file */ ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\n", file); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ } else ++ { ++ f += strlen (f) + 1; /* skip first, it's only the dir */ ++ while (f[0]) ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\\%s\n", /*dir!*/file, f); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ f += strlen (f) + 1; ++ } ++ } ++ ++ } else ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\n", file); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ } ++ } ++ ++ write (freq->th->pipe_fd[1], "0\n", 2); ++ Sleep (2000); ++ ++ return NULL; ++} ++ ++static void * ++win32_thread2 (struct file_req *freq) ++{ ++ char buf[1024 + 32]; ++ char file[1024]; ++ ++ memset (file, 0, sizeof (file)); ++ safe_strcpy (file, last_dir, sizeof (file)); ++ ++ if (win32_savefile (file, sizeof (file), freq->title, freq->filter, freq->multiple)) ++ { ++ if (freq->multiple) ++ { ++ char *f = file; ++ ++ if (f[strlen (f) + 1] == 0) /* only selected one file */ ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\n", file); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ } else ++ { ++ f += strlen (f) + 1; /* skip first, it's only the dir */ ++ while (f[0]) ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\\%s\n", /*dir!*/file, f); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ f += strlen (f) + 1; ++ } ++ } ++ ++ } else ++ { ++ snprintf (buf, sizeof (buf), "1\n%s\n", file); ++ write (freq->th->pipe_fd[1], buf, strlen (buf)); ++ } ++ } ++ ++ write (freq->th->pipe_fd[1], "0\n", 2); ++ Sleep (2000); ++ ++ return NULL; ++} ++ ++static int ++waitline2 (GIOChannel *source, char *buf, int bufsize) ++{ ++ int i = 0; ++ int len; ++ ++ while (1) ++ { ++ if (g_io_channel_read (source, &buf[i], 1, &len) != G_IO_ERROR_NONE) ++ return -1; ++ if (buf[i] == '\n' || bufsize == i + 1) ++ { ++ buf[i] = 0; ++ return i; ++ } ++ i++; ++ } ++} ++ ++static gboolean ++win32_close_pipe (int fd) ++{ ++ close (fd); ++ return 0; ++} ++ ++static gboolean ++win32_read_thread (GIOChannel *source, GIOCondition cond, struct file_req *freq) ++{ ++ char buf[512]; ++ char *file; ++ ++ waitline2 (source, buf, sizeof buf); ++ ++ switch (buf[0]) ++ { ++ case '0': /* filedialog has closed */ ++ freq->callback (freq->userdata, NULL); ++ break; ++ ++ case '1': /* got a filename! */ ++ waitline2 (source, buf, sizeof buf); ++ file = g_filename_to_utf8 (buf, -1, 0, 0, 0); ++ freq->callback (freq->userdata, file); ++ g_free (file); ++ return TRUE; ++ } ++ ++ /* it doesn't work to close them here, because of the weird ++ way giowin32 works. We must _return_ before closing them */ ++ g_timeout_add(3000, (GSourceFunc)win32_close_pipe, freq->th->pipe_fd[0]); ++ g_timeout_add(2000, (GSourceFunc)win32_close_pipe, freq->th->pipe_fd[1]); ++ ++ g_free (freq->title); ++ free (freq->th); ++ free (freq); ++ ++ return FALSE; ++} ++#endif ++ + void + gtkutil_file_req (const char *title, void *callback, void *userdata, char *filter, + int flags) +@@ -172,6 +372,54 @@ + GtkWidget *dialog; + extern char *get_xdir_fs (void); + ++#ifdef WIN32 ++ if (!(flags & FRF_WRITE)) ++ { ++ freq = malloc (sizeof (struct file_req)); ++ freq->th = thread_new (); ++ freq->flags = 0; ++ freq->multiple = (flags & FRF_MULTIPLE); ++ freq->callback = callback; ++ freq->userdata = userdata; ++ freq->title = g_locale_from_utf8 (title, -1, 0, 0, 0); ++ if (!filter) ++ freq->filter = "All files\000*.*\000" ++ "EXE files\000*.EXE\000" ++ "MP3 files\000*.MP3\000" ++ "MPEG files\000*.MPG;*.MPEG\000" ++ "RAR files\000*.RAR\000" ++ "ZIP files\000*.ZIP\000"; ++ else ++ freq->filter = filter; ++ ++ thread_start (freq->th, win32_thread, freq); ++ fe_input_add (freq->th->pipe_fd[0], FIA_FD|FIA_READ, win32_read_thread, freq); ++ ++ return; ++ ++ } ++ ++ else { ++ freq = malloc (sizeof (struct file_req)); ++ freq->th = thread_new (); ++ freq->flags = 0; ++ freq->multiple = (flags & FRF_MULTIPLE); ++ freq->callback = callback; ++ freq->userdata = userdata; ++ freq->title = g_locale_from_utf8 (title, -1, 0, 0, 0); ++ if (!filter) ++ freq->filter = "Text files\000*.TXT\000" ++ "All files\000*.*\000"; ++ else ++ freq->filter = filter; ++ ++ thread_start (freq->th, win32_thread2, freq); ++ fe_input_add (freq->th->pipe_fd[0], FIA_FD|FIA_READ, win32_read_thread, freq); ++ ++ return; ++ } ++#endif ++ + if (flags & FRF_WRITE) + { + dialog = gtk_file_chooser_dialog_new (title, NULL, diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/joind.c xchat-wdk/src/fe-gtk/joind.c --- xchat-wdk.orig/src/fe-gtk/joind.c 2006-12-26 05:56:55 +0100 +++ xchat-wdk/src/fe-gtk/joind.c 2010-10-05 03:55:27 +0200 @@ -1195,7 +1472,7 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/plugin-tray.c xchat-wdk/ return 1; /* return 1 for success */ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/plugingui.c xchat-wdk/src/fe-gtk/plugingui.c --- xchat-wdk.orig/src/fe-gtk/plugingui.c 2010-05-16 05:20:22 +0200 -+++ xchat-wdk/src/fe-gtk/plugingui.c 2010-10-05 03:55:28 +0200 ++++ xchat-wdk/src/fe-gtk/plugingui.c 2010-10-05 02:53:43 +0200 @@ -35,7 +35,7 @@ #include "../common/xchat.h" #define PLUGIN_C @@ -1205,6 +1482,17 @@ diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/plugingui.c xchat-wdk/sr #include "../common/plugin.h" #include "../common/util.h" #include "../common/outbound.h" +@@ -147,7 +147,9 @@ + plugingui_load (void) + { + gtkutil_file_req (_("Select a Plugin or Script to load"), plugingui_load_cb, +- current_sess, NULL, FRF_ADDFOLDER); ++ current_sess, ++ "Plugins and Scripts\000" "*.dll;*.pl;*.tcl;*.py;*.lua\000" ++ "All files\000" "*.*\000", 0); + } + + static void diff -ruN --strip-trailing-cr xchat-wdk.orig/src/fe-gtk/rawlog.c xchat-wdk/src/fe-gtk/rawlog.c --- xchat-wdk.orig/src/fe-gtk/rawlog.c 2010-05-16 05:20:22 +0200 +++ xchat-wdk/src/fe-gtk/rawlog.c 2010-10-05 03:55:28 +0200 |