Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 608c99d92d | |||
| 7af69af9c8 | |||
| 6501755d7b | |||
| d0c833a8a7 | |||
| 437b7949dd | |||
| 781d8c974a | |||
| 79f3ac57e5 | |||
| 0d8a8a1183 | |||
| f9c1469267 | |||
| 1d4ea5dac3 | |||
| d83e126644 | |||
| 95a727c219 | |||
| 2ccdfc445d | |||
| d4f2313aee | |||
| d24ca42b24 | |||
| e6f3ed4f69 | |||
| b98239c5a4 | |||
| 7a557c5540 | |||
| 6c9ebd69ca | |||
| d416fe6936 | |||
| badfe1295a | |||
| 073b38a0f5 | |||
| 9436bc7ce0 | |||
| 3961ed8f46 | |||
| 325da813f3 | |||
| d0f1c474de | |||
| 27e4b3901a | |||
| da0dd44412 | |||
| 54e988a8ad | |||
| bbea4b5e33 | |||
| 3f6d93db49 | |||
| 359911d11a | |||
| 6594e77f7a | |||
| bdad1edd93 | |||
| 01d7b18802 | |||
| 8571f59136 | |||
| e79b989e7a | |||
| ed029de53d | |||
| 793d059d38 | |||
| 1ad3bfdd64 | |||
| 59679d00f1 | |||
| ac2c4e808d | |||
| fd799a203b | |||
| 67820cc624 | |||
| 0bd9ec1e5e | |||
| bd62ff6717 | |||
| 7974c98490 | |||
| aa46d1cd22 | |||
| fb60703d21 | |||
| a87dbdb9a9 | |||
| 7b0f4f4b8a | |||
| dc0b67f1e2 | |||
| 281f231d73 | |||
| 2a67316003 | |||
| 1706e775d6 | |||
| cf8531cd0d | |||
| ff8d4f899d | |||
| 8786714cc9 | |||
| cbfe8477fb | |||
| 06167dfa59 | |||
| 685dbf9bbc | |||
| b74c87f355 | |||
| 4c60091657 | |||
| f10e451bad | |||
| 5806b7f34d | |||
| 2e454a61ba | |||
| 01df2249df | |||
| 7c9df99170 | |||
| d0628c6856 | |||
| 095225e496 | |||
| e6873c2cd5 | |||
| 55d5543eed | |||
| 76a7700091 | |||
| f5bafd1b8e | |||
| fedfe60e0e | |||
| 83405a2c8b | |||
| a0b2f2491f | |||
| 94f030875f | |||
| 3591e29913 | |||
| 10e7514987 | |||
| 839ed23770 | |||
| 9eb83c3501 | |||
| dbe993a4dd | |||
| d7a517a0b0 | |||
| f6142b10c9 | |||
| 9423346201 | |||
| de9f5196fa | |||
| c062dcb54d | |||
| dda8c3764a | |||
| 3501d8c4f5 | |||
| 0c87680876 | |||
| dab59b874b | |||
| 0d089cd6de | |||
| 2901f63d0d | |||
| 438c13366a | |||
| 02a2c61f2d | |||
| 525150055d | |||
| 7cc56a9965 | |||
| 1ae5c7beec | |||
| 06974f39fc | |||
| 4cde9b16fd | |||
| cc3ccba88d | |||
| 442630afe5 | |||
| 45fc03183e | |||
| e42049b412 | |||
| cd4145185c | |||
| b305265dea | |||
| 243fcad89f | |||
| 3b177953c1 | |||
| 032c5f1efd | |||
| ceb158a3e1 | |||
| 35e2e048fc | |||
| eebe1148c1 | |||
| 8347521bfd | |||
| 2d1ba49ab4 | |||
| 385df5517b | |||
| a221e0da4c | |||
| d4729ecf19 | |||
| bec4c7bdb4 | |||
| 0c99e43e4c | |||
| 0451e0ad1d | |||
| 48e183353b | |||
| c3412528e8 | |||
| 35e6148400 |
67 changed files with 11135 additions and 3573 deletions
|
|
@ -131,7 +131,7 @@ emerge --ask --oneshot media-libs/freetype x11-libs/pango
|
|||
```
|
||||
|
||||
## How to Contribute
|
||||
Join the main discussion here:
|
||||
Join the main discussion here:
|
||||
https://devuanusers.com/thread-gtk2-revival-thread--80
|
||||
|
||||
Test apps, report issues, submit patches!
|
||||
|
|
|
|||
49
configure.ac
49
configure.ac
|
|
@ -469,7 +469,7 @@ if test "x$enable_rebuilds" = "xyes" && \
|
|||
fi
|
||||
AC_SUBST(REBUILD)
|
||||
|
||||
AC_CHECK_FUNCS(lstat mkstemp flockfile getc_unlocked)
|
||||
AC_CHECK_FUNCS(lstat mkstemp flockfile getc_unlocked _lock_file _unlock_file _getc_nolock)
|
||||
AC_CHECK_FUNCS(localtime_r)
|
||||
|
||||
# _NL_TIME_FIRST_WEEKDAY is an enum and not a define
|
||||
|
|
@ -718,6 +718,48 @@ fi
|
|||
saved_cflags="$CFLAGS"
|
||||
saved_ldflags="$LDFLAGS"
|
||||
|
||||
# Help GNU ld find indirect shared-library dependencies from custom
|
||||
# library prefixes. This is useful for musl/cross/custom-prefix builds
|
||||
# where a directly linked .so is found through -L, but its DT_NEEDED
|
||||
# libraries from the same prefix are not in the default linker search path.
|
||||
case "$host_os" in
|
||||
linux*)
|
||||
GTK_RPATH_LINK_FLAGS=
|
||||
gtk_next_is_libdir=no
|
||||
|
||||
for gtk_ldflag in $LDFLAGS; do
|
||||
if test "x$gtk_next_is_libdir" = xyes; then
|
||||
gtk_libdir="$gtk_ldflag"
|
||||
gtk_next_is_libdir=no
|
||||
else
|
||||
case $gtk_ldflag in
|
||||
-L)
|
||||
gtk_next_is_libdir=yes
|
||||
continue
|
||||
;;
|
||||
-L*)
|
||||
gtk_libdir=`echo "$gtk_ldflag" | sed 's/^-L//'`
|
||||
;;
|
||||
*)
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
case " $GTK_RPATH_LINK_FLAGS " in
|
||||
*" -Wl,-rpath-link,$gtk_libdir "*)
|
||||
;;
|
||||
*)
|
||||
GTK_RPATH_LINK_FLAGS="$GTK_RPATH_LINK_FLAGS -Wl,-rpath-link,$gtk_libdir"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
LDFLAGS="$LDFLAGS $GTK_RPATH_LINK_FLAGS"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
||||
|
||||
# Checks for header files.
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
|
|
@ -1392,7 +1434,7 @@ CFLAGS="$CFLAGS $PANGO_CFLAGS"
|
|||
if $PKG_CONFIG --uninstalled $PANGO_PACKAGES; then
|
||||
:
|
||||
else
|
||||
gtk_save_LIBS="$LIBS"
|
||||
gtk_save_LIBS="$LIBS"
|
||||
LIBS="$PANGO_LIBS $LIBS"
|
||||
AC_LINK_IFELSE(
|
||||
[AC_LANG_CALL([], [pango_context_new])],
|
||||
|
|
@ -1470,7 +1512,7 @@ fi
|
|||
GTK_EXTRA_LIBS=
|
||||
GTK_EXTRA_CFLAGS=
|
||||
GTK_DEP_LIBS="$GDK_EXTRA_LIBS $GTK_DEP_LIBS_FOR_X `$PKG_CONFIG --libs $PANGO_PACKAGES $GTK_PACKAGES_FOR_X $GTK_PACKAGES` $GTK_EXTRA_LIBS $MATH_LIB"
|
||||
GTK_DEP_CFLAGS="`$PKG_CONFIG --cflags gthread-2.0 $GDK_PACKAGES $GTK_PACKAGES` $GDK_EXTRA_CFLAGS $GTK_EXTRA_CFLAGS"
|
||||
GTK_DEP_CFLAGS="`$PKG_CONFIG --cflags gthread-2.0 $PANGO_PACKAGES $GDK_PACKAGES $GTK_PACKAGES` $GDK_EXTRA_CFLAGS $GTK_EXTRA_CFLAGS"
|
||||
|
||||
if test x"$os_win32" = xyes; then
|
||||
GTK_EXTRA_CFLAGS="$msnative_struct"
|
||||
|
|
@ -1594,6 +1636,7 @@ else
|
|||
gtk_save_libs="$LIBS"
|
||||
LIBS="$CUPS_LIBS"
|
||||
AC_CHECK_FUNCS(httpGetAuthString)
|
||||
AC_CHECK_FUNCS(httpConnect2 httpReconnect2)
|
||||
LIBS="$gtk_save_libs"
|
||||
fi
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -992,11 +992,11 @@ main (int argc, char **argv)
|
|||
NULL);
|
||||
gtk_text_buffer_create_tag (source_buffer, "preprocessor",
|
||||
"style", PANGO_STYLE_OBLIQUE,
|
||||
"foreground", "burlywood4",
|
||||
"foreground", "burlywood4",
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (source_buffer, "function",
|
||||
"weight", PANGO_WEIGHT_BOLD,
|
||||
"foreground", "DarkGoldenrod4",
|
||||
"foreground", "DarkGoldenrod4",
|
||||
NULL);
|
||||
g_object_unref (source_buffer);
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ IGNORE_HFILES= \
|
|||
|
||||
# Extra files to add when scanning (relative to $srcdir)
|
||||
EXTRA_HFILES= \
|
||||
../../../gdk/x11/gdkx.h
|
||||
$(top_srcdir)/gdk/x11/gdkx.h
|
||||
|
||||
# CFLAGS and LDFLAGS for compiling scan program. Only needed
|
||||
# if $(DOC_MODULE).types is non-empty.
|
||||
|
|
@ -159,4 +159,3 @@ EXTRA_DIST += version.xml.in
|
|||
# working when the top-level test target descends into the documentation
|
||||
# reference directories.
|
||||
test:
|
||||
|
||||
|
|
|
|||
|
|
@ -391,4 +391,3 @@ dist-hook-local: $(BUILT_EXTRA_DIST)
|
|||
# working when the top-level test target descends into the documentation
|
||||
# reference directories.
|
||||
test:
|
||||
|
||||
|
|
|
|||
|
|
@ -39,4 +39,3 @@ include $(top_srcdir)/gtk-doc.make
|
|||
# working when the top-level test target descends into the documentation
|
||||
# reference directories.
|
||||
test:
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,8 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
INTROSPECTION_GIRS =
|
||||
INTROSPECTION_SCANNER_ENV = \
|
||||
CC="$(CC)"
|
||||
INTROSPECTION_SCANNER_ARGS = \
|
||||
--warn-all \
|
||||
--add-include-path=../gdk
|
||||
|
|
@ -213,6 +215,11 @@ Gdk_2_0_gir_CFLAGS = \
|
|||
-I$(top_builddir) \
|
||||
-I$(top_builddir)/gdk \
|
||||
$(INCLUDES)
|
||||
|
||||
if OS_WIN32
|
||||
Gdk_2_0_gir_CFLAGS += -I$(srcdir)/win32 -I$(srcdir)
|
||||
endif
|
||||
|
||||
INTROSPECTION_GIRS += Gdk-2.0.gir
|
||||
|
||||
if USE_X11
|
||||
|
|
@ -268,6 +275,63 @@ introspection_files += $(filter-out x11/gdkx.h, $(x11_introspection_files))
|
|||
|
||||
endif # USE_X11
|
||||
|
||||
if OS_WIN32
|
||||
win32_introspection_files = \
|
||||
win32/gdkapplaunchcontext-win32.c \
|
||||
win32/gdkcolor-win32.c \
|
||||
win32/gdkcursor-win32.c \
|
||||
win32/gdkdisplay-win32.c \
|
||||
win32/gdkdnd-win32.c \
|
||||
win32/gdkdrawable-win32.c \
|
||||
win32/gdkdrawable-win32.h \
|
||||
win32/gdkevents-win32.c \
|
||||
win32/gdkfont-win32.c \
|
||||
win32/gdkgc-win32.c \
|
||||
win32/gdkgeometry-win32.c \
|
||||
win32/gdkglobals-win32.c \
|
||||
win32/gdkimage-win32.c \
|
||||
win32/gdkim-win32.c \
|
||||
win32/gdkinput.c \
|
||||
win32/gdkinput-win32.c \
|
||||
win32/gdkinput-win32.h \
|
||||
win32/gdkkeys-win32.c \
|
||||
win32/gdkmain-win32.c \
|
||||
win32/gdkpixmap-win32.c \
|
||||
win32/gdkpixmap-win32.h \
|
||||
win32/gdkprivate-win32.h \
|
||||
win32/gdkproperty-win32.c \
|
||||
win32/gdkscreen-win32.c \
|
||||
win32/gdkselection-win32.c \
|
||||
win32/gdkspawn-win32.c \
|
||||
win32/gdktestutils-win32.c \
|
||||
win32/gdkvisual-win32.c \
|
||||
win32/gdkwin32.h \
|
||||
win32/gdkwin32id.c \
|
||||
win32/gdkwin32keys.h \
|
||||
win32/gdkwindow-win32.c \
|
||||
win32/gdkwindow-win32.h
|
||||
|
||||
GdkWin32-2.0.gir: $(gdktargetlib) Gdk-2.0.gir Makefile
|
||||
GdkWin32_2_0_gir_SCANNERFLAGS = --warn-all --identifier-prefix=Gdk --symbol-prefix=gdk --include-uninstalled=Gdk-2.0.gir
|
||||
GdkWin32_2_0_gir_INCLUDES = Gio-2.0 Gdk-2.0 GdkPixbuf-2.0 Pango-1.0
|
||||
GdkWin32_2_0_gir_LIBS = $(gdktargetlib)
|
||||
GdkWin32_2_0_gir_FILES = $(win32_introspection_files)
|
||||
GdkWin32_2_0_gir_EXPORT_PACKAGES = gdk-win32-2.0
|
||||
GdkWin32_2_0_gir_CFLAGS = \
|
||||
-DGDK_COMPILATION \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_builddir) \
|
||||
-I$(top_builddir)/gdk \
|
||||
-I$(srcdir)/win32 \
|
||||
-I$(srcdir) \
|
||||
$(INCLUDES) \
|
||||
-L$(top_builddir)/gdk
|
||||
INTROSPECTION_GIRS += GdkWin32-2.0.gir
|
||||
|
||||
introspection_files += $(filter-out win32/gdkwin32.h, $(win32_introspection_files))
|
||||
|
||||
endif # OS_WIN32
|
||||
|
||||
girdir = $(datadir)/gir-1.0
|
||||
gir_DATA = $(INTROSPECTION_GIRS)
|
||||
|
||||
|
|
|
|||
50
gdk/gdkrgb.c
50
gdk/gdkrgb.c
|
|
@ -2242,6 +2242,51 @@ gdk_rgb_convert_8880_br (GdkRgbInfo *image_info, GdkImage *image,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_rgb_convert_0AAA_br (GdkRgbInfo *image_info, GdkImage *image,
|
||||
gint x0, gint y0, gint width, gint height,
|
||||
const guchar *buf, int rowstride,
|
||||
gint x_align, gint y_align, GdkRgbCmap *cmap)
|
||||
{
|
||||
int y, w;
|
||||
guchar *obuf, *p;
|
||||
gint bpl;
|
||||
const guchar *bptr, *bp2;
|
||||
guchar r, g, b;
|
||||
|
||||
bptr = buf;
|
||||
bpl = image->bpl;
|
||||
obuf = ((guchar *) image->mem) + y0 * bpl + x0 * 4;
|
||||
|
||||
for (y = 0; y < height; y++)
|
||||
{
|
||||
bp2 = bptr;
|
||||
p = obuf;
|
||||
w = width;
|
||||
|
||||
while (w--)
|
||||
{
|
||||
r = *bp2++;
|
||||
g = *bp2++;
|
||||
b = *bp2++;
|
||||
|
||||
/* Since the R, G and B channels are coded in a char, we
|
||||
* replicate the two most significant bits to the two least
|
||||
* significant ones.
|
||||
*/
|
||||
*((guint32 *) p) = 0x3 << 30 |
|
||||
b << 22 | (b >> 6) << 20 |
|
||||
g << 12 | (g >> 6) << 10 |
|
||||
r << 2 | (r >> 6);
|
||||
|
||||
p += 4;
|
||||
}
|
||||
|
||||
bptr += rowstride;
|
||||
obuf += bpl;
|
||||
}
|
||||
}
|
||||
|
||||
/* Generic truecolor/directcolor conversion function. Slow, but these
|
||||
are oddball modes. */
|
||||
static void
|
||||
|
|
@ -3195,6 +3240,11 @@ gdk_rgb_select_conv (GdkRgbInfo *image_info)
|
|||
#endif
|
||||
}
|
||||
#endif
|
||||
else if (bpp == 32 && (depth == 30 || depth == 32) &&
|
||||
vtype == GDK_VISUAL_TRUE_COLOR &&
|
||||
(red_mask == 0x3ff && green_mask == 0xffc00 &&
|
||||
blue_mask == 0x3ff00000 && byte_order == GDK_LSB_FIRST))
|
||||
conv = gdk_rgb_convert_0AAA_br;
|
||||
else if (vtype == GDK_VISUAL_TRUE_COLOR && byte_order == GDK_LSB_FIRST)
|
||||
{
|
||||
conv = gdk_rgb_convert_truecolor_lsb;
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ print <<EOF;
|
|||
|
||||
#include <glib.h>
|
||||
|
||||
#ifdef G_HAVE_GNUC_VISIBILITY
|
||||
#if defined(G_HAVE_GNUC_VISIBILITY) && !defined(__APPLE__)
|
||||
|
||||
EOF
|
||||
|
||||
|
|
|
|||
|
|
@ -599,6 +599,25 @@
|
|||
gdk_screen_get_rgba_colormap (_gdk_screen);
|
||||
}
|
||||
|
||||
-(void)viewWillDraw
|
||||
{
|
||||
/* macOS 11 (Big Sur) and newer may use a higher precision backing
|
||||
* format for layer contents. For GTK2's 8-bit drawing this can add
|
||||
* avoidable conversion overhead. Use a dynamic Objective-C call here
|
||||
* instead of a hard QuartzCore/CALayer dependency, so old SDKs and old
|
||||
* macOS targets keep building and keep their old behaviour.
|
||||
*/
|
||||
if (gdk_quartz_osx_version () >= GDK_OSX_BIG_SUR)
|
||||
{
|
||||
id layer = [self layer];
|
||||
|
||||
if (layer && [layer respondsToSelector: @selector(setContentsFormat:)])
|
||||
[layer setValue: @"RGBA8Uint" forKey: @"contentsFormat"];
|
||||
}
|
||||
|
||||
[super viewWillDraw];
|
||||
}
|
||||
|
||||
-(void)drawRect: (NSRect)rect
|
||||
{
|
||||
GdkRectangle gdk_rect;
|
||||
|
|
|
|||
|
|
@ -893,7 +893,8 @@ gdk_quartz_drawable_release_context (GdkDrawable *drawable,
|
|||
if (window_impl->in_paint_rect_count == 0)
|
||||
{
|
||||
_gdk_quartz_drawable_flush (drawable);
|
||||
[window_impl->view unlockFocus];
|
||||
if (gdk_quartz_osx_version () < GDK_OSX_MOJAVE)
|
||||
[window_impl->view unlockFocus];
|
||||
}
|
||||
}
|
||||
else if (GDK_IS_PIXMAP_IMPL_QUARTZ (drawable))
|
||||
|
|
|
|||
|
|
@ -34,9 +34,20 @@ gdk_quartz_osx_version (void)
|
|||
|
||||
if (minor == GDK_OSX_UNSUPPORTED)
|
||||
{
|
||||
OSErr err = Gestalt (gestaltSystemVersionMinor, (SInt32*)&minor);
|
||||
gint32 major = GDK_OSX_UNSUPPORTED;
|
||||
OSErr err = Gestalt (gestaltSystemVersionMajor, (SInt32*)&major);
|
||||
|
||||
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
||||
|
||||
err = Gestalt (gestaltSystemVersionMinor, (SInt32*)&minor);
|
||||
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
||||
|
||||
/* GTK2 encodes macOS 10.x releases by their minor version.
|
||||
* Map macOS 11+ into the same sequence:
|
||||
* 11 -> 16, 12 -> 17, 13 -> 18, ...
|
||||
*/
|
||||
if (major > 10)
|
||||
minor = major + 5;
|
||||
}
|
||||
|
||||
if (minor < GDK_OSX_MIN)
|
||||
|
|
|
|||
|
|
@ -54,7 +54,13 @@ typedef enum
|
|||
GDK_OSX_SIERRA = 12,
|
||||
GDK_OSX_HIGH_SIERRA = 13,
|
||||
GDK_OSX_MOJAVE = 14,
|
||||
GDK_OSX_CURRENT = 14,
|
||||
GDK_OSX_CATALINA = 15,
|
||||
GDK_OSX_BIG_SUR = 16,
|
||||
GDK_OSX_MONTEREY = 17,
|
||||
GDK_OSX_VENTURA = 18,
|
||||
GDK_OSX_SONOMA = 19,
|
||||
GDK_OSX_SEQUOIA = 20,
|
||||
GDK_OSX_CURRENT = 20,
|
||||
GDK_OSX_NEW = 99
|
||||
} GdkOSXVersion;
|
||||
|
||||
|
|
|
|||
|
|
@ -104,7 +104,8 @@ gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
|
|||
* and for widgets that send fake expose events like the arrow
|
||||
* buttons in spinbuttons or the position marker in rulers.
|
||||
*/
|
||||
if (window_impl->in_paint_rect_count == 0)
|
||||
if (window_impl->in_paint_rect_count == 0 &&
|
||||
gdk_quartz_osx_version () < GDK_OSX_MOJAVE)
|
||||
{
|
||||
if (![window_impl->view lockFocusIfCanDraw])
|
||||
return NULL;
|
||||
|
|
@ -468,7 +469,8 @@ _gdk_windowing_before_process_all_updates (void)
|
|||
{
|
||||
in_process_all_updates = TRUE;
|
||||
|
||||
NSDisableScreenUpdates ();
|
||||
if (gdk_quartz_osx_version () < GDK_OSX_MOJAVE)
|
||||
NSDisableScreenUpdates ();
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -489,8 +491,9 @@ _gdk_windowing_after_process_all_updates (void)
|
|||
|
||||
/* 10.14 needs to be told that the view needs to be redrawn, see
|
||||
* https://gitlab.gnome.org/GNOME/gtk/issues/1479 */
|
||||
if (gdk_quartz_osx_version() >= GDK_OSX_MOJAVE)
|
||||
[[nswindow contentView] setNeedsDisplay:YES];
|
||||
if (gdk_quartz_osx_version () >= GDK_OSX_MOJAVE &&
|
||||
gdk_quartz_osx_version () < GDK_OSX_BIG_SUR)
|
||||
[[nswindow contentView] setNeedsDisplay:YES];
|
||||
[nswindow enableFlushWindow];
|
||||
[nswindow flushWindow];
|
||||
[nswindow release];
|
||||
|
|
@ -502,7 +505,8 @@ _gdk_windowing_after_process_all_updates (void)
|
|||
|
||||
in_process_all_updates = FALSE;
|
||||
|
||||
NSEnableScreenUpdates ();
|
||||
if (gdk_quartz_osx_version () < GDK_OSX_MOJAVE)
|
||||
NSEnableScreenUpdates ();
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -692,6 +692,7 @@ update_keymap (GdkKeymap *gdk_keymap)
|
|||
if (hkls_len != keymap->layout_handles->len)
|
||||
keymap->keysym_tab = g_renew (guint, keymap->keysym_tab, keysym_tab_size);
|
||||
|
||||
memset (key_state, 0, sizeof(key_state));
|
||||
memset (keymap->keysym_tab, 0, keysym_tab_size);
|
||||
g_array_set_size (keymap->layout_handles, hkls_len);
|
||||
g_array_set_size (keymap->options, hkls_len);
|
||||
|
|
|
|||
|
|
@ -2767,6 +2767,10 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
|
|||
* WindowFromPoint() can find our windows, we follow similar logic
|
||||
* here, and ignore invisible and disabled windows.
|
||||
*/
|
||||
UINT cwp_flags = CWP_SKIPDISABLED |
|
||||
CWP_SKIPINVISIBLE |
|
||||
CWP_SKIPTRANSPARENT;
|
||||
|
||||
hwnd = GetDesktopWindow ();
|
||||
do {
|
||||
window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd);
|
||||
|
|
@ -2777,8 +2781,7 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
|
|||
break;
|
||||
|
||||
screen_to_client (hwnd, screen_pt, &client_pt);
|
||||
hwndc = ChildWindowFromPointEx (hwnd, client_pt, CWP_SKIPDISABLED |
|
||||
CWP_SKIPINVISIBLE);
|
||||
hwndc = ChildWindowFromPointEx (hwnd, client_pt, cwp_flags);
|
||||
|
||||
/* Verify that we're really inside the client area of the window */
|
||||
if (hwndc != hwnd)
|
||||
|
|
@ -2789,6 +2792,8 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
|
|||
hwndc = hwnd;
|
||||
}
|
||||
|
||||
/* Only ignore top-level transparent windows */
|
||||
cwp_flags &= ~CWP_SKIPTRANSPARENT;
|
||||
} while (hwndc != hwnd && (hwnd = hwndc, 1));
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
include $(top_srcdir)/Makefile.decl
|
||||
-include $(INTROSPECTION_MAKEFILE)
|
||||
INTROSPECTION_GIRS =
|
||||
INTROSPECTION_SCANNER_ENV = \
|
||||
CC="$(CC)" \
|
||||
PATH="$(builddir):$(builddir)/.libs:$${PATH}:"
|
||||
INTROSPECTION_SCANNER_ARGS = \
|
||||
--warn-all \
|
||||
--add-include-path=../gdk
|
||||
|
|
@ -1139,7 +1142,7 @@ $(GTK_UPDATE_ICON_CACHE_MANIFEST):
|
|||
echo '</assembly>' ) >$@
|
||||
|
||||
$(GTK_UPDATE_ICON_CACHE_RC):
|
||||
(echo -e '#include <winbase.h>\nCREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST '$(GTK_UPDATE_ICON_CACHE_MANIFEST)) >$@
|
||||
(echo -e '#include <winbase.h>\nCREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "'$(GTK_UPDATE_ICON_CACHE_MANIFEST)'"') >$@
|
||||
|
||||
$(GTK_UPDATE_ICON_CACHE_MANIFEST_OBJECT): $(GTK_UPDATE_ICON_CACHE_RC) $(GTK_UPDATE_ICON_CACHE_MANIFEST)
|
||||
$(WINDRES) --input $< --output $@ --output-format=coff
|
||||
|
|
|
|||
|
|
@ -688,8 +688,7 @@ gtk_calendar_init (GtkCalendar *calendar)
|
|||
#else
|
||||
static const char *month_format = NULL;
|
||||
char buffer[255];
|
||||
GDateTime *tmp_dt;
|
||||
gchar *tmp_str;
|
||||
time_t tmp_time;
|
||||
#endif
|
||||
GtkCalendarPrivate *priv;
|
||||
gchar *year_before;
|
||||
|
|
@ -710,15 +709,9 @@ gtk_calendar_init (GtkCalendar *calendar)
|
|||
for (i=0; i<7; i++)
|
||||
{
|
||||
#ifndef G_OS_WIN32
|
||||
tmp_dt = g_date_time_new_utc (2001, 1, i + 1, 12, 0, 0.0);
|
||||
if (tmp_dt)
|
||||
{
|
||||
tmp_str = g_date_time_format (tmp_dt, "%a");
|
||||
default_abbreviated_dayname[i] = tmp_str ? tmp_str : g_strdup ("");
|
||||
g_date_time_unref (tmp_dt);
|
||||
}
|
||||
else
|
||||
default_abbreviated_dayname[i] = g_strdup ("");
|
||||
tmp_time = (i + 3) * 86400;
|
||||
strftime (buffer, sizeof (buffer), "%a", gmtime (&tmp_time));
|
||||
default_abbreviated_dayname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
|
||||
#else
|
||||
if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SABBREVDAYNAME1 + (i+6)%7,
|
||||
wbuffer, G_N_ELEMENTS (wbuffer)))
|
||||
|
|
@ -732,30 +725,21 @@ gtk_calendar_init (GtkCalendar *calendar)
|
|||
for (i=0; i<12; i++)
|
||||
{
|
||||
#ifndef G_OS_WIN32
|
||||
tmp_dt = g_date_time_new_utc (2001, i + 1, 1, 12, 0, 0.0);
|
||||
tmp_time = i * 2764800;
|
||||
if (G_UNLIKELY (month_format == NULL))
|
||||
{
|
||||
buffer[0] = '\0';
|
||||
month_format = "%OB";
|
||||
tmp_str = tmp_dt ? g_date_time_format (tmp_dt, month_format) : NULL;
|
||||
if (tmp_str)
|
||||
{
|
||||
g_strlcpy (buffer, tmp_str, sizeof (buffer));
|
||||
g_free (tmp_str);
|
||||
}
|
||||
strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time));
|
||||
|
||||
/* "%OB" is not supported in Linux with glibc < 2.27 */
|
||||
if (!strcmp (buffer, "%OB") || !strcmp (buffer, "OB") || !strcmp (buffer, ""))
|
||||
month_format = "%B";
|
||||
}
|
||||
|
||||
if (tmp_dt)
|
||||
{
|
||||
tmp_str = g_date_time_format (tmp_dt, month_format);
|
||||
default_monthname[i] = tmp_str ? tmp_str : g_strdup ("");
|
||||
g_date_time_unref (tmp_dt);
|
||||
}
|
||||
else
|
||||
default_monthname[i] = g_strdup ("");
|
||||
strftime (buffer, sizeof (buffer), month_format, gmtime (&tmp_time));
|
||||
|
||||
default_monthname[i] = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
|
||||
#else
|
||||
if (!GetLocaleInfoW (GetThreadLocale (), LOCALE_SMONTHNAME1 + i,
|
||||
wbuffer, G_N_ELEMENTS (wbuffer)))
|
||||
|
|
|
|||
|
|
@ -884,11 +884,11 @@ gtk_clipboard_wait_for_targets (GtkClipboard *clipboard,
|
|||
clipboard->n_cached_targets != -1)
|
||||
{
|
||||
if (n_targets)
|
||||
*n_targets = clipboard->n_cached_targets;
|
||||
*n_targets = clipboard->n_cached_targets;
|
||||
|
||||
if (targets)
|
||||
*targets = _gtk_memdup2 (clipboard->cached_targets,
|
||||
clipboard->n_cached_targets * sizeof (GdkAtom));
|
||||
*targets = _gtk_memdup2 (clipboard->cached_targets,
|
||||
clipboard->n_cached_targets * sizeof (GdkAtom));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -909,11 +909,11 @@ gtk_clipboard_wait_for_targets (GtkClipboard *clipboard,
|
|||
result = gtk_selection_data_get_targets (data, &tmp_targets, &tmp_n_targets);
|
||||
|
||||
if (gdk_display_supports_selection_notification (gtk_clipboard_get_display (clipboard)))
|
||||
{
|
||||
clipboard->n_cached_targets = tmp_n_targets;
|
||||
clipboard->cached_targets = _gtk_memdup2 (tmp_targets,
|
||||
tmp_n_targets * sizeof (GdkAtom));
|
||||
}
|
||||
{
|
||||
clipboard->n_cached_targets = tmp_n_targets;
|
||||
clipboard->cached_targets = _gtk_memdup2 (tmp_targets,
|
||||
tmp_n_targets * sizeof (GdkAtom));
|
||||
}
|
||||
|
||||
if (n_targets)
|
||||
*n_targets = tmp_n_targets;
|
||||
|
|
|
|||
|
|
@ -548,7 +548,7 @@ gtk_clipboard_set_contents (GtkClipboard *clipboard,
|
|||
clipboard_add_owner_notify (clipboard);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
clipboard->get_func = get_func;
|
||||
clipboard->clear_func = clear_func;
|
||||
|
|
@ -1758,11 +1758,11 @@ gtk_clipboard_wait_for_targets (GtkClipboard *clipboard,
|
|||
clipboard->n_cached_targets != -1)
|
||||
{
|
||||
if (n_targets)
|
||||
*n_targets = clipboard->n_cached_targets;
|
||||
*n_targets = clipboard->n_cached_targets;
|
||||
|
||||
if (targets)
|
||||
*targets = _gtk_memdup2 (clipboard->cached_targets,
|
||||
clipboard->n_cached_targets * sizeof (GdkAtom));
|
||||
*targets = _gtk_memdup2 (clipboard->cached_targets,
|
||||
clipboard->n_cached_targets * sizeof (GdkAtom));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -1783,11 +1783,11 @@ gtk_clipboard_wait_for_targets (GtkClipboard *clipboard,
|
|||
result = gtk_selection_data_get_targets (data, &tmp_targets, &tmp_n_targets);
|
||||
|
||||
if (gdk_display_supports_selection_notification (gtk_clipboard_get_display (clipboard)))
|
||||
{
|
||||
clipboard->n_cached_targets = tmp_n_targets;
|
||||
clipboard->cached_targets = _gtk_memdup2 (tmp_targets,
|
||||
tmp_n_targets * sizeof (GdkAtom));
|
||||
}
|
||||
{
|
||||
clipboard->n_cached_targets = tmp_n_targets;
|
||||
clipboard->cached_targets = _gtk_memdup2 (tmp_targets,
|
||||
tmp_n_targets * sizeof (GdkAtom));
|
||||
}
|
||||
|
||||
if (n_targets)
|
||||
*n_targets = tmp_n_targets;
|
||||
|
|
|
|||
|
|
@ -40,6 +40,9 @@
|
|||
#include "gtktoolbar.h"
|
||||
#include <gobject/gobjectnotifyqueue.c>
|
||||
#include <gobject/gvaluecollector.h>
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
#include "gdk/quartz/gdkquartz.h"
|
||||
#endif
|
||||
#include "gtkalias.h"
|
||||
|
||||
|
||||
|
|
@ -1357,7 +1360,16 @@ gtk_container_idle_sizer (gpointer data)
|
|||
gtk_container_check_resize (GTK_CONTAINER (widget));
|
||||
}
|
||||
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
/* macOS 11 and newer can trigger expensive full-window redraws here.
|
||||
* Keep the traditional update processing path for older Quartz targets,
|
||||
* but let the normal GDK update idle handle updates on Big Sur and newer.
|
||||
*/
|
||||
if (gdk_quartz_osx_version () < GDK_OSX_BIG_SUR)
|
||||
gdk_window_process_all_updates ();
|
||||
#else
|
||||
gdk_window_process_all_updates ();
|
||||
#endif
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -122,8 +122,7 @@ struct _GtkFileChooserWidgetPrivate
|
|||
|
||||
typedef enum {
|
||||
LOAD_EMPTY, /* There is no model */
|
||||
LOAD_PRELOAD, /* Model is loading and a timer is running; model isn't inserted into the tree yet */
|
||||
LOAD_LOADING, /* Timeout expired, model is inserted into the tree, but not fully loaded yet */
|
||||
LOAD_LOADING, /* Model is loading; inserted into the view when loading finishes */
|
||||
LOAD_FINISHED /* Model is fully loaded and inserted into the tree */
|
||||
} LoadState;
|
||||
|
||||
|
|
@ -139,7 +138,8 @@ typedef enum {
|
|||
|
||||
typedef enum {
|
||||
VIEW_MODE_LIST,
|
||||
VIEW_MODE_ICON
|
||||
VIEW_MODE_ICON,
|
||||
VIEW_MODE_COMPACT
|
||||
} ViewMode;
|
||||
|
||||
typedef enum {
|
||||
|
|
@ -176,13 +176,35 @@ struct _GtkFileChooserDefault
|
|||
GtkWidget *browse_shortcuts_popup_menu;
|
||||
GtkWidget *browse_shortcuts_popup_menu_remove_item;
|
||||
GtkWidget *browse_shortcuts_popup_menu_rename_item;
|
||||
GtkWidget *browse_shortcuts_popup_menu_open_containing_folder_item;
|
||||
GtkWidget *browse_files_tree_view;
|
||||
GtkWidget *browse_files_scrolled_window;
|
||||
GtkWidget *browse_files_current_view;
|
||||
GtkWidget *browse_files_icon_view;
|
||||
GtkTreePath *icon_tooltip_path;
|
||||
gchar *icon_tooltip_text;
|
||||
gint icon_tooltip_width;
|
||||
ViewMode icon_tooltip_view_mode;
|
||||
OperationMode icon_tooltip_operation_mode;
|
||||
guint icon_tooltip_visible : 1;
|
||||
GtkTreePath *list_tooltip_path;
|
||||
GtkTreeModel *list_tooltip_model;
|
||||
gchar *list_tooltip_text;
|
||||
gint list_tooltip_width;
|
||||
OperationMode list_tooltip_operation_mode;
|
||||
guint list_tooltip_visible : 1;
|
||||
GtkWidget *browse_files_popup_menu;
|
||||
GtkWidget *browse_files_popup_menu_add_shortcut_item;
|
||||
GtkWidget *browse_files_popup_menu_copy_item;
|
||||
GtkWidget *browse_files_popup_menu_cut_item;
|
||||
GtkWidget *browse_files_popup_menu_paste_item;
|
||||
GtkWidget *browse_files_popup_menu_copy_location_item;
|
||||
GtkWidget *browse_files_popup_menu_open_containing_folder_item;
|
||||
GtkWidget *browse_files_popup_menu_rename_item;
|
||||
GtkWidget *browse_files_popup_menu_trash_item;
|
||||
GtkWidget *browse_files_popup_menu_hidden_files_item;
|
||||
GtkWidget *browse_files_popup_menu_preview_panel_item;
|
||||
GtkWidget *browse_files_popup_menu_thumbnails_item;
|
||||
GtkWidget *browse_files_popup_menu_size_column_item;
|
||||
GtkWidget *browse_files_popup_menu_sort_by_name_item;
|
||||
GtkWidget *browse_files_popup_menu_sort_by_size_item;
|
||||
|
|
@ -224,10 +246,18 @@ struct _GtkFileChooserDefault
|
|||
GtkWidget *preview_box;
|
||||
GtkWidget *preview_label;
|
||||
GtkWidget *preview_widget;
|
||||
GtkWidget *preview_panel;
|
||||
GtkWidget *preview_panel_image;
|
||||
GtkWidget *preview_panel_title_label;
|
||||
GtkWidget *preview_panel_info_label;
|
||||
guint preview_panel_resize_timeout_id;
|
||||
guint preview_panel_update_timeout_id;
|
||||
gint preview_panel_last_image_size;
|
||||
GtkWidget *extra_align;
|
||||
GtkWidget *extra_widget;
|
||||
|
||||
GtkWidget *view_mode_combo_box;
|
||||
GtkWidget *preview_panel_toggle_button;
|
||||
GtkWidget *icon_view_scale_hbox;
|
||||
GtkWidget *icon_view_scale;
|
||||
GtkWidget *icon_view_scale_zoom_in_icon;
|
||||
|
|
@ -237,8 +267,29 @@ struct _GtkFileChooserDefault
|
|||
guint icon_view_scale_after_layout_id;
|
||||
gint pending_icon_view_icon_size;
|
||||
gint icon_view_scale_visible_overscan;
|
||||
|
||||
/* Cached viewport avoids an O(n) visible-range scan per icon cell. */
|
||||
guint icon_view_visible_range_idle_id;
|
||||
gint icon_view_visible_first, icon_view_visible_last;
|
||||
guint icon_view_visible_range_valid : 1;
|
||||
|
||||
ViewMode view_mode;
|
||||
|
||||
/* Visible-only thumbnail generation state. Thumbnail workers are
|
||||
* cancellable so changing folders or views never leaves stale decode work
|
||||
* running for files that are no longer useful to the user.
|
||||
*/
|
||||
GSList *thumbnail_queue;
|
||||
GSList *thumbnail_queue_tail;
|
||||
GHashTable *thumbnail_queued_files;
|
||||
GHashTable *file_clipboard_cut_files;
|
||||
GCancellable *thumbnail_cancellable;
|
||||
guint thumbnail_queue_idle_id;
|
||||
guint thumbnail_generation_serial;
|
||||
guint thumbnail_worker_running : 1;
|
||||
GdkPixbuf *thumbnail_standard_icon_pixbuf;
|
||||
gint thumbnail_standard_icon_size;
|
||||
|
||||
GtkWidget *location_button;
|
||||
GtkWidget *location_entry_box;
|
||||
GtkWidget *location_label;
|
||||
|
|
@ -264,7 +315,6 @@ struct _GtkFileChooserDefault
|
|||
|
||||
LoadState load_state;
|
||||
ReloadState reload_state;
|
||||
guint load_timeout_id;
|
||||
|
||||
OperationMode operation_mode;
|
||||
|
||||
|
|
@ -294,6 +344,11 @@ struct _GtkFileChooserDefault
|
|||
GSource *edited_idle;
|
||||
char *edited_new_text;
|
||||
|
||||
GSource *rename_idle;
|
||||
char *rename_new_text;
|
||||
char *rename_old_text;
|
||||
GFile *rename_file;
|
||||
|
||||
gulong settings_signal_id;
|
||||
int list_view_icon_size;
|
||||
int icon_view_icon_size;
|
||||
|
|
@ -318,9 +373,11 @@ struct _GtkFileChooserDefault
|
|||
|
||||
guint local_only : 1;
|
||||
guint preview_widget_active : 1;
|
||||
guint preview_panel_active : 1;
|
||||
guint use_preview_label : 1;
|
||||
guint select_multiple : 1;
|
||||
guint show_hidden : 1;
|
||||
guint show_thumbnails : 1;
|
||||
guint do_overwrite_confirmation : 1;
|
||||
guint list_sort_ascending : 1;
|
||||
guint changing_folder : 1;
|
||||
|
|
|
|||
|
|
@ -42,6 +42,8 @@
|
|||
#define VIEW_MODE_KEY "ViewMode"
|
||||
#define ICON_VIEW_SCALE_KEY "IconViewScale"
|
||||
#define SHOW_HIDDEN_KEY "ShowHidden"
|
||||
#define SHOW_PREVIEW_PANEL_KEY "ShowPreviewPanel"
|
||||
#define SHOW_THUMBNAILS_KEY "ShowThumbnails"
|
||||
#define SHOW_SIZE_COLUMN_KEY "ShowSizeColumn"
|
||||
#define GEOMETRY_X_KEY "GeometryX"
|
||||
#define GEOMETRY_Y_KEY "GeometryY"
|
||||
|
|
@ -65,6 +67,7 @@
|
|||
|
||||
#define MODE_LIST_VIEW "list-view"
|
||||
#define MODE_ICON_VIEW "icon-view"
|
||||
#define MODE_COMPACT_VIEW "compact-view"
|
||||
|
||||
#define EQ(a, b) (g_ascii_strcasecmp ((a), (b)) == 0)
|
||||
|
||||
|
|
@ -174,6 +177,8 @@ ensure_settings_read (GtkFileChooserSettings *settings)
|
|||
settings->view_mode = VIEW_MODE_LIST;
|
||||
else if (EQ (view_mode_str, MODE_ICON_VIEW))
|
||||
settings->view_mode = VIEW_MODE_ICON;
|
||||
else if (EQ (view_mode_str, MODE_COMPACT_VIEW))
|
||||
settings->view_mode = VIEW_MODE_COMPACT;
|
||||
else
|
||||
g_warning ("Unknown view mode '%s' encountered in filechooser settings",
|
||||
view_mode_str);
|
||||
|
|
@ -194,6 +199,24 @@ ensure_settings_read (GtkFileChooserSettings *settings)
|
|||
else
|
||||
settings->show_hidden = value != FALSE;
|
||||
|
||||
/* Show preview panel */
|
||||
|
||||
value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_PREVIEW_PANEL_KEY, &error);
|
||||
if (error)
|
||||
warn_if_invalid_key_and_clear_error (SHOW_PREVIEW_PANEL_KEY, &error);
|
||||
else
|
||||
settings->show_preview_panel = value != FALSE;
|
||||
|
||||
/* Show thumbnails */
|
||||
|
||||
value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_THUMBNAILS_KEY, &error);
|
||||
if (error)
|
||||
warn_if_invalid_key_and_clear_error (SHOW_THUMBNAILS_KEY, &error);
|
||||
else
|
||||
settings->show_thumbnails = value != FALSE;
|
||||
|
||||
/* Show size column */
|
||||
|
||||
value = g_key_file_get_boolean (key_file, SETTINGS_GROUP,
|
||||
|
|
@ -287,6 +310,8 @@ _gtk_file_chooser_settings_init (GtkFileChooserSettings *settings)
|
|||
settings->sort_order = GTK_SORT_ASCENDING;
|
||||
settings->sort_column = FILE_LIST_COL_NAME;
|
||||
settings->show_hidden = FALSE;
|
||||
settings->show_preview_panel = FALSE;
|
||||
settings->show_thumbnails = TRUE;
|
||||
settings->show_size_column = TRUE;
|
||||
settings->geometry_x = -1;
|
||||
settings->geometry_y = -1;
|
||||
|
|
@ -357,6 +382,34 @@ _gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
|
|||
settings->show_hidden = show_hidden != FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_file_chooser_settings_get_show_preview_panel (GtkFileChooserSettings *settings)
|
||||
{
|
||||
ensure_settings_read (settings);
|
||||
return settings->show_preview_panel;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_chooser_settings_set_show_preview_panel (GtkFileChooserSettings *settings,
|
||||
gboolean show_preview_panel)
|
||||
{
|
||||
settings->show_preview_panel = show_preview_panel != FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_file_chooser_settings_get_show_thumbnails (GtkFileChooserSettings *settings)
|
||||
{
|
||||
ensure_settings_read (settings);
|
||||
return settings->show_thumbnails;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_chooser_settings_set_show_thumbnails (GtkFileChooserSettings *settings,
|
||||
gboolean show_thumbnails)
|
||||
{
|
||||
settings->show_thumbnails = show_thumbnails != FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_file_chooser_settings_set_show_size_column (GtkFileChooserSettings *settings,
|
||||
gboolean show_column)
|
||||
|
|
@ -477,6 +530,8 @@ _gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
|
|||
view_mode_str = MODE_LIST_VIEW;
|
||||
else if (settings->view_mode == VIEW_MODE_ICON)
|
||||
view_mode_str = MODE_ICON_VIEW;
|
||||
else if (settings->view_mode == VIEW_MODE_COMPACT)
|
||||
view_mode_str = MODE_COMPACT_VIEW;
|
||||
else
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
|
|
@ -545,6 +600,10 @@ _gtk_file_chooser_settings_save (GtkFileChooserSettings *settings,
|
|||
ICON_VIEW_SCALE_KEY, settings->icon_view_scale);
|
||||
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_HIDDEN_KEY, settings->show_hidden);
|
||||
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_PREVIEW_PANEL_KEY, settings->show_preview_panel);
|
||||
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_THUMBNAILS_KEY, settings->show_thumbnails);
|
||||
g_key_file_set_boolean (key_file, SETTINGS_GROUP,
|
||||
SHOW_SIZE_COLUMN_KEY, settings->show_size_column);
|
||||
g_key_file_set_integer (key_file, SETTINGS_GROUP,
|
||||
|
|
|
|||
|
|
@ -56,9 +56,11 @@ struct _GtkFileChooserSettings
|
|||
int geometry_width;
|
||||
int geometry_height;
|
||||
|
||||
guint settings_read : 1;
|
||||
guint show_hidden : 1;
|
||||
guint show_size_column : 1;
|
||||
guint settings_read : 1;
|
||||
guint show_hidden : 1;
|
||||
guint show_preview_panel : 1;
|
||||
guint show_thumbnails : 1;
|
||||
guint show_size_column : 1;
|
||||
};
|
||||
|
||||
struct _GtkFileChooserSettingsClass
|
||||
|
|
@ -86,6 +88,14 @@ gboolean _gtk_file_chooser_settings_get_show_hidden (GtkFileChooserSettings *set
|
|||
void _gtk_file_chooser_settings_set_show_hidden (GtkFileChooserSettings *settings,
|
||||
gboolean show_hidden);
|
||||
|
||||
gboolean _gtk_file_chooser_settings_get_show_preview_panel (GtkFileChooserSettings *settings);
|
||||
void _gtk_file_chooser_settings_set_show_preview_panel (GtkFileChooserSettings *settings,
|
||||
gboolean show_preview_panel);
|
||||
|
||||
gboolean _gtk_file_chooser_settings_get_show_thumbnails (GtkFileChooserSettings *settings);
|
||||
void _gtk_file_chooser_settings_set_show_thumbnails (GtkFileChooserSettings *settings,
|
||||
gboolean show_thumbnails);
|
||||
|
||||
gboolean _gtk_file_chooser_settings_get_show_size_column (GtkFileChooserSettings *settings);
|
||||
void _gtk_file_chooser_settings_set_show_size_column (GtkFileChooserSettings *settings,
|
||||
gboolean show_column);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -92,7 +92,7 @@ void _gtk_file_system_model_set_filter (GtkFileSystemModel
|
|||
GtkFileFilter *filter);
|
||||
|
||||
void _gtk_file_system_model_add_editable (GtkFileSystemModel *model,
|
||||
GtkTreeIter *iter);
|
||||
GtkTreeIter *iter);
|
||||
void _gtk_file_system_model_remove_editable (GtkFileSystemModel *model);
|
||||
|
||||
G_END_DECLS
|
||||
|
|
|
|||
|
|
@ -889,7 +889,7 @@ gtk_font_button_update_font_info (GtkFontButton *font_button)
|
|||
if (style == NULL || !g_ascii_strcasecmp (style, "Regular"))
|
||||
family_style = g_strdup (family);
|
||||
else
|
||||
family_style = g_strdup_printf ("%s %s", family, style);
|
||||
family_style = g_strdup_printf ("%s %s", family, _(style));
|
||||
|
||||
gtk_label_set_text (GTK_LABEL (font_button->priv->font_label), family_style);
|
||||
|
||||
|
|
|
|||
235
gtk/gtkfontsel.c
235
gtk/gtkfontsel.c
|
|
@ -76,6 +76,22 @@
|
|||
|
||||
#define DEFAULT_FONT_NAME "Sans 10"
|
||||
|
||||
/* Common font style names, listed here so they can be translated when
|
||||
* Pango returns the standard English names.
|
||||
*/
|
||||
#define FONT_STYLE_ULTRA_LIGHT N_("Ultra-Light")
|
||||
#define FONT_STYLE_LIGHT N_("Light")
|
||||
#define FONT_STYLE_MEDIUM N_("Medium")
|
||||
#define FONT_STYLE_NORMAL N_("Normal")
|
||||
#define FONT_STYLE_REGULAR N_("Regular")
|
||||
#define FONT_STYLE_ITALIC N_("Italic")
|
||||
#define FONT_STYLE_OBLIQUE N_("Oblique")
|
||||
#define FONT_STYLE_SEMI_BOLD N_("Semi-Bold")
|
||||
#define FONT_STYLE_BOLD N_("Bold")
|
||||
#define FONT_STYLE_ULTRA_BOLD N_("Ultra-Bold")
|
||||
#define FONT_STYLE_HEAVY N_("Heavy")
|
||||
#define FONT_STYLE_BOLD_ITALIC N_("Bold Italic")
|
||||
|
||||
/* This is the initial and maximum height of the preview entry (it expands
|
||||
when large font sizes are selected). Initial height is also the minimum. */
|
||||
#define INITIAL_PREVIEW_HEIGHT 44
|
||||
|
|
@ -699,11 +715,11 @@ gtk_font_selection_scroll_on_map (GtkWidget *widget,
|
|||
}
|
||||
|
||||
/* This is called when a family is selected in the list. */
|
||||
static void
|
||||
gtk_font_selection_select_font (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
static gboolean
|
||||
gtk_font_selection_real_select_font (gpointer data)
|
||||
{
|
||||
GtkFontSelection *fontsel;
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
#ifdef INCLUDE_FONT_ENTRIES
|
||||
|
|
@ -711,6 +727,7 @@ gtk_font_selection_select_font (GtkTreeSelection *selection,
|
|||
#endif
|
||||
|
||||
fontsel = GTK_FONT_SELECTION (data);
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->family_list));
|
||||
|
||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
||||
{
|
||||
|
|
@ -718,29 +735,53 @@ gtk_font_selection_select_font (GtkTreeSelection *selection,
|
|||
|
||||
gtk_tree_model_get (model, &iter, FAMILY_COLUMN, &family, -1);
|
||||
if (fontsel->family != family)
|
||||
{
|
||||
gtk_font_selection_ref_family (fontsel, family);
|
||||
{
|
||||
gtk_font_selection_ref_family (fontsel, family);
|
||||
|
||||
#ifdef INCLUDE_FONT_ENTRIES
|
||||
family_name = pango_font_family_get_name (fontsel->family);
|
||||
gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), family_name);
|
||||
family_name = pango_font_family_get_name (fontsel->family);
|
||||
gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry), family_name);
|
||||
#endif
|
||||
|
||||
gtk_font_selection_show_available_styles (fontsel);
|
||||
gtk_font_selection_select_best_style (fontsel, TRUE);
|
||||
}
|
||||
gtk_font_selection_show_available_styles (fontsel);
|
||||
gtk_font_selection_select_best_style (fontsel, TRUE);
|
||||
}
|
||||
|
||||
g_object_unref (family);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static int
|
||||
cmp_families (const void *a, const void *b)
|
||||
static void
|
||||
gtk_font_selection_select_font (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
{
|
||||
const char *a_name = pango_font_family_get_name (*(PangoFontFamily **)a);
|
||||
const char *b_name = pango_font_family_get_name (*(PangoFontFamily **)b);
|
||||
GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
|
||||
|
||||
return g_utf8_collate (a_name, b_name);
|
||||
gtk_font_selection_real_select_font (fontsel);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PangoFontFamily *family;
|
||||
const gchar *name;
|
||||
gchar *collate_key;
|
||||
} FontFamilySortInfo;
|
||||
|
||||
static int
|
||||
cmp_families (const void *a,
|
||||
const void *b)
|
||||
{
|
||||
const FontFamilySortInfo *family_a = a;
|
||||
const FontFamilySortInfo *family_b = b;
|
||||
gint result;
|
||||
|
||||
result = strcmp (family_a->collate_key, family_b->collate_key);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
return g_strcmp0 (family_a->name, family_b->name);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -748,6 +789,7 @@ gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
|
|||
{
|
||||
GtkListStore *model;
|
||||
PangoFontFamily **families;
|
||||
FontFamilySortInfo *sorted_families;
|
||||
PangoFontFamily *match_family = NULL;
|
||||
gint n_families, i;
|
||||
GtkTreeIter match_row;
|
||||
|
|
@ -755,27 +797,37 @@ gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
|
|||
model = GTK_LIST_STORE (gtk_tree_view_get_model (GTK_TREE_VIEW (fontsel->family_list)));
|
||||
|
||||
pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (fontsel)),
|
||||
&families, &n_families);
|
||||
qsort (families, n_families, sizeof (PangoFontFamily *), cmp_families);
|
||||
&families, &n_families);
|
||||
|
||||
sorted_families = g_new (FontFamilySortInfo, n_families);
|
||||
for (i = 0; i < n_families; i++)
|
||||
{
|
||||
const gchar *name = pango_font_family_get_name (families[i]);
|
||||
|
||||
sorted_families[i].family = families[i];
|
||||
sorted_families[i].name = name;
|
||||
sorted_families[i].collate_key = g_utf8_collate_key (name ? name : "", -1);
|
||||
}
|
||||
|
||||
qsort (sorted_families, n_families, sizeof (FontFamilySortInfo), cmp_families);
|
||||
|
||||
gtk_list_store_clear (model);
|
||||
|
||||
for (i=0; i<n_families; i++)
|
||||
for (i = 0; i < n_families; i++)
|
||||
{
|
||||
const gchar *name = pango_font_family_get_name (families[i]);
|
||||
const gchar *name = sorted_families[i].name;
|
||||
GtkTreeIter iter;
|
||||
|
||||
gtk_list_store_append (model, &iter);
|
||||
gtk_list_store_set (model, &iter,
|
||||
FAMILY_COLUMN, families[i],
|
||||
FAMILY_NAME_COLUMN, name,
|
||||
-1);
|
||||
gtk_list_store_insert_with_values (model, &iter, -1,
|
||||
FAMILY_COLUMN, sorted_families[i].family,
|
||||
FAMILY_NAME_COLUMN, name,
|
||||
-1);
|
||||
|
||||
if (i == 0 || !g_ascii_strcasecmp (name, "sans"))
|
||||
{
|
||||
match_family = families[i];
|
||||
match_row = iter;
|
||||
}
|
||||
{
|
||||
match_family = sorted_families[i].family;
|
||||
match_row = iter;
|
||||
}
|
||||
}
|
||||
|
||||
gtk_font_selection_ref_family (fontsel, match_family);
|
||||
|
|
@ -784,10 +836,14 @@ gtk_font_selection_show_available_fonts (GtkFontSelection *fontsel)
|
|||
set_cursor_to_iter (GTK_TREE_VIEW (fontsel->family_list), &match_row);
|
||||
#ifdef INCLUDE_FONT_ENTRIES
|
||||
gtk_entry_set_text (GTK_ENTRY (fontsel->font_entry),
|
||||
pango_font_family_get_name (match_family));
|
||||
pango_font_family_get_name (match_family));
|
||||
#endif /* INCLUDE_FONT_ENTRIES */
|
||||
}
|
||||
|
||||
for (i = 0; i < n_families; i++)
|
||||
g_free (sorted_families[i].collate_key);
|
||||
|
||||
g_free (sorted_families);
|
||||
g_free (families);
|
||||
}
|
||||
|
||||
|
|
@ -813,18 +869,26 @@ compare_font_descriptions (const PangoFontDescription *a, const PangoFontDescrip
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
faces_sort_func (const void *a, const void *b)
|
||||
typedef struct
|
||||
{
|
||||
PangoFontDescription *desc_a = pango_font_face_describe (*(PangoFontFace **)a);
|
||||
PangoFontDescription *desc_b = pango_font_face_describe (*(PangoFontFace **)b);
|
||||
PangoFontFace *face;
|
||||
PangoFontDescription *desc;
|
||||
const gchar *name;
|
||||
} FontFaceSortInfo;
|
||||
|
||||
int ord = compare_font_descriptions (desc_a, desc_b);
|
||||
static int
|
||||
faces_sort_func (const void *a,
|
||||
const void *b)
|
||||
{
|
||||
const FontFaceSortInfo *face_a = a;
|
||||
const FontFaceSortInfo *face_b = b;
|
||||
gint result;
|
||||
|
||||
pango_font_description_free (desc_a);
|
||||
pango_font_description_free (desc_b);
|
||||
result = compare_font_descriptions (face_a->desc, face_b->desc);
|
||||
if (result != 0)
|
||||
return result;
|
||||
|
||||
return ord;
|
||||
return g_strcmp0 (face_a->name, face_b->name);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -844,6 +908,7 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
|
|||
{
|
||||
gint n_faces, i;
|
||||
PangoFontFace **faces;
|
||||
FontFaceSortInfo *sorted_faces;
|
||||
PangoFontDescription *old_desc;
|
||||
GtkListStore *model;
|
||||
GtkTreeIter match_row;
|
||||
|
|
@ -857,38 +922,40 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
|
|||
old_desc= NULL;
|
||||
|
||||
pango_font_family_list_faces (fontsel->family, &faces, &n_faces);
|
||||
qsort (faces, n_faces, sizeof (PangoFontFace *), faces_sort_func);
|
||||
|
||||
sorted_faces = g_new (FontFaceSortInfo, n_faces);
|
||||
for (i = 0; i < n_faces; i++)
|
||||
{
|
||||
sorted_faces[i].face = faces[i];
|
||||
sorted_faces[i].desc = pango_font_face_describe (faces[i]);
|
||||
sorted_faces[i].name = pango_font_face_get_face_name (faces[i]);
|
||||
}
|
||||
|
||||
qsort (sorted_faces, n_faces, sizeof (FontFaceSortInfo), faces_sort_func);
|
||||
|
||||
gtk_list_store_clear (model);
|
||||
|
||||
for (i=0; i < n_faces; i++)
|
||||
for (i = 0; i < n_faces; i++)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
const gchar *str = pango_font_face_get_face_name (faces[i]);
|
||||
const gchar *str = sorted_faces[i].name;
|
||||
|
||||
gtk_list_store_append (model, &iter);
|
||||
gtk_list_store_set (model, &iter,
|
||||
FACE_COLUMN, faces[i],
|
||||
FACE_NAME_COLUMN, str,
|
||||
-1);
|
||||
gtk_list_store_insert_with_values (model, &iter, -1,
|
||||
FACE_COLUMN, sorted_faces[i].face,
|
||||
FACE_NAME_COLUMN, _(str),
|
||||
-1);
|
||||
|
||||
if (i == 0)
|
||||
{
|
||||
match_row = iter;
|
||||
match_face = faces[i];
|
||||
}
|
||||
else if (old_desc)
|
||||
{
|
||||
PangoFontDescription *tmp_desc = pango_font_face_describe (faces[i]);
|
||||
|
||||
if (font_description_style_equal (tmp_desc, old_desc))
|
||||
{
|
||||
match_row = iter;
|
||||
match_face = faces[i];
|
||||
}
|
||||
|
||||
pango_font_description_free (tmp_desc);
|
||||
}
|
||||
{
|
||||
match_row = iter;
|
||||
match_face = sorted_faces[i].face;
|
||||
}
|
||||
else if (old_desc &&
|
||||
font_description_style_equal (sorted_faces[i].desc, old_desc))
|
||||
{
|
||||
match_row = iter;
|
||||
match_face = sorted_faces[i].face;
|
||||
}
|
||||
}
|
||||
|
||||
if (old_desc)
|
||||
|
|
@ -905,6 +972,10 @@ gtk_font_selection_show_available_styles (GtkFontSelection *fontsel)
|
|||
set_cursor_to_iter (GTK_TREE_VIEW (fontsel->face_list), &match_row);
|
||||
}
|
||||
|
||||
for (i = 0; i < n_faces; i++)
|
||||
pango_font_description_free (sorted_faces[i].desc);
|
||||
|
||||
g_free (sorted_faces);
|
||||
g_free (faces);
|
||||
}
|
||||
|
||||
|
|
@ -934,14 +1005,16 @@ gtk_font_selection_select_best_style (GtkFontSelection *fontsel,
|
|||
|
||||
|
||||
/* This is called when a style is selected in the list. */
|
||||
static void
|
||||
gtk_font_selection_select_style (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
static gboolean
|
||||
gtk_font_selection_real_select_style (gpointer data)
|
||||
{
|
||||
GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->face_list));
|
||||
|
||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
||||
{
|
||||
PangoFontFace *face;
|
||||
|
|
@ -953,6 +1026,17 @@ gtk_font_selection_select_style (GtkTreeSelection *selection,
|
|||
|
||||
gtk_font_selection_show_available_sizes (fontsel, FALSE);
|
||||
gtk_font_selection_select_best_size (fontsel);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_font_selection_select_style (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
{
|
||||
GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
|
||||
|
||||
gtk_font_selection_real_select_style (fontsel);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -975,8 +1059,9 @@ gtk_font_selection_show_available_sizes (GtkFontSelection *fontsel,
|
|||
{
|
||||
GtkTreeIter iter;
|
||||
|
||||
gtk_list_store_append (model, &iter);
|
||||
gtk_list_store_set (model, &iter, SIZE_COLUMN, font_sizes[i], -1);
|
||||
gtk_list_store_insert_with_values (model, &iter, -1,
|
||||
SIZE_COLUMN, font_sizes[i],
|
||||
-1);
|
||||
|
||||
if (font_sizes[i] * PANGO_SCALE == fontsel->size)
|
||||
set_cursor_to_iter (GTK_TREE_VIEW (fontsel->size_list), &iter);
|
||||
|
|
@ -1085,22 +1170,34 @@ gtk_font_selection_size_focus_out (GtkWidget *w,
|
|||
}
|
||||
|
||||
/* This is called when a size is selected in the list. */
|
||||
static void
|
||||
gtk_font_selection_select_size (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
static gboolean
|
||||
gtk_font_selection_real_select_size (gpointer data)
|
||||
{
|
||||
GtkFontSelection *fontsel;
|
||||
GtkTreeSelection *selection;
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
gint new_size;
|
||||
|
||||
fontsel = GTK_FONT_SELECTION (data);
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (fontsel->size_list));
|
||||
|
||||
if (gtk_tree_selection_get_selected (selection, &model, &iter))
|
||||
{
|
||||
gtk_tree_model_get (model, &iter, SIZE_COLUMN, &new_size, -1);
|
||||
gtk_font_selection_set_size (fontsel, new_size * PANGO_SCALE);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_font_selection_select_size (GtkTreeSelection *selection,
|
||||
gpointer data)
|
||||
{
|
||||
GtkFontSelection *fontsel = GTK_FONT_SELECTION (data);
|
||||
|
||||
gtk_font_selection_real_select_size (fontsel);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -2945,6 +2945,10 @@ icon_info_ensure_scale_and_pixbuf (GtkIconInfo *icon_info,
|
|||
|
||||
if (mime_type && strcmp (mime_type, "image/svg+xml") == 0)
|
||||
is_svg = TRUE;
|
||||
#ifdef G_OS_WIN32
|
||||
else if (content_type && strcmp (content_type, ".svg") == 0)
|
||||
is_svg = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
||||
g_object_unref (file_info);
|
||||
|
|
|
|||
|
|
@ -120,6 +120,12 @@ struct _GtkIconViewPrivate
|
|||
GtkAdjustment *vadjustment;
|
||||
|
||||
guint layout_idle_id;
|
||||
GList *layout_items;
|
||||
gint layout_y, layout_maximum_width;
|
||||
gint layout_row, layout_item_width, layout_next_index;
|
||||
guint layout_in_progress : 1;
|
||||
guint layout_scanning_width : 1;
|
||||
guint layout_restart : 1;
|
||||
|
||||
gboolean doing_rubberband;
|
||||
gint rubberband_x1, rubberband_y1;
|
||||
|
|
@ -304,6 +310,7 @@ static void gtk_icon_view_queue_draw_path (GtkIco
|
|||
GtkTreePath *path);
|
||||
static void gtk_icon_view_queue_draw_item (GtkIconView *icon_view,
|
||||
GtkIconViewItem *item);
|
||||
static gboolean layout_callback (gpointer user_data);
|
||||
static void gtk_icon_view_queue_layout (GtkIconView *icon_view);
|
||||
static void gtk_icon_view_set_cursor_item (GtkIconView *icon_view,
|
||||
GtkIconViewItem *item,
|
||||
|
|
@ -1491,6 +1498,8 @@ gtk_icon_view_size_allocate (GtkWidget *widget,
|
|||
GtkIconView *icon_view = GTK_ICON_VIEW (widget);
|
||||
|
||||
GtkAdjustment *hadjustment, *vadjustment;
|
||||
gboolean relayout = (icon_view->priv->layout_idle_id != 0 ||
|
||||
widget->allocation.width != allocation->width);
|
||||
|
||||
widget->allocation = *allocation;
|
||||
|
||||
|
|
@ -1504,7 +1513,8 @@ gtk_icon_view_size_allocate (GtkWidget *widget,
|
|||
MAX (icon_view->priv->height, allocation->height));
|
||||
}
|
||||
|
||||
gtk_icon_view_layout (icon_view);
|
||||
if (relayout)
|
||||
gtk_icon_view_layout (icon_view);
|
||||
|
||||
gtk_icon_view_allocate_children (icon_view);
|
||||
|
||||
|
|
@ -1588,6 +1598,10 @@ gtk_icon_view_expose (GtkWidget *widget,
|
|||
for (icons = icon_view->priv->items; icons; icons = icons->next)
|
||||
{
|
||||
GtkIconViewItem *item = icons->data;
|
||||
|
||||
if (icon_view->priv->layout_in_progress &&
|
||||
item->index >= icon_view->priv->layout_next_index)
|
||||
break;
|
||||
GdkRectangle area;
|
||||
|
||||
area.x = item->x;
|
||||
|
|
@ -2810,11 +2824,8 @@ gtk_icon_view_set_adjustment_upper (GtkAdjustment *adj,
|
|||
static void
|
||||
gtk_icon_view_layout (GtkIconView *icon_view)
|
||||
{
|
||||
gint y = 0, maximum_width = 0;
|
||||
GList *icons;
|
||||
GtkWidget *widget;
|
||||
gint row;
|
||||
gint item_width;
|
||||
gint64 deadline;
|
||||
|
||||
if (icon_view->priv->layout_idle_id != 0)
|
||||
{
|
||||
|
|
@ -2823,54 +2834,100 @@ gtk_icon_view_layout (GtkIconView *icon_view)
|
|||
}
|
||||
|
||||
if (icon_view->priv->model == NULL)
|
||||
return;
|
||||
{
|
||||
icon_view->priv->layout_in_progress = FALSE;
|
||||
icon_view->priv->layout_items = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
widget = GTK_WIDGET (icon_view);
|
||||
deadline = g_get_monotonic_time () + 2000;
|
||||
|
||||
item_width = icon_view->priv->item_width;
|
||||
|
||||
if (item_width < 0)
|
||||
if (!icon_view->priv->layout_in_progress ||
|
||||
icon_view->priv->layout_restart)
|
||||
{
|
||||
for (icons = icon_view->priv->items; icons; icons = icons->next)
|
||||
{
|
||||
GtkIconViewItem *item = icons->data;
|
||||
gtk_icon_view_calculate_item_size (icon_view, item);
|
||||
item_width = MAX (item_width, item->width);
|
||||
}
|
||||
icon_view->priv->layout_in_progress = TRUE;
|
||||
icon_view->priv->layout_restart = FALSE;
|
||||
icon_view->priv->layout_items = icon_view->priv->items;
|
||||
icon_view->priv->layout_y = icon_view->priv->margin;
|
||||
icon_view->priv->layout_maximum_width = 0;
|
||||
icon_view->priv->layout_row = 0;
|
||||
icon_view->priv->layout_item_width = icon_view->priv->item_width;
|
||||
icon_view->priv->layout_next_index = 0;
|
||||
icon_view->priv->layout_scanning_width =
|
||||
icon_view->priv->layout_item_width < 0;
|
||||
|
||||
if (!icon_view->priv->layout_scanning_width &&
|
||||
icon_view->priv->layout_items)
|
||||
{
|
||||
gtk_icon_view_set_cell_data (icon_view,
|
||||
icon_view->priv->layout_items->data);
|
||||
adjust_wrap_width (icon_view, icon_view->priv->layout_items->data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
icons = icon_view->priv->items;
|
||||
y += icon_view->priv->margin;
|
||||
row = 0;
|
||||
|
||||
if (icons)
|
||||
while (icon_view->priv->layout_scanning_width &&
|
||||
icon_view->priv->layout_items)
|
||||
{
|
||||
gtk_icon_view_set_cell_data (icon_view, icons->data);
|
||||
adjust_wrap_width (icon_view, icons->data);
|
||||
GtkIconViewItem *item = icon_view->priv->layout_items->data;
|
||||
|
||||
gtk_icon_view_calculate_item_size (icon_view, item);
|
||||
icon_view->priv->layout_item_width =
|
||||
MAX (icon_view->priv->layout_item_width, item->width);
|
||||
icon_view->priv->layout_items = icon_view->priv->layout_items->next;
|
||||
|
||||
if (g_get_monotonic_time () >= deadline)
|
||||
goto yield;
|
||||
}
|
||||
|
||||
do
|
||||
if (icon_view->priv->layout_scanning_width)
|
||||
{
|
||||
icons = gtk_icon_view_layout_single_row (icon_view, icons,
|
||||
item_width, row,
|
||||
&y, &maximum_width);
|
||||
row++;
|
||||
icon_view->priv->layout_scanning_width = FALSE;
|
||||
icon_view->priv->layout_items = icon_view->priv->items;
|
||||
|
||||
if (icon_view->priv->layout_items)
|
||||
{
|
||||
gtk_icon_view_set_cell_data (icon_view,
|
||||
icon_view->priv->layout_items->data);
|
||||
adjust_wrap_width (icon_view, icon_view->priv->layout_items->data);
|
||||
}
|
||||
}
|
||||
while (icons != NULL);
|
||||
|
||||
if (maximum_width != icon_view->priv->width)
|
||||
icon_view->priv->width = maximum_width;
|
||||
while (icon_view->priv->layout_items)
|
||||
{
|
||||
icon_view->priv->layout_items =
|
||||
gtk_icon_view_layout_single_row (icon_view,
|
||||
icon_view->priv->layout_items,
|
||||
icon_view->priv->layout_item_width,
|
||||
icon_view->priv->layout_row++,
|
||||
&icon_view->priv->layout_y,
|
||||
&icon_view->priv->layout_maximum_width);
|
||||
|
||||
y += icon_view->priv->margin;
|
||||
icon_view->priv->layout_next_index =
|
||||
icon_view->priv->layout_items
|
||||
? ((GtkIconViewItem *) icon_view->priv->layout_items->data)->index
|
||||
: G_MAXINT;
|
||||
|
||||
if (y != icon_view->priv->height)
|
||||
icon_view->priv->height = y;
|
||||
if (icon_view->priv->layout_restart ||
|
||||
(icon_view->priv->layout_items &&
|
||||
g_get_monotonic_time () >= deadline))
|
||||
goto yield;
|
||||
}
|
||||
|
||||
icon_view->priv->layout_in_progress = FALSE;
|
||||
|
||||
if (icon_view->priv->layout_maximum_width != icon_view->priv->width)
|
||||
icon_view->priv->width = icon_view->priv->layout_maximum_width;
|
||||
|
||||
icon_view->priv->layout_y += icon_view->priv->margin;
|
||||
|
||||
if (icon_view->priv->layout_y != icon_view->priv->height)
|
||||
icon_view->priv->height = icon_view->priv->layout_y;
|
||||
|
||||
gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment,
|
||||
icon_view->priv->width);
|
||||
icon_view->priv->width);
|
||||
gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment,
|
||||
icon_view->priv->height);
|
||||
icon_view->priv->height);
|
||||
|
||||
if (icon_view->priv->width != widget->requisition.width ||
|
||||
icon_view->priv->height != widget->requisition.height)
|
||||
|
|
@ -2878,8 +2935,8 @@ gtk_icon_view_layout (GtkIconView *icon_view)
|
|||
|
||||
if (gtk_widget_get_realized (GTK_WIDGET (icon_view)))
|
||||
gdk_window_resize (icon_view->priv->bin_window,
|
||||
MAX (icon_view->priv->width, widget->allocation.width),
|
||||
MAX (icon_view->priv->height, widget->allocation.height));
|
||||
MAX (icon_view->priv->width, widget->allocation.width),
|
||||
MAX (icon_view->priv->height, widget->allocation.height));
|
||||
|
||||
if (icon_view->priv->scroll_to_path)
|
||||
{
|
||||
|
|
@ -2890,13 +2947,21 @@ gtk_icon_view_layout (GtkIconView *icon_view)
|
|||
icon_view->priv->scroll_to_path = NULL;
|
||||
|
||||
gtk_icon_view_scroll_to_path (icon_view, path,
|
||||
icon_view->priv->scroll_to_use_align,
|
||||
icon_view->priv->scroll_to_row_align,
|
||||
icon_view->priv->scroll_to_col_align);
|
||||
icon_view->priv->scroll_to_use_align,
|
||||
icon_view->priv->scroll_to_row_align,
|
||||
icon_view->priv->scroll_to_col_align);
|
||||
gtk_tree_path_free (path);
|
||||
}
|
||||
|
||||
gtk_widget_queue_draw (widget);
|
||||
return;
|
||||
|
||||
yield:
|
||||
if (icon_view->priv->layout_idle_id == 0)
|
||||
icon_view->priv->layout_idle_id =
|
||||
gdk_threads_add_idle (layout_callback, icon_view);
|
||||
|
||||
gtk_widget_queue_draw (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -3409,6 +3474,9 @@ layout_callback (gpointer user_data)
|
|||
static void
|
||||
gtk_icon_view_queue_layout (GtkIconView *icon_view)
|
||||
{
|
||||
if (icon_view->priv->layout_in_progress)
|
||||
icon_view->priv->layout_restart = TRUE;
|
||||
|
||||
if (icon_view->priv->layout_idle_id != 0)
|
||||
return;
|
||||
|
||||
|
|
@ -3500,6 +3568,10 @@ gtk_icon_view_get_item_at_coords (GtkIconView *icon_view,
|
|||
{
|
||||
GtkIconViewItem *item = items->data;
|
||||
|
||||
if (icon_view->priv->layout_in_progress &&
|
||||
item->index >= icon_view->priv->layout_next_index)
|
||||
break;
|
||||
|
||||
if (x >= item->x - icon_view->priv->column_spacing/2 && x <= item->x + item->width + icon_view->priv->column_spacing/2 &&
|
||||
y >= item->y - icon_view->priv->row_spacing/2 && y <= item->y + item->height + icon_view->priv->row_spacing/2)
|
||||
{
|
||||
|
|
@ -5207,6 +5279,10 @@ gtk_icon_view_get_visible_range (GtkIconView *icon_view,
|
|||
{
|
||||
GtkIconViewItem *item = icons->data;
|
||||
|
||||
if (icon_view->priv->layout_in_progress &&
|
||||
item->index >= icon_view->priv->layout_next_index)
|
||||
break;
|
||||
|
||||
if ((item->x + item->width >= (int)icon_view->priv->hadjustment->value) &&
|
||||
(item->y + item->height >= (int)icon_view->priv->vadjustment->value) &&
|
||||
(item->x <= (int) (icon_view->priv->hadjustment->value + icon_view->priv->hadjustment->page_size)) &&
|
||||
|
|
@ -7917,7 +7993,7 @@ gtk_icon_view_item_accessible_image_get_image_position (AtkImage *image,
|
|||
if (atk_state_set_contains_state (item->state_set, ATK_STATE_DEFUNCT))
|
||||
return;
|
||||
|
||||
atk_component_get_position (ATK_COMPONENT (image), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (image), x, y, NULL, NULL, coord_type);
|
||||
|
||||
if (get_pixbuf_box (GTK_ICON_VIEW (item->widget), item->item, &box))
|
||||
{
|
||||
|
|
@ -8601,7 +8677,7 @@ gtk_icon_view_item_accessible_get_extents (AtkComponent *component,
|
|||
if (gtk_icon_view_item_accessible_is_showing (item))
|
||||
{
|
||||
parent_obj = gtk_widget_get_accessible (item->widget);
|
||||
atk_component_get_position (ATK_COMPONENT (parent_obj), &l_x, &l_y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (parent_obj), &l_x, &l_y, NULL, NULL, coord_type);
|
||||
*x = l_x + item->item->x;
|
||||
*y = l_y + item->item->y;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ struct _GtkIMModule
|
|||
GModule *library;
|
||||
|
||||
void (*list) (const GtkIMContextInfo ***contexts,
|
||||
guint *n_contexts);
|
||||
guint *n_contexts);
|
||||
void (*init) (GTypeModule *module);
|
||||
void (*exit) (void);
|
||||
GtkIMContext *(*create) (const gchar *context_id);
|
||||
|
|
@ -309,6 +309,176 @@ add_builtin_module (const gchar *module_name,
|
|||
return module;
|
||||
}
|
||||
|
||||
/* Parser helpers adapted from GTK 3.24 gtkutils.c
|
||||
* (gtk_read_line(), gtk_skip_space(), gtk_scan_string()).
|
||||
* GTK 3 notes that these helpers were copied from pango-utils.c.
|
||||
*
|
||||
* Keep these helpers local to avoid depending on deprecated Pango parser
|
||||
* utilities while preserving the old gtk.immodules parser semantics.
|
||||
*/
|
||||
#if !defined(HAVE_FLOCKFILE) && \
|
||||
defined(HAVE__LOCK_FILE) && \
|
||||
defined(HAVE__UNLOCK_FILE) && \
|
||||
defined(HAVE__GETC_NOLOCK)
|
||||
#define flockfile(f) _lock_file(f)
|
||||
#define funlockfile(f) _unlock_file(f)
|
||||
#define getc_unlocked(f) _getc_nolock(f)
|
||||
#elif !defined(HAVE_FLOCKFILE)
|
||||
#define flockfile(f) (void)1
|
||||
#define funlockfile(f) (void)1
|
||||
#define getc_unlocked(f) getc(f)
|
||||
#endif
|
||||
|
||||
static gboolean
|
||||
gtk_im_module_scan_string (const char **pos,
|
||||
GString *out)
|
||||
{
|
||||
const char *p = *pos, *q = *pos;
|
||||
char *tmp, *tmp2;
|
||||
gboolean quoted;
|
||||
|
||||
while (g_ascii_isspace (*p))
|
||||
p++;
|
||||
|
||||
if (!*p)
|
||||
return FALSE;
|
||||
else if (*p == '"')
|
||||
{
|
||||
p++;
|
||||
quoted = FALSE;
|
||||
for (q = p; (*q != '"') || quoted; q++)
|
||||
{
|
||||
if (!*q)
|
||||
return FALSE;
|
||||
|
||||
quoted = (*q == '\\') && !quoted;
|
||||
}
|
||||
|
||||
tmp = g_strndup (p, q - p);
|
||||
tmp2 = g_strcompress (tmp);
|
||||
g_string_truncate (out, 0);
|
||||
g_string_append (out, tmp2);
|
||||
g_free (tmp);
|
||||
g_free (tmp2);
|
||||
}
|
||||
else
|
||||
return FALSE;
|
||||
|
||||
q++;
|
||||
*pos = q;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_im_module_skip_space (const char **pos)
|
||||
{
|
||||
const char *p = *pos;
|
||||
|
||||
while (g_ascii_isspace (*p))
|
||||
p++;
|
||||
|
||||
*pos = p;
|
||||
|
||||
return !(*p == '\0');
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_im_module_read_line (FILE *stream,
|
||||
GString *str)
|
||||
{
|
||||
gboolean quoted = FALSE;
|
||||
gboolean comment = FALSE;
|
||||
int n_read = 0;
|
||||
int lines = 1;
|
||||
|
||||
flockfile (stream);
|
||||
|
||||
g_string_truncate (str, 0);
|
||||
|
||||
while (1)
|
||||
{
|
||||
int c;
|
||||
|
||||
c = getc_unlocked (stream);
|
||||
|
||||
if (c == EOF)
|
||||
{
|
||||
if (quoted)
|
||||
g_string_append_c (str, '\\');
|
||||
|
||||
goto done;
|
||||
}
|
||||
else
|
||||
n_read++;
|
||||
|
||||
if (quoted)
|
||||
{
|
||||
quoted = FALSE;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case '#':
|
||||
g_string_append_c (str, '#');
|
||||
break;
|
||||
|
||||
case '\r':
|
||||
case '\n':
|
||||
{
|
||||
int next_c = getc_unlocked (stream);
|
||||
|
||||
if (!(next_c == EOF ||
|
||||
(c == '\r' && next_c == '\n') ||
|
||||
(c == '\n' && next_c == '\r')))
|
||||
ungetc (next_c, stream);
|
||||
|
||||
lines++;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
g_string_append_c (str, '\\');
|
||||
g_string_append_c (str, c);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (c)
|
||||
{
|
||||
case '#':
|
||||
comment = TRUE;
|
||||
break;
|
||||
|
||||
case '\\':
|
||||
if (!comment)
|
||||
quoted = TRUE;
|
||||
break;
|
||||
|
||||
case '\n':
|
||||
{
|
||||
int next_c = getc_unlocked (stream);
|
||||
|
||||
if (!(next_c == EOF ||
|
||||
(c == '\r' && next_c == '\n') ||
|
||||
(c == '\n' && next_c == '\r')))
|
||||
ungetc (next_c, stream);
|
||||
|
||||
goto done;
|
||||
}
|
||||
|
||||
default:
|
||||
if (!comment)
|
||||
g_string_append_c (str, c);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
funlockfile (stream);
|
||||
|
||||
return (n_read > 0) ? lines : 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_im_module_initialize (void)
|
||||
{
|
||||
|
|
@ -392,13 +562,13 @@ gtk_im_module_initialize (void)
|
|||
return;
|
||||
}
|
||||
|
||||
while (!have_error && pango_read_line (file, line_buf))
|
||||
while (!have_error && gtk_im_module_read_line (file, line_buf))
|
||||
{
|
||||
const char *p;
|
||||
|
||||
p = line_buf->str;
|
||||
|
||||
if (!pango_skip_space (&p))
|
||||
if (!gtk_im_module_skip_space (&p))
|
||||
{
|
||||
/* Blank line marking the end of a module
|
||||
*/
|
||||
|
|
@ -418,8 +588,8 @@ gtk_im_module_initialize (void)
|
|||
*/
|
||||
module = g_object_new (GTK_TYPE_IM_MODULE, NULL);
|
||||
|
||||
if (!pango_scan_string (&p, tmp_buf) ||
|
||||
pango_skip_space (&p))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf) ||
|
||||
gtk_im_module_skip_space (&p))
|
||||
{
|
||||
g_warning ("Error parsing context info in '%s'\n %s",
|
||||
filename, line_buf->str);
|
||||
|
|
@ -438,30 +608,30 @@ gtk_im_module_initialize (void)
|
|||
|
||||
/* Read information about a context type
|
||||
*/
|
||||
if (!pango_scan_string (&p, tmp_buf))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf))
|
||||
goto context_error;
|
||||
info->context_id = g_strdup (tmp_buf->str);
|
||||
|
||||
if (!pango_scan_string (&p, tmp_buf))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf))
|
||||
goto context_error;
|
||||
info->context_name = g_strdup (tmp_buf->str);
|
||||
|
||||
if (!pango_scan_string (&p, tmp_buf))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf))
|
||||
goto context_error;
|
||||
info->domain = g_strdup (tmp_buf->str);
|
||||
|
||||
if (!pango_scan_string (&p, tmp_buf))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf))
|
||||
goto context_error;
|
||||
info->domain_dirname = g_strdup (tmp_buf->str);
|
||||
#ifdef G_OS_WIN32
|
||||
correct_localedir_prefix ((char **) &info->domain_dirname);
|
||||
#endif
|
||||
|
||||
if (!pango_scan_string (&p, tmp_buf))
|
||||
if (!gtk_im_module_scan_string (&p, tmp_buf))
|
||||
goto context_error;
|
||||
info->default_locales = g_strdup (tmp_buf->str);
|
||||
|
||||
if (pango_skip_space (&p))
|
||||
if (gtk_im_module_skip_space (&p))
|
||||
goto context_error;
|
||||
|
||||
infos = g_slist_prepend (infos, info);
|
||||
|
|
@ -662,7 +832,7 @@ lookup_immodule (gchar **immodules_list)
|
|||
gboolean found;
|
||||
gchar *context_id;
|
||||
found = g_hash_table_lookup_extended (contexts_hash, *immodules_list,
|
||||
(gpointer *) &context_id, NULL);
|
||||
(gpointer *) &context_id, NULL);
|
||||
if (found)
|
||||
return context_id;
|
||||
}
|
||||
|
|
@ -721,7 +891,7 @@ _gtk_im_module_get_default_context_id (GdkWindow *client_window)
|
|||
g_strfreev(immodules);
|
||||
g_free (tmp);
|
||||
|
||||
if (context_id)
|
||||
if (context_id)
|
||||
return context_id;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -51,6 +51,8 @@ static gboolean default_display_opened = FALSE;
|
|||
static gint gtk_argc = 0;
|
||||
static gchar **gtk_argv = NULL;
|
||||
|
||||
static gint module_path_env_dirs = 0;
|
||||
|
||||
static gchar **
|
||||
split_file_list (const gchar *str)
|
||||
{
|
||||
|
|
@ -131,6 +133,7 @@ get_module_path (void)
|
|||
gchar *home_gtk_dir = NULL;
|
||||
gchar *module_path;
|
||||
gchar *default_dir;
|
||||
gchar *local_dir = NULL;
|
||||
static gchar **result = NULL;
|
||||
|
||||
if (result)
|
||||
|
|
@ -146,25 +149,67 @@ get_module_path (void)
|
|||
if (exe_prefix)
|
||||
default_dir = g_build_filename (exe_prefix, "lib", "gtk-2.0", NULL);
|
||||
else
|
||||
default_dir = g_build_filename (GTK_LIBDIR, "gtk-2.0", NULL);
|
||||
{
|
||||
default_dir = g_build_filename (GTK_LIBDIR, "gtk-2.0", NULL);
|
||||
|
||||
if (module_path_env && home_gtk_dir)
|
||||
#ifndef G_OS_WIN32
|
||||
if (g_str_has_prefix (GTK_LIBDIR, "/usr/lib"))
|
||||
{
|
||||
const gchar *lib_subdir = GTK_LIBDIR + strlen ("/usr/");
|
||||
|
||||
if (lib_subdir[0] != '\0')
|
||||
local_dir = g_build_filename ("/usr/local", lib_subdir, "gtk-2.0", NULL);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if (module_path_env && home_gtk_dir && local_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
module_path_env, home_gtk_dir, default_dir, NULL);
|
||||
module_path_env, home_gtk_dir, local_dir, default_dir, NULL);
|
||||
else if (module_path_env && home_gtk_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
module_path_env, home_gtk_dir, default_dir, NULL);
|
||||
else if (module_path_env && local_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
module_path_env, local_dir, default_dir, NULL);
|
||||
else if (module_path_env)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
module_path_env, default_dir, NULL);
|
||||
module_path_env, default_dir, NULL);
|
||||
else if (home_gtk_dir && local_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
home_gtk_dir, local_dir, default_dir, NULL);
|
||||
else if (home_gtk_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
home_gtk_dir, default_dir, NULL);
|
||||
home_gtk_dir, default_dir, NULL);
|
||||
else if (local_dir)
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
local_dir, default_dir, NULL);
|
||||
else
|
||||
module_path = g_build_path (G_SEARCHPATH_SEPARATOR_S,
|
||||
default_dir, NULL);
|
||||
default_dir, NULL);
|
||||
|
||||
g_free (home_gtk_dir);
|
||||
g_free (local_dir);
|
||||
g_free (default_dir);
|
||||
|
||||
result = split_file_list (module_path);
|
||||
|
||||
if (module_path_env)
|
||||
{
|
||||
gchar **env_paths;
|
||||
gchar **path;
|
||||
|
||||
env_paths = split_file_list (module_path_env);
|
||||
|
||||
module_path_env_dirs = 0;
|
||||
for (path = env_paths; *path; path++)
|
||||
module_path_env_dirs++;
|
||||
|
||||
g_strfreev (env_paths);
|
||||
}
|
||||
else
|
||||
module_path_env_dirs = 0;
|
||||
|
||||
g_free (module_path);
|
||||
|
||||
return result;
|
||||
|
|
@ -189,12 +234,15 @@ _gtk_get_module_path (const gchar *type)
|
|||
for (path = paths; *path; path++)
|
||||
count++;
|
||||
|
||||
result = g_new (gchar *, count * 5 + 1);
|
||||
result = g_new (gchar *, count * 4 + module_path_env_dirs + 1);
|
||||
|
||||
count = 0;
|
||||
for (path = get_module_path (); *path; path++)
|
||||
for (path = paths; *path; path++)
|
||||
{
|
||||
gint use_version, use_host;
|
||||
gboolean path_from_env;
|
||||
|
||||
path_from_env = (path - paths) < module_path_env_dirs;
|
||||
|
||||
for (use_version = TRUE; use_version >= FALSE; use_version--)
|
||||
for (use_host = TRUE; use_host >= FALSE; use_host--)
|
||||
|
|
@ -219,10 +267,11 @@ _gtk_get_module_path (const gchar *type)
|
|||
* live directly in .../.libs directories, for example print backends,
|
||||
* theme engines or input modules.
|
||||
*
|
||||
* Keep this limited to absolute paths so the removed fallback that could
|
||||
* load modules from the current working directory is not reintroduced.
|
||||
* Keep this limited to absolute GTK_PATH entries so the removed fallback
|
||||
* that could load modules from the current working directory is not
|
||||
* reintroduced for built-in default paths.
|
||||
*/
|
||||
if (g_path_is_absolute (*path))
|
||||
if (path_from_env && g_path_is_absolute (*path))
|
||||
result[count++] = g_strdup (*path);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -349,6 +349,9 @@ gtk_print_backend_load_modules (void)
|
|||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkPrintBackend, gtk_print_backend, G_TYPE_OBJECT)
|
||||
|
||||
#define GTK_PRINT_BACKEND_CAN_STORE_AUTH_INFO_KEY "gtk-print-backend-can-store-auth-info"
|
||||
#define GTK_PRINT_BACKEND_STORE_AUTH_INFO_KEY "gtk-print-backend-store-auth-info"
|
||||
|
||||
static void fallback_printer_request_details (GtkPrinter *printer);
|
||||
static gboolean fallback_printer_mark_conflicts (GtkPrinter *printer,
|
||||
GtkPrinterOptionSet *options);
|
||||
|
|
@ -690,6 +693,17 @@ store_entry (GtkEntry *entry,
|
|||
*data = g_strdup (gtk_entry_get_text (entry));
|
||||
}
|
||||
|
||||
static void
|
||||
store_auth_info_toggled (GtkToggleButton *button,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkPrintBackend *backend = GTK_PRINT_BACKEND (user_data);
|
||||
|
||||
g_object_set_data (G_OBJECT (backend),
|
||||
GTK_PRINT_BACKEND_STORE_AUTH_INFO_KEY,
|
||||
GINT_TO_POINTER (gtk_toggle_button_get_active (button)));
|
||||
}
|
||||
|
||||
static void
|
||||
password_dialog_response (GtkWidget *dialog,
|
||||
gint response_id,
|
||||
|
|
@ -729,7 +743,7 @@ request_password (GtkPrintBackend *backend,
|
|||
const gchar *prompt)
|
||||
{
|
||||
GtkPrintBackendPrivate *priv = backend->priv;
|
||||
GtkWidget *dialog, *box, *main_box, *label, *icon, *vbox, *entry;
|
||||
GtkWidget *dialog, *box, *main_box, *label, *icon, *vbox, *entry, *chkbtn;
|
||||
GtkWidget *focus = NULL;
|
||||
gchar *markup;
|
||||
gint length;
|
||||
|
|
@ -743,6 +757,10 @@ request_password (GtkPrintBackend *backend,
|
|||
length = g_strv_length (ai_required);
|
||||
priv->auth_info = g_new0 (gchar *, length + 1);
|
||||
|
||||
g_object_set_data (G_OBJECT (backend),
|
||||
GTK_PRINT_BACKEND_STORE_AUTH_INFO_KEY,
|
||||
GINT_TO_POINTER (FALSE));
|
||||
|
||||
dialog = gtk_dialog_new_with_buttons ( _("Authentication"), NULL, GTK_DIALOG_MODAL,
|
||||
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
||||
GTK_STOCK_OK, GTK_RESPONSE_OK,
|
||||
|
|
@ -810,6 +828,17 @@ request_password (GtkPrintBackend *backend,
|
|||
}
|
||||
}
|
||||
|
||||
if (g_object_get_data (G_OBJECT (backend),
|
||||
GTK_PRINT_BACKEND_CAN_STORE_AUTH_INFO_KEY))
|
||||
{
|
||||
chkbtn = gtk_check_button_new_with_mnemonic (_("_Remember password"));
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (chkbtn), FALSE);
|
||||
gtk_box_pack_start (GTK_BOX (vbox), chkbtn, FALSE, FALSE, 6);
|
||||
g_signal_connect (chkbtn, "toggled",
|
||||
G_CALLBACK (store_auth_info_toggled),
|
||||
backend);
|
||||
}
|
||||
|
||||
if (focus != NULL)
|
||||
{
|
||||
gtk_widget_grab_focus (focus);
|
||||
|
|
|
|||
|
|
@ -796,7 +796,9 @@ printer_status_cb (GtkPrintBackend *backend,
|
|||
/* When the pause state change then we need to update sensitive property
|
||||
* of GTK_RESPONSE_OK button inside of selected_printer_changed function. */
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->printer_treeview));
|
||||
priv->internal_printer_change = TRUE;
|
||||
selected_printer_changed (selection, dialog);
|
||||
priv->internal_printer_change = FALSE;
|
||||
|
||||
if (gtk_print_backend_printer_list_is_done (backend) &&
|
||||
gtk_printer_is_default (printer) &&
|
||||
|
|
|
|||
|
|
@ -67,7 +67,10 @@ _gtk_quartz_create_image_from_pixbuf (GdkPixbuf *pixbuf)
|
|||
}
|
||||
[nsimage lockFocus];
|
||||
|
||||
context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
|
||||
if (gdk_quartz_osx_version () < GDK_OSX_YOSEMITE)
|
||||
context = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
|
||||
else
|
||||
context = [[NSGraphicsContext currentContext] CGContext];
|
||||
CGContextDrawImage (context, CGRectMake (0, 0, pixbuf_width, pixbuf_height), image);
|
||||
|
||||
[nsimage unlockFocus];
|
||||
|
|
|
|||
18
gtk/gtkrc.c
18
gtk/gtkrc.c
|
|
@ -808,6 +808,8 @@ gtk_rc_parse_named (GtkRcContext *context,
|
|||
gchar *path = NULL;
|
||||
const gchar *home_dir;
|
||||
gchar *subpath;
|
||||
const gchar * const *xdg_data_dirs;
|
||||
gint i;
|
||||
|
||||
if (type)
|
||||
subpath = g_strconcat ("gtk-2.0-", type,
|
||||
|
|
@ -829,6 +831,22 @@ gtk_rc_parse_named (GtkRcContext *context,
|
|||
}
|
||||
}
|
||||
|
||||
if (!path)
|
||||
{
|
||||
xdg_data_dirs = g_get_system_data_dirs ();
|
||||
for (i = 0; xdg_data_dirs[i]; i++)
|
||||
{
|
||||
path = g_build_filename (xdg_data_dirs[i], "themes", name, subpath, NULL);
|
||||
if (g_file_test (path, G_FILE_TEST_EXISTS))
|
||||
break;
|
||||
else
|
||||
{
|
||||
g_free (path);
|
||||
path = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!path)
|
||||
{
|
||||
gchar *theme_dir = gtk_rc_get_theme_dir ();
|
||||
|
|
|
|||
|
|
@ -86,12 +86,12 @@ struct _GtkRecentChooserIface
|
|||
* Methods
|
||||
*/
|
||||
gboolean (* set_current_uri) (GtkRecentChooser *chooser,
|
||||
const gchar *uri,
|
||||
GError **error);
|
||||
const gchar *uri,
|
||||
GError **error);
|
||||
gchar * (* get_current_uri) (GtkRecentChooser *chooser);
|
||||
gboolean (* select_uri) (GtkRecentChooser *chooser,
|
||||
const gchar *uri,
|
||||
GError **error);
|
||||
const gchar *uri,
|
||||
GError **error);
|
||||
void (* unselect_uri) (GtkRecentChooser *chooser,
|
||||
const gchar *uri);
|
||||
void (* select_all) (GtkRecentChooser *chooser);
|
||||
|
|
@ -99,14 +99,14 @@ struct _GtkRecentChooserIface
|
|||
GList * (* get_items) (GtkRecentChooser *chooser);
|
||||
GtkRecentManager *(* get_recent_manager) (GtkRecentChooser *chooser);
|
||||
void (* add_filter) (GtkRecentChooser *chooser,
|
||||
GtkRecentFilter *filter);
|
||||
GtkRecentFilter *filter);
|
||||
void (* remove_filter) (GtkRecentChooser *chooser,
|
||||
GtkRecentFilter *filter);
|
||||
GtkRecentFilter *filter);
|
||||
GSList * (* list_filters) (GtkRecentChooser *chooser);
|
||||
void (* set_sort_func) (GtkRecentChooser *chooser,
|
||||
GtkRecentSortFunc sort_func,
|
||||
gpointer sort_data,
|
||||
GDestroyNotify data_destroy);
|
||||
GtkRecentSortFunc sort_func,
|
||||
gpointer sort_data,
|
||||
GDestroyNotify data_destroy);
|
||||
|
||||
/*
|
||||
* Signals
|
||||
|
|
@ -176,8 +176,8 @@ gchar ** gtk_recent_chooser_get_uris (GtkRecentChooser *chooser,
|
|||
/*
|
||||
* Filters
|
||||
*/
|
||||
void gtk_recent_chooser_add_filter (GtkRecentChooser *chooser,
|
||||
GtkRecentFilter *filter);
|
||||
void gtk_recent_chooser_add_filter (GtkRecentChooser *chooser,
|
||||
GtkRecentFilter *filter);
|
||||
void gtk_recent_chooser_remove_filter (GtkRecentChooser *chooser,
|
||||
GtkRecentFilter *filter);
|
||||
GSList * gtk_recent_chooser_list_filters (GtkRecentChooser *chooser);
|
||||
|
|
|
|||
|
|
@ -2439,8 +2439,7 @@ _gtk_text_btree_get_text (const GtkTextIter *start_orig,
|
|||
|
||||
copy_segment (retval, include_hidden, include_nonchars, &iter, &end);
|
||||
|
||||
str = retval->str;
|
||||
g_string_free (retval, FALSE);
|
||||
str = g_string_free (retval, FALSE);
|
||||
return str;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -74,7 +74,10 @@ struct _GtkTooltips
|
|||
guint have_grab : 1;
|
||||
guint use_sticky_delay : 1;
|
||||
gint timer_tag;
|
||||
GTimeVal last_popdown;
|
||||
struct {
|
||||
glong tv_sec;
|
||||
glong tv_usec;
|
||||
} last_popdown;
|
||||
};
|
||||
|
||||
struct _GtkTooltipsClass
|
||||
|
|
|
|||
|
|
@ -46,12 +46,12 @@ struct _GtkTrayIconClass
|
|||
{
|
||||
GtkPlugClass parent_class;
|
||||
|
||||
void (*__gtk_reserved1);
|
||||
void (*__gtk_reserved2);
|
||||
void (*__gtk_reserved3);
|
||||
void (*__gtk_reserved4);
|
||||
void (*__gtk_reserved5);
|
||||
void (*__gtk_reserved6);
|
||||
void (*__gtk_reserved1) (void);
|
||||
void (*__gtk_reserved2) (void);
|
||||
void (*__gtk_reserved3) (void);
|
||||
void (*__gtk_reserved4) (void);
|
||||
void (*__gtk_reserved5) (void);
|
||||
void (*__gtk_reserved6) (void);
|
||||
};
|
||||
|
||||
GType gtk_tray_icon_get_type (void) G_GNUC_CONST;
|
||||
|
|
|
|||
|
|
@ -465,6 +465,10 @@ void _gtk_tree_view_column_get_neighbor_sizes (GtkTreeViewColumn *c
|
|||
gint *right);
|
||||
|
||||
|
||||
G_GNUC_INTERNAL
|
||||
void _gtk_tree_view_set_fixed_height_mode_unchecked
|
||||
(GtkTreeView *tree_view);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -48,7 +48,11 @@
|
|||
|
||||
#define GTK_TREE_VIEW_PRIORITY_VALIDATE (GDK_PRIORITY_REDRAW + 5)
|
||||
#define GTK_TREE_VIEW_PRIORITY_SCROLL_SYNC (GTK_TREE_VIEW_PRIORITY_VALIDATE + 2)
|
||||
#define GTK_TREE_VIEW_TIME_MS_PER_IDLE 30
|
||||
#if defined(__arm__) && defined(__ARM_ARCH) && (__ARM_ARCH == 6)
|
||||
#define GTK_TREE_VIEW_TIME_MS_PER_IDLE 10
|
||||
#else
|
||||
#define GTK_TREE_VIEW_TIME_MS_PER_IDLE 2
|
||||
#endif
|
||||
#define SCROLL_EDGE_SIZE 15
|
||||
#define EXPANDER_EXTRA_PADDING 4
|
||||
#define GTK_TREE_VIEW_SEARCH_DIALOG_TIMEOUT 5000
|
||||
|
|
@ -7732,6 +7736,25 @@ column_sizing_notify (GObject *object,
|
|||
g_object_set (data, "fixed-height-mode", FALSE, NULL);
|
||||
}
|
||||
|
||||
/* Internal fixed-height mode for width-independent rows. */
|
||||
G_GNUC_INTERNAL
|
||||
void
|
||||
_gtk_tree_view_set_fixed_height_mode_unchecked (GtkTreeView *tree_view)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_TREE_VIEW (tree_view));
|
||||
|
||||
if (tree_view->priv->fixed_height_mode)
|
||||
return;
|
||||
|
||||
tree_view->priv->fixed_height_mode = TRUE;
|
||||
tree_view->priv->fixed_height = -1;
|
||||
|
||||
if (tree_view->priv->tree)
|
||||
initialize_fixed_height_mode (tree_view);
|
||||
|
||||
g_object_notify (G_OBJECT (tree_view), "fixed-height-mode");
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_tree_view_set_fixed_height_mode:
|
||||
* @tree_view: a #GtkTreeView
|
||||
|
|
@ -8927,6 +8950,16 @@ gtk_tree_view_clamp_node_visible (GtkTreeView *tree_view,
|
|||
path = _gtk_tree_view_find_path (tree_view, tree, node);
|
||||
if (path)
|
||||
{
|
||||
/* The first root row at the top cannot require scrolling. */
|
||||
if (tree_view->priv->vadjustment->value <=
|
||||
tree_view->priv->vadjustment->lower &&
|
||||
gtk_tree_path_get_depth (path) == 1 &&
|
||||
gtk_tree_path_get_indices (path)[0] == 0)
|
||||
{
|
||||
gtk_tree_path_free (path);
|
||||
return;
|
||||
}
|
||||
|
||||
/* We process updates because we want to clear old selected items when we scroll.
|
||||
* if this is removed, we get a "selection streak" at the bottom. */
|
||||
gdk_window_process_updates (tree_view->priv->bin_window, TRUE);
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ print <<EOF;
|
|||
|
||||
#include <glib.h>
|
||||
|
||||
#ifdef G_HAVE_GNUC_VISIBILITY
|
||||
#if defined(G_HAVE_GNUC_VISIBILITY) && !defined(__APPLE__)
|
||||
|
||||
EOF
|
||||
|
||||
|
|
|
|||
|
|
@ -159,9 +159,6 @@ query_module (const char *dir, const char *name, GString *contents)
|
|||
{
|
||||
void (*list) (const GtkIMContextInfo ***contexts,
|
||||
guint *n_contexts);
|
||||
G_GNUC_UNUSED void (*init) (GTypeModule *type_module);
|
||||
G_GNUC_UNUSED void (*exit) (void);
|
||||
G_GNUC_UNUSED GtkIMContext *(*create) (const gchar *context_id);
|
||||
|
||||
gpointer list_ptr;
|
||||
gpointer init_ptr;
|
||||
|
|
@ -196,9 +193,6 @@ query_module (const char *dir, const char *name, GString *contents)
|
|||
int i;
|
||||
|
||||
list = list_ptr;
|
||||
init = init_ptr;
|
||||
exit = exit_ptr;
|
||||
create = create_ptr;
|
||||
|
||||
print_escaped (contents, path);
|
||||
g_string_append_c (contents, '\n');
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ static int object = 0;
|
|||
static int object_after = 0;
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_normal (GtkWindow *window, GParamSpec spec)
|
||||
signal_normal (GtkWindow *window, GParamSpec *spec)
|
||||
{
|
||||
g_assert (GTK_IS_WINDOW (window));
|
||||
g_assert (normal == 0);
|
||||
|
|
@ -142,7 +142,7 @@ signal_normal (GtkWindow *window, GParamSpec spec)
|
|||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_after (GtkWindow *window, GParamSpec spec)
|
||||
signal_after (GtkWindow *window, GParamSpec *spec)
|
||||
{
|
||||
g_assert (GTK_IS_WINDOW (window));
|
||||
g_assert (normal == 1);
|
||||
|
|
@ -152,7 +152,7 @@ signal_after (GtkWindow *window, GParamSpec spec)
|
|||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_object (GtkButton *button, GParamSpec spec)
|
||||
signal_object (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (GTK_IS_BUTTON (button));
|
||||
g_assert (object == 0);
|
||||
|
|
@ -162,7 +162,7 @@ signal_object (GtkButton *button, GParamSpec spec)
|
|||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_object_after (GtkButton *button, GParamSpec spec)
|
||||
signal_object_after (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (GTK_IS_BUTTON (button));
|
||||
g_assert (object == 1);
|
||||
|
|
@ -172,28 +172,28 @@ signal_object_after (GtkButton *button, GParamSpec spec)
|
|||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_first (GtkButton *button, GParamSpec spec)
|
||||
signal_first (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (normal == 0);
|
||||
normal = 10;
|
||||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_second (GtkButton *button, GParamSpec spec)
|
||||
signal_second (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (normal == 10);
|
||||
normal = 20;
|
||||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_extra (GtkButton *button, GParamSpec spec)
|
||||
signal_extra (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (normal == 20);
|
||||
normal = 30;
|
||||
}
|
||||
|
||||
void /* exported for GtkBuilder */
|
||||
signal_extra2 (GtkButton *button, GParamSpec spec)
|
||||
signal_extra2 (GtkButton *button, GParamSpec *spec)
|
||||
{
|
||||
g_assert (normal == 30);
|
||||
normal = 40;
|
||||
|
|
|
|||
|
|
@ -608,6 +608,16 @@ replace_backslashes_with_slashes (gchar *path)
|
|||
path[i] = '/';
|
||||
}
|
||||
|
||||
static gint
|
||||
compare_string_pointers (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const gchar * const *str_a = a;
|
||||
const gchar * const *str_b = b;
|
||||
|
||||
return strcmp (*str_a, *str_b);
|
||||
}
|
||||
|
||||
static GList *
|
||||
scan_directory (const gchar *base_path,
|
||||
const gchar *subdir,
|
||||
|
|
@ -617,10 +627,12 @@ scan_directory (const gchar *base_path,
|
|||
{
|
||||
GHashTable *dir_hash;
|
||||
GDir *dir;
|
||||
GPtrArray *names;
|
||||
const gchar *name;
|
||||
gchar *dir_path;
|
||||
gboolean dir_added = FALSE;
|
||||
guint dir_index = 0xffff;
|
||||
guint i;
|
||||
|
||||
dir_path = g_build_path ("/", base_path, subdir, NULL);
|
||||
|
||||
|
|
@ -628,12 +640,25 @@ scan_directory (const gchar *base_path,
|
|||
dir = g_dir_open (dir_path, 0, NULL);
|
||||
|
||||
if (!dir)
|
||||
return directories;
|
||||
{
|
||||
g_free (dir_path);
|
||||
return directories;
|
||||
}
|
||||
|
||||
names = g_ptr_array_new_with_free_func (g_free);
|
||||
|
||||
while ((name = g_dir_read_name (dir)))
|
||||
g_ptr_array_add (names, g_strdup (name));
|
||||
|
||||
g_dir_close (dir);
|
||||
|
||||
g_ptr_array_sort (names, compare_string_pointers);
|
||||
|
||||
dir_hash = g_hash_table_new (g_str_hash, g_str_equal);
|
||||
|
||||
while ((name = g_dir_read_name (dir)))
|
||||
for (i = 0; i < names->len; i++)
|
||||
{
|
||||
name = g_ptr_array_index (names, i);
|
||||
gchar *path;
|
||||
gboolean retval;
|
||||
int flags = 0;
|
||||
|
|
@ -712,7 +737,8 @@ scan_directory (const gchar *base_path,
|
|||
g_free (path);
|
||||
}
|
||||
|
||||
g_dir_close (dir);
|
||||
g_ptr_array_free (names, TRUE);
|
||||
g_free (dir_path);
|
||||
|
||||
/* Move dir into the big file hash */
|
||||
g_hash_table_foreach_remove (dir_hash, foreach_remove_func, files);
|
||||
|
|
|
|||
|
|
@ -1021,7 +1021,7 @@ gail_button_get_image_position (AtkImage *image,
|
|||
if (button_image != NULL)
|
||||
{
|
||||
obj = gtk_widget_get_accessible (GTK_WIDGET (button_image));
|
||||
atk_component_get_position (ATK_COMPONENT (obj), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (obj), x, y, NULL, NULL, coord_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ gail_image_get_image_position (AtkImage *image,
|
|||
gint *y,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
atk_component_get_position (ATK_COMPONENT (image), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (image), x, y, NULL, NULL, coord_type);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ gail_image_cell_get_image_position (AtkImage *image,
|
|||
gint *y,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
atk_component_get_position (ATK_COMPONENT (image), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (image), x, y, NULL, NULL, coord_type);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -467,7 +467,7 @@ gail_notebook_page_get_extents (AtkComponent *component,
|
|||
child = atk_object_ref_accessible_child (ATK_OBJECT (component), 0);
|
||||
gail_return_if_fail (child);
|
||||
|
||||
atk_component_get_position (ATK_COMPONENT (child), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (child), x, y, NULL, NULL, coord_type);
|
||||
g_object_unref (child);
|
||||
}
|
||||
else
|
||||
|
|
|
|||
|
|
@ -43,6 +43,14 @@ static void gail_paned_get_minimum_value (AtkValue *obj,
|
|||
GValue *value);
|
||||
static gboolean gail_paned_set_current_value (AtkValue *obj,
|
||||
const GValue *value);
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
static void gail_paned_get_value_and_text (AtkValue *obj,
|
||||
gdouble *value,
|
||||
gchar **text);
|
||||
static AtkRange *gail_paned_get_range (AtkValue *obj);
|
||||
static void gail_paned_set_value (AtkValue *obj,
|
||||
gdouble new_value);
|
||||
#endif
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GailPaned, gail_paned, GAIL_TYPE_CONTAINER,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init))
|
||||
|
|
@ -112,6 +120,11 @@ atk_value_interface_init (AtkValueIface *iface)
|
|||
iface->get_maximum_value = gail_paned_get_maximum_value;
|
||||
iface->get_minimum_value = gail_paned_get_minimum_value;
|
||||
iface->set_current_value = gail_paned_set_current_value;
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
iface->get_value_and_text = gail_paned_get_value_and_text;
|
||||
iface->get_range = gail_paned_get_range;
|
||||
iface->set_value = gail_paned_set_value;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -197,3 +210,58 @@ gail_paned_set_current_value (AtkValue *obj,
|
|||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
static void
|
||||
gail_paned_get_value_and_text (AtkValue *obj,
|
||||
gdouble *value,
|
||||
gchar **text)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
if (text)
|
||||
*text = NULL;
|
||||
|
||||
if (!value)
|
||||
return;
|
||||
|
||||
widget = GTK_ACCESSIBLE (obj)->widget;
|
||||
if (widget == NULL)
|
||||
{
|
||||
*value = 0.0;
|
||||
return;
|
||||
}
|
||||
|
||||
*value = gtk_paned_get_position (GTK_PANED (widget));
|
||||
}
|
||||
|
||||
static AtkRange *
|
||||
gail_paned_get_range (AtkValue *obj)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkPaned *paned;
|
||||
|
||||
widget = GTK_ACCESSIBLE (obj)->widget;
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
|
||||
return atk_range_new (paned->min_position, paned->max_position, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gail_paned_set_value (AtkValue *obj,
|
||||
gdouble value)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
gint new_value;
|
||||
|
||||
widget = GTK_ACCESSIBLE (obj)->widget;
|
||||
if (widget == NULL)
|
||||
return;
|
||||
|
||||
new_value = (gint) value;
|
||||
gtk_paned_set_position (GTK_PANED (widget), new_value);
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ gail_pixmap_get_image_position (AtkImage *obj,
|
|||
gint *y,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
atk_component_get_position (ATK_COMPONENT (obj), x, y, coord_type);
|
||||
atk_component_get_extents (ATK_COMPONENT (obj), x, y, NULL, NULL, coord_type);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -125,7 +125,17 @@ gail_progress_bar_get_current_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_current_value (ATK_VALUE (progress_bar->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (progress_bar->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->value);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -143,7 +153,17 @@ gail_progress_bar_get_maximum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_maximum_value (ATK_VALUE (progress_bar->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (progress_bar->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->upper);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -161,7 +181,17 @@ gail_progress_bar_get_minimum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_minimum_value (ATK_VALUE (progress_bar->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (progress_bar->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->lower);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -180,7 +180,17 @@ gail_range_get_current_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_current_value (ATK_VALUE (range->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (range->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->value);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -201,7 +211,17 @@ gail_range_get_maximum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_maximum_value (ATK_VALUE (range->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (range->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->upper);
|
||||
}
|
||||
|
||||
gtk_range = GTK_RANGE (gtk_accessible_get_widget (GTK_ACCESSIBLE (range)));
|
||||
g_return_if_fail (gtk_range);
|
||||
|
|
@ -231,7 +251,17 @@ gail_range_get_minimum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_minimum_value (ATK_VALUE (range->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (range->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->lower);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -248,7 +278,31 @@ gail_range_get_minimum_increment (AtkValue *obj, GValue *value)
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_minimum_increment (ATK_VALUE (range->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
gdouble minimum_increment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (range->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
if (adjustment->step_increment != 0 &&
|
||||
adjustment->page_increment != 0)
|
||||
{
|
||||
if (ABS (adjustment->step_increment) < ABS (adjustment->page_increment))
|
||||
minimum_increment = adjustment->step_increment;
|
||||
else
|
||||
minimum_increment = adjustment->page_increment;
|
||||
}
|
||||
else if (adjustment->step_increment != 0)
|
||||
minimum_increment = adjustment->step_increment;
|
||||
else
|
||||
minimum_increment = adjustment->page_increment;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, minimum_increment);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean gail_range_set_current_value (AtkValue *obj,
|
||||
|
|
|
|||
|
|
@ -127,7 +127,17 @@ gail_spin_button_get_current_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_current_value (ATK_VALUE (spin_button->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (spin_button->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->value);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -145,7 +155,17 @@ gail_spin_button_get_maximum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_maximum_value (ATK_VALUE (spin_button->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (spin_button->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->upper);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -163,7 +183,17 @@ gail_spin_button_get_minimum_value (AtkValue *obj,
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_minimum_value (ATK_VALUE (spin_button->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (spin_button->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, adjustment->lower);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -180,7 +210,31 @@ gail_spin_button_get_minimum_increment (AtkValue *obj, GValue *value)
|
|||
*/
|
||||
return;
|
||||
|
||||
atk_value_get_minimum_increment (ATK_VALUE (spin_button->adjustment), value);
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
gdouble minimum_increment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (spin_button->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return;
|
||||
|
||||
if (adjustment->step_increment != 0 &&
|
||||
adjustment->page_increment != 0)
|
||||
{
|
||||
if (ABS (adjustment->step_increment) < ABS (adjustment->page_increment))
|
||||
minimum_increment = adjustment->step_increment;
|
||||
else
|
||||
minimum_increment = adjustment->page_increment;
|
||||
}
|
||||
else if (adjustment->step_increment != 0)
|
||||
minimum_increment = adjustment->step_increment;
|
||||
else
|
||||
minimum_increment = adjustment->page_increment;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
g_value_init (value, G_TYPE_DOUBLE);
|
||||
g_value_set_double (value, minimum_increment);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
|
@ -198,7 +252,19 @@ gail_spin_button_set_current_value (AtkValue *obj,
|
|||
*/
|
||||
return FALSE;
|
||||
|
||||
return atk_value_set_current_value (ATK_VALUE (spin_button->adjustment), value);
|
||||
if (G_VALUE_HOLDS_DOUBLE (value))
|
||||
{
|
||||
GtkAdjustment *adjustment;
|
||||
|
||||
adjustment = GAIL_ADJUSTMENT (spin_button->adjustment)->adjustment;
|
||||
if (adjustment == NULL)
|
||||
return FALSE;
|
||||
|
||||
gtk_adjustment_set_value (adjustment, g_value_get_double (value));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -251,7 +251,7 @@ gail_misc_layout_get_run_attributes (AtkAttributeSet *attrib_set,
|
|||
if ((pango_string = (PangoAttrString*) pango_attr_iterator_get (iter,
|
||||
PANGO_ATTR_FAMILY)) != NULL)
|
||||
{
|
||||
value = g_strdup_printf("%s", pango_string->value);
|
||||
value = g_strdup (pango_string->value);
|
||||
attrib_set = gail_misc_add_attribute (attrib_set,
|
||||
ATK_TEXT_ATTR_FAMILY_NAME,
|
||||
value);
|
||||
|
|
|
|||
|
|
@ -1512,9 +1512,10 @@ _button_watcher (GSignalInvocationHint *ihint,
|
|||
event = (GdkEventButton *) gp;
|
||||
aobject = gtk_widget_get_accessible (widget);
|
||||
aobject_x = aobject_y = 0;
|
||||
atk_component_get_position (ATK_COMPONENT (aobject),
|
||||
&aobject_x, &aobject_y,
|
||||
ATK_XY_WINDOW);
|
||||
atk_component_get_extents (ATK_COMPONENT (aobject),
|
||||
&aobject_x, &aobject_y,
|
||||
NULL, NULL,
|
||||
ATK_XY_WINDOW);
|
||||
x = aobject_x + (gint) event->x;
|
||||
y = aobject_y + (gint) event->y;
|
||||
child = atk_component_ref_accessible_at_point (ATK_COMPONENT (aobject),
|
||||
|
|
|
|||
|
|
@ -16,11 +16,11 @@ static void _check_position (AtkObject *obj)
|
|||
return;
|
||||
|
||||
atk_component_get_extents (ATK_COMPONENT(obj), &x, &y, &width, &height, ATK_XY_SCREEN);
|
||||
atk_component_get_position (ATK_COMPONENT(obj), &x1, &y1, ATK_XY_SCREEN );
|
||||
atk_component_get_extents (ATK_COMPONENT(obj), &x1, &y1, NULL, NULL, ATK_XY_SCREEN);
|
||||
atk_component_get_size (ATK_COMPONENT(obj), &width1, &height1);
|
||||
if ((x1 != x) || (y1 != y))
|
||||
{
|
||||
g_print ("atk_component_get_extents and atk_get_position give different"
|
||||
g_print ("Repeated atk_component_get_extents calls give different"
|
||||
" values: %d,%d %d,%d\n", x, y, x1, y1);
|
||||
}
|
||||
if ((width1 != width) || (height1 != height))
|
||||
|
|
@ -29,7 +29,7 @@ static void _check_position (AtkObject *obj)
|
|||
" values: %d,%d %d,%d\n", width, height, width1, height1);
|
||||
}
|
||||
|
||||
atk_component_get_position (ATK_COMPONENT(obj), &x1, &y1, ATK_XY_SCREEN);
|
||||
atk_component_get_extents (ATK_COMPONENT(obj), &x1, &y1, NULL, NULL, ATK_XY_SCREEN);
|
||||
g_print ("Object Type: %s\n", g_type_name (G_OBJECT_TYPE (obj)));
|
||||
g_print ("Object at %d, %d on screen\n", x1, y1);
|
||||
g_print ("Object at %d, %d, size: %d, %d\n", x, y, width, height);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,103 @@ static void _property_change_handler (AtkObject *obj,
|
|||
#define NUM_VALID_ROLES 1
|
||||
static gint last_position;
|
||||
|
||||
static gint
|
||||
test_value_get_current_int (AtkValue *obj)
|
||||
{
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
gdouble value = 0.0;
|
||||
|
||||
atk_value_get_value_and_text (obj, &value, NULL);
|
||||
|
||||
return (gint) value;
|
||||
#else
|
||||
GValue value = G_VALUE_INIT;
|
||||
gint result;
|
||||
|
||||
atk_value_get_current_value (obj, &value);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_INT (&value), 0);
|
||||
|
||||
result = g_value_get_int (&value);
|
||||
g_value_unset (&value);
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
static gint
|
||||
test_value_get_minimum_int (AtkValue *obj)
|
||||
{
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
AtkRange *range;
|
||||
gint value = 0;
|
||||
|
||||
range = atk_value_get_range (obj);
|
||||
if (range)
|
||||
{
|
||||
value = (gint) atk_range_get_lower_limit (range);
|
||||
atk_range_free (range);
|
||||
}
|
||||
|
||||
return value;
|
||||
#else
|
||||
GValue value = G_VALUE_INIT;
|
||||
gint result;
|
||||
|
||||
atk_value_get_minimum_value (obj, &value);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_INT (&value), 0);
|
||||
|
||||
result = g_value_get_int (&value);
|
||||
g_value_unset (&value);
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
static gint
|
||||
test_value_get_maximum_int (AtkValue *obj)
|
||||
{
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
AtkRange *range;
|
||||
gint value = 0;
|
||||
|
||||
range = atk_value_get_range (obj);
|
||||
if (range)
|
||||
{
|
||||
value = (gint) atk_range_get_upper_limit (range);
|
||||
atk_range_free (range);
|
||||
}
|
||||
|
||||
return value;
|
||||
#else
|
||||
GValue value = G_VALUE_INIT;
|
||||
gint result;
|
||||
|
||||
atk_value_get_maximum_value (obj, &value);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_INT (&value), 0);
|
||||
|
||||
result = g_value_get_int (&value);
|
||||
g_value_unset (&value);
|
||||
|
||||
return result;
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
test_value_set_current_int (AtkValue *obj,
|
||||
gint value)
|
||||
{
|
||||
#if ATK_CHECK_VERSION (2, 12, 0)
|
||||
atk_value_set_value (obj, value);
|
||||
#else
|
||||
GValue gvalue = G_VALUE_INIT;
|
||||
|
||||
g_value_init (&gvalue, G_TYPE_INT);
|
||||
g_value_set_int (&gvalue, value);
|
||||
atk_value_set_current_value (obj, &gvalue);
|
||||
g_value_unset (&gvalue);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void _property_change_handler (AtkObject *obj,
|
||||
AtkPropertyValues *values)
|
||||
{
|
||||
|
|
@ -26,24 +123,17 @@ static void _property_change_handler (AtkObject *obj,
|
|||
values->property_name ? values->property_name: "NULL");
|
||||
if (strcmp (values->property_name, "accessible-value") == 0)
|
||||
{
|
||||
GValue *value, val;
|
||||
int position;
|
||||
value = &val;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
atk_value_get_current_value (ATK_VALUE (obj), value);
|
||||
g_return_if_fail (G_VALUE_HOLDS_INT (value));
|
||||
position = g_value_get_int (value);
|
||||
position = test_value_get_current_int (ATK_VALUE (obj));
|
||||
g_print ("Position is %d previous position was %d\n",
|
||||
position, last_position);
|
||||
last_position = position;
|
||||
atk_value_get_minimum_value (ATK_VALUE (obj), value);
|
||||
g_return_if_fail (G_VALUE_HOLDS_INT (value));
|
||||
position = g_value_get_int (value);
|
||||
|
||||
position = test_value_get_minimum_int (ATK_VALUE (obj));
|
||||
g_print ("Minimum Value is %d\n", position);
|
||||
atk_value_get_maximum_value (ATK_VALUE (obj), value);
|
||||
g_return_if_fail (G_VALUE_HOLDS_INT (value));
|
||||
position = g_value_get_int (value);
|
||||
|
||||
position = test_value_get_maximum_int (ATK_VALUE (obj));
|
||||
g_print ("Maximum Value is %d\n", position);
|
||||
}
|
||||
}
|
||||
|
|
@ -56,19 +146,13 @@ static gint _test_paned (gpointer data)
|
|||
|
||||
if (role == ATK_ROLE_SPLIT_PANE)
|
||||
{
|
||||
GValue *value, val;
|
||||
int position;
|
||||
value = &val;
|
||||
|
||||
memset (value, 0, sizeof (GValue));
|
||||
atk_value_get_current_value (ATK_VALUE (obj), value);
|
||||
g_return_val_if_fail (G_VALUE_HOLDS_INT (value), FALSE);
|
||||
position = g_value_get_int (value);
|
||||
position = test_value_get_current_int (ATK_VALUE (obj));
|
||||
g_print ("Position is : %d\n", position);
|
||||
last_position = position;
|
||||
position *= 2;
|
||||
g_value_set_int (value, position);
|
||||
atk_value_set_current_value (ATK_VALUE (obj), value);
|
||||
test_value_set_current_int (ATK_VALUE (obj), position);
|
||||
times++;
|
||||
}
|
||||
if (times < 4)
|
||||
|
|
|
|||
|
|
@ -27,12 +27,14 @@ backend_LTLIBRARIES = libprintbackend-cups.la
|
|||
libprintbackend_cups_la_SOURCES = \
|
||||
gtkprintbackendcups.c \
|
||||
gtkprintercups.c \
|
||||
gtkcupsutils.c
|
||||
gtkcupsutils.c \
|
||||
gtkcupssecretsutils.c
|
||||
|
||||
noinst_HEADERS = \
|
||||
gtkprintbackendcups.h \
|
||||
gtkprintercups.h \
|
||||
gtkcupsutils.h
|
||||
gtkcupsutils.h \
|
||||
gtkcupssecretsutils.h
|
||||
|
||||
libprintbackend_cups_la_LDFLAGS = -avoid-version -module $(no_undefined)
|
||||
libprintbackend_cups_la_LIBADD = $(LDADDS) $(CUPS_LIBS)
|
||||
|
|
|
|||
1048
modules/printbackends/cups/gtkcupssecretsutils.c
Normal file
1048
modules/printbackends/cups/gtkcupssecretsutils.c
Normal file
File diff suppressed because it is too large
Load diff
41
modules/printbackends/cups/gtkcupssecretsutils.h
Normal file
41
modules/printbackends/cups/gtkcupssecretsutils.h
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
/* gtkcupssecretsutils.h: Helper to use a secrets service for printer passwords
|
||||
* Copyright (C) 2014 Intevation GmbH
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef __GTK_SECRETS_UTILS_H__
|
||||
#define __GTK_SECRETS_UTILS_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
#include "gtkcupsutils.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void gtk_cups_secrets_service_query_task (gpointer source_object,
|
||||
GCancellable *cancellable,
|
||||
GAsyncReadyCallback callback,
|
||||
gpointer user_data,
|
||||
const gchar *printer_uri,
|
||||
gchar **auth_info_required);
|
||||
guint gtk_cups_secrets_service_watch (GBusNameAppearedCallback appeared,
|
||||
GBusNameVanishedCallback vanished,
|
||||
gpointer user_data);
|
||||
void gtk_cups_secrets_service_store (gchar **auth_info,
|
||||
gchar **auth_info_labels,
|
||||
const gchar *printer_uri);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SECRETS_UTILS_H__ */
|
||||
|
|
@ -34,6 +34,11 @@
|
|||
|
||||
typedef void (*GtkCupsRequestStateFunc) (GtkCupsRequest *request);
|
||||
|
||||
static http_t *gtk_cups_http_connect (const char *host,
|
||||
int port,
|
||||
http_encryption_t encryption);
|
||||
static int gtk_cups_http_reconnect (http_t *http);
|
||||
|
||||
static void _connect (GtkCupsRequest *request);
|
||||
static void _post_send (GtkCupsRequest *request);
|
||||
static void _post_write_request (GtkCupsRequest *request);
|
||||
|
|
@ -171,7 +176,7 @@ gtk_cups_request_new_with_username (http_t *connection,
|
|||
else
|
||||
{
|
||||
request->http = NULL;
|
||||
request->http = httpConnectEncrypt (request->server,
|
||||
request->http = gtk_cups_http_connect (request->server,
|
||||
ippPort (),
|
||||
cupsEncryption ());
|
||||
|
||||
|
|
@ -681,6 +686,29 @@ gtk_cups_request_set_ipp_version (GtkCupsRequest *request,
|
|||
ippSetVersion (request->ipp_request, major, minor);
|
||||
}
|
||||
|
||||
|
||||
static http_t *
|
||||
gtk_cups_http_connect (const char *host,
|
||||
int port,
|
||||
http_encryption_t encryption)
|
||||
{
|
||||
#ifdef HAVE_HTTPCONNECT2
|
||||
return httpConnect2 (host, port, NULL, AF_UNSPEC, encryption, 0, 30000, NULL);
|
||||
#else
|
||||
return httpConnectEncrypt (host, port, encryption);
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
gtk_cups_http_reconnect (http_t *http)
|
||||
{
|
||||
#ifdef HAVE_HTTPRECONNECT2
|
||||
return httpReconnect2 (http, 30000, NULL);
|
||||
#else
|
||||
return httpReconnect (http);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
_connect (GtkCupsRequest *request)
|
||||
{
|
||||
|
|
@ -689,7 +717,7 @@ _connect (GtkCupsRequest *request)
|
|||
|
||||
if (request->http == NULL)
|
||||
{
|
||||
request->http = httpConnectEncrypt (request->server,
|
||||
request->http = gtk_cups_http_connect (request->server,
|
||||
ippPort (),
|
||||
cupsEncryption ());
|
||||
|
||||
|
|
@ -744,7 +772,7 @@ _post_send (GtkCupsRequest *request)
|
|||
|
||||
if (httpPost (request->http, request->resource))
|
||||
{
|
||||
if (httpReconnect (request->http))
|
||||
if (gtk_cups_http_reconnect (request->http))
|
||||
{
|
||||
request->state = GTK_CUPS_POST_DONE;
|
||||
request->poll_state = GTK_CUPS_HTTP_IDLE;
|
||||
|
|
@ -1046,7 +1074,7 @@ _post_check (GtkCupsRequest *request)
|
|||
}
|
||||
|
||||
if (auth_result ||
|
||||
httpReconnect (request->http))
|
||||
gtk_cups_http_reconnect (request->http))
|
||||
{
|
||||
/* if the password has been used, reset password_state
|
||||
* so that we ask for a new one next time around
|
||||
|
|
@ -1105,7 +1133,7 @@ _post_check (GtkCupsRequest *request)
|
|||
request->state = GTK_CUPS_POST_CONNECT;
|
||||
|
||||
/* Reconnect... */
|
||||
httpReconnect (request->http);
|
||||
gtk_cups_http_reconnect (request->http);
|
||||
|
||||
/* Upgrade with encryption... */
|
||||
httpEncryption (request->http, HTTP_ENCRYPT_REQUIRED);
|
||||
|
|
@ -1232,7 +1260,7 @@ _get_send (GtkCupsRequest *request)
|
|||
|
||||
if (httpGet (request->http, request->resource))
|
||||
{
|
||||
if (httpReconnect (request->http))
|
||||
if (gtk_cups_http_reconnect (request->http))
|
||||
{
|
||||
request->state = GTK_CUPS_GET_DONE;
|
||||
request->poll_state = GTK_CUPS_HTTP_IDLE;
|
||||
|
|
@ -1341,7 +1369,7 @@ _get_check (GtkCupsRequest *request)
|
|||
}
|
||||
|
||||
if (auth_result ||
|
||||
httpReconnect (request->http))
|
||||
gtk_cups_http_reconnect (request->http))
|
||||
{
|
||||
/* if the password has been used, reset password_state
|
||||
* so that we ask for a new one next time around
|
||||
|
|
@ -1373,7 +1401,7 @@ _get_check (GtkCupsRequest *request)
|
|||
request->state = GTK_CUPS_GET_CONNECT;
|
||||
|
||||
/* Reconnect... */
|
||||
httpReconnect (request->http);
|
||||
gtk_cups_http_reconnect (request->http);
|
||||
|
||||
/* Upgrade with encryption... */
|
||||
httpEncryption (request->http, HTTP_ENCRYPT_REQUIRED);
|
||||
|
|
|
|||
|
|
@ -60,6 +60,11 @@
|
|||
#include "gtkprintercups.h"
|
||||
|
||||
#include "gtkcupsutils.h"
|
||||
#include "gtkcupssecretsutils.h"
|
||||
|
||||
#define GTK_PRINT_BACKEND_CAN_STORE_AUTH_INFO_KEY "gtk-print-backend-can-store-auth-info"
|
||||
#define GTK_PRINT_BACKEND_STORE_AUTH_INFO_KEY "gtk-print-backend-store-auth-info"
|
||||
#define GTK_PRINT_BACKEND_AUTH_PRINTER_URI_KEY "gtk-print-backend-auth-printer-uri"
|
||||
|
||||
|
||||
typedef struct _GtkPrintBackendCupsClass GtkPrintBackendCupsClass;
|
||||
|
|
@ -144,6 +149,9 @@ struct _GtkPrintBackendCups
|
|||
GHashTable *auth;
|
||||
gchar *username;
|
||||
gboolean authentication_lock;
|
||||
|
||||
gboolean secrets_service_available;
|
||||
guint secrets_service_watch_id;
|
||||
#ifdef HAVE_CUPS_API_1_6
|
||||
GDBusConnection *dbus_connection;
|
||||
gchar *avahi_default_printer;
|
||||
|
|
@ -213,6 +221,14 @@ static cairo_surface_t * cups_printer_create_cairo_surface (GtkPrinter
|
|||
static void gtk_print_backend_cups_set_password (GtkPrintBackend *backend,
|
||||
gchar **auth_info_required,
|
||||
gchar **auth_info);
|
||||
static void secrets_service_appeared (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
const gchar *name_owner,
|
||||
gpointer user_data);
|
||||
static void secrets_service_vanished (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
gpointer user_data);
|
||||
|
||||
|
||||
void overwrite_and_free (gpointer data);
|
||||
static gboolean is_address_local (const gchar *address);
|
||||
|
|
@ -489,6 +505,22 @@ cups_free_print_stream_data (CupsPrintStreamData *data)
|
|||
g_free (data);
|
||||
}
|
||||
|
||||
|
||||
static http_t *
|
||||
gtk_cups_backend_http_connect (const char *host,
|
||||
int port,
|
||||
http_encryption_t encryption)
|
||||
{
|
||||
#ifdef HAVE_HTTPCONNECT2
|
||||
return httpConnect2 (host, port, NULL, AF_UNSPEC, encryption, 1, 30000, NULL);
|
||||
#else
|
||||
if (encryption == HTTP_ENCRYPT_NEVER)
|
||||
return httpConnect (host, port);
|
||||
|
||||
return httpConnectEncrypt (host, port, encryption);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
cups_print_cb (GtkPrintBackendCups *print_backend,
|
||||
GtkCupsResult *result,
|
||||
|
|
@ -636,7 +668,7 @@ gtk_print_backend_cups_print_stream (GtkPrintBackend *print_backend,
|
|||
{
|
||||
http_t *http;
|
||||
|
||||
http = httpConnect (cups_printer->hostname, cups_printer->port);
|
||||
http = gtk_cups_backend_http_connect (cups_printer->hostname, cups_printer->port, HTTP_ENCRYPT_NEVER);
|
||||
if (http)
|
||||
{
|
||||
request = gtk_cups_request_new_with_username (http,
|
||||
|
|
@ -751,6 +783,27 @@ void overwrite_and_free (gpointer data)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
secrets_service_appeared (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
const gchar *name_owner,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (user_data);
|
||||
|
||||
cups_backend->secrets_service_available = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
secrets_service_vanished (GDBusConnection *connection,
|
||||
const gchar *name,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (user_data);
|
||||
|
||||
cups_backend->secrets_service_available = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_print_backend_cups_init (GtkPrintBackendCups *backend_cups)
|
||||
{
|
||||
|
|
@ -767,6 +820,11 @@ gtk_print_backend_cups_init (GtkPrintBackendCups *backend_cups)
|
|||
backend_cups->requests = NULL;
|
||||
backend_cups->auth = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, overwrite_and_free);
|
||||
backend_cups->authentication_lock = FALSE;
|
||||
backend_cups->secrets_service_available = FALSE;
|
||||
backend_cups->secrets_service_watch_id =
|
||||
gtk_cups_secrets_service_watch (secrets_service_appeared,
|
||||
secrets_service_vanished,
|
||||
backend_cups);
|
||||
|
||||
backend_cups->covers = NULL;
|
||||
backend_cups->number_of_covers = 0;
|
||||
|
|
@ -836,6 +894,12 @@ gtk_print_backend_cups_dispose (GObject *object)
|
|||
|
||||
backend_cups = GTK_PRINT_BACKEND_CUPS (object);
|
||||
|
||||
if (backend_cups->secrets_service_watch_id != 0)
|
||||
{
|
||||
g_bus_unwatch_name (backend_cups->secrets_service_watch_id);
|
||||
backend_cups->secrets_service_watch_id = 0;
|
||||
}
|
||||
|
||||
if (backend_cups->list_printers_poll > 0)
|
||||
g_source_remove (backend_cups->list_printers_poll);
|
||||
backend_cups->list_printers_poll = 0;
|
||||
|
|
@ -940,7 +1004,7 @@ gtk_print_backend_cups_set_password (GtkPrintBackend *backend,
|
|||
GtkPrintBackendCups *cups_backend = GTK_PRINT_BACKEND_CUPS (backend);
|
||||
GList *l;
|
||||
char dispatch_hostname[HTTP_MAX_URI];
|
||||
gchar *key;
|
||||
gchar *key = NULL;
|
||||
gchar *username = NULL;
|
||||
gchar *hostname = NULL;
|
||||
gchar *password = NULL;
|
||||
|
|
@ -962,15 +1026,27 @@ gtk_print_backend_cups_set_password (GtkPrintBackend *backend,
|
|||
|
||||
if (hostname != NULL && username != NULL && password != NULL)
|
||||
{
|
||||
const gchar *printer_uri;
|
||||
gboolean store_auth_info;
|
||||
|
||||
key = g_strconcat (username, "@", hostname, NULL);
|
||||
g_hash_table_insert (cups_backend->auth, key, g_strdup (password));
|
||||
|
||||
printer_uri = g_object_get_data (G_OBJECT (backend),
|
||||
GTK_PRINT_BACKEND_AUTH_PRINTER_URI_KEY);
|
||||
store_auth_info = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (backend),
|
||||
GTK_PRINT_BACKEND_STORE_AUTH_INFO_KEY));
|
||||
|
||||
if (store_auth_info && cups_backend->secrets_service_available && printer_uri != NULL)
|
||||
gtk_cups_secrets_service_store (auth_info, auth_info_required, printer_uri);
|
||||
}
|
||||
|
||||
g_free (cups_backend->username);
|
||||
cups_backend->username = g_strdup (username);
|
||||
|
||||
GTK_NOTE (PRINTING,
|
||||
g_print ("CUPS backend: storing password for %s\n", key));
|
||||
if (key != NULL)
|
||||
GTK_NOTE (PRINTING,
|
||||
g_print ("CUPS backend: storing password for %s\n", key));
|
||||
|
||||
for (l = cups_backend->requests; l; l = l->next)
|
||||
{
|
||||
|
|
@ -1114,6 +1190,14 @@ request_password (gpointer data)
|
|||
|
||||
g_free (printer_name);
|
||||
|
||||
g_object_set_data (G_OBJECT (dispatch->backend),
|
||||
GTK_PRINT_BACKEND_CAN_STORE_AUTH_INFO_KEY,
|
||||
GINT_TO_POINTER (dispatch->backend->secrets_service_available));
|
||||
g_object_set_data_full (G_OBJECT (dispatch->backend),
|
||||
GTK_PRINT_BACKEND_AUTH_PRINTER_URI_KEY,
|
||||
g_strdup (printer_uri),
|
||||
g_free);
|
||||
|
||||
g_signal_emit_by_name (dispatch->backend, "request-password",
|
||||
auth_info_required, auth_info_default, auth_info_display, auth_info_visible, prompt);
|
||||
|
||||
|
|
@ -2555,7 +2639,7 @@ cups_request_avahi_printer_info (const gchar *printer_uri,
|
|||
AvahiService *service;
|
||||
http_t *http;
|
||||
|
||||
http = httpConnect (host, port);
|
||||
http = gtk_cups_backend_http_connect (host, port, HTTP_ENCRYPT_NEVER);
|
||||
if (http)
|
||||
{
|
||||
service = (AvahiService *) g_new0 (AvahiService, 1);
|
||||
|
|
@ -3438,7 +3522,7 @@ cups_request_ppd (GtkPrinter *printer)
|
|||
}
|
||||
}
|
||||
|
||||
http = httpConnectEncrypt (cups_printer->hostname,
|
||||
http = gtk_cups_backend_http_connect (cups_printer->hostname,
|
||||
cups_printer->port,
|
||||
cupsEncryption ());
|
||||
|
||||
|
|
|
|||
94
po/de.po
94
po/de.po
|
|
@ -2743,7 +2743,7 @@ msgstr "_Aufsteigend"
|
|||
#: ../gtk/gtkstock.c:427
|
||||
msgctxt "Stock label"
|
||||
msgid "_Descending"
|
||||
msgstr "_Absteigend"
|
||||
msgstr "A_bsteigend"
|
||||
|
||||
#: ../gtk/gtkstock.c:428
|
||||
msgctxt "Stock label"
|
||||
|
|
@ -6086,3 +6086,95 @@ msgstr ""
|
|||
|
||||
#~ msgid "X"
|
||||
#~ msgstr "X"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "A file named \"%s\" already exists."
|
||||
msgstr "Eine Datei namens „%s“ existiert bereits."
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Choose a new name for the pasted file."
|
||||
msgstr "Neuen Namen für die eingefügte Datei wählen."
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "New name:"
|
||||
msgstr "Neuer Name:"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Open _Containing Folder"
|
||||
msgstr "_Dateipfad öffnen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Could not paste files"
|
||||
msgstr "Dateien konnten nicht eingefügt werden"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Could not move %s"
|
||||
msgstr "%s konnte nicht verschoben werden"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Could not copy %s"
|
||||
msgstr "%s konnte nicht kopiert werden"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Could not move %s to the trash"
|
||||
msgstr "%s konnte nicht in den Papierkorb verschoben werden"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Could not move files to the trash"
|
||||
msgstr "Dateien konnten nicht in den Papierkorb verschoben werden"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "_Copy Location"
|
||||
msgstr "_Pfad kopieren"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "_Rename..."
|
||||
msgstr "_Umbenennen …"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Move to _Trash"
|
||||
msgstr "In den _Papierkorb verschieben"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Show _Preview Panel"
|
||||
msgstr "_Vorschauleiste anzeigen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Show _Thumbnails"
|
||||
msgstr "_Vorschaubilder anzeigen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "List View"
|
||||
msgstr "Listenansicht"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Icon View"
|
||||
msgstr "Symbolansicht"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Compact View"
|
||||
msgstr "Kompaktansicht"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Show Preview Panel"
|
||||
msgstr "Vorschauleiste anzeigen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Arrange Items"
|
||||
msgstr "Objekte anordnen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "Arrange _Items"
|
||||
msgstr "_Objekte anordnen"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "By _Name"
|
||||
msgstr "Nach _Name"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "By _Size"
|
||||
msgstr "Nach _Größe"
|
||||
|
||||
#: gtk/gtkfilechooserdefault.c
|
||||
msgid "By _Modification Date"
|
||||
msgstr "Nach _Änderungsdatum"
|
||||
|
|
|
|||
|
|
@ -628,9 +628,9 @@ create_tree_model (void)
|
|||
gint i;
|
||||
GType *t;
|
||||
volatile GType dummy G_GNUC_UNUSED; /* G_GNUC_CONST makes the optimizer remove
|
||||
* get_type calls if you don't do something
|
||||
* like this
|
||||
*/
|
||||
* get_type calls if you don't do something
|
||||
* like this
|
||||
*/
|
||||
|
||||
/* Make the tree more interesting */
|
||||
dummy = gtk_scrolled_window_get_type ();
|
||||
|
|
|
|||
Loading…
Reference in a new issue