mirror of
https://github.com/ZoiteChat/zoitechat.git
synced 2026-06-28 16:49:25 +00:00
Compare commits
9 Commits
upnp-dcc-s
...
b8a7ccf005
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b8a7ccf005 | ||
| 68fc53585e | |||
|
|
090b39f78b | ||
| 3722de6b13 | |||
|
|
d93c9aa780 | ||
| ea56504aee | |||
| 46b91edfdf | |||
|
|
d2dfde519d | ||
| 1eac56f22c |
34
.github/workflows/appimage-build.yml
vendored
34
.github/workflows/appimage-build.yml
vendored
@@ -86,11 +86,21 @@ jobs:
|
|||||||
cp -a /usr/lib/x86_64-linux-gnu/python3/dist-packages AppDir/usr/lib/x86_64-linux-gnu/python3/
|
cp -a /usr/lib/x86_64-linux-gnu/python3/dist-packages AppDir/usr/lib/x86_64-linux-gnu/python3/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl-base" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/perl-base AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -d "/usr/lib/x86_64-linux-gnu/perl" ]; then
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl" ]; then
|
||||||
install -d AppDir/usr/lib/x86_64-linux-gnu
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
cp -a /usr/lib/x86_64-linux-gnu/perl AppDir/usr/lib/x86_64-linux-gnu/
|
cp -a /usr/lib/x86_64-linux-gnu/perl AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -d "/usr/lib/x86_64-linux-gnu/perl5" ]; then
|
||||||
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
|
cp -a /usr/lib/x86_64-linux-gnu/perl5 AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
|
fi
|
||||||
|
|
||||||
if [ -d "/usr/share/perl" ]; then
|
if [ -d "/usr/share/perl" ]; then
|
||||||
install -d AppDir/usr/share
|
install -d AppDir/usr/share
|
||||||
cp -a /usr/share/perl AppDir/usr/share/
|
cp -a /usr/share/perl AppDir/usr/share/
|
||||||
@@ -100,6 +110,10 @@ jobs:
|
|||||||
install -d AppDir/usr/share
|
install -d AppDir/usr/share
|
||||||
cp -a /usr/share/perl5 AppDir/usr/share/
|
cp -a /usr/share/perl5 AppDir/usr/share/
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
perl -MFile::Spec -e 'print "Build host File::Spec: $INC{\"File/Spec.pm\"}\n"'
|
||||||
|
find AppDir/usr -path '*/File/Spec.pm' -print -quit | grep -q .
|
||||||
|
|
||||||
if compgen -G '/usr/lib/x86_64-linux-gnu/libpython3*.so*' > /dev/null; then
|
if compgen -G '/usr/lib/x86_64-linux-gnu/libpython3*.so*' > /dev/null; then
|
||||||
install -d AppDir/usr/lib/x86_64-linux-gnu
|
install -d AppDir/usr/lib/x86_64-linux-gnu
|
||||||
cp -a /usr/lib/x86_64-linux-gnu/libpython3*.so* AppDir/usr/lib/x86_64-linux-gnu/
|
cp -a /usr/lib/x86_64-linux-gnu/libpython3*.so* AppDir/usr/lib/x86_64-linux-gnu/
|
||||||
@@ -162,7 +176,7 @@ jobs:
|
|||||||
|
|
||||||
APPDIR="${APPDIR:-$(dirname "$(readlink -f "$0")")}"
|
APPDIR="${APPDIR:-$(dirname "$(readlink -f "$0")")}"
|
||||||
|
|
||||||
export PATH="${PATH:-/usr/bin:/bin}:$APPDIR/usr/bin"
|
export PATH="$APPDIR/usr/bin:${PATH:-/usr/bin:/bin}"
|
||||||
export LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"
|
export LD_LIBRARY_PATH="$APPDIR/usr/lib:$APPDIR/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH:-}"
|
||||||
export XDG_DATA_DIRS="$APPDIR/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
export XDG_DATA_DIRS="$APPDIR/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}"
|
||||||
export GTK_EXE_PREFIX="$APPDIR/usr"
|
export GTK_EXE_PREFIX="$APPDIR/usr"
|
||||||
@@ -211,6 +225,23 @@ jobs:
|
|||||||
|
|
||||||
unset GTK_MODULES
|
unset GTK_MODULES
|
||||||
|
|
||||||
|
perl5lib_entries=""
|
||||||
|
for dir in \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl-base" \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl"/* \
|
||||||
|
"$APPDIR/usr/lib/x86_64-linux-gnu/perl5"/* \
|
||||||
|
"$APPDIR/usr/share/perl"/* \
|
||||||
|
"$APPDIR/usr/share/perl5"
|
||||||
|
do
|
||||||
|
if [ -d "$dir" ]; then
|
||||||
|
perl5lib_entries="${perl5lib_entries:+$perl5lib_entries:}$dir"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -n "$perl5lib_entries" ]; then
|
||||||
|
export PERL5LIB="$perl5lib_entries${PERL5LIB:+:$PERL5LIB}"
|
||||||
|
fi
|
||||||
|
|
||||||
export PYTHONHOME="$APPDIR/usr"
|
export PYTHONHOME="$APPDIR/usr"
|
||||||
python_stdlib_dir="$(find "$APPDIR/usr/lib" -maxdepth 1 -type d -name 'python3.*' | head -n 1 || true)"
|
python_stdlib_dir="$(find "$APPDIR/usr/lib" -maxdepth 1 -type d -name 'python3.*' | head -n 1 || true)"
|
||||||
pythonpath_entries=""
|
pythonpath_entries=""
|
||||||
@@ -256,7 +287,6 @@ jobs:
|
|||||||
EOF
|
EOF
|
||||||
chmod +x AppRun
|
chmod +x AppRun
|
||||||
|
|
||||||
|
|
||||||
VERSION="$(git describe --tags --always)"
|
VERSION="$(git describe --tags --always)"
|
||||||
|
|
||||||
./linuxdeploy-x86_64.AppImage \
|
./linuxdeploy-x86_64.AppImage \
|
||||||
|
|||||||
@@ -272,13 +272,6 @@ gtkutil_apply_palette (GtkWidget *widget, const GdkRGBA *bg, const GdkRGBA *fg,
|
|||||||
theme_manager_apply_palette_widget (widget, bg, fg, font_desc);
|
theme_manager_apply_palette_widget (widget, bg, fg, font_desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gtkutil_file_req_destroy (GtkWidget * wid, struct file_req *freq)
|
|
||||||
{
|
|
||||||
freq->callback (freq->userdata, NULL);
|
|
||||||
g_free (freq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gtkutil_check_file (char *filename, struct file_req *freq)
|
gtkutil_check_file (char *filename, struct file_req *freq)
|
||||||
{
|
{
|
||||||
@@ -390,26 +383,6 @@ gtkutil_file_req_done_chooser (GtkFileChooser *fs, struct file_req *freq)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gtkutil_file_req_done (GtkWidget * wid, struct file_req *freq)
|
|
||||||
{
|
|
||||||
gtkutil_file_req_done_chooser (GTK_FILE_CHOOSER (freq->dialog), freq);
|
|
||||||
gtk_widget_destroy (freq->dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
gtkutil_file_req_response (GtkWidget *dialog, gint res, struct file_req *freq)
|
|
||||||
{
|
|
||||||
if (res == GTK_RESPONSE_ACCEPT)
|
|
||||||
{
|
|
||||||
gtkutil_file_req_done (dialog, freq);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gtkutil_native_dialog_unref_idle (gpointer native)
|
gtkutil_native_dialog_unref_idle (gpointer native)
|
||||||
{
|
{
|
||||||
@@ -423,27 +396,16 @@ gtkutil_native_file_req_response (GtkNativeDialog *dialog, gint res, struct file
|
|||||||
if (res == GTK_RESPONSE_ACCEPT)
|
if (res == GTK_RESPONSE_ACCEPT)
|
||||||
gtkutil_file_req_done_chooser (GTK_FILE_CHOOSER (dialog), freq);
|
gtkutil_file_req_done_chooser (GTK_FILE_CHOOSER (dialog), freq);
|
||||||
|
|
||||||
/* Match gtk dialog flow by always sending NULL to indicate completion. */
|
|
||||||
freq->callback (freq->userdata, NULL);
|
freq->callback (freq->userdata, NULL);
|
||||||
g_free (freq);
|
g_free (freq);
|
||||||
|
|
||||||
/*
|
|
||||||
* Defer unref until idle to avoid disposing the native chooser while
|
|
||||||
* still in the button-release signal stack on Windows.
|
|
||||||
*/
|
|
||||||
g_idle_add (gtkutil_native_dialog_unref_idle, dialog);
|
g_idle_add (gtkutil_native_dialog_unref_idle, dialog);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *userdata, char *filter, char *extensions,
|
gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *userdata, char *filter, char *extensions,
|
||||||
int flags)
|
int flags)
|
||||||
{
|
{
|
||||||
struct file_req *freq;
|
struct file_req *freq;
|
||||||
GtkWidget *dialog;
|
|
||||||
GtkFileFilter *filefilter;
|
|
||||||
char *token;
|
|
||||||
char *tokenbuffer;
|
|
||||||
const char *xdir;
|
const char *xdir;
|
||||||
GtkWindow *effective_parent = parent;
|
GtkWindow *effective_parent = parent;
|
||||||
|
|
||||||
@@ -453,7 +415,6 @@ gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *us
|
|||||||
|
|
||||||
xdir = get_xdir ();
|
xdir = get_xdir ();
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
{
|
{
|
||||||
GtkFileChooserNative *native = gtk_file_chooser_native_new (
|
GtkFileChooserNative *native = gtk_file_chooser_native_new (
|
||||||
title,
|
title,
|
||||||
@@ -529,107 +490,7 @@ gtkutil_file_req (GtkWindow *parent, const char *title, void *callback, void *us
|
|||||||
gtk_native_dialog_show (GTK_NATIVE_DIALOG (native));
|
gtk_native_dialog_show (GTK_NATIVE_DIALOG (native));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
if (flags & FRF_WRITE)
|
|
||||||
{
|
|
||||||
dialog = gtk_file_chooser_dialog_new (title, NULL,
|
|
||||||
GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
||||||
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
||||||
_("_Save"), GTK_RESPONSE_ACCEPT,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
if (!(flags & FRF_NOASKOVERWRITE))
|
|
||||||
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
dialog = gtk_file_chooser_dialog_new (title, NULL,
|
|
||||||
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
||||||
_("_Cancel"), GTK_RESPONSE_CANCEL,
|
|
||||||
_("_Open"), GTK_RESPONSE_ACCEPT,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
theme_manager_attach_window (dialog);
|
|
||||||
|
|
||||||
if (filter && filter[0] && (flags & FRF_FILTERISINITIAL))
|
|
||||||
{
|
|
||||||
if (flags & FRF_WRITE)
|
|
||||||
{
|
|
||||||
char temp[1024];
|
|
||||||
path_part (filter, temp, sizeof (temp));
|
|
||||||
if (temp[0] && g_file_test (temp, G_FILE_TEST_IS_DIR))
|
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), temp);
|
|
||||||
else if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR))
|
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir);
|
|
||||||
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), file_part (filter));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (g_file_test (filter, G_FILE_TEST_IS_DIR))
|
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), filter);
|
|
||||||
else if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR))
|
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!(flags & FRF_RECENTLYUSED))
|
|
||||||
{
|
|
||||||
if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR))
|
|
||||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog), xdir);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & FRF_MULTIPLE)
|
|
||||||
gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (dialog), TRUE);
|
|
||||||
if (flags & FRF_CHOOSEFOLDER)
|
|
||||||
gtk_file_chooser_set_action (GTK_FILE_CHOOSER (dialog), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
|
|
||||||
|
|
||||||
if ((flags & FRF_EXTENSIONS || flags & FRF_MIMETYPES) && extensions != NULL)
|
|
||||||
{
|
|
||||||
filefilter = gtk_file_filter_new ();
|
|
||||||
tokenbuffer = g_strdup (extensions);
|
|
||||||
token = strtok (tokenbuffer, ";");
|
|
||||||
|
|
||||||
while (token != NULL)
|
|
||||||
{
|
|
||||||
if (flags & FRF_EXTENSIONS)
|
|
||||||
gtk_file_filter_add_pattern (filefilter, token);
|
|
||||||
else
|
|
||||||
gtk_file_filter_add_mime_type (filefilter, token);
|
|
||||||
token = strtok (NULL, ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (tokenbuffer);
|
|
||||||
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (dialog), filefilter);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xdir && xdir[0] && g_file_test (xdir, G_FILE_TEST_IS_DIR))
|
|
||||||
{
|
|
||||||
GError *shortcut_error = NULL;
|
|
||||||
|
|
||||||
gtk_file_chooser_add_shortcut_folder (GTK_FILE_CHOOSER (dialog), xdir, &shortcut_error);
|
|
||||||
if (shortcut_error)
|
|
||||||
g_error_free (shortcut_error);
|
|
||||||
}
|
|
||||||
freq = g_new (struct file_req, 1);
|
|
||||||
freq->dialog = dialog;
|
|
||||||
freq->flags = flags;
|
|
||||||
freq->callback = callback;
|
|
||||||
freq->userdata = userdata;
|
|
||||||
|
|
||||||
g_signal_connect (G_OBJECT (dialog), "response",
|
|
||||||
G_CALLBACK (gtkutil_file_req_response), freq);
|
|
||||||
g_signal_connect (G_OBJECT (dialog), "destroy",
|
|
||||||
G_CALLBACK (gtkutil_file_req_destroy), (gpointer) freq);
|
|
||||||
|
|
||||||
if (effective_parent)
|
|
||||||
gtk_window_set_transient_for (GTK_WINDOW (dialog), effective_parent);
|
|
||||||
|
|
||||||
if (flags & FRF_MODAL)
|
|
||||||
{
|
|
||||||
g_assert (effective_parent);
|
|
||||||
gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
gtk_widget_show (dialog);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|||||||
@@ -872,6 +872,10 @@ fe_set_title (session *sess)
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
mg_topicbar_update_height (GtkWidget *topic);
|
mg_topicbar_update_height (GtkWidget *topic);
|
||||||
|
static void
|
||||||
|
mg_topicbar_queue_relayout (GtkWidget *topic);
|
||||||
|
static void
|
||||||
|
mg_queue_window_relayout (GtkWidget *window);
|
||||||
|
|
||||||
static session *
|
static session *
|
||||||
mg_session_from_window (GtkWidget *wid)
|
mg_session_from_window (GtkWidget *wid)
|
||||||
@@ -891,6 +895,57 @@ mg_session_from_window (GtkWidget *wid)
|
|||||||
return current_sess;
|
return current_sess;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
mg_window_relayout_idle_cb (gpointer userdata)
|
||||||
|
{
|
||||||
|
GtkWidget *window = GTK_WIDGET (userdata);
|
||||||
|
session *sess;
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (window), "mg-window-relayout-source", NULL);
|
||||||
|
|
||||||
|
sess = mg_session_from_window (window);
|
||||||
|
if (sess && sess->gui)
|
||||||
|
{
|
||||||
|
if (GTK_IS_WIDGET (sess->gui->topic_entry))
|
||||||
|
mg_topicbar_queue_relayout (sess->gui->topic_entry);
|
||||||
|
|
||||||
|
if (GTK_IS_XTEXT (sess->gui->xtext))
|
||||||
|
{
|
||||||
|
gtk_xtext_refresh (GTK_XTEXT (sess->gui->xtext));
|
||||||
|
gtk_widget_queue_resize (sess->gui->xtext);
|
||||||
|
gtk_widget_queue_draw (sess->gui->xtext);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GTK_IS_WIDGET (sess->gui->window))
|
||||||
|
{
|
||||||
|
gtk_widget_queue_resize (sess->gui->window);
|
||||||
|
gtk_widget_queue_draw (sess->gui->window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (window);
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mg_queue_window_relayout (GtkWidget *window)
|
||||||
|
{
|
||||||
|
guint source_id;
|
||||||
|
|
||||||
|
if (!window || !GTK_IS_WIDGET (window))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_object_get_data (G_OBJECT (window), "mg-window-relayout-source") != NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
|
||||||
|
mg_window_relayout_idle_cb,
|
||||||
|
g_object_ref (window),
|
||||||
|
NULL);
|
||||||
|
g_object_set_data (G_OBJECT (window), "mg-window-relayout-source",
|
||||||
|
GUINT_TO_POINTER (source_id));
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
mg_windowstate_cb (GtkWindow *wid, GdkEventWindowState *event, gpointer userdata)
|
mg_windowstate_cb (GtkWindow *wid, GdkEventWindowState *event, gpointer userdata)
|
||||||
{
|
{
|
||||||
@@ -939,18 +994,10 @@ mg_windowstate_cb (GtkWindow *wid, GdkEventWindowState *event, gpointer userdata
|
|||||||
}
|
}
|
||||||
|
|
||||||
sess = mg_session_from_window (GTK_WIDGET (wid));
|
sess = mg_session_from_window (GTK_WIDGET (wid));
|
||||||
if (sess && sess->gui && GTK_IS_WIDGET (sess->gui->topic_entry))
|
|
||||||
{
|
|
||||||
mg_topicbar_update_height (sess->gui->topic_entry);
|
|
||||||
gtk_widget_queue_draw (sess->gui->topic_entry);
|
|
||||||
}
|
|
||||||
if (sess && sess->gui && GTK_IS_XTEXT (sess->gui->xtext))
|
|
||||||
{
|
|
||||||
gtk_xtext_refresh (GTK_XTEXT (sess->gui->xtext));
|
|
||||||
gtk_widget_queue_draw (sess->gui->xtext);
|
|
||||||
}
|
|
||||||
if (sess && sess->gui && GTK_IS_WIDGET (sess->gui->window))
|
if (sess && sess->gui && GTK_IS_WIDGET (sess->gui->window))
|
||||||
gtk_widget_queue_draw (sess->gui->window);
|
mg_queue_window_relayout (sess->gui->window);
|
||||||
|
else
|
||||||
|
mg_queue_window_relayout (GTK_WIDGET (wid));
|
||||||
|
|
||||||
if (current_sess && current_sess->gui)
|
if (current_sess && current_sess->gui)
|
||||||
menu_set_fullscreen (current_sess->gui, prefs.hex_gui_win_fullscreen);
|
menu_set_fullscreen (current_sess->gui, prefs.hex_gui_win_fullscreen);
|
||||||
@@ -1050,21 +1097,10 @@ mg_configure_cb (GtkWidget *wid, GdkEventConfigure *event, session *sess)
|
|||||||
}
|
}
|
||||||
|
|
||||||
target_sess = mg_session_from_window (wid);
|
target_sess = mg_session_from_window (wid);
|
||||||
if (target_sess && target_sess->gui)
|
if (target_sess && target_sess->gui && GTK_IS_WIDGET (target_sess->gui->window))
|
||||||
{
|
mg_queue_window_relayout (target_sess->gui->window);
|
||||||
if (GTK_IS_WIDGET (target_sess->gui->topic_entry))
|
else
|
||||||
{
|
mg_queue_window_relayout (wid);
|
||||||
mg_topicbar_update_height (target_sess->gui->topic_entry);
|
|
||||||
gtk_widget_queue_draw (target_sess->gui->topic_entry);
|
|
||||||
}
|
|
||||||
if (GTK_IS_XTEXT (target_sess->gui->xtext))
|
|
||||||
{
|
|
||||||
gtk_xtext_refresh (GTK_XTEXT (target_sess->gui->xtext));
|
|
||||||
gtk_widget_queue_draw (target_sess->gui->xtext);
|
|
||||||
}
|
|
||||||
if (GTK_IS_WIDGET (target_sess->gui->window))
|
|
||||||
gtk_widget_queue_draw (target_sess->gui->window);
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -3111,33 +3147,51 @@ mg_create_dialogbuttons (GtkWidget *box)
|
|||||||
static void
|
static void
|
||||||
mg_topicbar_update_height (GtkWidget *topic)
|
mg_topicbar_update_height (GtkWidget *topic)
|
||||||
{
|
{
|
||||||
GtkWidget *scroller;
|
GtkWidget *parent;
|
||||||
|
GtkWidget *grandparent;
|
||||||
GtkTextBuffer *buffer;
|
GtkTextBuffer *buffer;
|
||||||
GtkTextIter start;
|
GtkTextIter start;
|
||||||
GtkTextIter end;
|
GtkTextIter end;
|
||||||
|
GtkTextView *view;
|
||||||
PangoLayout *layout;
|
PangoLayout *layout;
|
||||||
char *text;
|
char *text;
|
||||||
int width;
|
int width;
|
||||||
int line_height;
|
int line_height;
|
||||||
int line_count;
|
int line_count;
|
||||||
int target_height;
|
int target_height;
|
||||||
|
int margin_left;
|
||||||
|
int margin_right;
|
||||||
|
int margin_top;
|
||||||
|
int margin_bottom;
|
||||||
|
int old_height;
|
||||||
PangoContext *context;
|
PangoContext *context;
|
||||||
PangoFontMetrics *metrics;
|
PangoFontMetrics *metrics;
|
||||||
|
|
||||||
if (!topic || !GTK_IS_TEXT_VIEW (topic))
|
if (!topic || !GTK_IS_TEXT_VIEW (topic))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
scroller = gtk_widget_get_parent (topic);
|
view = GTK_TEXT_VIEW (topic);
|
||||||
|
parent = gtk_widget_get_parent (topic);
|
||||||
|
grandparent = parent ? gtk_widget_get_parent (parent) : NULL;
|
||||||
|
|
||||||
buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (topic));
|
margin_left = gtk_text_view_get_left_margin (view);
|
||||||
|
margin_right = gtk_text_view_get_right_margin (view);
|
||||||
|
margin_top = gtk_text_view_get_top_margin (view);
|
||||||
|
margin_bottom = gtk_text_view_get_bottom_margin (view);
|
||||||
|
|
||||||
|
buffer = gtk_text_view_get_buffer (view);
|
||||||
gtk_text_buffer_get_bounds (buffer, &start, &end);
|
gtk_text_buffer_get_bounds (buffer, &start, &end);
|
||||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||||
layout = gtk_widget_create_pango_layout (topic, text && text[0] ? text : " ");
|
layout = gtk_widget_create_pango_layout (topic, text && text[0] ? text : " ");
|
||||||
g_free (text);
|
g_free (text);
|
||||||
|
|
||||||
width = gtk_widget_get_allocated_width (topic) - 8;
|
width = gtk_widget_get_allocated_width (topic);
|
||||||
if (width > 0)
|
if (width <= 1 && parent)
|
||||||
pango_layout_set_width (layout, width * PANGO_SCALE);
|
width = gtk_widget_get_allocated_width (parent);
|
||||||
|
width -= margin_left + margin_right;
|
||||||
|
if (width < 1)
|
||||||
|
width = 1;
|
||||||
|
pango_layout_set_width (layout, width * PANGO_SCALE);
|
||||||
pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR);
|
pango_layout_set_wrap (layout, PANGO_WRAP_WORD_CHAR);
|
||||||
|
|
||||||
context = gtk_widget_get_pango_context (topic);
|
context = gtk_widget_get_pango_context (topic);
|
||||||
@@ -3149,44 +3203,95 @@ mg_topicbar_update_height (GtkWidget *topic)
|
|||||||
pango_font_metrics_unref (metrics);
|
pango_font_metrics_unref (metrics);
|
||||||
if (line_height <= 0)
|
if (line_height <= 0)
|
||||||
line_height = 16;
|
line_height = 16;
|
||||||
|
|
||||||
line_count = pango_layout_get_line_count (layout);
|
line_count = pango_layout_get_line_count (layout);
|
||||||
if (line_count <= 0)
|
if (line_count <= 0)
|
||||||
line_count = 1;
|
line_count = 1;
|
||||||
target_height = line_height * line_count;
|
|
||||||
if (target_height < line_height)
|
|
||||||
target_height = line_height;
|
|
||||||
|
|
||||||
gtk_widget_set_size_request (topic, -1, target_height);
|
target_height = (line_height * line_count) + margin_top + margin_bottom;
|
||||||
if (scroller && GTK_IS_SCROLLED_WINDOW (scroller))
|
if (target_height < line_height + margin_top + margin_bottom)
|
||||||
|
target_height = line_height + margin_top + margin_bottom;
|
||||||
|
|
||||||
|
old_height = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (topic),
|
||||||
|
"mg-topicbar-target-height"));
|
||||||
|
if (old_height != target_height)
|
||||||
{
|
{
|
||||||
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (scroller), -1);
|
g_object_set_data (G_OBJECT (topic), "mg-topicbar-target-height",
|
||||||
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scroller), -1);
|
GINT_TO_POINTER (target_height));
|
||||||
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (scroller), target_height);
|
gtk_widget_set_size_request (topic, -1, target_height);
|
||||||
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (scroller), target_height);
|
|
||||||
gtk_widget_set_size_request (scroller, -1, target_height);
|
if (parent && GTK_IS_SCROLLED_WINDOW (parent))
|
||||||
gtk_widget_queue_resize (scroller);
|
{
|
||||||
}
|
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (parent), -1);
|
||||||
else
|
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (parent), -1);
|
||||||
{
|
gtk_scrolled_window_set_max_content_height (GTK_SCROLLED_WINDOW (parent), target_height);
|
||||||
gtk_widget_queue_resize (topic);
|
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (parent), target_height);
|
||||||
|
gtk_widget_set_size_request (parent, -1, target_height);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gtk_widget_queue_resize (topic);
|
||||||
|
if (parent)
|
||||||
|
gtk_widget_queue_resize (parent);
|
||||||
|
if (grandparent)
|
||||||
|
gtk_widget_queue_resize (grandparent);
|
||||||
gtk_widget_queue_draw (topic);
|
gtk_widget_queue_draw (topic);
|
||||||
g_object_unref (layout);
|
g_object_unref (layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
mg_topicbar_relayout_idle_cb (gpointer userdata)
|
||||||
|
{
|
||||||
|
GtkWidget *topic = GTK_WIDGET (userdata);
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (topic), "mg-topicbar-relayout-source", NULL);
|
||||||
|
mg_topicbar_update_height (topic);
|
||||||
|
g_object_unref (topic);
|
||||||
|
|
||||||
|
return G_SOURCE_REMOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
mg_topicbar_queue_relayout (GtkWidget *topic)
|
||||||
|
{
|
||||||
|
guint source_id;
|
||||||
|
|
||||||
|
if (!topic || !GTK_IS_TEXT_VIEW (topic))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (g_object_get_data (G_OBJECT (topic), "mg-topicbar-relayout-source") != NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
source_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE,
|
||||||
|
mg_topicbar_relayout_idle_cb,
|
||||||
|
g_object_ref (topic),
|
||||||
|
NULL);
|
||||||
|
g_object_set_data (G_OBJECT (topic), "mg-topicbar-relayout-source",
|
||||||
|
GUINT_TO_POINTER (source_id));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mg_topicbar_buffer_changed_cb (GtkTextBuffer *buffer, gpointer userdata)
|
mg_topicbar_buffer_changed_cb (GtkTextBuffer *buffer, gpointer userdata)
|
||||||
{
|
{
|
||||||
(void) buffer;
|
(void) buffer;
|
||||||
mg_topicbar_update_height (GTK_WIDGET (userdata));
|
mg_topicbar_queue_relayout (GTK_WIDGET (userdata));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mg_topicbar_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer userdata)
|
mg_topicbar_size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer userdata)
|
||||||
{
|
{
|
||||||
(void) allocation;
|
int old_width;
|
||||||
|
|
||||||
(void) userdata;
|
(void) userdata;
|
||||||
mg_topicbar_update_height (widget);
|
|
||||||
|
old_width = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (widget),
|
||||||
|
"mg-topicbar-allocated-width"));
|
||||||
|
if (allocation->width == old_width)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_object_set_data (G_OBJECT (widget), "mg-topicbar-allocated-width",
|
||||||
|
GINT_TO_POINTER (allocation->width));
|
||||||
|
mg_topicbar_queue_relayout (widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -3471,7 +3576,7 @@ mg_create_infoframe (GtkWidget *box)
|
|||||||
|
|
||||||
frame = gtk_frame_new (0);
|
frame = gtk_frame_new (0);
|
||||||
gtk_frame_set_shadow_type ((GtkFrame*)frame, GTK_SHADOW_OUT);
|
gtk_frame_set_shadow_type ((GtkFrame*)frame, GTK_SHADOW_OUT);
|
||||||
gtk_box_pack_start (GTK_BOX (box), frame, FALSE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX (box), frame, TRUE, TRUE, 0);
|
||||||
|
|
||||||
hbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
|
hbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
|
||||||
gtk_container_add (GTK_CONTAINER (frame), hbox);
|
gtk_container_add (GTK_CONTAINER (frame), hbox);
|
||||||
@@ -3492,7 +3597,7 @@ mg_create_meters (session_gui *gui, GtkWidget *parent_box)
|
|||||||
|
|
||||||
if ((prefs.hex_gui_lagometer & 2) || (prefs.hex_gui_throttlemeter & 2))
|
if ((prefs.hex_gui_lagometer & 2) || (prefs.hex_gui_throttlemeter & 2))
|
||||||
{
|
{
|
||||||
infbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
|
infbox = mg_box_new (GTK_ORIENTATION_HORIZONTAL, TRUE, 0);
|
||||||
gtk_box_pack_start (GTK_BOX (box), infbox, 0, 0, 0);
|
gtk_box_pack_start (GTK_BOX (box), infbox, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2300,6 +2300,12 @@ gtk_xtext_leave_notify (GtkWidget * widget, GdkEventCrossing * event)
|
|||||||
xtext->hilight_ent = NULL;
|
xtext->hilight_ent = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (xtext->tooltip_stamp_set)
|
||||||
|
{
|
||||||
|
gtk_widget_set_tooltip_text (widget, NULL);
|
||||||
|
xtext->tooltip_stamp_set = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2466,7 +2472,7 @@ gtk_xtext_motion_notify (GtkWidget * widget, GdkEventMotion * event)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (xtext->urlcheck_function == NULL)
|
if (xtext->urlcheck_function == NULL)
|
||||||
return FALSE;
|
goto tooltip_check;
|
||||||
|
|
||||||
word_type = gtk_xtext_get_word_adjust (xtext, x, y, &word_ent, &offset, &len);
|
word_type = gtk_xtext_get_word_adjust (xtext, x, y, &word_ent, &offset, &len);
|
||||||
if (word_type > 0)
|
if (word_type > 0)
|
||||||
@@ -2504,6 +2510,46 @@ gtk_xtext_motion_notify (GtkWidget * widget, GdkEventMotion * event)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tooltip_check:
|
||||||
|
if (xtext->buffer->time_stamp && xtext->buffer->indent > 0 && x >= 0 && x < xtext->stamp_width)
|
||||||
|
{
|
||||||
|
textentry *ent = gtk_xtext_find_char (xtext, x, y, NULL, NULL);
|
||||||
|
if (ent && (!xtext->tooltip_stamp_set || xtext->tooltip_stamp != ent->stamp))
|
||||||
|
{
|
||||||
|
char tooltip[96];
|
||||||
|
strftime_utf8 (tooltip, sizeof (tooltip), "%Y-%m-%d", ent->stamp);
|
||||||
|
gtk_widget_set_tooltip_text (widget, tooltip);
|
||||||
|
xtext->tooltip_stamp = ent->stamp;
|
||||||
|
xtext->tooltip_stamp_set = TRUE;
|
||||||
|
}
|
||||||
|
if (ent)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if (!xtext->buffer->time_stamp && x >= xtext->buffer->indent)
|
||||||
|
{
|
||||||
|
textentry *ent = gtk_xtext_find_char (xtext, x, y, NULL, NULL);
|
||||||
|
if (ent && ent->stamp && (!xtext->tooltip_stamp_set || xtext->tooltip_stamp != ent->stamp))
|
||||||
|
{
|
||||||
|
char tooltip[128];
|
||||||
|
char date[64];
|
||||||
|
char *stamp_text;
|
||||||
|
strftime_utf8 (date, sizeof (date), "%Y-%m-%d", ent->stamp);
|
||||||
|
xtext_get_stamp_str (ent->stamp, &stamp_text);
|
||||||
|
g_snprintf (tooltip, sizeof (tooltip), "%s %s", date, stamp_text);
|
||||||
|
gtk_widget_set_tooltip_text (widget, tooltip);
|
||||||
|
g_free (stamp_text);
|
||||||
|
xtext->tooltip_stamp = ent->stamp;
|
||||||
|
xtext->tooltip_stamp_set = TRUE;
|
||||||
|
}
|
||||||
|
if (ent)
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
else if (xtext->tooltip_stamp_set)
|
||||||
|
{
|
||||||
|
gtk_widget_set_tooltip_text (widget, NULL);
|
||||||
|
xtext->tooltip_stamp_set = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
gtk_xtext_leave_notify (widget, NULL);
|
gtk_xtext_leave_notify (widget, NULL);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|||||||
@@ -190,6 +190,8 @@ struct _GtkXText
|
|||||||
textentry *hilight_ent;
|
textentry *hilight_ent;
|
||||||
int hilight_start;
|
int hilight_start;
|
||||||
int hilight_end;
|
int hilight_end;
|
||||||
|
time_t tooltip_stamp;
|
||||||
|
unsigned int tooltip_stamp_set:1;
|
||||||
|
|
||||||
guint16 fontwidth[128]; /* each char's width, only the ASCII ones */
|
guint16 fontwidth[128]; /* each char's width, only the ASCII ones */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user