forked from AuroraMiddleware/gtk
Merge master into places-sidebar to keep up with development
This commit is contained in:
commit
1dfd0e8c9b
10
INSTALL.in
10
INSTALL.in
@ -18,12 +18,12 @@ GTK+ requires the following packages:
|
||||
Simple install procedure
|
||||
========================
|
||||
|
||||
% gzip -cd gtk+-@GTK_VERSION@.tar.gz | tar xvf - # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
% tar xf gtk+-@GTK_VERSION@.tar.xz # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
[ Become root if necessary ]
|
||||
% make install # install GTK+
|
||||
% make install # install GTK+
|
||||
|
||||
The Details
|
||||
===========
|
||||
|
188
NEWS
188
NEWS
@ -1,3 +1,191 @@
|
||||
Overview of Changes in GTK+ 3.6.1
|
||||
=================================
|
||||
|
||||
* CSS:
|
||||
- huge refactoring to avoid computing wrong values
|
||||
- treeview: Invalidate children properly
|
||||
- treeview: Fix computing child paths
|
||||
|
||||
* Broadway:
|
||||
- use binary websockets when available
|
||||
|
||||
* Bugs fixed:
|
||||
646221 Imperfect Russian translation of 'Print preview'...
|
||||
682395 Nautilus tabs have black background
|
||||
684517 window: Delay showing auto mnemonics on focus in
|
||||
684639 GTK+ 3.5.18 makes Epiphany unusable
|
||||
684984 No focus rendering for Icon Views in SELECTION_N...
|
||||
685449 Non-uniform borders on GtkScrolledWindow break c...
|
||||
685996 trivial build fix: test uses = not ==
|
||||
Fix a multi-display problem in touch handle code
|
||||
App chooser: respect NoDisplay
|
||||
|
||||
* Translation updates:
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Italian
|
||||
Japanese
|
||||
Khmer
|
||||
Norwegian bokmål
|
||||
Russian
|
||||
Slovak
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.6.0
|
||||
=================================
|
||||
|
||||
* Add support for blur to CSS shadows
|
||||
|
||||
* Bugs fixed:
|
||||
679883 When printing Custom paper sizes GTK Print Dialog...
|
||||
684258 Crash when calling gtk_application_set_menubar twice
|
||||
684606 GtkMenuButton: implement rtl flipping
|
||||
684607 GtkSearchEntry: flip the clear icon in rtl
|
||||
Fix style context path for internal buttons
|
||||
|
||||
* Translation updates:
|
||||
Bengali
|
||||
Brazilian Portuguese
|
||||
Bulgarian
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Czech
|
||||
Galician
|
||||
German
|
||||
Gujarati
|
||||
Hebrew
|
||||
Hindi
|
||||
Kannada
|
||||
Kyrgyz
|
||||
Latvian
|
||||
Malayalam
|
||||
Punjabi
|
||||
Russian
|
||||
Serbian
|
||||
Telugu
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.18
|
||||
==================================
|
||||
|
||||
* GMenu:
|
||||
- Support namespaces for actions
|
||||
- Allow submenus to have actions for opening
|
||||
- New function: gtk_menu_shell_bind_model
|
||||
|
||||
* CSS:
|
||||
- Parse and support CSS animations
|
||||
- Support cross-fading and transitions
|
||||
|
||||
* OS X:
|
||||
- Adjust scrollbar and scale behavior according to platform
|
||||
|
||||
* Bugs fixed
|
||||
643611 Leak on gail_widget_get_description
|
||||
658694 GtkAssistant: Unable to change current page in prepare...
|
||||
670390 -GtkMenuBar-shadow-type: none disables background inst...
|
||||
671786 Glade XML files cannot set an ImageMenuItem accelerato...
|
||||
674108 Hard crash due to wrong NSAutoreleasePool stacking
|
||||
676890 GtkButton are still highlighted after removing them fr...
|
||||
677559 argument of Gdk.Keymap.map_virtual_modifiers is not co...
|
||||
680962 GtkMenuButton doesn't display accelerators when used w...
|
||||
682630 GMenuModel attribute for an action to toggle on submen...
|
||||
682831 gtkmodelmenu: expose API for action namespace
|
||||
683474 Print dialog lists custom paper sizes twice for "Print...
|
||||
683627 Memory leak in style_data_lookup
|
||||
683718 box: Fix typo
|
||||
683738 Simplify GtkApplicationWindow accel handling
|
||||
683874 Load settings.ini also from XDG_CONFIG_DIRS
|
||||
683896 Clean up global resources when the display is closed
|
||||
684038 togglebutton: always set PRELIGHT state when in_button...
|
||||
684076 clean up a11y on shutdown
|
||||
684096 GtkWidget:drag-data-received code sample refers to rem...
|
||||
684156 fontchooserwidget: scroll to the currently selected row
|
||||
|
||||
* Translation updates
|
||||
Arabic
|
||||
Assamese
|
||||
Belarusian
|
||||
Brazilian Portuguese
|
||||
British English
|
||||
Danish
|
||||
Finnish
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Hebrew
|
||||
Hungarian
|
||||
Indonesian
|
||||
Korean
|
||||
Lithuanian
|
||||
Persian
|
||||
Polish
|
||||
Portuguese
|
||||
Punjabi
|
||||
Serbian
|
||||
Slovenian
|
||||
Thai
|
||||
Spanish
|
||||
Russian
|
||||
Traditional Chinese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.16
|
||||
==================================
|
||||
|
||||
* Fix critical warnings on startup in nautilus
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.14
|
||||
==================================
|
||||
|
||||
* Input method support
|
||||
- Propagate input purpose and hints to individual IMs
|
||||
- Add a hint to suppress on-screen keyboards
|
||||
|
||||
* GtkEntry can now set Pango attributes for its text
|
||||
|
||||
* GtkEntry and GtkTextView show 'selection handles' when
|
||||
used with touch devices
|
||||
|
||||
* GtkSpinButton can be oriented vertically
|
||||
|
||||
* Bugs fixed
|
||||
645065 GtkFileChooserButton doesn't handle closing its dialo...
|
||||
661973 gtk+ reacts on F10 press incorrectly with xkeyboard-c...
|
||||
672046 Issues with widget state propagation
|
||||
672431 the alt+tab app switch makes mnemonics flash
|
||||
676787 Update printing demo to use new print setting
|
||||
679144 Gdk doesn't properly find the child area with alpha
|
||||
681617 radio button text isn't centered when draw indicator ...
|
||||
682129 Print Dialog / Improving "Print to file" option
|
||||
682291 GtkMenuButton .ui issues
|
||||
682552 Improve the layout of the mount operations dialog
|
||||
682662 GtkAspectFrame: vertical alignment should be top/bott...
|
||||
682724 Fix a typo in the the comments
|
||||
682825 Also compile gtkdbusgenerated.c on non-UNIX environme...
|
||||
682919 Crash in GTK+-3.x (3.0.x-3.5.12+) on Windows with CJK...
|
||||
683001 Make headings bold in message dialogs by default
|
||||
683168 Make spinbutton orientable
|
||||
|
||||
* Translation updates
|
||||
Assamese
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Indonesian
|
||||
Japanese
|
||||
Kazakh
|
||||
Latvian
|
||||
Lithuanian
|
||||
Norwegian bokmål
|
||||
Persian
|
||||
Polish
|
||||
Punjabi
|
||||
Spanish
|
||||
Vietnamese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.12
|
||||
==================================
|
||||
|
||||
|
13
README.in
13
README.in
@ -75,8 +75,17 @@ Patches should be in unified diff form. (The -up option to GNU diff.)
|
||||
Release notes for 3.6
|
||||
=====================
|
||||
|
||||
* Now follows the XDG Base Directory specification for user
|
||||
configuration and data files. In detail,
|
||||
* The accessibility bridge code that exports accessible objects
|
||||
on the bus is now used by default; atk-bridge has been converted
|
||||
into a library that GTK+ links against. To void the linking,
|
||||
pass --without-atk-bridge when configuring GTK+.
|
||||
|
||||
* GDK threading support has been deprecated. It is recommended to
|
||||
use g_idle_add(), g_main_context_invoke() and similar funtions
|
||||
to make all GTK+ calls from the main thread.
|
||||
|
||||
* GTK+ now follows the XDG Base Directory specification for
|
||||
user configuration and data files. In detail,
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/custom-papers is the new location
|
||||
for $HOME/.gtk-custom-papers
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/bookmarks is the new location
|
||||
|
@ -18,24 +18,24 @@ mkdir $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.dll $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin
|
||||
|
||||
mkdir $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin\gtk3-demo
|
||||
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
|
||||
|
||||
mkdir $(CopyDir)\lib
|
||||
@ -319,6 +319,8 @@ copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@ -331,6 +333,8 @@ copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@ -411,6 +415,8 @@ copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
@ -176,6 +176,8 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\drawingarea.c" />
|
||||
|
@ -47,6 +47,12 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
@ -69,16 +69,17 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h

|
||||
echo on

|
||||
mkdir $(CopyDir)\bin

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.dll $(CopyDir)\bin

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin

|
||||
|
||||
mkdir $(CopyDir)\bin\gtk3-demo

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo

|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo

|
||||
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo

|
||||
|
||||
mkdir $(CopyDir)\lib

|
||||
copy $(ConfigurationName)\$(PlatformName)\bin\*-$(GtkApiVersion).lib $(CopyDir)\lib

|
||||
@ -222,12 +223,14 @@ copy ..\..\..\gtk\gtkinfobar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
copy ..\..\..\gtk\gtkinvisible.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtklockbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmain.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkmenutoolbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
@ -268,6 +271,7 @@ copy ..\..\..\gtk\gtkscalebutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#
|
||||
copy ..\..\..\gtk\gtkscrollable.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
copy ..\..\..\gtk\gtkseparatormenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk

|
||||
|
@ -171,6 +171,8 @@
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\combobox.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
|
14
configure.ac
14
configure.ac
@ -9,9 +9,9 @@
|
||||
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
|
||||
|
||||
m4_define([gtk_major_version], [3])
|
||||
m4_define([gtk_minor_version], [5])
|
||||
m4_define([gtk_micro_version], [13])
|
||||
m4_define([gtk_interface_age], [0])
|
||||
m4_define([gtk_minor_version], [6])
|
||||
m4_define([gtk_micro_version], [2])
|
||||
m4_define([gtk_interface_age], [2])
|
||||
m4_define([gtk_binary_age],
|
||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||
m4_define([gtk_version],
|
||||
@ -383,7 +383,7 @@ else
|
||||
fi
|
||||
AC_SUBST(DISABLE_ON_QUARTZ)
|
||||
|
||||
if test "x$enable_broadway_backend" == xyes; then
|
||||
if test "x$enable_broadway_backend" = xyes; then
|
||||
GDK_BACKENDS="$GDK_BACKENDS broadway"
|
||||
cairo_backends="$cairo_backends cairo"
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
@ -394,8 +394,8 @@ else
|
||||
AM_CONDITIONAL(USE_BROADWAY, false)
|
||||
fi
|
||||
|
||||
if test "x$enable_wayland_backend" == "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
if test "x$enable_wayland_backend" = "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
# Wayland can use cairo-gl
|
||||
cairo_backends="$cairo_backends cairo-gl"
|
||||
AC_DEFINE(GDK_WAYLAND_USE_EGL, [1], [Whether to use EGL in Wayland backend])
|
||||
@ -408,7 +408,7 @@ if test "x$enable_wayland_backend" == "xyes"; then
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
#define GDK_WINDOWING_WAYLAND"
|
||||
WAYLAND_PACKAGES="wayland-client xkbcommon wayland-cursor"
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
WAYLAND_PACKAGES="$WAYLAND_PACKAGES wayland-egl egl"
|
||||
fi
|
||||
AM_CONDITIONAL(USE_WAYLAND, true)
|
||||
|
@ -18,6 +18,8 @@ demos = \
|
||||
css_accordion.c \
|
||||
css_basics.c \
|
||||
css_multiplebgs.c \
|
||||
css_pixbufs.c \
|
||||
css_shadows.c \
|
||||
dialog.c \
|
||||
drawingarea.c \
|
||||
editable_cells.c \
|
||||
@ -118,6 +120,8 @@ RESOURCES= application.ui \
|
||||
css_accordion.css \
|
||||
css_basics.css \
|
||||
css_multiplebgs.css \
|
||||
css_pixbufs.css \
|
||||
css_shadows.css \
|
||||
cssview.css \
|
||||
fancy.css \
|
||||
reset.css
|
||||
|
@ -61,6 +61,7 @@ do_css_accordion (GtkWidget *do_widget)
|
||||
data = g_bytes_get_data (bytes, &data_size);
|
||||
|
||||
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), (gchar *)data, data_size, NULL);
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
@import url("reset.css");
|
||||
@import url("resource:///reset.css");
|
||||
|
||||
* {
|
||||
transition-property: color, background-color, border-color, background-image, padding, border-width;
|
||||
@ -49,4 +49,4 @@ GtkWindow {
|
||||
.button:hover:active,
|
||||
.button:active {
|
||||
background-color: #993401;
|
||||
}
|
||||
}
|
||||
|
@ -100,6 +100,7 @@ do_css_basics (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_basics/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("resource:///reset.css");
|
||||
|
||||
/* Set a very futuristic style by default */
|
||||
* {
|
||||
|
@ -149,6 +149,7 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_multiplebgs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
#canvas {
|
||||
transition-property: background-color, background-image;
|
||||
@ -56,7 +56,7 @@
|
||||
/*
|
||||
#bricks-button {
|
||||
background-color: #eef;
|
||||
background-image: url('brick.png');
|
||||
background-image: url('resource:///css_multiplebgs/brick.png');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
@ -133,4 +133,4 @@
|
||||
background-image: linear-gradient(90deg, transparent 79px, alpha(#999, 0.40) 79px, #999 80px, alpha(#999, 0.40) 81px, transparent 81px),
|
||||
linear-gradient(alpha(#bbb, 0.60), alpha(#bbb, 0.60) 1px, transparent 1px);
|
||||
}
|
||||
*/
|
||||
*/
|
||||
|
127
demos/gtk-demo/css_pixbufs.c
Normal file
127
demos/gtk-demo/css_pixbufs.c
Normal file
@ -0,0 +1,127 @@
|
||||
/* CSS Theming/Animated backgrounds
|
||||
*
|
||||
* This demo is done in honour of the Pixbufs demo further down. It is done exclusively
|
||||
* with CSS as the background of the window.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_pixbufs (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
/* Need a filler so we get a handle */
|
||||
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_pixbufs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
@keyframes move-the-image {
|
||||
0% { background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; }
|
||||
@ -46,21 +46,31 @@
|
||||
}
|
||||
|
||||
@keyframes size-the-image {
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, 100% }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, 100% }
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
|
||||
}
|
||||
|
||||
GtkWindow {
|
||||
background-image: url("apple-red.png"),
|
||||
url("gnome-applets.png"),
|
||||
url("gnome-calendar.png"),
|
||||
url("gnome-foot.png"),
|
||||
url("gnome-gmush.png"),
|
||||
url("gnome-gimp.png"),
|
||||
url("gnome-gsame.png"),
|
||||
url("gnu-keys.png"),
|
||||
url("background.jpg");
|
||||
background-image: url("resource:///css_pixbufs/apple-red.png"),
|
||||
url("resource:///css_pixbufs/gnome-applets.png"),
|
||||
url("resource:///css_pixbufs/gnome-calendar.png"),
|
||||
url("resource:///css_pixbufs/gnome-foot.png"),
|
||||
url("resource:///css_pixbufs/gnome-gmush.png"),
|
||||
url("resource:///css_pixbufs/gnome-gimp.png"),
|
||||
url("resource:///css_pixbufs/gnome-gsame.png"),
|
||||
url("resource:///css_pixbufs/gnu-keys.png"),
|
||||
url("resource:///css_pixbufs/background.jpg");
|
||||
background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%;
|
||||
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;
|
||||
animation: move-the-image infinite linear 3s, size-the-image infinite alternate ease-in-out 0.75s;
|
||||
}
|
||||
|
||||
/* Make the text editor has a nice style */
|
||||
.view, .scrollbar, .pane-separator {
|
||||
color: black;
|
||||
background-color: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.view:selected {
|
||||
background-color: rgba(127,127,255,0.5);
|
||||
}
|
||||
|
147
demos/gtk-demo/css_shadows.c
Normal file
147
demos/gtk-demo/css_shadows.c
Normal file
@ -0,0 +1,147 @@
|
||||
/* CSS Theming/Shadows
|
||||
*
|
||||
* This demo shows how to use CSS shadows.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
create_toolbar (void)
|
||||
{
|
||||
GtkWidget *toolbar;
|
||||
GtkToolItem *item;
|
||||
|
||||
toolbar = gtk_toolbar_new ();
|
||||
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new (NULL, "Hello World");
|
||||
gtk_tool_item_set_is_important (item, TRUE);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
return toolbar;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_shadows (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
child = create_toolbar ();
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_shadows/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
44
demos/gtk-demo/css_shadows.css
Normal file
44
demos/gtk-demo/css_shadows.css
Normal file
@ -0,0 +1,44 @@
|
||||
/* You can edit the text in this window to change the
|
||||
* appearance of this Window.
|
||||
* Be careful, if you screw it up, nothing might be visible
|
||||
* anymore. :)
|
||||
*/
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
/* Get a nice background for the window */
|
||||
.background {
|
||||
background-color: #4870bc;
|
||||
background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.17) 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.19) 50%);
|
||||
background-size: 29px, 59px, 73px, 109px;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: black;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
transition: all 250ms ease-in;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
text-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
icon-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
|
||||
border: solid 1px alpha(black, 0.75);
|
||||
}
|
||||
|
||||
.button:active {
|
||||
padding: 11px 9px 9px 11px;
|
||||
text-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
}
|
||||
|
||||
|
||||
|
@ -20,6 +20,7 @@
|
||||
</gresource>
|
||||
<gresource prefix="/css_multiplebgs">
|
||||
<file alias="gtk.css">css_multiplebgs.css</file>
|
||||
<file>brick.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/theming_custom_css">
|
||||
<file alias="gtk.css">fancy.css</file>
|
||||
@ -27,4 +28,19 @@
|
||||
<gresource prefix="/theming_style_classes">
|
||||
<file preprocess="xml-stripblanks">theming.ui</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_pixbufs">
|
||||
<file alias="gtk.css">css_pixbufs.css</file>
|
||||
<file>background.jpg</file>
|
||||
<file>apple-red.png</file>
|
||||
<file>gnome-applets.png</file>
|
||||
<file>gnome-calendar.png</file>
|
||||
<file>gnome-foot.png</file>
|
||||
<file>gnome-gmush.png</file>
|
||||
<file>gnome-gimp.png</file>
|
||||
<file>gnome-gsame.png</file>
|
||||
<file>gnu-keys.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_shadows">
|
||||
<file alias="gtk.css">css_shadows.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
|
@ -1,24 +1,65 @@
|
||||
GtkButton#fancy {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, yellow, blue);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 0.7),
|
||||
alpha(white, 0) 30%),
|
||||
linear-gradient(to top,
|
||||
alpha(#babdb6, 0.4),
|
||||
alpha(#babdb6, 0) 50%),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: #3465a4;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 1px white;
|
||||
}
|
||||
|
||||
GtkButton#fancy:hover {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, blue, yellow);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
transition: all 250ms linear;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 1),
|
||||
alpha(white, 0)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec 10%,
|
||||
white 40%,
|
||||
#d3d7cf,
|
||||
white 70%,
|
||||
#babdb6);
|
||||
color: #204a87;
|
||||
}
|
||||
|
||||
GtkButton#fancy:active {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(yellow, yellow);
|
||||
border-radius: 20px;
|
||||
color: black;
|
||||
GtkButton#fancy:active,
|
||||
GtkButton#fancy:active:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(#555753, 0.5),
|
||||
alpha(#babdb6, 0.3)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: white;
|
||||
text-shadow: 0 1px black;
|
||||
}
|
||||
|
||||
GtkButton#fancy:backdrop,
|
||||
GtkButton#fancy:backdrop:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(135deg,
|
||||
alpha(#eeeeec, 0.5) 10%,
|
||||
alpha(white, 0.5) 40%,
|
||||
alpha(#d3d7cf, 0.5),
|
||||
alpha(white, 0.5) 70%,
|
||||
alpha(#babdb6, 0.5));
|
||||
color: #babdb6;
|
||||
}
|
||||
|
||||
GtkButton#fancy * {
|
||||
color: inherit;
|
||||
/* Yeah this should be inherited by default */
|
||||
color: inherit;
|
||||
}
|
||||
|
@ -579,10 +579,7 @@ load_file (const gchar *filename)
|
||||
}
|
||||
|
||||
if (current_file && !strcmp (current_file, names[0]))
|
||||
{
|
||||
g_string_free (buffer, TRUE);
|
||||
return;
|
||||
}
|
||||
goto out;
|
||||
|
||||
g_free (current_file);
|
||||
current_file = g_strdup (names[0]);
|
||||
@ -598,7 +595,7 @@ load_file (const gchar *filename)
|
||||
{
|
||||
g_warning ("%s", err->message);
|
||||
g_error_free (err);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
file = g_fopen (full_filename, "r");
|
||||
@ -609,7 +606,7 @@ load_file (const gchar *filename)
|
||||
g_free (full_filename);
|
||||
|
||||
if (!file)
|
||||
return;
|
||||
goto out;
|
||||
|
||||
gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
|
||||
while (read_line (file, buffer))
|
||||
@ -725,6 +722,7 @@ load_file (const gchar *filename)
|
||||
|
||||
fontify ();
|
||||
|
||||
out:
|
||||
g_string_free (buffer, TRUE);
|
||||
|
||||
g_strfreev (names);
|
||||
|
@ -65,12 +65,26 @@ show_about (GtkMenuItem *item, GtkWidget *window)
|
||||
g_object_unref (pixbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
on_page_toggled (GtkToggleButton *button,
|
||||
GtkNotebook *pages)
|
||||
{
|
||||
gint page;
|
||||
|
||||
if (!gtk_toggle_button_get_active (button))
|
||||
return;
|
||||
|
||||
page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "page"));
|
||||
gtk_notebook_set_current_page (pages, page);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *window;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *notebook;
|
||||
gboolean dark = FALSE;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
@ -88,6 +102,15 @@ main (int argc, char *argv[])
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (dark_toggled), NULL);
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), dark);
|
||||
|
||||
notebook = (GtkWidget*) gtk_builder_get_object (builder, "toplevel_notebook");
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage1");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (0));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage2");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (1));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "aboutmenuitem");
|
||||
g_signal_connect (widget, "activate", G_CALLBACK (show_about), window);
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -89,25 +89,20 @@ Make sure that gtk-doc is the latest released version.
|
||||
it to download.gnome.org. If you don't have an account on master.gnome.org,
|
||||
find someone who can do it for you. The command for this looks like
|
||||
|
||||
scp gtk+-2.12.10.tar.gz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org
|
||||
install-module gtk+-2.12.10.tar.gz
|
||||
scp gtk+-2.12.10.tar.xz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org ftpadmin install gtk+-2.12.10.tar.xz
|
||||
|
||||
15) Get the .bz2 tarball and the .md5sum files back from master.gnome.org
|
||||
You can probably also create it locally, but I've experienced md5
|
||||
mismatches when doing so.
|
||||
15) Upload the tarball and checksum to ftp.gtk.org and put them in the right
|
||||
directory below /ftp/pub. Pay attention to correct ownership, and don't
|
||||
forget to update the LATEST file in the directory.
|
||||
|
||||
16) Upload the .gz and .bz2 tarballs and checksums to ftp.gtk.org and put
|
||||
them in the right directory below /ftp/pub. Pay attention to correct
|
||||
ownership, and don't forget to update the LATEST file in the directory.
|
||||
|
||||
17) Go to the gnome-announce list archives, find the last announce message,
|
||||
16) Go to the gnome-announce list archives, find the last announce message,
|
||||
create a new message in the same form, replacing version numbers,
|
||||
commentary at the top about "what this release is about" and the
|
||||
summary of changes.
|
||||
|
||||
18) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
17) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
gtk-devel-list. Set reply-to to desktop-devel-list.
|
||||
|
||||
19) Add a link to the release announcement to www.gtk.org which lives
|
||||
18) Add a link to the release announcement to www.gtk.org which lives
|
||||
in the gtk-web git module.
|
||||
|
@ -12,7 +12,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gdk3/">http://developer.gnome.org/gdk3/</ulink>.
|
||||
If you are looking for the older GDK 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk/">http://developer.gnome.org/gdk/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk2/">http://developer.gnome.org/gdk2/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
@ -42,7 +42,7 @@
|
||||
<xi:include href="xml/cairo_interaction.xml" />
|
||||
<xi:include href="xml/x_interaction.xml" />
|
||||
<xi:include href="xml/gdkapplaunchcontext.xml" />
|
||||
<xi:include href="xml/gdktesting.xml" />
|
||||
<xi:include href="xml/gdktestutils.xml" />
|
||||
</reference>
|
||||
|
||||
<index id="api-index-full">
|
||||
|
@ -1145,8 +1145,8 @@ gdk_app_launch_context_get_type
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Testing</TITLE>
|
||||
<FILE>gdktesting</FILE>
|
||||
<FILE>gdktestutils</FILE>
|
||||
gdk_test_render_sync
|
||||
gdk_test_simulate_button
|
||||
gdk_test_simulate_key
|
||||
|
||||
</SECTION>
|
||||
|
@ -14,7 +14,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gtk3/">http://developer.gnome.org/gtk3/</ulink>.
|
||||
If you are looking for the older GTK+ 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk/">http://developer.gnome.org/gtk/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk2/">http://developer.gnome.org/gtk2/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
|
@ -139,6 +139,7 @@ gtk_accel_label_set_accel_closure
|
||||
gtk_accel_label_get_accel_widget
|
||||
gtk_accel_label_set_accel_widget
|
||||
gtk_accel_label_get_accel_width
|
||||
gtk_accel_label_set_accel
|
||||
gtk_accel_label_refetch
|
||||
<SUBSECTION Standard>
|
||||
GTK_ACCEL_LABEL
|
||||
@ -263,6 +264,8 @@ gtk_action_group_get_sensitive
|
||||
gtk_action_group_set_sensitive
|
||||
gtk_action_group_get_visible
|
||||
gtk_action_group_set_visible
|
||||
gtk_action_group_get_accel_group
|
||||
gtk_action_group_set_accel_group
|
||||
gtk_action_group_get_action
|
||||
gtk_action_group_list_actions
|
||||
gtk_action_group_add_action
|
||||
@ -530,6 +533,7 @@ gtk_builder_add_from_resource
|
||||
gtk_builder_add_from_string
|
||||
gtk_builder_add_objects_from_file
|
||||
gtk_builder_add_objects_from_string
|
||||
gtk_builder_add_objects_from_resource
|
||||
gtk_builder_get_object
|
||||
gtk_builder_get_objects
|
||||
gtk_builder_connect_signals
|
||||
@ -583,6 +587,8 @@ gtk_button_set_image
|
||||
gtk_button_get_image
|
||||
gtk_button_set_image_position
|
||||
gtk_button_get_image_position
|
||||
gtk_button_set_always_show_image
|
||||
gtk_button_get_always_show_image
|
||||
gtk_button_get_event_window
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@ -1046,6 +1052,8 @@ gtk_entry_get_layout
|
||||
gtk_entry_get_layout_offsets
|
||||
gtk_entry_layout_index_to_text_index
|
||||
gtk_entry_text_index_to_layout_index
|
||||
gtk_entry_set_attributes
|
||||
gtk_entry_get_attributes
|
||||
gtk_entry_get_max_length
|
||||
gtk_entry_get_visibility
|
||||
gtk_entry_set_completion
|
||||
@ -1808,6 +1816,7 @@ gtk_image_new_from_stock
|
||||
gtk_image_new_from_animation
|
||||
gtk_image_new_from_icon_name
|
||||
gtk_image_new_from_gicon
|
||||
gtk_image_new_from_resource
|
||||
gtk_image_set_from_file
|
||||
gtk_image_set_from_icon_set
|
||||
gtk_image_set_from_pixbuf
|
||||
@ -1815,6 +1824,7 @@ gtk_image_set_from_stock
|
||||
gtk_image_set_from_animation
|
||||
gtk_image_set_from_icon_name
|
||||
gtk_image_set_from_gicon
|
||||
gtk_image_set_from_resource
|
||||
gtk_image_clear
|
||||
gtk_image_new
|
||||
gtk_image_set_pixel_size
|
||||
@ -2244,6 +2254,7 @@ gtk_menu_shell_set_take_focus
|
||||
gtk_menu_shell_get_take_focus
|
||||
gtk_menu_shell_get_selected_item
|
||||
gtk_menu_shell_get_parent_shell
|
||||
gtk_menu_shell_bind_model
|
||||
GtkMenuDirectionType
|
||||
<SUBSECTION Standard>
|
||||
GTK_MENU_SHELL
|
||||
@ -3270,6 +3281,8 @@ gtk_level_bar_set_min_value
|
||||
gtk_level_bar_get_min_value
|
||||
gtk_level_bar_set_max_value
|
||||
gtk_level_bar_get_max_value
|
||||
gtk_level_bar_set_inverted
|
||||
gtk_level_bar_get_inverted
|
||||
gtk_level_bar_add_offset_value
|
||||
gtk_level_bar_remove_offset_value
|
||||
gtk_level_bar_get_offset_value
|
||||
@ -5765,6 +5778,7 @@ GTK_STYLE_CLASS_LINKED
|
||||
GTK_STYLE_CLASS_ARROW
|
||||
GTK_STYLE_CLASS_OSD
|
||||
GTK_STYLE_CLASS_LEVEL_BAR
|
||||
GTK_STYLE_CLASS_CURSOR_HANDLE
|
||||
GTK_STYLE_REGION_COLUMN
|
||||
GTK_STYLE_REGION_COLUMN_HEADER
|
||||
GTK_STYLE_REGION_ROW
|
||||
@ -5974,6 +5988,7 @@ gtk_gradient_add_color_stop
|
||||
gtk_gradient_ref
|
||||
gtk_gradient_unref
|
||||
gtk_gradient_resolve
|
||||
gtk_gradient_resolve_for_context
|
||||
gtk_gradient_to_string
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@ -7106,6 +7121,7 @@ gtk_application_add_window
|
||||
gtk_application_remove_window
|
||||
gtk_application_get_windows
|
||||
gtk_application_get_window_by_id
|
||||
gtk_application_get_active_window
|
||||
|
||||
<SUBSECTION>
|
||||
GtkApplicationInhibitFlags
|
||||
|
@ -55,6 +55,7 @@ noinst_PROGRAMS = \
|
||||
bloatpad \
|
||||
plugman \
|
||||
sunny \
|
||||
action-namespace \
|
||||
grid-packing \
|
||||
drawing \
|
||||
builder
|
||||
|
134
examples/action-namespace.c
Normal file
134
examples/action-namespace.c
Normal file
@ -0,0 +1,134 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static void
|
||||
action_activated (GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *parent = user_data;
|
||||
GtkWidget *dialog;
|
||||
|
||||
dialog = gtk_message_dialog_new (parent,
|
||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||
GTK_MESSAGE_INFO,
|
||||
GTK_BUTTONS_CLOSE,
|
||||
"Activated action `%s`",
|
||||
g_action_get_name (G_ACTION (action)));
|
||||
|
||||
g_signal_connect_swapped (dialog, "response",
|
||||
G_CALLBACK (gtk_widget_destroy), dialog);
|
||||
|
||||
gtk_widget_show_all (dialog);
|
||||
}
|
||||
|
||||
static GActionEntry doc_entries[] = {
|
||||
{ "save", action_activated },
|
||||
{ "print", action_activated },
|
||||
{ "share", action_activated }
|
||||
};
|
||||
|
||||
static GActionEntry win_entries[] = {
|
||||
{ "fullscreen", action_activated },
|
||||
{ "close", action_activated },
|
||||
};
|
||||
|
||||
const gchar *menu_ui =
|
||||
"<interface>"
|
||||
" <menu id='doc-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Save</attribute>"
|
||||
" <attribute name='action'>save</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Print</attribute>"
|
||||
" <attribute name='action'>print</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Share</attribute>"
|
||||
" <attribute name='action'>share</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
" <menu id='win-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Fullscreen</attribute>"
|
||||
" <attribute name='action'>fullscreen</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Close</attribute>"
|
||||
" <attribute name='action'>close</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
"</interface>";
|
||||
|
||||
static void
|
||||
activate (GApplication *app,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *win;
|
||||
GtkWidget *button;
|
||||
GSimpleActionGroup *doc_actions;
|
||||
GtkBuilder *builder;
|
||||
GMenuModel *doc_menu;
|
||||
GMenuModel *win_menu;
|
||||
GMenu *button_menu;
|
||||
GMenuItem *section;
|
||||
|
||||
if (gtk_application_get_windows (GTK_APPLICATION (app)) != NULL)
|
||||
return;
|
||||
|
||||
win = gtk_application_window_new (GTK_APPLICATION (app));
|
||||
|
||||
doc_actions = g_simple_action_group_new ();
|
||||
g_simple_action_group_add_entries (doc_actions, doc_entries,
|
||||
G_N_ELEMENTS (doc_entries), win);
|
||||
|
||||
g_action_map_add_action_entries (G_ACTION_MAP (win), win_entries,
|
||||
G_N_ELEMENTS (win_entries), win);
|
||||
|
||||
builder = gtk_builder_new ();
|
||||
gtk_builder_add_from_string (builder, menu_ui, -1, NULL);
|
||||
|
||||
doc_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "doc-menu"));
|
||||
win_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "win-menu"));
|
||||
|
||||
button_menu = g_menu_new ();
|
||||
|
||||
section = g_menu_item_new_section (NULL, doc_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "doc");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
section = g_menu_item_new_section (NULL, win_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "win");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
button = gtk_menu_button_new ();
|
||||
gtk_button_set_label (GTK_BUTTON (button), "Menu");
|
||||
gtk_widget_insert_action_group (button, "doc", G_ACTION_GROUP (doc_actions));
|
||||
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), G_MENU_MODEL (button_menu));
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (win), button);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (win), 12);
|
||||
gtk_widget_show_all (win);
|
||||
|
||||
g_object_unref (button_menu);
|
||||
g_object_unref (doc_actions);
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,
|
||||
char **argv)
|
||||
{
|
||||
GtkApplication *app;
|
||||
|
||||
app = gtk_application_new ("org.gtk.Example", 0);
|
||||
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
||||
|
||||
return g_application_run (G_APPLICATION (app), argc, argv);
|
||||
}
|
@ -191,7 +191,14 @@ bloat_pad_open (GApplication *application,
|
||||
new_window (application, files[i]);
|
||||
}
|
||||
|
||||
typedef GtkApplication BloatPad;
|
||||
typedef struct
|
||||
{
|
||||
GtkApplication parent_instance;
|
||||
|
||||
GMenu *time;
|
||||
guint timeout;
|
||||
} BloatPad;
|
||||
|
||||
typedef GtkApplicationClass BloatPadClass;
|
||||
|
||||
G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)
|
||||
@ -234,15 +241,65 @@ quit_activated (GSimpleAction *action,
|
||||
g_application_quit (app);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_time (gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
GDateTime *now;
|
||||
gchar *time;
|
||||
|
||||
while (g_menu_model_get_n_items (G_MENU_MODEL (bloatpad->time)))
|
||||
g_menu_remove (bloatpad->time, 0);
|
||||
|
||||
g_message ("Updating the time menu (which should be open now)...");
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
time = g_date_time_format (now, "%c");
|
||||
g_menu_append (bloatpad->time, time, NULL);
|
||||
g_date_time_unref (now);
|
||||
g_free (time);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
time_active_changed (GSimpleAction *action,
|
||||
GVariant *state,
|
||||
gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
|
||||
if (g_variant_get_boolean (state))
|
||||
{
|
||||
if (!bloatpad->timeout)
|
||||
{
|
||||
bloatpad->timeout = g_timeout_add (1000, update_time, bloatpad);
|
||||
update_time (bloatpad);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
}
|
||||
|
||||
g_simple_action_set_state (action, state);
|
||||
}
|
||||
|
||||
static GActionEntry app_entries[] = {
|
||||
{ "new", new_activated, NULL, NULL, NULL },
|
||||
{ "about", about_activated, NULL, NULL, NULL },
|
||||
{ "quit", quit_activated, NULL, NULL, NULL },
|
||||
{ "time-active", NULL, NULL, "false", time_active_changed }
|
||||
};
|
||||
|
||||
static void
|
||||
bloat_pad_startup (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad*) application;
|
||||
GtkBuilder *builder;
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
@ -301,13 +358,34 @@ bloat_pad_startup (GApplication *application)
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </submenu>"
|
||||
" <submenu id='time-menu'>"
|
||||
" <attribute name='label' translatable='yes'>Time</attribute>"
|
||||
" <attribute name='submenu-action'>app.time-active</attribute>"
|
||||
" </submenu>"
|
||||
" </menu>"
|
||||
"</interface>", -1, NULL);
|
||||
gtk_application_set_app_menu (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")));
|
||||
//gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
bloatpad->time = G_MENU (gtk_builder_get_object (builder, "time-menu"));
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_shutdown (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad *) application;
|
||||
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
->shutdown (application);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_init (BloatPad *app)
|
||||
{
|
||||
@ -320,6 +398,7 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
application_class->startup = bloat_pad_startup;
|
||||
application_class->shutdown = bloat_pad_shutdown;
|
||||
application_class->activate = bloat_pad_activate;
|
||||
application_class->open = bloat_pad_open;
|
||||
|
||||
@ -330,7 +409,7 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
BloatPad *
|
||||
bloat_pad_new (void)
|
||||
{
|
||||
GtkApplication *bloat_pad;
|
||||
BloatPad *bloat_pad;
|
||||
|
||||
g_type_init ();
|
||||
|
||||
|
@ -341,7 +341,8 @@ gdkmarshalers.h: @REBUILD@ gdkmarshalers.list
|
||||
&& mv gdkmarshalers-h.tmp gdkmarshalers.h \
|
||||
|| ( rm -f gdkmarshalers-h.tmp && exit 1)
|
||||
gdkmarshalers.c: @REBUILD@ gdkmarshalers.list
|
||||
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body > gdkmarshalers-c.tmp \
|
||||
$(AM_V_GEN) (echo "#include \"gdkmarshalers.h\""; \
|
||||
$(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body) > gdkmarshalers-c.tmp \
|
||||
&& mv gdkmarshalers-c.tmp gdkmarshalers.c \
|
||||
|| ( rm -f gdkmarshalers-c.tmp && exit 1 )
|
||||
|
||||
|
@ -57,8 +57,44 @@ base64_uint32 (guint32 v, char *c)
|
||||
* conversion of raw image data to png data: uris *
|
||||
***********************************************************/
|
||||
|
||||
static cairo_status_t
|
||||
write_png_data (void *closure,
|
||||
const unsigned char *data,
|
||||
unsigned int data_len)
|
||||
{
|
||||
GString *buf = closure;
|
||||
|
||||
g_string_append_len (buf, (char *)data, data_len);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
struct PngTarget {
|
||||
GString *url;
|
||||
GString *buf;
|
||||
int state;
|
||||
int save;
|
||||
};
|
||||
@ -71,71 +107,73 @@ write_png_url (void *closure,
|
||||
struct PngTarget *target = closure;
|
||||
gsize res, old_len;
|
||||
|
||||
old_len = target->url->len;
|
||||
g_string_set_size (target->url,
|
||||
old_len = target->buf->len;
|
||||
g_string_set_size (target->buf,
|
||||
old_len + (data_len / 3 + 1) * 4 + 4);
|
||||
|
||||
res = g_base64_encode_step (data, data_len, FALSE,
|
||||
target->url->str + old_len,
|
||||
target->buf->str + old_len,
|
||||
&target->state, &target->save);
|
||||
|
||||
g_string_set_size (target->url, old_len + res);
|
||||
g_string_set_size (target->buf, old_len + res);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static char *
|
||||
to_png_rgb (int w, int h, int byte_stride, guint32 *data)
|
||||
static void
|
||||
to_png_url_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.buf = buf;
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = target.url->len;
|
||||
old_len = buf->len;
|
||||
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
target.url->str + old_len,
|
||||
buf->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
}
|
||||
|
||||
static char *
|
||||
to_png_rgba (int w, int h, int byte_stride, guint32 *data)
|
||||
static void
|
||||
to_png_url_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.buf = buf;
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = target.url->len;
|
||||
old_len = buf->len;
|
||||
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
target.url->str + old_len,
|
||||
buf->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@ -173,9 +211,11 @@ to_png_a (int w, int h, int byte_stride, guint8 *data)
|
||||
|
||||
struct BroadwayOutput {
|
||||
GOutputStream *out;
|
||||
GString *buf;
|
||||
int error;
|
||||
guint32 serial;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -212,13 +252,12 @@ broadway_output_send_cmd (BroadwayOutput *output,
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_sendmsg (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
broadway_output_send_cmd_pre_v7 (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
{
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT, buf, count);
|
||||
g_output_stream_write_all (output->out, "\0", 1, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, "\xff", 1, NULL, NULL, NULL);
|
||||
}
|
||||
|
||||
void broadway_output_pong (BroadwayOutput *output)
|
||||
@ -227,42 +266,40 @@ void broadway_output_pong (BroadwayOutput *output)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_CNX_PONG, NULL, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_sendmsg_initiate (BroadwayOutput *output)
|
||||
{
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write (output->out, "\0", 1, NULL, NULL);
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
broadway_output_flush (BroadwayOutput *output)
|
||||
{
|
||||
if (output->buf->len == 0)
|
||||
return TRUE;
|
||||
|
||||
if (!output->proto_v7_plus)
|
||||
{
|
||||
broadway_output_sendmsg (output, "\xff", 1);
|
||||
broadway_output_sendmsg (output, "\0", 1);
|
||||
return !output->error;
|
||||
}
|
||||
else /* no need to flush */
|
||||
return !output->error;
|
||||
broadway_output_send_cmd_pre_v7 (output, output->buf->str, output->buf->len);
|
||||
else if (output->binary)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_BINARY,
|
||||
output->buf->str, output->buf->len);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT,
|
||||
output->buf->str, output->buf->len);
|
||||
|
||||
g_string_set_size (output->buf, 0);
|
||||
|
||||
return !output->error;
|
||||
|
||||
}
|
||||
|
||||
BroadwayOutput *
|
||||
broadway_output_new(GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus)
|
||||
broadway_output_new (GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus, gboolean binary)
|
||||
{
|
||||
BroadwayOutput *output;
|
||||
|
||||
output = g_new0 (BroadwayOutput, 1);
|
||||
|
||||
output->out = g_object_ref (out);
|
||||
output->buf = g_string_new ("");
|
||||
output->serial = serial;
|
||||
output->proto_v7_plus = proto_v7_plus;
|
||||
|
||||
broadway_output_sendmsg_initiate (output);
|
||||
output->binary = binary;
|
||||
|
||||
return output;
|
||||
}
|
||||
@ -285,32 +322,97 @@ broadway_output_get_next_serial (BroadwayOutput *output)
|
||||
* Core rendering operations *
|
||||
************************************************************************/
|
||||
|
||||
#define HEADER_LEN (1+6)
|
||||
|
||||
static void
|
||||
append_uint16 (guint32 v, char *buf, int *p)
|
||||
append_char (BroadwayOutput *output, char c)
|
||||
{
|
||||
base64_uint16 (v, &buf[*p]);
|
||||
*p += 3;
|
||||
g_string_append_c (output->buf, c);
|
||||
}
|
||||
|
||||
static void
|
||||
append_uint32 (guint32 v, char *buf, int *p)
|
||||
append_bool (BroadwayOutput *output, gboolean val)
|
||||
{
|
||||
base64_uint32 (v, &buf[*p]);
|
||||
*p += 6;
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val ? 1: 0);
|
||||
else
|
||||
g_string_append_c (output->buf, val ? '1': '0');
|
||||
}
|
||||
|
||||
static int
|
||||
write_header(BroadwayOutput *output, char *buf, char op)
|
||||
static void
|
||||
append_flags (BroadwayOutput *output, guint32 val)
|
||||
{
|
||||
int p;
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val);
|
||||
else
|
||||
g_string_append_c (output->buf, val + '0');
|
||||
}
|
||||
|
||||
p = 0;
|
||||
buf[p++] = op;
|
||||
append_uint32 (output->serial++, buf, &p);
|
||||
|
||||
return p;
|
||||
static void
|
||||
append_uint16 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 2);
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 3);
|
||||
base64_uint16 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
append_uint32 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 4);
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 6);
|
||||
base64_uint32 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
overwrite_uint32 (BroadwayOutput *output, gsize pos, guint32 v)
|
||||
{
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + pos;
|
||||
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
base64_uint32 (v, output->buf->str + pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_header(BroadwayOutput *output, char op)
|
||||
{
|
||||
append_char (output, op);
|
||||
append_uint32 (output, output->serial++);
|
||||
}
|
||||
|
||||
void
|
||||
@ -318,29 +420,20 @@ broadway_output_copy_rectangles (BroadwayOutput *output, int id,
|
||||
BroadwayRect *rects, int n_rects,
|
||||
int dx, int dy)
|
||||
{
|
||||
char *buf;
|
||||
int len, i, p;
|
||||
int i;
|
||||
|
||||
len = HEADER_LEN + 3 + 3 + 3*4*n_rects + 3 + 3;
|
||||
|
||||
buf = g_malloc (len);
|
||||
p = write_header (output, buf, 'b');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (n_rects, buf, &p);
|
||||
write_header (output, 'b');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
append_uint16 (rects[i].x, buf, &p);
|
||||
append_uint16 (rects[i].y, buf, &p);
|
||||
append_uint16 (rects[i].width, buf, &p);
|
||||
append_uint16 (rects[i].height, buf, &p);
|
||||
append_uint16 (output, rects[i].x);
|
||||
append_uint16 (output, rects[i].y);
|
||||
append_uint16 (output, rects[i].width);
|
||||
append_uint16 (output, rects[i].height);
|
||||
}
|
||||
append_uint16 (dx, buf, &p);
|
||||
append_uint16 (dy, buf, &p);
|
||||
|
||||
assert (p == len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, len);
|
||||
free (buf);
|
||||
append_uint16 (output, dx);
|
||||
append_uint16 (output, dy);
|
||||
}
|
||||
|
||||
void
|
||||
@ -348,31 +441,18 @@ broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
int id,
|
||||
gboolean owner_event)
|
||||
{
|
||||
char buf[HEADER_LEN + 3 + 1];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'g');
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = owner_event ? '1': '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'g');
|
||||
append_uint16 (output, id);
|
||||
append_bool (output, owner_event);
|
||||
}
|
||||
|
||||
guint32
|
||||
broadway_output_ungrab_pointer (BroadwayOutput *output)
|
||||
{
|
||||
char buf[HEADER_LEN];
|
||||
guint32 serial;
|
||||
int p;
|
||||
|
||||
serial = output->serial;
|
||||
p = write_header (output, buf, 'u');
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'u');
|
||||
|
||||
return serial;
|
||||
}
|
||||
@ -382,62 +462,34 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
int id, int x, int y, int w, int h,
|
||||
gboolean is_temp)
|
||||
{
|
||||
char buf[HEADER_LEN + 16];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 's');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
buf[p++] = is_temp ? '1' : '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 's');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
append_bool (output, is_temp);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'S');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'S');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'H');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'H');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'd');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'd');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
|
||||
@ -451,31 +503,25 @@ broadway_output_move_resize_surface (BroadwayOutput *output,
|
||||
int w,
|
||||
int h)
|
||||
{
|
||||
char buf[HEADER_LEN+3+1+6+6];
|
||||
int p;
|
||||
int val;
|
||||
|
||||
if (!has_pos && !has_size)
|
||||
return;
|
||||
|
||||
p = write_header (output, buf, 'm');
|
||||
|
||||
write_header (output, 'm');
|
||||
val = (!!has_pos) | ((!!has_size) << 1);
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = val + '0';
|
||||
append_uint16 (output, id);
|
||||
append_flags (output, val);
|
||||
if (has_pos)
|
||||
{
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
}
|
||||
if (has_size)
|
||||
{
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
}
|
||||
assert (p <= sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, p);
|
||||
}
|
||||
|
||||
void
|
||||
@ -483,17 +529,9 @@ broadway_output_set_transient_for (BroadwayOutput *output,
|
||||
int id,
|
||||
int parent_id)
|
||||
{
|
||||
char buf[HEADER_LEN + 6];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'p');
|
||||
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (parent_id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'p');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, parent_id);
|
||||
}
|
||||
|
||||
|
||||
@ -501,32 +539,26 @@ void
|
||||
broadway_output_put_rgb (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
gsize buf_size;
|
||||
gsize url_len;
|
||||
char *url, *buf;
|
||||
int p;
|
||||
gsize size_start, image_start, len;
|
||||
|
||||
url = to_png_rgb (w, h, byte_stride, (guint32*)data);
|
||||
url_len = strlen (url);
|
||||
write_header (output, 'i');
|
||||
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
|
||||
p = write_header (output, buf, 'i');
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
image_start = output->buf->len;
|
||||
if (output->binary)
|
||||
to_png_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
else
|
||||
to_png_url_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
|
||||
append_uint32 (url_len, buf, &p);
|
||||
len = output->buf->len - image_start;
|
||||
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
g_free (buf);
|
||||
free (url);
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@ -757,39 +789,38 @@ broadway_output_put_rgba (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
BroadwayBox *rects;
|
||||
int p, i, n_rects;
|
||||
int i, n_rects;
|
||||
gsize size_start, image_start, len;
|
||||
|
||||
rects = rgba_find_rects (data, w, h, byte_stride, &n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
gsize url_len, buf_size;
|
||||
char *buf, *url;
|
||||
guint8 *subdata;
|
||||
|
||||
write_header (output, 'i');
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x + rects[i].x1);
|
||||
append_uint16 (output, y + rects[i].y1);
|
||||
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
|
||||
image_start = output->buf->len;
|
||||
|
||||
subdata = (guint8 *)data + rects[i].x1 * 4 + rects[i].y1 * byte_stride;
|
||||
url = to_png_rgba (rects[i].x2 - rects[i].x1,
|
||||
if (output->binary)
|
||||
to_png_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
else
|
||||
to_png_url_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
|
||||
url_len = strlen (url);
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
len = output->buf->len - image_start;
|
||||
|
||||
|
||||
p = write_header (output, buf, 'i');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x + rects[i].x1, buf, &p);
|
||||
append_uint16 (y + rects[i].y1, buf, &p);
|
||||
|
||||
append_uint32 (url_len, buf, &p);
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
free (url);
|
||||
g_free (buf);
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
}
|
||||
|
||||
free (rects);
|
||||
@ -799,13 +830,6 @@ void
|
||||
broadway_output_surface_flush (BroadwayOutput *output,
|
||||
int id)
|
||||
{
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'f');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
g_assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
write_header (output, 'f');
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
@ -19,7 +19,8 @@ typedef enum {
|
||||
|
||||
BroadwayOutput *broadway_output_new (GOutputStream *out,
|
||||
guint32 serial,
|
||||
gboolean proto_v7_plus);
|
||||
gboolean proto_v7_plus,
|
||||
gboolean binary);
|
||||
void broadway_output_free (BroadwayOutput *output);
|
||||
int broadway_output_flush (BroadwayOutput *output);
|
||||
int broadway_output_has_error (BroadwayOutput *output);
|
||||
|
@ -725,76 +725,56 @@ function cmdUngrabPointer()
|
||||
doUngrab();
|
||||
}
|
||||
|
||||
function handleCommands(cmdObj)
|
||||
function handleCommands(cmd)
|
||||
{
|
||||
var cmd = cmdObj.data;
|
||||
var i = cmdObj.pos;
|
||||
|
||||
while (i < cmd.length) {
|
||||
while (cmd.pos < cmd.length) {
|
||||
var id, x, y, w, h, q;
|
||||
var command = cmd[i++];
|
||||
lastSerial = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
var command = cmd.get_char();
|
||||
lastSerial = cmd.get_32();
|
||||
switch (command) {
|
||||
case 's': // create new surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var isTemp = cmd[i] == '1';
|
||||
i = i + 1;
|
||||
id = cmd.get_16();
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
var isTemp = cmd.get_bool();
|
||||
cmdCreateSurface(id, x, y, w, h, isTemp);
|
||||
break;
|
||||
|
||||
case 'S': // Show a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdShowSurface(id);
|
||||
break;
|
||||
|
||||
case 'H': // Hide a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdHideSurface(id);
|
||||
break;
|
||||
|
||||
case 'p': // Set transient parent
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var parentId = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
var parentId = cmd.get_16();
|
||||
cmdSetTransientFor(id, parentId);
|
||||
break;
|
||||
|
||||
case 'd': // Delete surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
cmdDeleteSurface(id);
|
||||
break;
|
||||
|
||||
case 'm': // Move a surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ops = cmd.charCodeAt(i++) - 48;
|
||||
id = cmd.get_16();
|
||||
var ops = cmd.get_flags();
|
||||
var has_pos = ops & 1;
|
||||
if (has_pos) {
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
}
|
||||
var has_size = ops & 2;
|
||||
if (has_size) {
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
}
|
||||
cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h);
|
||||
break;
|
||||
@ -802,67 +782,50 @@ function handleCommands(cmdObj)
|
||||
case 'i': // Put image data surface
|
||||
q = new Object();
|
||||
q.op = 'i';
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var size = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
var url = cmd.slice(i, i + size);
|
||||
i = i + size;
|
||||
q.id = cmd.get_16();
|
||||
q.x = cmd.get_16();
|
||||
q.y = cmd.get_16();
|
||||
var url = cmd.get_image_url ();
|
||||
q.img = new Image();
|
||||
q.img.src = url;
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
if (!q.img.complete) {
|
||||
cmdObj.pos = i;
|
||||
q.img.onload = function() { handleOutstanding(); };
|
||||
q.img.onload = function() { cmd.free_image_url (url); handleOutstanding(); };
|
||||
return false;
|
||||
}
|
||||
cmd.free_image_url (url);
|
||||
break;
|
||||
|
||||
case 'b': // Copy rects
|
||||
q = new Object();
|
||||
q.op = 'b';
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
|
||||
var nrects = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.id = cmd.get_16();
|
||||
var nrects = cmd.get_16();
|
||||
|
||||
q.rects = [];
|
||||
for (var r = 0; r < nrects; r++) {
|
||||
var rect = new Object();
|
||||
rect.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.x = cmd.get_16();
|
||||
rect.y = cmd.get_16();
|
||||
rect.w = cmd.get_16();
|
||||
rect.h = cmd.get_16();
|
||||
q.rects.push (rect);
|
||||
}
|
||||
|
||||
q.dx = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
q.dy = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
q.dx = cmd.get_16s();
|
||||
q.dy = cmd.get_16s();
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
break;
|
||||
|
||||
case 'f': // Flush surface
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
id = cmd.get_16();
|
||||
|
||||
cmdFlushSurface(id);
|
||||
break;
|
||||
|
||||
case 'g': // Grab
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ownerEvents = cmd[i++] == '1';
|
||||
id = cmd.get_16();
|
||||
var ownerEvents = cmd.get_bool ();
|
||||
|
||||
cmdGrabPointer(id, ownerEvents);
|
||||
break;
|
||||
@ -888,13 +851,103 @@ function handleOutstanding()
|
||||
}
|
||||
}
|
||||
|
||||
function TextCommands(message) {
|
||||
this.data = message;
|
||||
this.length = message.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
TextCommands.prototype.get_char = function() {
|
||||
return this.data[this.pos++];
|
||||
};
|
||||
TextCommands.prototype.get_bool = function() {
|
||||
return this.get_char() == '1';
|
||||
};
|
||||
TextCommands.prototype.get_flags = function() {
|
||||
return this.get_char() - 48;
|
||||
}
|
||||
TextCommands.prototype.get_16 = function() {
|
||||
var n = base64_16(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_16s = function() {
|
||||
var n = base64_16s(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_32 = function() {
|
||||
var n = base64_32(this.data, this.pos);
|
||||
this.pos = this.pos + 6;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var url = this.data.slice(this.pos, this.pos + size);
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
TextCommands.prototype.free_image_url = function(url) {
|
||||
};
|
||||
|
||||
function BinCommands(message) {
|
||||
this.arraybuffer = message;
|
||||
this.u8 = new Uint8Array(message);
|
||||
this.length = this.u8.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
BinCommands.prototype.get_char = function() {
|
||||
return String.fromCharCode(this.u8[this.pos++]);
|
||||
};
|
||||
BinCommands.prototype.get_bool = function() {
|
||||
return this.u8[this.pos++] != 0;
|
||||
};
|
||||
BinCommands.prototype.get_flags = function() {
|
||||
return this.u8[this.pos++];
|
||||
}
|
||||
BinCommands.prototype.get_16 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8);
|
||||
this.pos = this.pos + 2;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_16s = function() {
|
||||
var v = this.get_16 ();
|
||||
if (v > 32767)
|
||||
return v - 65536;
|
||||
else
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_32 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8) +
|
||||
(this.u8[this.pos+2] << 16) +
|
||||
(this.u8[this.pos+3] << 24);
|
||||
this.pos = this.pos + 4;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var png_blob = new Blob ([this.arraybuffer.slice (this.pos, this.pos + size)], {type:"image/png"});
|
||||
var url = URL.createObjectURL(png_blob, {oneTimeOnly: true});
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
BinCommands.prototype.free_image_url = function(url) {
|
||||
URL.revokeObjectURL(url);
|
||||
};
|
||||
|
||||
function handleMessage(message)
|
||||
{
|
||||
var cmdObj = {};
|
||||
cmdObj.data = message;
|
||||
cmdObj.pos = 0;
|
||||
|
||||
outstandingCommands.push(cmdObj);
|
||||
var cmd;
|
||||
if (message instanceof ArrayBuffer)
|
||||
cmd = new BinCommands(message);
|
||||
else
|
||||
cmd = new TextCommands(message);
|
||||
outstandingCommands.push(cmd);
|
||||
if (outstandingCommands.length == 1) {
|
||||
handleOutstanding();
|
||||
}
|
||||
@ -2759,6 +2812,18 @@ function setupDocument(document)
|
||||
}
|
||||
}
|
||||
|
||||
function newWS(loc) {
|
||||
var ws = null;
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
} else {
|
||||
alert("WebSocket not supported, broadway will not work!");
|
||||
}
|
||||
return ws;
|
||||
}
|
||||
|
||||
function connect()
|
||||
{
|
||||
var url = window.location.toString();
|
||||
@ -2771,41 +2836,39 @@ function connect()
|
||||
|
||||
var loc = window.location.toString().replace("http:", "ws:");
|
||||
loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
|
||||
var ws = null;
|
||||
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
var supports_binary = newWS (loc + "-test").binaryType == "blob";
|
||||
if (supports_binary) {
|
||||
ws = newWS (loc + "-bin");
|
||||
ws.binaryType = "arraybuffer";
|
||||
} else {
|
||||
alert("WebSocket not supported, input will not work!");
|
||||
return;
|
||||
ws = newWS (loc);
|
||||
}
|
||||
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
if (useToplevelWindows) {
|
||||
w = window.screen.width;
|
||||
h = window.screen.height;
|
||||
} else {
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
if (useToplevelWindows) {
|
||||
w = window.screen.width;
|
||||
h = window.screen.height;
|
||||
} else {
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
}
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
}
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
|
||||
setupDocument(document);
|
||||
window.onunload = function (ev) {
|
||||
|
@ -130,7 +130,7 @@ typedef struct HttpRequest {
|
||||
GString *request;
|
||||
} HttpRequest;
|
||||
|
||||
static void start_output (HttpRequest *request, gboolean proto_v7_plus);
|
||||
static void start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary);
|
||||
|
||||
static void
|
||||
http_request_free (HttpRequest *request)
|
||||
@ -149,6 +149,7 @@ struct BroadwayInput {
|
||||
gboolean seen_time;
|
||||
gint64 time_base;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
};
|
||||
|
||||
static void
|
||||
@ -691,7 +692,7 @@ generate_handshake_response_wsietf_v7 (const gchar *key)
|
||||
}
|
||||
|
||||
static void
|
||||
start_input (HttpRequest *request)
|
||||
start_input (HttpRequest *request, gboolean binary)
|
||||
{
|
||||
char **lines;
|
||||
char *p;
|
||||
@ -867,6 +868,7 @@ start_input (HttpRequest *request)
|
||||
input->display = request->display;
|
||||
input->connection = g_object_ref (request->connection);
|
||||
input->proto_v7_plus = proto_v7_plus;
|
||||
input->binary = binary;
|
||||
|
||||
data_buffer = g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (request->data), &data_buffer_size);
|
||||
input->buffer = g_byte_array_sized_new (data_buffer_size);
|
||||
@ -874,7 +876,7 @@ start_input (HttpRequest *request)
|
||||
|
||||
broadway_display->input = input;
|
||||
|
||||
start_output (request, proto_v7_plus);
|
||||
start_output (request, proto_v7_plus, binary);
|
||||
|
||||
/* This will free and close the data input stream, but we got all the buffered content already */
|
||||
http_request_free (request);
|
||||
@ -892,7 +894,7 @@ start_input (HttpRequest *request)
|
||||
}
|
||||
|
||||
static void
|
||||
start_output (HttpRequest *request, gboolean proto_v7_plus)
|
||||
start_output (HttpRequest *request, gboolean proto_v7_plus, gboolean binary)
|
||||
{
|
||||
GSocket *socket;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
@ -912,7 +914,7 @@ start_output (HttpRequest *request, gboolean proto_v7_plus)
|
||||
|
||||
broadway_display->output =
|
||||
broadway_output_new (g_io_stream_get_output_stream (G_IO_STREAM (request->connection)),
|
||||
broadway_display->saved_serial, proto_v7_plus);
|
||||
broadway_display->saved_serial, proto_v7_plus, binary);
|
||||
|
||||
_gdk_broadway_resync_windows ();
|
||||
|
||||
@ -985,7 +987,9 @@ got_request (HttpRequest *request)
|
||||
else if (strcmp (escaped, "/broadway.js") == 0)
|
||||
send_data (request, "text/javascript", broadway_js, G_N_ELEMENTS(broadway_js) - 1);
|
||||
else if (strcmp (escaped, "/socket") == 0)
|
||||
start_input (request);
|
||||
start_input (request, FALSE);
|
||||
else if (strcmp (escaped, "/socket-bin") == 0)
|
||||
start_input (request, TRUE);
|
||||
else
|
||||
send_error (request, 404, "File not found");
|
||||
|
||||
|
@ -24,6 +24,8 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkdisplay.h"
|
||||
#include "gdkmain.h"
|
||||
#include "gdkwindow.h"
|
||||
|
||||
/**
|
||||
* gdk_pointer_ungrab:
|
||||
|
@ -584,12 +584,11 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_add_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (out): pointer to the modifier mask to change
|
||||
* @state: (inout): pointer to the modifier mask to change
|
||||
*
|
||||
* Adds virtual modifiers (i.e. Super, Hyper and Meta) which correspond
|
||||
* to the real modifiers (i.e Mod2, Mod3, ...) in @modifiers.
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
* Mod3,...) and set the corresponding bits in @state.
|
||||
* Maps the non-virtual modifiers (i.e Mod2, Mod3, ...) which are set
|
||||
* in @state to the virtual modifiers (i.e. Super, Hyper and Meta) and
|
||||
* set the corresponding bits in @state.
|
||||
*
|
||||
* GDK already does this before delivering key events, but for
|
||||
* compatibility reasons, it only sets the first virtual modifier
|
||||
@ -612,7 +611,7 @@ gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_map_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (out): pointer to the modifier state to map
|
||||
* @state: (inout): pointer to the modifier state to map
|
||||
*
|
||||
* Maps the virtual modifiers (i.e. Super, Hyper and Meta) which
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkkeys.h"
|
||||
#include "gdktypes.h"
|
||||
|
||||
|
||||
|
@ -21,6 +21,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkscreenprivate.h"
|
||||
#include "gdkrectangle.h"
|
||||
#include "gdkwindow.h"
|
||||
|
@ -29,7 +29,7 @@ G_BEGIN_DECLS
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:gdktesting
|
||||
* SECTION:gdktestutils
|
||||
* @Short_description: Test utilities
|
||||
* @Title: Testing
|
||||
*
|
||||
|
@ -217,4 +217,18 @@
|
||||
# define GDK_AVAILABLE_IN_3_6
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8 GDK_DEPRECATED
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f) GDK_DEPRECATED_FOR(f)
|
||||
#else
|
||||
# define GDK_DEPRECATED_IN_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f)
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_8
|
||||
# define GDK_AVAILABLE_IN_3_8 GDK_UNAVAILABLE(3, 8)
|
||||
#else
|
||||
# define GDK_AVAILABLE_IN_3_8
|
||||
#endif
|
||||
|
||||
#endif /* __GDK_VERSION_MACROS_H__ */
|
||||
|
@ -65,25 +65,6 @@
|
||||
* <firstterm>composited</firstterm> window it is the responsibility of the
|
||||
* application to render the window contents at the right spot.
|
||||
* </para>
|
||||
* <example id="composited-window-example">
|
||||
* <title>Composited windows</title>
|
||||
* <programlisting>
|
||||
* <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../examples/gdk/composited-window-example.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include>
|
||||
* </programlisting></example>
|
||||
* <para>
|
||||
* In the example <xref linkend="composited-window-example"/>, a button is
|
||||
* placed inside of an event box inside of a window. The event box is set as
|
||||
* composited and therefore is no longer automatically drawn to the screen.
|
||||
*
|
||||
* When the contents of the event box change, an expose event is generated on
|
||||
* its parent window (which, in this case, belongs to the toplevel #GtkWindow).
|
||||
* The expose handler for this widget is responsible for merging the changes
|
||||
* back on the screen in the way that it wishes.
|
||||
*
|
||||
* In our case, we merge the contents with a 50% transparency. We also set the
|
||||
* background colour of the window to red. The effect is that the background
|
||||
* shows through the button.
|
||||
* </para>
|
||||
* </refsect2>
|
||||
* <refsect2 id="OFFSCREEN-WINDOWS">
|
||||
* <title>Offscreen Windows</title>
|
||||
@ -112,7 +93,7 @@
|
||||
* be it a toplevel window or a child window. In this setup the
|
||||
* GdkWindow (and other GdkDrawables) were platform independent classes,
|
||||
* and the actual platform specific implementation was in a delegate
|
||||
* object availible as "impl" in the window object.
|
||||
* object available as "impl" in the window object.
|
||||
*
|
||||
* With the addition of client side windows and offscreen windows this
|
||||
* changes a bit. The application-visible GdkWindow object behaves as
|
||||
@ -1382,6 +1363,11 @@ gdk_window_new (GdkWindow *parent,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (attributes_mask & GDK_WA_VISUAL)
|
||||
{
|
||||
g_return_val_if_fail (gdk_visual_get_screen (attributes->visual) == screen, NULL);
|
||||
}
|
||||
|
||||
display = gdk_screen_get_display (screen);
|
||||
|
||||
window = _gdk_display_create_window (display);
|
||||
|
@ -81,6 +81,25 @@
|
||||
if (NSEqualRects (rect, NSZeroRect))
|
||||
return;
|
||||
|
||||
if (!GDK_WINDOW_IS_MAPPED (gdk_window))
|
||||
{
|
||||
/* If the window is not yet mapped, clip_region_with_children
|
||||
* will be empty causing the usual code below to draw nothing.
|
||||
* To not see garbage on the screen, we draw an aesthetic color
|
||||
* here. The garbage would be visible if any widget enabled
|
||||
* the NSView's CALayer in order to add sublayers for custom
|
||||
* native rendering.
|
||||
*/
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
|
||||
[[NSColor windowBackgroundColor] setFill];
|
||||
[NSBezierPath fillRect:rect];
|
||||
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Clear our own bookkeeping of regions that need display */
|
||||
if (impl->needs_display_region)
|
||||
{
|
||||
|
@ -635,21 +635,6 @@ gdk_event_check (GSource *source)
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
|
||||
_gdk_quartz_event_loop_check_pending ());
|
||||
|
||||
@ -667,6 +652,21 @@ gdk_event_dispatch (GSource *source,
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
_gdk_quartz_display_queue_events (_gdk_display);
|
||||
|
||||
event = _gdk_event_unqueue (_gdk_display);
|
||||
@ -703,6 +703,10 @@ poll_func (GPollFD *ufds,
|
||||
NSDate *limit_date;
|
||||
gint n_ready;
|
||||
|
||||
static GPollFD *last_ufds;
|
||||
|
||||
last_ufds = ufds;
|
||||
|
||||
n_ready = select_thread_start_poll (ufds, nfds, timeout_);
|
||||
if (n_ready > 0)
|
||||
timeout_ = 0;
|
||||
@ -721,7 +725,16 @@ poll_func (GPollFD *ufds,
|
||||
dequeue: YES];
|
||||
getting_events--;
|
||||
|
||||
if (n_ready < 0)
|
||||
/* We check if last_ufds did not change since the time this function was
|
||||
* called. It is possible that a recursive main loop (and thus recursive
|
||||
* invocation of this poll function) is triggered while in
|
||||
* nextEventMatchingMask:. If during that time new fds are added,
|
||||
* the cached fds array might be replaced in g_main_context_iterate().
|
||||
* So, we should avoid accessing the old fd array (still pointed at by
|
||||
* ufds) here in that case, since it might have been freed. We avoid this
|
||||
* by not calling the collect stage.
|
||||
*/
|
||||
if (last_ufds == ufds && n_ready < 0)
|
||||
n_ready = select_thread_collect_poll (ufds, nfds);
|
||||
|
||||
if (event &&
|
||||
|
@ -58,10 +58,62 @@ static GdkWindow *find_toplevel_under_pointer (GdkDisplay *display,
|
||||
gint *y);
|
||||
|
||||
|
||||
static void
|
||||
gdk_quartz_ns_notification_callback (CFNotificationCenterRef center,
|
||||
void *observer,
|
||||
CFStringRef name,
|
||||
const void *object,
|
||||
CFDictionaryRef userInfo)
|
||||
{
|
||||
GdkEvent new_event;
|
||||
|
||||
new_event.type = GDK_SETTING;
|
||||
new_event.setting.window = gdk_screen_get_root_window (_gdk_screen);
|
||||
new_event.setting.send_event = FALSE;
|
||||
new_event.setting.action = GDK_SETTING_ACTION_CHANGED;
|
||||
new_event.setting.name = NULL;
|
||||
|
||||
/* Translate name */
|
||||
if (CFStringCompare (name,
|
||||
CFSTR("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
0) == kCFCompareEqualTo)
|
||||
new_event.setting.name = "gtk-primary-button-warps-slider";
|
||||
|
||||
if (!new_event.setting.name)
|
||||
return;
|
||||
|
||||
gdk_event_put (&new_event);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_events_init_notifications (void)
|
||||
{
|
||||
static gboolean notifications_initialized = FALSE;
|
||||
|
||||
if (notifications_initialized)
|
||||
return;
|
||||
notifications_initialized = TRUE;
|
||||
|
||||
/* Initialize any handlers for notifications we want to push to GTK
|
||||
* through GdkEventSettings.
|
||||
*/
|
||||
|
||||
/* This is an undocumented *distributed* notification to listen for changes
|
||||
* in scrollbar jump behavior. It is used by LibreOffice and WebKit as well.
|
||||
*/
|
||||
CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (),
|
||||
NULL,
|
||||
&gdk_quartz_ns_notification_callback,
|
||||
CFSTR ("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
NULL,
|
||||
CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_init (void)
|
||||
{
|
||||
_gdk_quartz_event_loop_init ();
|
||||
gdk_quartz_events_init_notifications ();
|
||||
|
||||
current_keyboard_window = g_object_ref (_gdk_root);
|
||||
}
|
||||
@ -1386,7 +1438,8 @@ gdk_event_translate (GdkEvent *event,
|
||||
|
||||
if (dx != 0.0 || dy != 0.0)
|
||||
{
|
||||
if ([nsevent hasPreciseScrollingDeltas])
|
||||
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
|
||||
if (gdk_quartz_osx_version() >= GDK_OSX_LION &[nsevent hasPreciseScrollingDeltas])
|
||||
{
|
||||
GdkEvent *emulated_event;
|
||||
|
||||
@ -1398,6 +1451,7 @@ gdk_event_translate (GdkEvent *event,
|
||||
append_event (emulated_event, TRUE);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
fill_scroll_event (window, event, nsevent,
|
||||
x, y, x_root, y_root,
|
||||
dx, dy, direction);
|
||||
@ -1548,6 +1602,19 @@ _gdk_quartz_screen_get_setting (GdkScreen *screen,
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else if (strcmp (name, "gtk-primary-button-warps-slider") == 0)
|
||||
{
|
||||
GDK_QUARTZ_ALLOC_POOL;
|
||||
|
||||
BOOL setting = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"];
|
||||
|
||||
/* If the Apple property is YES, it means "warp" */
|
||||
g_value_set_boolean (value, setting == YES);
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
@ -183,6 +183,7 @@ gdk_device_core_set_window_cursor (GdkDevice *device,
|
||||
x, y);
|
||||
wl_surface_attach (wd->pointer_surface, buffer, 0, 0);
|
||||
wl_surface_damage (wd->pointer_surface, 0, 0, w, h);
|
||||
wl_surface_commit(wd->pointer_surface);
|
||||
|
||||
g_object_unref (cursor);
|
||||
}
|
||||
|
@ -96,7 +96,8 @@ static void
|
||||
output_handle_geometry(void *data,
|
||||
struct wl_output *wl_output,
|
||||
int x, int y, int physical_width, int physical_height,
|
||||
int subpixel, const char *make, const char *model)
|
||||
int subpixel, const char *make, const char *model,
|
||||
int32_t transform)
|
||||
{
|
||||
/*
|
||||
g_signal_emit_by_name (screen, "monitors-changed");
|
||||
@ -119,8 +120,8 @@ static const struct wl_output_listener output_listener = {
|
||||
};
|
||||
|
||||
static void
|
||||
gdk_display_handle_global(struct wl_display *display, uint32_t id,
|
||||
const char *interface, uint32_t version, void *data)
|
||||
gdk_registry_handle_global(void *data, struct wl_registry *registry, uint32_t id,
|
||||
const char *interface, uint32_t version)
|
||||
{
|
||||
GdkWaylandDisplay *display_wayland = data;
|
||||
GdkDisplay *gdk_display = GDK_DISPLAY_OBJECT (data);
|
||||
@ -128,27 +129,29 @@ gdk_display_handle_global(struct wl_display *display, uint32_t id,
|
||||
|
||||
if (strcmp(interface, "wl_compositor") == 0) {
|
||||
display_wayland->compositor =
|
||||
wl_display_bind(display, id, &wl_compositor_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_compositor_interface, 1);
|
||||
} else if (strcmp(interface, "wl_shm") == 0) {
|
||||
display_wayland->shm = wl_display_bind(display, id, &wl_shm_interface);
|
||||
display_wayland->shm =
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_shm_interface, 1);
|
||||
|
||||
/* SHM interface is prerequisite */
|
||||
_gdk_wayland_display_load_cursor_theme(display_wayland);
|
||||
} else if (strcmp(interface, "wl_shell") == 0) {
|
||||
display_wayland->shell = wl_display_bind(display, id, &wl_shell_interface);
|
||||
display_wayland->shell =
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_shell_interface, 1);
|
||||
} else if (strcmp(interface, "wl_output") == 0) {
|
||||
display_wayland->output =
|
||||
wl_display_bind(display, id, &wl_output_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id, &wl_output_interface, 1);
|
||||
wl_output_add_listener(display_wayland->output,
|
||||
&output_listener, display_wayland);
|
||||
} else if (strcmp(interface, "wl_seat") == 0) {
|
||||
seat = wl_display_bind (display, id, &wl_seat_interface);
|
||||
seat = wl_registry_bind(display_wayland->wl_registry, id, &wl_seat_interface, 1);
|
||||
_gdk_wayland_device_manager_add_device (gdk_display->device_manager,
|
||||
seat);
|
||||
} else if (strcmp(interface, "wl_data_device_manager") == 0) {
|
||||
display_wayland->data_device_manager =
|
||||
wl_display_bind(display, id,
|
||||
&wl_data_device_manager_interface);
|
||||
wl_registry_bind(display_wayland->wl_registry, id,
|
||||
&wl_data_device_manager_interface, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -210,6 +213,10 @@ gdk_display_init_egl(GdkDisplay *display)
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct wl_registry_listener registry_listener = {
|
||||
gdk_registry_handle_global
|
||||
};
|
||||
|
||||
GdkDisplay *
|
||||
_gdk_wayland_display_open (const gchar *display_name)
|
||||
{
|
||||
@ -231,14 +238,13 @@ _gdk_wayland_display_open (const gchar *display_name)
|
||||
display->device_manager = _gdk_wayland_device_manager_new (display);
|
||||
|
||||
/* Set up listener so we'll catch all events. */
|
||||
wl_display_add_global_listener(display_wayland->wl_display,
|
||||
gdk_display_handle_global, display_wayland);
|
||||
display_wayland->wl_registry = wl_display_get_registry(display_wayland->wl_display);
|
||||
wl_registry_add_listener(display_wayland->wl_registry, ®istry_listener, display_wayland);
|
||||
|
||||
#ifdef GDK_WAYLAND_USE_EGL
|
||||
gdk_display_init_egl(display);
|
||||
#else
|
||||
wl_display_iterate(wl_display, WL_DISPLAY_READABLE);
|
||||
wl_display_roundtrip(wl_display);
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
#endif
|
||||
|
||||
display_wayland->event_source =
|
||||
@ -351,8 +357,7 @@ gdk_wayland_display_flush (GdkDisplay *display)
|
||||
g_return_if_fail (GDK_IS_DISPLAY (display));
|
||||
|
||||
if (!display->closed)
|
||||
_gdk_wayland_display_flush (display,
|
||||
GDK_WAYLAND_DISPLAY (display)->event_source);
|
||||
wl_display_flush(GDK_WAYLAND_DISPLAY (display)->wl_display);;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -76,6 +76,7 @@ struct _GdkWaylandDisplay
|
||||
|
||||
/* Wayland fields below */
|
||||
struct wl_display *wl_display;
|
||||
struct wl_registry *wl_registry;
|
||||
struct wl_compositor *compositor;
|
||||
struct wl_shm *shm;
|
||||
struct wl_shell *shell;
|
||||
|
@ -44,8 +44,7 @@ gdk_event_source_prepare(GSource *base, gint *timeout)
|
||||
if (_gdk_event_queue_find_first (source->display) != NULL)
|
||||
return TRUE;
|
||||
|
||||
while (source->mask & WL_DISPLAY_WRITABLE)
|
||||
wl_display_iterate(display->wl_display, WL_DISPLAY_WRITABLE);
|
||||
wl_display_flush(display->wl_display);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -97,16 +96,6 @@ static GSourceFuncs wl_glib_source_funcs = {
|
||||
gdk_event_source_finalize
|
||||
};
|
||||
|
||||
static int
|
||||
gdk_event_source_update(uint32_t mask, void *data)
|
||||
{
|
||||
GdkWaylandEventSource *source = data;
|
||||
|
||||
source->mask = mask;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_deliver_event (GdkDisplay *display, GdkEvent *event)
|
||||
{
|
||||
@ -134,8 +123,7 @@ _gdk_wayland_display_event_source_new (GdkDisplay *display)
|
||||
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
wl_source->display = display;
|
||||
wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display,
|
||||
gdk_event_source_update, source);
|
||||
wl_source->pfd.fd = wl_display_get_fd(display_wayland->wl_display);
|
||||
wl_source->pfd.events = G_IO_IN | G_IO_ERR;
|
||||
g_source_add_poll(source, &wl_source->pfd);
|
||||
|
||||
@ -148,16 +136,6 @@ _gdk_wayland_display_event_source_new (GdkDisplay *display)
|
||||
return source;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_flush (GdkDisplay *display, GSource *source)
|
||||
{
|
||||
GdkWaylandEventSource *wayland_source = (GdkWaylandEventSource *) source;
|
||||
|
||||
while (wayland_source->mask & WL_DISPLAY_WRITABLE)
|
||||
wl_display_iterate(GDK_WAYLAND_DISPLAY (display)->wl_display,
|
||||
WL_DISPLAY_WRITABLE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_wayland_display_queue_events (GdkDisplay *display)
|
||||
{
|
||||
@ -166,10 +144,9 @@ _gdk_wayland_display_queue_events (GdkDisplay *display)
|
||||
|
||||
display_wayland = GDK_WAYLAND_DISPLAY (display);
|
||||
source = (GdkWaylandEventSource *) display_wayland->event_source;
|
||||
|
||||
if (source->pfd.revents)
|
||||
{
|
||||
wl_display_iterate(display_wayland->wl_display, WL_DISPLAY_READABLE);
|
||||
source->pfd.revents = 0;
|
||||
wl_display_dispatch(display_wayland->wl_display);
|
||||
source->pfd.revents = 0;
|
||||
}
|
||||
}
|
||||
|
@ -137,7 +137,6 @@ GdkKeymap *_gdk_wayland_device_get_keymap (GdkDevice *device);
|
||||
void _gdk_wayland_display_deliver_event (GdkDisplay *display, GdkEvent *event);
|
||||
GSource *_gdk_wayland_display_event_source_new (GdkDisplay *display);
|
||||
void _gdk_wayland_display_queue_events (GdkDisplay *display);
|
||||
void _gdk_wayland_display_flush (GdkDisplay *display, GSource *source);
|
||||
|
||||
GdkAppLaunchContext *_gdk_wayland_display_get_app_launch_context (GdkDisplay *display);
|
||||
|
||||
|
@ -1563,6 +1563,7 @@ gdk_wayland_window_process_updates_recurse (GdkWindow *window,
|
||||
cairo_region_get_rectangle (region, i, &rect);
|
||||
wl_surface_damage (impl->surface,
|
||||
rect.x, rect.y, rect.width, rect.height);
|
||||
wl_surface_commit(impl->surface);
|
||||
}
|
||||
|
||||
_gdk_window_process_updates_recurse (window, region);
|
||||
|
@ -1459,7 +1459,6 @@ _gdk_x11_display_open (const gchar *display_name)
|
||||
_gdk_x11_screen_setup (display_x11->screens[i]);
|
||||
|
||||
g_signal_emit_by_name (display, "opened");
|
||||
g_signal_emit_by_name (gdk_display_manager_get (), "display-opened", display);
|
||||
|
||||
return display;
|
||||
}
|
||||
|
@ -51,8 +51,13 @@ gdk_x11_display_manager_open_display (GdkDisplayManager *manager,
|
||||
GdkDisplay *display;
|
||||
|
||||
display = _gdk_x11_display_open (name);
|
||||
if (manager_x11->default_display == NULL && display != NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
if (display != NULL)
|
||||
{
|
||||
if (manager_x11->default_display == NULL)
|
||||
gdk_display_manager_set_default_display (manager, display);
|
||||
|
||||
g_signal_emit_by_name (manager, "display-opened", display);
|
||||
}
|
||||
|
||||
return display;
|
||||
}
|
||||
|
@ -1113,6 +1113,8 @@ MyEnhancedXkbTranslateKeyCode(register XkbDescPtr xkb,
|
||||
int found = 0;
|
||||
|
||||
for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
|
||||
if (!entry->active || syms[col+entry->level] == syms[col])
|
||||
continue;
|
||||
if (mods_rtrn) {
|
||||
int bits = 0;
|
||||
unsigned long tmp = entry->mods.mask;
|
||||
@ -1123,14 +1125,22 @@ MyEnhancedXkbTranslateKeyCode(register XkbDescPtr xkb,
|
||||
}
|
||||
/* We always add one-modifiers levels to mods_rtrn since
|
||||
* they can't wipe out bits in the state unless the
|
||||
* level would be triggered. But return other modifiers
|
||||
*
|
||||
* level would be triggered. But not if they don't change
|
||||
* the symbol (otherwise we can't discriminate Shift-F10
|
||||
* and F10 anymore). And don't add modifiers that are
|
||||
* explicitly marked as preserved, either.
|
||||
*/
|
||||
if (bits == 1 || (mods&type->mods.mask)==entry->mods.mask)
|
||||
*mods_rtrn |= entry->mods.mask;
|
||||
if (bits == 1 ||
|
||||
(mods&type->mods.mask) == entry->mods.mask)
|
||||
{
|
||||
if (type->preserve)
|
||||
*mods_rtrn |= (entry->mods.mask & ~type->preserve[i].mask);
|
||||
else
|
||||
*mods_rtrn |= entry->mods.mask;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found&&entry->active&&((mods&type->mods.mask)==entry->mods.mask)) {
|
||||
if (!found && ((mods&type->mods.mask) == entry->mods.mask)) {
|
||||
col+= entry->level;
|
||||
if (type->preserve)
|
||||
preserve= type->preserve[i].mask;
|
||||
|
@ -311,6 +311,10 @@ void _gdk_x11_cursor_display_finalize (GdkDisplay *display);
|
||||
|
||||
void _gdk_x11_window_register_dnd (GdkWindow *window);
|
||||
|
||||
GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window,
|
||||
GdkDevice *device,
|
||||
GList *targets);
|
||||
|
||||
gboolean _gdk_x11_get_xft_setting (GdkScreen *screen,
|
||||
const gchar *name,
|
||||
GValue *value);
|
||||
|
@ -4858,6 +4858,11 @@ _gdk_x11_display_before_process_all_updates (GdkDisplay *display)
|
||||
void
|
||||
_gdk_x11_display_after_process_all_updates (GdkDisplay *display)
|
||||
{
|
||||
/* Sync after all drawing, otherwise the client can get "ahead" of
|
||||
the server rendering during animations, such that we fill up
|
||||
the Xserver pipes with sync rendering ops not letting other
|
||||
clients (including the VM) do anything. */
|
||||
XSync (GDK_DISPLAY_XDISPLAY (display), FALSE);
|
||||
}
|
||||
|
||||
static Bool
|
||||
@ -4948,10 +4953,6 @@ gdk_x11_window_get_xid (GdkWindow *window)
|
||||
return GDK_WINDOW_IMPL_X11 (window->impl)->xid;
|
||||
}
|
||||
|
||||
extern GdkDragContext * _gdk_x11_window_drag_begin (GdkWindow *window,
|
||||
GdkDevice *device,
|
||||
GList *targets);
|
||||
|
||||
static void
|
||||
gdk_window_impl_x11_class_init (GdkWindowImplX11Class *klass)
|
||||
{
|
||||
|
@ -395,8 +395,9 @@ gtk_appchooser_impl_c_sources = \
|
||||
gtkappchooseronlinepk.c
|
||||
endif
|
||||
|
||||
gtk_private_type_h_sources = \
|
||||
gtkcsstypesprivate.h
|
||||
gtk_private_type_h_sources = \
|
||||
gtkcsstypesprivate.h \
|
||||
gtktexthandleprivate.h
|
||||
|
||||
|
||||
# GTK+ header files that don't get installed
|
||||
@ -420,6 +421,7 @@ gtk_private_h_sources = \
|
||||
gtkboxprivate.h \
|
||||
gtkbuilderprivate.h \
|
||||
gtkbuttonprivate.h \
|
||||
gtkcairoblurprivate.h \
|
||||
gtkcellareaboxcontextprivate.h \
|
||||
gtkcolorswatchprivate.h \
|
||||
gtkcoloreditorprivate.h \
|
||||
@ -427,7 +429,7 @@ gtk_private_h_sources = \
|
||||
gtkcolorscaleprivate.h \
|
||||
gtkcolorchooserprivate.h \
|
||||
gtkcontainerprivate.h \
|
||||
gtkcssanimatedvaluesprivate.h \
|
||||
gtkcssanimationprivate.h \
|
||||
gtkcssarrayvalueprivate.h \
|
||||
gtkcssbgsizevalueprivate.h \
|
||||
gtkcssbordervalueprivate.h \
|
||||
@ -446,6 +448,7 @@ gtk_private_h_sources = \
|
||||
gtkcssimagewin32private.h \
|
||||
gtkcssinheritvalueprivate.h \
|
||||
gtkcssinitialvalueprivate.h \
|
||||
gtkcsskeyframesprivate.h \
|
||||
gtkcsslookupprivate.h \
|
||||
gtkcssmatcherprivate.h \
|
||||
gtkcssnumbervalueprivate.h \
|
||||
@ -476,6 +479,7 @@ gtk_private_h_sources = \
|
||||
gtkfilesystemmodel.h \
|
||||
gtkfontchooserprivate.h \
|
||||
gtkfontchooserutils.h \
|
||||
gtkgradientprivate.h \
|
||||
gtkiconcache.h \
|
||||
gtkiconhelperprivate.h \
|
||||
gtkiconviewprivate.h \
|
||||
@ -490,7 +494,6 @@ gtk_private_h_sources = \
|
||||
gtkmenuitemprivate.h \
|
||||
gtkmenushellprivate.h \
|
||||
gtkmnemonichash.h \
|
||||
gtkmodelmenu.h \
|
||||
gtkmodelmenuitem.h \
|
||||
gtkmodifierstyle.h \
|
||||
gtkmodulesprivate.h \
|
||||
@ -527,6 +530,7 @@ gtk_private_h_sources = \
|
||||
gtktextbtree.h \
|
||||
gtktextbufferserialize.h \
|
||||
gtktextchildprivate.h \
|
||||
gtktexthandleprivate.h \
|
||||
gtktextiterprivate.h \
|
||||
gtktextmarkprivate.h \
|
||||
gtktextsegment.h \
|
||||
@ -616,6 +620,7 @@ gtk_base_c_sources = \
|
||||
gtkbuilderparser.c \
|
||||
gtkbuilder-menus.c \
|
||||
gtkbutton.c \
|
||||
gtkcairoblur.c \
|
||||
gtkcalendar.c \
|
||||
gtkcellarea.c \
|
||||
gtkcellareabox.c \
|
||||
@ -647,7 +652,7 @@ gtk_base_c_sources = \
|
||||
gtkcombobox.c \
|
||||
gtkcomboboxtext.c \
|
||||
gtkcontainer.c \
|
||||
gtkcssanimatedvalues.c \
|
||||
gtkcssanimation.c \
|
||||
gtkcssarrayvalue.c \
|
||||
gtkcssbgsizevalue.c \
|
||||
gtkcssbordervalue.c \
|
||||
@ -666,6 +671,7 @@ gtk_base_c_sources = \
|
||||
gtkcssimagewin32.c \
|
||||
gtkcssinheritvalue.c \
|
||||
gtkcssinitialvalue.c \
|
||||
gtkcsskeyframes.c \
|
||||
gtkcsslookup.c \
|
||||
gtkcssmatcher.c \
|
||||
gtkcssnumbervalue.c \
|
||||
@ -825,6 +831,7 @@ gtk_base_c_sources = \
|
||||
gtktextbufferserialize.c \
|
||||
gtktextchild.c \
|
||||
gtktextdisplay.c \
|
||||
gtktexthandle.c \
|
||||
gtktextiter.c \
|
||||
gtktextlayout.c \
|
||||
gtktextmark.c \
|
||||
|
@ -54,6 +54,7 @@ gail_c_sources = \
|
||||
gailmisc.c
|
||||
|
||||
gail_private_h_sources = \
|
||||
gail.h \
|
||||
gtkarrowaccessible.h \
|
||||
gtkbooleancellaccessible.h \
|
||||
gtkboxaccessible.h \
|
||||
|
@ -17,6 +17,8 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gail.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
@ -76,6 +78,7 @@ static GtkWidget* focus_before_menu = NULL;
|
||||
static guint focus_notify_handler = 0;
|
||||
static guint focus_tracker_id = 0;
|
||||
static GQuark quark_focus_object = 0;
|
||||
static int initialized = FALSE;
|
||||
|
||||
static AtkObject*
|
||||
gail_get_accessible_for_widget (GtkWidget *widget,
|
||||
@ -794,10 +797,25 @@ gail_set_focus_object (AtkObject *focus_obj,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_shutdown (void)
|
||||
{
|
||||
if (!initialized)
|
||||
return;
|
||||
|
||||
initialized = FALSE;
|
||||
|
||||
g_clear_object (&atk_misc_instance);
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
atk_bridge_adaptor_cleanup ();
|
||||
#endif
|
||||
_gail_util_uninstall ();
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_init (void)
|
||||
{
|
||||
static int initialized = FALSE;
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
|
30
gtk/a11y/gail.h
Normal file
30
gtk/a11y/gail.h
Normal file
@ -0,0 +1,30 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* 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_GAIL_H__
|
||||
#define __GTK_GAIL_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gtk_accessibility_shutdown (void);
|
||||
void _gtk_accessibility_init (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_GAIL_H__ */
|
@ -206,6 +206,17 @@ do_window_event_initialization (void)
|
||||
(GCallback) window_removed, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
undo_window_event_initialization (void)
|
||||
{
|
||||
AtkObject *root;
|
||||
|
||||
root = atk_get_root ();
|
||||
|
||||
g_signal_handlers_disconnect_by_func (root, (GCallback) window_added, NULL);
|
||||
g_signal_handlers_disconnect_by_func (root, (GCallback) window_removed, NULL);
|
||||
}
|
||||
|
||||
static AtkKeyEventStruct *
|
||||
atk_key_event_from_gdk_event_key (GdkEventKey *key)
|
||||
{
|
||||
@ -341,6 +352,12 @@ gail_util_get_toolkit_version (void)
|
||||
return GTK_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_uninstall (void)
|
||||
{
|
||||
undo_window_event_initialization ();
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_install (void)
|
||||
{
|
||||
|
@ -22,7 +22,8 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gail_util_install (void);
|
||||
void _gail_util_install (void);
|
||||
void _gail_util_uninstall (void);
|
||||
|
||||
gboolean _gail_util_key_snooper (GtkWidget *the_widget,
|
||||
GdkEventKey *event);
|
||||
|
@ -20,6 +20,10 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkarrowaccessible.h"
|
||||
|
||||
struct _GtkArrowAccessiblePrivate
|
||||
{
|
||||
gchar *image_description;
|
||||
};
|
||||
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
@ -40,7 +44,7 @@ gtk_arrow_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (object);
|
||||
|
||||
g_free (arrow->image_description);
|
||||
g_free (arrow->priv->image_description);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_arrow_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -54,12 +58,16 @@ _gtk_arrow_accessible_class_init (GtkArrowAccessibleClass *klass)
|
||||
atk_object_class->initialize = gtk_arrow_accessible_initialize;
|
||||
|
||||
gobject_class->finalize = gtk_arrow_accessible_finalize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkArrowAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_arrow_accessible_init (GtkArrowAccessible *arrow)
|
||||
{
|
||||
arrow->image_description = NULL;
|
||||
arrow->priv = G_TYPE_INSTANCE_GET_PRIVATE (arrow,
|
||||
GTK_TYPE_ARROW_ACCESSIBLE,
|
||||
GtkArrowAccessiblePrivate);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
@ -67,7 +75,7 @@ gtk_arrow_accessible_get_image_description (AtkImage *obj)
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (obj);
|
||||
|
||||
return arrow->image_description;
|
||||
return arrow->priv->image_description;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -76,8 +84,8 @@ gtk_arrow_accessible_set_image_description (AtkImage *obj,
|
||||
{
|
||||
GtkArrowAccessible *arrow = GTK_ARROW_ACCESSIBLE (obj);
|
||||
|
||||
g_free (arrow->image_description);
|
||||
arrow->image_description = g_strdup (description);
|
||||
g_free (arrow->priv->image_description);
|
||||
arrow->priv->image_description = g_strdup (description);
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
@ -29,14 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_ARROW_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ARROW_ACCESSIBLE))
|
||||
#define GTK_ARROW_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ARROW_ACCESSIBLE, GtkArrowAccessibleClass))
|
||||
|
||||
typedef struct _GtkArrowAccessible GtkArrowAccessible;
|
||||
typedef struct _GtkArrowAccessibleClass GtkArrowAccessibleClass;
|
||||
typedef struct _GtkArrowAccessible GtkArrowAccessible;
|
||||
typedef struct _GtkArrowAccessibleClass GtkArrowAccessibleClass;
|
||||
typedef struct _GtkArrowAccessiblePrivate GtkArrowAccessiblePrivate;
|
||||
|
||||
struct _GtkArrowAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gchar *image_description;
|
||||
GtkArrowAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkArrowAccessibleClass
|
||||
|
@ -20,6 +20,12 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkbooleancellaccessible.h"
|
||||
|
||||
struct _GtkBooleanCellAccessiblePrivate
|
||||
{
|
||||
gboolean cell_value;
|
||||
gboolean cell_sensitive;
|
||||
};
|
||||
|
||||
static AtkActionIface *parent_action_iface;
|
||||
|
||||
static gint
|
||||
@ -82,10 +88,10 @@ gtk_boolean_cell_accessible_ref_state_set (AtkObject *accessible)
|
||||
|
||||
state_set = ATK_OBJECT_CLASS (_gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
|
||||
|
||||
if (cell->cell_value)
|
||||
if (cell->priv->cell_value)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
|
||||
|
||||
if (cell->cell_sensitive)
|
||||
if (cell->priv->cell_sensitive)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SENSITIVE);
|
||||
else
|
||||
atk_state_set_remove_state (state_set, ATK_STATE_SENSITIVE);
|
||||
@ -99,22 +105,25 @@ gtk_boolean_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
GtkBooleanCellAccessible *boolean_cell = GTK_BOOLEAN_CELL_ACCESSIBLE (cell);
|
||||
gboolean active;
|
||||
gboolean sensitive;
|
||||
GtkCellRenderer *renderer;
|
||||
|
||||
g_object_get (G_OBJECT (GTK_RENDERER_CELL_ACCESSIBLE (cell)->renderer),
|
||||
g_object_get (cell, "renderer", &renderer, NULL);
|
||||
g_object_get (renderer,
|
||||
"active", &active,
|
||||
"sensitive", &sensitive,
|
||||
NULL);
|
||||
g_object_unref (renderer);
|
||||
|
||||
if (boolean_cell->cell_value != active)
|
||||
if (boolean_cell->priv->cell_value != active)
|
||||
{
|
||||
boolean_cell->cell_value = !boolean_cell->cell_value;
|
||||
boolean_cell->priv->cell_value = !boolean_cell->priv->cell_value;
|
||||
|
||||
atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, active);
|
||||
}
|
||||
|
||||
if (boolean_cell->cell_sensitive != sensitive)
|
||||
if (boolean_cell->priv->cell_sensitive != sensitive)
|
||||
{
|
||||
boolean_cell->cell_sensitive = !boolean_cell->cell_sensitive;
|
||||
boolean_cell->priv->cell_sensitive = !boolean_cell->priv->cell_sensitive;
|
||||
|
||||
atk_object_notify_state_change (ATK_OBJECT (cell), ATK_STATE_CHECKED, sensitive);
|
||||
}
|
||||
@ -129,10 +138,15 @@ _gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
|
||||
atkobject_class->ref_state_set = gtk_boolean_cell_accessible_ref_state_set;
|
||||
|
||||
cell_class->update_cache = gtk_boolean_cell_accessible_update_cache;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkBooleanCellAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
|
||||
{
|
||||
cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
|
||||
GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE,
|
||||
GtkBooleanCellAccessiblePrivate);
|
||||
}
|
||||
|
||||
|
@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_BOOLEAN_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE))
|
||||
#define GTK_BOOLEAN_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE, GtkBooleanCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkBooleanCellAccessible GtkBooleanCellAccessible;
|
||||
typedef struct _GtkBooleanCellAccessibleClass GtkBooleanCellAccessibleClass;
|
||||
typedef struct _GtkBooleanCellAccessible GtkBooleanCellAccessible;
|
||||
typedef struct _GtkBooleanCellAccessibleClass GtkBooleanCellAccessibleClass;
|
||||
typedef struct _GtkBooleanCellAccessiblePrivate GtkBooleanCellAccessiblePrivate;
|
||||
|
||||
struct _GtkBooleanCellAccessible
|
||||
{
|
||||
GtkRendererCellAccessible parent;
|
||||
gboolean cell_value;
|
||||
gboolean cell_sensitive;
|
||||
|
||||
GtkBooleanCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkBooleanCellAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_BOX_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BOX_ACCESSIBLE))
|
||||
#define GTK_BOX_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BOX_ACCESSIBLE, GtkBoxAccessibleClass))
|
||||
|
||||
typedef struct _GtkBoxAccessible GtkBoxAccessible;
|
||||
typedef struct _GtkBoxAccessibleClass GtkBoxAccessibleClass;
|
||||
typedef struct _GtkBoxAccessible GtkBoxAccessible;
|
||||
typedef struct _GtkBoxAccessibleClass GtkBoxAccessibleClass;
|
||||
typedef struct _GtkBoxAccessiblePrivate GtkBoxAccessiblePrivate;
|
||||
|
||||
struct _GtkBoxAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkBoxAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkBoxAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_BUTTON_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_BUTTON_ACCESSIBLE))
|
||||
#define GTK_BUTTON_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_BUTTON_ACCESSIBLE, GtkButtonAccessibleClass))
|
||||
|
||||
typedef struct _GtkButtonAccessible GtkButtonAccessible;
|
||||
typedef struct _GtkButtonAccessibleClass GtkButtonAccessibleClass;
|
||||
typedef struct _GtkButtonAccessible GtkButtonAccessible;
|
||||
typedef struct _GtkButtonAccessibleClass GtkButtonAccessibleClass;
|
||||
typedef struct _GtkButtonAccessiblePrivate GtkButtonAccessiblePrivate;
|
||||
|
||||
struct _GtkButtonAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkButtonAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkButtonAccessibleClass
|
||||
|
@ -83,7 +83,7 @@ gtk_cell_accessible_get_index_in_parent (AtkObject *obj)
|
||||
|
||||
parent = atk_object_get_parent (obj);
|
||||
if (GTK_IS_CONTAINER_CELL_ACCESSIBLE (parent))
|
||||
return g_list_index (GTK_CONTAINER_CELL_ACCESSIBLE (parent)->children, obj);
|
||||
return g_list_index (_gtk_container_cell_accessible_get_children (GTK_CONTAINER_CELL_ACCESSIBLE (parent)), obj);
|
||||
|
||||
parent = gtk_widget_get_accessible (gtk_accessible_get_widget (GTK_ACCESSIBLE (cell)));
|
||||
if (parent == NULL)
|
||||
|
@ -30,12 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CELL_ACCESSIBLE))
|
||||
#define GTK_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CELL_ACCESSIBLE, GtkCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkCellAccessible GtkCellAccessible;
|
||||
typedef struct _GtkCellAccessibleClass GtkCellAccessibleClass;
|
||||
typedef struct _GtkCellAccessible GtkCellAccessible;
|
||||
typedef struct _GtkCellAccessibleClass GtkCellAccessibleClass;
|
||||
typedef struct _GtkCellAccessiblePrivate GtkCellAccessiblePrivate;
|
||||
|
||||
struct _GtkCellAccessible
|
||||
{
|
||||
GtkAccessible parent;
|
||||
|
||||
GtkCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkCellAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CHECK_MENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CHECK_MENU_ITEM_ACCESSIBLE))
|
||||
#define GTK_CHECK_MENU_ITEM_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CHECK_MENU_ITEM_ACCESSIBLE, GtkCheckMenuItemAccessibleClass))
|
||||
|
||||
typedef struct _GtkCheckMenuItemAccessible GtkCheckMenuItemAccessible;
|
||||
typedef struct _GtkCheckMenuItemAccessibleClass GtkCheckMenuItemAccessibleClass;
|
||||
typedef struct _GtkCheckMenuItemAccessible GtkCheckMenuItemAccessible;
|
||||
typedef struct _GtkCheckMenuItemAccessibleClass GtkCheckMenuItemAccessibleClass;
|
||||
typedef struct _GtkCheckMenuItemAccessiblePrivate GtkCheckMenuItemAccessiblePrivate;
|
||||
|
||||
struct _GtkCheckMenuItemAccessible
|
||||
{
|
||||
GtkMenuItemAccessible parent;
|
||||
|
||||
GtkCheckMenuItemAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkCheckMenuItemAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_COLOR_SWATCH_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COLOR_SWATCH_ACCESSIBLE))
|
||||
#define GTK_COLOR_SWATCH_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COLOR_SWATCH_ACCESSIBLE, GtkColorSwatchAccessibleClass))
|
||||
|
||||
typedef struct _GtkColorSwatchAccessible GtkColorSwatchAccessible;
|
||||
typedef struct _GtkColorSwatchAccessibleClass GtkColorSwatchAccessibleClass;
|
||||
typedef struct _GtkColorSwatchAccessible GtkColorSwatchAccessible;
|
||||
typedef struct _GtkColorSwatchAccessibleClass GtkColorSwatchAccessibleClass;
|
||||
typedef struct _GtkColorSwatchAccessiblePrivate GtkColorSwatchAccessiblePrivate;
|
||||
|
||||
struct _GtkColorSwatchAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
GtkColorSwatchAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkColorSwatchAccessibleClass
|
||||
|
@ -20,6 +20,12 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcomboboxaccessible.h"
|
||||
|
||||
struct _GtkComboBoxAccessiblePrivate
|
||||
{
|
||||
gchar *name;
|
||||
gint old_selection;
|
||||
gboolean popup_set;
|
||||
};
|
||||
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
static void atk_selection_interface_init (AtkSelectionIface *iface);
|
||||
@ -41,9 +47,9 @@ changed_cb (GtkWidget *widget)
|
||||
index = gtk_combo_box_get_active (combo_box);
|
||||
obj = gtk_widget_get_accessible (widget);
|
||||
accessible = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
if (accessible->old_selection != index)
|
||||
if (accessible->priv->old_selection != index)
|
||||
{
|
||||
accessible->old_selection = index;
|
||||
accessible->priv->old_selection = index;
|
||||
g_object_notify (G_OBJECT (obj), "accessible-name");
|
||||
g_signal_emit_by_name (obj, "selection-changed");
|
||||
}
|
||||
@ -63,13 +69,13 @@ gtk_combo_box_accessible_initialize (AtkObject *obj,
|
||||
accessible = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
|
||||
g_signal_connect (combo_box, "changed", G_CALLBACK (changed_cb), NULL);
|
||||
accessible->old_selection = gtk_combo_box_get_active (combo_box);
|
||||
accessible->priv->old_selection = gtk_combo_box_get_active (combo_box);
|
||||
|
||||
popup = gtk_combo_box_get_popup_accessible (combo_box);
|
||||
if (popup)
|
||||
{
|
||||
atk_object_set_parent (popup, obj);
|
||||
accessible->popup_set = TRUE;
|
||||
accessible->priv->popup_set = TRUE;
|
||||
}
|
||||
if (gtk_combo_box_get_has_entry (combo_box))
|
||||
atk_object_set_parent (gtk_widget_get_accessible (gtk_bin_get_child (GTK_BIN (combo_box))), obj);
|
||||
@ -82,7 +88,7 @@ gtk_combo_box_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkComboBoxAccessible *combo_box = GTK_COMBO_BOX_ACCESSIBLE (object);
|
||||
|
||||
g_free (combo_box->name);
|
||||
g_free (combo_box->priv->name);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_combo_box_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -120,8 +126,8 @@ gtk_combo_box_accessible_get_name (AtkObject *obj)
|
||||
gtk_tree_model_get_value (model, &iter, i, &value);
|
||||
if (G_VALUE_HOLDS_STRING (&value))
|
||||
{
|
||||
g_free (accessible->name);
|
||||
accessible->name = g_strdup (g_value_get_string (&value));
|
||||
g_free (accessible->priv->name);
|
||||
accessible->priv->name = g_strdup (g_value_get_string (&value));
|
||||
g_value_unset (&value);
|
||||
break;
|
||||
}
|
||||
@ -129,7 +135,7 @@ gtk_combo_box_accessible_get_name (AtkObject *obj)
|
||||
g_value_unset (&value);
|
||||
}
|
||||
}
|
||||
return accessible->name;
|
||||
return accessible->priv->name;
|
||||
}
|
||||
|
||||
static gint
|
||||
@ -165,10 +171,10 @@ gtk_combo_box_accessible_ref_child (AtkObject *obj,
|
||||
{
|
||||
child = gtk_combo_box_get_popup_accessible (GTK_COMBO_BOX (widget));
|
||||
box = GTK_COMBO_BOX_ACCESSIBLE (obj);
|
||||
if (box->popup_set == FALSE)
|
||||
if (!box->priv->popup_set)
|
||||
{
|
||||
atk_object_set_parent (child, obj);
|
||||
box->popup_set = TRUE;
|
||||
box->priv->popup_set = TRUE;
|
||||
}
|
||||
}
|
||||
else if (i == 1 && gtk_combo_box_get_has_entry (GTK_COMBO_BOX (widget)))
|
||||
@ -195,14 +201,19 @@ _gtk_combo_box_accessible_class_init (GtkComboBoxAccessibleClass *klass)
|
||||
class->get_n_children = gtk_combo_box_accessible_get_n_children;
|
||||
class->ref_child = gtk_combo_box_accessible_ref_child;
|
||||
class->initialize = gtk_combo_box_accessible_initialize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkComboBoxAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_combo_box_accessible_init (GtkComboBoxAccessible *combo_box)
|
||||
{
|
||||
combo_box->old_selection = -1;
|
||||
combo_box->name = NULL;
|
||||
combo_box->popup_set = FALSE;
|
||||
combo_box->priv = G_TYPE_INSTANCE_GET_PRIVATE (combo_box,
|
||||
GTK_TYPE_COMBO_BOX_ACCESSIBLE,
|
||||
GtkComboBoxAccessiblePrivate);
|
||||
combo_box->priv->old_selection = -1;
|
||||
combo_box->priv->name = NULL;
|
||||
combo_box->priv->popup_set = FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -29,16 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_COMBO_BOX_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_COMBO_BOX_ACCESSIBLE))
|
||||
#define GTK_COMBO_BOX_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_COMBO_BOX_ACCESSIBLE, GtkComboBoxAccessibleClass))
|
||||
|
||||
typedef struct _GtkComboBoxAccessible GtkComboBoxAccessible;
|
||||
typedef struct _GtkComboBoxAccessibleClass GtkComboBoxAccessibleClass;
|
||||
typedef struct _GtkComboBoxAccessible GtkComboBoxAccessible;
|
||||
typedef struct _GtkComboBoxAccessibleClass GtkComboBoxAccessibleClass;
|
||||
typedef struct _GtkComboBoxAccessiblePrivate GtkComboBoxAccessiblePrivate;
|
||||
|
||||
struct _GtkComboBoxAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
gchar *name;
|
||||
gint old_selection;
|
||||
gboolean popup_set;
|
||||
GtkComboBoxAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkComboBoxAccessibleClass
|
||||
|
@ -20,6 +20,10 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcontaineraccessible.h"
|
||||
|
||||
struct _GtkContainerAccessiblePrivate
|
||||
{
|
||||
GList *children;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkContainerAccessible, _gtk_container_accessible, GTK_TYPE_WIDGET_ACCESSIBLE)
|
||||
|
||||
@ -34,7 +38,7 @@ gtk_container_accessible_get_n_children (AtkObject* obj)
|
||||
if (widget == NULL)
|
||||
return 0;
|
||||
|
||||
children = gtk_container_get_children (GTK_CONTAINER(widget));
|
||||
children = gtk_container_get_children (GTK_CONTAINER (widget));
|
||||
count = g_list_length (children);
|
||||
g_list_free (children);
|
||||
|
||||
@ -115,9 +119,9 @@ gtk_container_accessible_real_add_gtk (GtkContainer *container,
|
||||
accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
g_list_free (accessible->children);
|
||||
accessible->children = gtk_container_get_children (container);
|
||||
index = g_list_index (accessible->children, widget);
|
||||
g_list_free (accessible->priv->children);
|
||||
accessible->priv->children = gtk_container_get_children (container);
|
||||
index = g_list_index (accessible->priv->children, widget);
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::add", index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
@ -140,10 +144,10 @@ gtk_container_accessible_real_remove_gtk (GtkContainer *container,
|
||||
accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
index = g_list_index (accessible->children, widget);
|
||||
g_list_free (accessible->children);
|
||||
accessible->children = gtk_container_get_children (container);
|
||||
if (index >= 0 && index <= g_list_length (accessible->children))
|
||||
index = g_list_index (accessible->priv->children, widget);
|
||||
g_list_free (accessible->priv->children);
|
||||
accessible->priv->children = gtk_container_get_children (container);
|
||||
if (index >= 0 && index <= g_list_length (accessible->priv->children))
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::remove", index, atk_child, NULL);
|
||||
|
||||
return 1;
|
||||
@ -157,7 +161,7 @@ gtk_container_accessible_real_initialize (AtkObject *obj,
|
||||
|
||||
ATK_OBJECT_CLASS (_gtk_container_accessible_parent_class)->initialize (obj, data);
|
||||
|
||||
accessible->children = gtk_container_get_children (GTK_CONTAINER (data));
|
||||
accessible->priv->children = gtk_container_get_children (GTK_CONTAINER (data));
|
||||
|
||||
g_signal_connect (data, "add", G_CALLBACK (gtk_container_accessible_add_gtk), obj);
|
||||
g_signal_connect (data, "remove", G_CALLBACK (gtk_container_accessible_remove_gtk), obj);
|
||||
@ -170,7 +174,7 @@ gtk_container_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkContainerAccessible *accessible = GTK_CONTAINER_ACCESSIBLE (object);
|
||||
|
||||
g_list_free (accessible->children);
|
||||
g_list_free (accessible->priv->children);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_container_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -189,10 +193,14 @@ _gtk_container_accessible_class_init (GtkContainerAccessibleClass *klass)
|
||||
|
||||
klass->add_gtk = gtk_container_accessible_real_add_gtk;
|
||||
klass->remove_gtk = gtk_container_accessible_real_remove_gtk;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkContainerAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_container_accessible_init (GtkContainerAccessible *container)
|
||||
{
|
||||
container->priv = G_TYPE_INSTANCE_GET_PRIVATE (container,
|
||||
GTK_TYPE_CONTAINER_ACCESSIBLE,
|
||||
GtkContainerAccessiblePrivate);
|
||||
}
|
||||
|
||||
|
@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CONTAINER_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CONTAINER_ACCESSIBLE))
|
||||
#define GTK_CONTAINER_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CONTAINER_ACCESSIBLE, GtkContainerAccessibleClass))
|
||||
|
||||
typedef struct _GtkContainerAccessible GtkContainerAccessible;
|
||||
typedef struct _GtkContainerAccessibleClass GtkContainerAccessibleClass;
|
||||
typedef struct _GtkContainerAccessible GtkContainerAccessible;
|
||||
typedef struct _GtkContainerAccessibleClass GtkContainerAccessibleClass;
|
||||
typedef struct _GtkContainerAccessiblePrivate GtkContainerAccessiblePrivate;
|
||||
|
||||
struct _GtkContainerAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
GList *children;
|
||||
GtkContainerAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkContainerAccessibleClass
|
||||
|
@ -20,6 +20,11 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcontainercellaccessible.h"
|
||||
|
||||
struct _GtkContainerCellAccessiblePrivate
|
||||
{
|
||||
GList *children;
|
||||
gint n_children;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkContainerCellAccessible, _gtk_container_cell_accessible, GTK_TYPE_CELL_ACCESSIBLE)
|
||||
|
||||
@ -29,7 +34,7 @@ gtk_container_cell_accessible_finalize (GObject *obj)
|
||||
{
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
|
||||
g_list_free_full (container->children, g_object_unref);
|
||||
g_list_free_full (container->priv->children, g_object_unref);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_container_cell_accessible_parent_class)->finalize (obj);
|
||||
}
|
||||
@ -40,7 +45,7 @@ gtk_container_cell_accessible_get_n_children (AtkObject *obj)
|
||||
{
|
||||
GtkContainerCellAccessible *cell = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
|
||||
return cell->NChildren;
|
||||
return cell->priv->n_children;
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
@ -50,7 +55,7 @@ gtk_container_cell_accessible_ref_child (AtkObject *obj,
|
||||
GtkContainerCellAccessible *cell = GTK_CONTAINER_CELL_ACCESSIBLE (obj);
|
||||
GList *l;
|
||||
|
||||
l = g_list_nth (cell->children, child);
|
||||
l = g_list_nth (cell->priv->children, child);
|
||||
if (l == NULL)
|
||||
return NULL;
|
||||
|
||||
@ -63,7 +68,7 @@ gtk_container_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (cell);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
_gtk_cell_accessible_update_cache (l->data);
|
||||
}
|
||||
@ -75,7 +80,7 @@ gtk_container_cell_widget_set (GtkAccessible *accessible)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (accessible);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
gtk_accessible_set_widget (l->data, gtk_accessible_get_widget (accessible));
|
||||
}
|
||||
@ -89,7 +94,7 @@ gtk_container_cell_widget_unset (GtkAccessible *accessible)
|
||||
GtkContainerCellAccessible *container = GTK_CONTAINER_CELL_ACCESSIBLE (accessible);
|
||||
GList *l;
|
||||
|
||||
for (l = container->children; l; l = l->next)
|
||||
for (l = container->priv->children; l; l = l->next)
|
||||
{
|
||||
gtk_accessible_set_widget (l->data, NULL);
|
||||
}
|
||||
@ -114,31 +119,28 @@ _gtk_container_cell_accessible_class_init (GtkContainerCellAccessibleClass *klas
|
||||
accessible_class->widget_unset = gtk_container_cell_widget_unset;
|
||||
|
||||
cell_class->update_cache = gtk_container_cell_accessible_update_cache;
|
||||
|
||||
g_type_class_add_private (g_object_class, sizeof (GtkContainerCellAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_container_cell_accessible_init (GtkContainerCellAccessible *cell)
|
||||
{
|
||||
cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
|
||||
GTK_TYPE_CONTAINER_CELL_ACCESSIBLE,
|
||||
GtkContainerCellAccessiblePrivate);
|
||||
}
|
||||
|
||||
GtkContainerCellAccessible *
|
||||
_gtk_container_cell_accessible_new (void)
|
||||
{
|
||||
GObject *object;
|
||||
AtkObject *atk_object;
|
||||
GtkContainerCellAccessible *container;
|
||||
|
||||
object = g_object_new (GTK_TYPE_CONTAINER_CELL_ACCESSIBLE, NULL);
|
||||
|
||||
g_return_val_if_fail (object != NULL, NULL);
|
||||
ATK_OBJECT (object)->role = ATK_ROLE_TABLE_CELL;
|
||||
|
||||
atk_object = ATK_OBJECT (object);
|
||||
atk_object->role = ATK_ROLE_TABLE_CELL;
|
||||
|
||||
container = GTK_CONTAINER_CELL_ACCESSIBLE (object);
|
||||
container->children = NULL;
|
||||
container->NChildren = 0;
|
||||
return container;
|
||||
return GTK_CONTAINER_CELL_ACCESSIBLE (object);
|
||||
}
|
||||
|
||||
void
|
||||
@ -148,8 +150,8 @@ _gtk_container_cell_accessible_add_child (GtkContainerCellAccessible *container,
|
||||
g_return_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container));
|
||||
g_return_if_fail (GTK_IS_CELL_ACCESSIBLE (child));
|
||||
|
||||
container->NChildren++;
|
||||
container->children = g_list_append (container->children, child);
|
||||
container->priv->n_children++;
|
||||
container->priv->children = g_list_append (container->priv->children, child);
|
||||
atk_object_set_parent (ATK_OBJECT (child), ATK_OBJECT (container));
|
||||
}
|
||||
|
||||
@ -159,8 +161,16 @@ _gtk_container_cell_accessible_remove_child (GtkContainerCellAccessible *contain
|
||||
{
|
||||
g_return_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container));
|
||||
g_return_if_fail (GTK_IS_CELL_ACCESSIBLE (child));
|
||||
g_return_if_fail (container->NChildren > 0);
|
||||
g_return_if_fail (container->priv->n_children > 0);
|
||||
|
||||
container->children = g_list_remove (container->children, child);
|
||||
container->NChildren--;
|
||||
container->priv->children = g_list_remove (container->priv->children, child);
|
||||
container->priv->n_children--;
|
||||
}
|
||||
|
||||
GList *
|
||||
_gtk_container_cell_accessible_get_children (GtkContainerCellAccessible *container)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_CONTAINER_CELL_ACCESSIBLE (container), NULL);
|
||||
|
||||
return container->priv->children;
|
||||
}
|
||||
|
@ -30,14 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_CONTAINER_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_CONTAINER_CELL_ACCESSIBLE))
|
||||
#define GTK_CONTAINER_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_CONTAINER_CELL_ACCESSIBLE, GtkContainerCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkContainerCellAccessible GtkContainerCellAccessible;
|
||||
typedef struct _GtkContainerCellAccessibleClass GtkContainerCellAccessibleClass;
|
||||
typedef struct _GtkContainerCellAccessible GtkContainerCellAccessible;
|
||||
typedef struct _GtkContainerCellAccessibleClass GtkContainerCellAccessibleClass;
|
||||
typedef struct _GtkContainerCellAccessiblePrivate GtkContainerCellAccessiblePrivate;
|
||||
|
||||
struct _GtkContainerCellAccessible
|
||||
{
|
||||
GtkCellAccessible parent;
|
||||
GList *children;
|
||||
gint NChildren;
|
||||
|
||||
GtkContainerCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkContainerCellAccessibleClass
|
||||
@ -52,6 +53,7 @@ void _gtk_container_cell_accessible_add_child (GtkCont
|
||||
GtkCellAccessible *child);
|
||||
void _gtk_container_cell_accessible_remove_child (GtkContainerCellAccessible *container,
|
||||
GtkCellAccessible *child);
|
||||
GList *_gtk_container_cell_accessible_get_children (GtkContainerCellAccessible *container);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@ -23,6 +23,12 @@
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtkcomboboxaccessible.h"
|
||||
|
||||
struct _GtkEntryAccessiblePrivate
|
||||
{
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
};
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
static void insert_text_cb (GtkEditable *editable,
|
||||
@ -109,10 +115,9 @@ gtk_entry_accessible_initialize (AtkObject *obj,
|
||||
gtk_entry_accessible = GTK_ENTRY_ACCESSIBLE (obj);
|
||||
|
||||
entry = GTK_ENTRY (data);
|
||||
gtk_editable_get_selection_bounds (GTK_EDITABLE (entry),
|
||||
&start_pos, &end_pos);
|
||||
gtk_entry_accessible->cursor_position = end_pos;
|
||||
gtk_entry_accessible->selection_bound = start_pos;
|
||||
gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start_pos, &end_pos);
|
||||
gtk_entry_accessible->priv->cursor_position = end_pos;
|
||||
gtk_entry_accessible->priv->selection_bound = start_pos;
|
||||
|
||||
/* Set up signal callbacks */
|
||||
g_signal_connect (entry, "insert-text", G_CALLBACK (insert_text_cb), NULL);
|
||||
@ -146,7 +151,7 @@ gtk_entry_accessible_notify_gtk (GObject *obj,
|
||||
* The entry cursor position has moved so generate the signal.
|
||||
*/
|
||||
g_signal_emit_by_name (atk_obj, "text-caret-moved",
|
||||
entry->cursor_position);
|
||||
entry->priv->cursor_position);
|
||||
}
|
||||
else if (g_strcmp0 (pspec->name, "selection-bound") == 0)
|
||||
{
|
||||
@ -199,13 +204,18 @@ _gtk_entry_accessible_class_init (GtkEntryAccessibleClass *klass)
|
||||
class->get_attributes = gtk_entry_accessible_get_attributes;
|
||||
|
||||
widget_class->notify_gtk = gtk_entry_accessible_notify_gtk;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkEntryAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_entry_accessible_init (GtkEntryAccessible *entry)
|
||||
{
|
||||
entry->cursor_position = 0;
|
||||
entry->selection_bound = 0;
|
||||
entry->priv = G_TYPE_INSTANCE_GET_PRIVATE (entry,
|
||||
GTK_TYPE_ENTRY_ACCESSIBLE,
|
||||
GtkEntryAccessiblePrivate);
|
||||
entry->priv->cursor_position = 0;
|
||||
entry->priv->selection_bound = 0;
|
||||
}
|
||||
|
||||
static gchar *
|
||||
@ -889,8 +899,8 @@ check_for_selection_change (GtkEntryAccessible *accessible,
|
||||
|
||||
if (gtk_editable_get_selection_bounds (GTK_EDITABLE (entry), &start, &end))
|
||||
{
|
||||
if (end != accessible->cursor_position ||
|
||||
start != accessible->selection_bound)
|
||||
if (end != accessible->priv->cursor_position ||
|
||||
start != accessible->priv->selection_bound)
|
||||
/*
|
||||
* This check is here as this function can be called
|
||||
* for notification of selection_bound and current_pos.
|
||||
@ -903,11 +913,11 @@ check_for_selection_change (GtkEntryAccessible *accessible,
|
||||
else
|
||||
{
|
||||
/* We had a selection */
|
||||
ret_val = (accessible->cursor_position != accessible->selection_bound);
|
||||
ret_val = (accessible->priv->cursor_position != accessible->priv->selection_bound);
|
||||
}
|
||||
|
||||
accessible->cursor_position = end;
|
||||
accessible->selection_bound = start;
|
||||
accessible->priv->cursor_position = end;
|
||||
accessible->priv->selection_bound = start;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
@ -29,15 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_ENTRY_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ENTRY_ACCESSIBLE))
|
||||
#define GTK_ENTRY_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ENTRY_ACCESSIBLE, GtkEntryAccessibleClass))
|
||||
|
||||
typedef struct _GtkEntryAccessible GtkEntryAccessible;
|
||||
typedef struct _GtkEntryAccessibleClass GtkEntryAccessibleClass;
|
||||
typedef struct _GtkEntryAccessible GtkEntryAccessible;
|
||||
typedef struct _GtkEntryAccessibleClass GtkEntryAccessibleClass;
|
||||
typedef struct _GtkEntryAccessiblePrivate GtkEntryAccessiblePrivate;
|
||||
|
||||
struct _GtkEntryAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
GtkEntryAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkEntryAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_EXPANDER_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_EXPANDER_ACCESSIBLE))
|
||||
#define GTK_EXPANDER_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_EXPANDER_ACCESSIBLE, GtkExpanderAccessibleClass))
|
||||
|
||||
typedef struct _GtkExpanderAccessible GtkExpanderAccessible;
|
||||
typedef struct _GtkExpanderAccessibleClass GtkExpanderAccessibleClass;
|
||||
typedef struct _GtkExpanderAccessible GtkExpanderAccessible;
|
||||
typedef struct _GtkExpanderAccessibleClass GtkExpanderAccessibleClass;
|
||||
typedef struct _GtkExpanderAccessiblePrivate GtkExpanderAccessiblePrivate;
|
||||
|
||||
struct _GtkExpanderAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkExpanderAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkExpanderAccessibleClass
|
||||
|
@ -29,12 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_FRAME_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_FRAME_ACCESSIBLE))
|
||||
#define GTK_FRAME_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_FRAME_ACCESSIBLE, GtkFrameAccessibleClass))
|
||||
|
||||
typedef struct _GtkFrameAccessible GtkFrameAccessible;
|
||||
typedef struct _GtkFrameAccessibleClass GtkFrameAccessibleClass;
|
||||
typedef struct _GtkFrameAccessible GtkFrameAccessible;
|
||||
typedef struct _GtkFrameAccessibleClass GtkFrameAccessibleClass;
|
||||
typedef struct _GtkFrameAccessiblePrivate GtkFrameAccessiblePrivate;
|
||||
|
||||
struct _GtkFrameAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GtkFrameAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkFrameAccessibleClass
|
||||
|
@ -32,6 +32,12 @@
|
||||
#define GTK_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ICON_VIEW_ITEM_ACCESSIBLE, GtkIconViewItemAccessible))
|
||||
#define GTK_IS_ICON_VIEW_ITEM_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ICON_VIEW_ITEM_ACCESSIBLE))
|
||||
|
||||
struct _GtkIconViewAccessiblePrivate
|
||||
{
|
||||
GList *items;
|
||||
GtkTreeModel *model;
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
AtkObject parent;
|
||||
@ -51,6 +57,8 @@ typedef struct
|
||||
|
||||
} GtkIconViewItemAccessibleClass;
|
||||
|
||||
GType _gtk_icon_view_item_accessible_get_type (void);
|
||||
|
||||
static gboolean gtk_icon_view_item_accessible_is_showing (GtkIconViewItemAccessible *item);
|
||||
|
||||
static void atk_component_item_interface_init (AtkComponentIface *iface);
|
||||
@ -866,7 +874,7 @@ gtk_icon_view_item_accessible_info_new (AtkObject *accessible,
|
||||
info->item = item;
|
||||
info->index = index;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
tmp_info = items->data;
|
||||
@ -874,7 +882,7 @@ gtk_icon_view_item_accessible_info_new (AtkObject *accessible,
|
||||
break;
|
||||
items = items->next;
|
||||
}
|
||||
view->items = g_list_insert_before (view->items, items, info);
|
||||
view->priv->items = g_list_insert_before (view->priv->items, items, info);
|
||||
}
|
||||
|
||||
static gint
|
||||
@ -900,7 +908,7 @@ gtk_icon_view_accessible_find_child (AtkObject *accessible,
|
||||
GtkIconViewItemAccessibleInfo *info;
|
||||
GList *items;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
|
||||
while (items)
|
||||
{
|
||||
@ -964,7 +972,7 @@ gtk_icon_view_accessible_traverse_items (GtkIconViewAccessible *view,
|
||||
GtkIconViewItemAccessible *item;
|
||||
GList *items;
|
||||
|
||||
if (view->items)
|
||||
if (view->priv->items)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
gboolean act_on_item;
|
||||
@ -973,7 +981,7 @@ gtk_icon_view_accessible_traverse_items (GtkIconViewAccessible *view,
|
||||
if (widget == NULL)
|
||||
return;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
|
||||
act_on_item = (list == NULL);
|
||||
|
||||
@ -1062,7 +1070,7 @@ gtk_icon_view_accessible_model_row_inserted (GtkTreeModel *tree_model,
|
||||
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
|
||||
view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
tmp_list = NULL;
|
||||
while (items)
|
||||
{
|
||||
@ -1105,7 +1113,7 @@ gtk_icon_view_accessible_model_row_deleted (GtkTreeModel *tree_model,
|
||||
atk_obj = gtk_widget_get_accessible (GTK_WIDGET (user_data));
|
||||
view = GTK_ICON_VIEW_ACCESSIBLE (atk_obj);
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
tmp_list = NULL;
|
||||
deleted_item = NULL;
|
||||
info = NULL;
|
||||
@ -1134,7 +1142,7 @@ gtk_icon_view_accessible_model_row_deleted (GtkTreeModel *tree_model,
|
||||
gtk_icon_view_item_accessible_add_state (GTK_ICON_VIEW_ITEM_ACCESSIBLE (info->item), ATK_STATE_DEFUNCT, TRUE);
|
||||
g_signal_emit_by_name (atk_obj, "children-changed::remove",
|
||||
index, NULL, NULL);
|
||||
view->items = g_list_remove_link (view->items, deleted_item);
|
||||
view->priv->items = g_list_remove_link (view->priv->items, deleted_item);
|
||||
g_free (info);
|
||||
}
|
||||
|
||||
@ -1174,7 +1182,7 @@ gtk_icon_view_accessible_model_rows_reordered (GtkTreeModel *tree_model,
|
||||
for (i = 0; i < length; i++)
|
||||
order [new_order[i]] = i;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
info = items->data;
|
||||
@ -1184,8 +1192,8 @@ gtk_icon_view_accessible_model_rows_reordered (GtkTreeModel *tree_model,
|
||||
items = items->next;
|
||||
}
|
||||
g_free (order);
|
||||
view->items = g_list_sort (view->items,
|
||||
(GCompareFunc)gtk_icon_view_accessible_item_compare);
|
||||
view->priv->items = g_list_sort (view->priv->items,
|
||||
(GCompareFunc)gtk_icon_view_accessible_item_compare);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1229,7 +1237,7 @@ gtk_icon_view_accessible_clear_cache (GtkIconViewAccessible *view)
|
||||
GtkIconViewItemAccessibleInfo *info;
|
||||
GList *items;
|
||||
|
||||
items = view->items;
|
||||
items = view->priv->items;
|
||||
while (items)
|
||||
{
|
||||
info = (GtkIconViewItemAccessibleInfo *) items->data;
|
||||
@ -1237,8 +1245,8 @@ gtk_icon_view_accessible_clear_cache (GtkIconViewAccessible *view)
|
||||
g_free (items->data);
|
||||
items = items->next;
|
||||
}
|
||||
g_list_free (view->items);
|
||||
view->items = NULL;
|
||||
g_list_free (view->priv->items);
|
||||
view->priv->items = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -1255,20 +1263,20 @@ gtk_icon_view_accessible_notify_gtk (GObject *obj,
|
||||
widget = GTK_WIDGET (obj);
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
view = (GtkIconViewAccessible*)atk_obj;
|
||||
if (view->model)
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_remove_weak_pointer (G_OBJECT (view->model),
|
||||
(gpointer *)&view->model);
|
||||
gtk_icon_view_accessible_disconnect_model_signals (view->model, widget);
|
||||
g_object_remove_weak_pointer (G_OBJECT (view->priv->model),
|
||||
(gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_disconnect_model_signals (view->priv->model, widget);
|
||||
}
|
||||
gtk_icon_view_accessible_clear_cache (view);
|
||||
|
||||
icon_view = GTK_ICON_VIEW (obj);
|
||||
view->model = icon_view->priv->model;
|
||||
view->priv->model = icon_view->priv->model;
|
||||
/* If there is no model the GtkIconView is probably being destroyed */
|
||||
if (view->model)
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_add_weak_pointer (G_OBJECT (view->model), (gpointer *)&view->model);
|
||||
g_object_add_weak_pointer (G_OBJECT (view->priv->model), (gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_connect_model_signals (icon_view);
|
||||
}
|
||||
}
|
||||
@ -1292,10 +1300,10 @@ gtk_icon_view_accessible_initialize (AtkObject *accessible,
|
||||
g_signal_connect (data, "notify",
|
||||
G_CALLBACK (gtk_icon_view_accessible_notify_gtk), NULL);
|
||||
|
||||
view->model = icon_view->priv->model;
|
||||
if (view->model)
|
||||
view->priv->model = icon_view->priv->model;
|
||||
if (view->priv->model)
|
||||
{
|
||||
g_object_add_weak_pointer (G_OBJECT (view->model), (gpointer *)&view->model);
|
||||
g_object_add_weak_pointer (G_OBJECT (view->priv->model), (gpointer *)&view->priv->model);
|
||||
gtk_icon_view_accessible_connect_model_signals (icon_view);
|
||||
}
|
||||
|
||||
@ -1326,11 +1334,16 @@ _gtk_icon_view_accessible_class_init (GtkIconViewAccessibleClass *klass)
|
||||
atk_class->get_n_children = gtk_icon_view_accessible_get_n_children;
|
||||
atk_class->ref_child = gtk_icon_view_accessible_ref_child;
|
||||
atk_class->initialize = gtk_icon_view_accessible_initialize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkIconViewAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_icon_view_accessible_init (GtkIconViewAccessible *accessible)
|
||||
{
|
||||
accessible->priv = G_TYPE_INSTANCE_GET_PRIVATE (accessible,
|
||||
GTK_TYPE_ICON_VIEW_ACCESSIBLE,
|
||||
GtkIconViewAccessiblePrivate);
|
||||
}
|
||||
|
||||
static AtkObject*
|
||||
|
@ -30,15 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_ICON_VIEW_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ICON_VIEW_ACCESSIBLE))
|
||||
#define GTK_ICON_VIEW_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ICON_VIEW_ACCESSIBLE, GtkIconViewAccessibleClass))
|
||||
|
||||
typedef struct _GtkIconViewAccessible GtkIconViewAccessible;
|
||||
typedef struct _GtkIconViewAccessibleClass GtkIconViewAccessibleClass;
|
||||
typedef struct _GtkIconViewAccessible GtkIconViewAccessible;
|
||||
typedef struct _GtkIconViewAccessibleClass GtkIconViewAccessibleClass;
|
||||
typedef struct _GtkIconViewAccessiblePrivate GtkIconViewAccessiblePrivate;
|
||||
|
||||
struct _GtkIconViewAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
GList *items;
|
||||
GtkTreeModel *model;
|
||||
GtkIconViewAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkIconViewAccessibleClass
|
||||
|
@ -21,6 +21,11 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkimageaccessible.h"
|
||||
|
||||
struct _GtkImageAccessiblePrivate
|
||||
{
|
||||
gchar *image_description;
|
||||
gchar *stock_name;
|
||||
};
|
||||
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
@ -41,8 +46,8 @@ gtk_image_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkImageAccessible *aimage = GTK_IMAGE_ACCESSIBLE (object);
|
||||
|
||||
g_free (aimage->image_description);
|
||||
g_free (aimage->stock_name);
|
||||
g_free (aimage->priv->image_description);
|
||||
g_free (aimage->priv->stock_name);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_image_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -68,8 +73,8 @@ gtk_image_accessible_get_name (AtkObject *accessible)
|
||||
image = GTK_IMAGE (widget);
|
||||
image_accessible = GTK_IMAGE_ACCESSIBLE (accessible);
|
||||
|
||||
g_free (image_accessible->stock_name);
|
||||
image_accessible->stock_name = NULL;
|
||||
g_free (image_accessible->priv->stock_name);
|
||||
image_accessible->priv->stock_name = NULL;
|
||||
|
||||
if (gtk_image_get_storage_type (image) != GTK_IMAGE_STOCK)
|
||||
return NULL;
|
||||
@ -81,8 +86,8 @@ gtk_image_accessible_get_name (AtkObject *accessible)
|
||||
if (!gtk_stock_lookup (stock_id, &stock_item))
|
||||
return NULL;
|
||||
|
||||
image_accessible->stock_name = _gtk_toolbar_elide_underscores (stock_item.label);
|
||||
return image_accessible->stock_name;
|
||||
image_accessible->priv->stock_name = _gtk_toolbar_elide_underscores (stock_item.label);
|
||||
return image_accessible->priv->stock_name;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -94,11 +99,16 @@ _gtk_image_accessible_class_init (GtkImageAccessibleClass *klass)
|
||||
gobject_class->finalize = gtk_image_accessible_finalize;
|
||||
class->initialize = gtk_image_accessible_initialize;
|
||||
class->get_name = gtk_image_accessible_get_name;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkImageAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_image_accessible_init (GtkImageAccessible *image)
|
||||
{
|
||||
image->priv = G_TYPE_INSTANCE_GET_PRIVATE (image,
|
||||
GTK_TYPE_IMAGE_ACCESSIBLE,
|
||||
GtkImageAccessiblePrivate);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
@ -106,7 +116,7 @@ gtk_image_accessible_get_image_description (AtkImage *image)
|
||||
{
|
||||
GtkImageAccessible *accessible = GTK_IMAGE_ACCESSIBLE (image);
|
||||
|
||||
return accessible->image_description;
|
||||
return accessible->priv->image_description;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -187,8 +197,8 @@ gtk_image_accessible_set_image_description (AtkImage *image,
|
||||
{
|
||||
GtkImageAccessible* accessible = GTK_IMAGE_ACCESSIBLE (image);
|
||||
|
||||
g_free (accessible->image_description);
|
||||
accessible->image_description = g_strdup (description);
|
||||
g_free (accessible->priv->image_description);
|
||||
accessible->priv->image_description = g_strdup (description);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -29,15 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_IMAGE_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IMAGE_ACCESSIBLE))
|
||||
#define GTK_IMAGE_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_IMAGE_ACCESSIBLE, GtkImageAccessibleClass))
|
||||
|
||||
typedef struct _GtkImageAccessible GtkImageAccessible;
|
||||
typedef struct _GtkImageAccessibleClass GtkImageAccessibleClass;
|
||||
typedef struct _GtkImageAccessible GtkImageAccessible;
|
||||
typedef struct _GtkImageAccessibleClass GtkImageAccessibleClass;
|
||||
typedef struct _GtkImageAccessiblePrivate GtkImageAccessiblePrivate;
|
||||
|
||||
struct _GtkImageAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gchar* image_description;
|
||||
gchar* stock_name;
|
||||
GtkImageAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkImageAccessibleClass
|
||||
|
@ -20,6 +20,11 @@
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkimagecellaccessible.h"
|
||||
|
||||
struct _GtkImageCellAccessiblePrivate
|
||||
{
|
||||
gchar *image_description;
|
||||
};
|
||||
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkImageCellAccessible, _gtk_image_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE,
|
||||
@ -30,7 +35,7 @@ gtk_image_cell_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkImageCellAccessible *image_cell = GTK_IMAGE_CELL_ACCESSIBLE (object);
|
||||
|
||||
g_free (image_cell->image_description);
|
||||
g_free (image_cell->priv->image_description);
|
||||
G_OBJECT_CLASS (_gtk_image_cell_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
@ -40,12 +45,16 @@ _gtk_image_cell_accessible_class_init (GtkImageCellAccessibleClass *klass)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class->finalize = gtk_image_cell_accessible_finalize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkImageCellAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_image_cell_accessible_init (GtkImageCellAccessible *image_cell)
|
||||
{
|
||||
image_cell->image_description = NULL;
|
||||
image_cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (image_cell,
|
||||
GTK_TYPE_IMAGE_CELL_ACCESSIBLE,
|
||||
GtkImageCellAccessiblePrivate);
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
@ -53,7 +62,7 @@ gtk_image_cell_accessible_get_image_description (AtkImage *image)
|
||||
{
|
||||
GtkImageCellAccessible *image_cell = GTK_IMAGE_CELL_ACCESSIBLE (image);
|
||||
|
||||
return image_cell->image_description;
|
||||
return image_cell->priv->image_description;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -62,10 +71,10 @@ gtk_image_cell_accessible_set_image_description (AtkImage *image,
|
||||
{
|
||||
GtkImageCellAccessible *image_cell = GTK_IMAGE_CELL_ACCESSIBLE (image);
|
||||
|
||||
g_free (image_cell->image_description);
|
||||
image_cell->image_description = g_strdup (description);
|
||||
g_free (image_cell->priv->image_description);
|
||||
image_cell->priv->image_description = g_strdup (description);
|
||||
|
||||
if (image_cell->image_description)
|
||||
if (image_cell->priv->image_description)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
@ -92,10 +101,11 @@ gtk_image_cell_accessible_get_image_size (AtkImage *image,
|
||||
*width = 0;
|
||||
*height = 0;
|
||||
|
||||
cell_renderer = GTK_RENDERER_CELL_ACCESSIBLE (cell)->renderer;
|
||||
g_object_get (GTK_CELL_RENDERER_PIXBUF (cell_renderer),
|
||||
g_object_get (cell, "renderer", &cell_renderer, NULL);
|
||||
g_object_get (cell_renderer,
|
||||
"pixbuf", &pixbuf,
|
||||
NULL);
|
||||
g_object_unref (cell_renderer);
|
||||
|
||||
if (pixbuf)
|
||||
{
|
||||
|
@ -30,15 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_IMAGE_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_IMAGE_CELL_ACCESSIBLE))
|
||||
#define GTK_IMAGE_CELL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_IMAGE_CELL_ACCESSIBLE, GtkImageCellAccessibleClass))
|
||||
|
||||
typedef struct _GtkImageCellAccessible GtkImageCellAccessible;
|
||||
typedef struct _GtkImageCellAccessibleClass GtkImageCellAccessibleClass;
|
||||
typedef struct _GtkImageCellAccessible GtkImageCellAccessible;
|
||||
typedef struct _GtkImageCellAccessibleClass GtkImageCellAccessibleClass;
|
||||
typedef struct _GtkImageCellAccessiblePrivate GtkImageCellAccessiblePrivate;
|
||||
|
||||
struct _GtkImageCellAccessible
|
||||
{
|
||||
GtkRendererCellAccessible parent;
|
||||
|
||||
gchar *image_description;
|
||||
gint x, y;
|
||||
GtkImageCellAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkImageCellAccessibleClass
|
||||
|
@ -21,6 +21,12 @@
|
||||
#include <gtk/gtkpango.h>
|
||||
#include "gtklabelaccessible.h"
|
||||
|
||||
struct _GtkLabelAccessiblePrivate
|
||||
{
|
||||
gchar *text;
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
};
|
||||
|
||||
static void atk_text_interface_init (AtkTextIface *iface);
|
||||
|
||||
@ -30,6 +36,9 @@ G_DEFINE_TYPE_WITH_CODE (GtkLabelAccessible, _gtk_label_accessible, GTK_TYPE_WID
|
||||
static void
|
||||
_gtk_label_accessible_init (GtkLabelAccessible *label)
|
||||
{
|
||||
label->priv = G_TYPE_INSTANCE_GET_PRIVATE (label,
|
||||
GTK_TYPE_LABEL_ACCESSIBLE,
|
||||
GtkLabelAccessiblePrivate);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -45,7 +54,7 @@ gtk_label_accessible_initialize (AtkObject *obj,
|
||||
|
||||
widget = GTK_WIDGET (data);
|
||||
|
||||
accessible->text = g_strdup (gtk_label_get_text (GTK_LABEL (widget)));
|
||||
accessible->priv->text = g_strdup (gtk_label_get_text (GTK_LABEL (widget)));
|
||||
|
||||
/*
|
||||
* Check whether ancestor of GtkLabel is a GtkButton and if so
|
||||
@ -73,17 +82,17 @@ check_for_selection_change (GtkLabelAccessible *accessible,
|
||||
|
||||
if (gtk_label_get_selection_bounds (label, &start, &end))
|
||||
{
|
||||
if (end != accessible->cursor_position ||
|
||||
start != accessible->selection_bound)
|
||||
if (end != accessible->priv->cursor_position ||
|
||||
start != accessible->priv->selection_bound)
|
||||
ret_val = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
ret_val = (accessible->cursor_position != accessible->selection_bound);
|
||||
ret_val = (accessible->priv->cursor_position != accessible->priv->selection_bound);
|
||||
}
|
||||
|
||||
accessible->cursor_position = end;
|
||||
accessible->selection_bound = start;
|
||||
accessible->priv->cursor_position = end;
|
||||
accessible->priv->selection_bound = start;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
@ -105,18 +114,18 @@ gtk_label_accessible_notify_gtk (GObject *obj,
|
||||
const gchar *text;
|
||||
|
||||
text = gtk_label_get_text (GTK_LABEL (widget));
|
||||
if (g_strcmp0 (accessible->text, text) == 0)
|
||||
if (g_strcmp0 (accessible->priv->text, text) == 0)
|
||||
return;
|
||||
|
||||
/* Create a delete text and an insert text signal */
|
||||
length = g_utf8_strlen (accessible->text, -1);
|
||||
length = g_utf8_strlen (accessible->priv->text, -1);
|
||||
if (length > 0)
|
||||
g_signal_emit_by_name (atk_obj, "text-changed::delete", 0, length);
|
||||
|
||||
g_free (accessible->text);
|
||||
accessible->text = g_strdup (text);
|
||||
g_free (accessible->priv->text);
|
||||
accessible->priv->text = g_strdup (text);
|
||||
|
||||
length = g_utf8_strlen (accessible->text, -1);
|
||||
length = g_utf8_strlen (accessible->priv->text, -1);
|
||||
if (length > 0)
|
||||
g_signal_emit_by_name (atk_obj, "text-changed::insert", 0, length);
|
||||
|
||||
@ -147,7 +156,7 @@ gtk_label_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkLabelAccessible *accessible = GTK_LABEL_ACCESSIBLE (object);
|
||||
|
||||
g_free (accessible->text);
|
||||
g_free (accessible->priv->text);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_label_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -277,6 +286,8 @@ _gtk_label_accessible_class_init (GtkLabelAccessibleClass *klass)
|
||||
class->ref_state_set = gtk_label_accessible_ref_state_set;
|
||||
class->ref_relation_set = gtk_label_accessible_ref_relation_set;
|
||||
class->initialize = gtk_label_accessible_initialize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkLabelAccessiblePrivate));
|
||||
}
|
||||
|
||||
/* atktext.h */
|
||||
|
@ -29,16 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_LABEL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LABEL_ACCESSIBLE))
|
||||
#define GTK_LABEL_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LABEL_ACCESSIBLE, GtkLabelAccessibleClass))
|
||||
|
||||
typedef struct _GtkLabelAccessible GtkLabelAccessible;
|
||||
typedef struct _GtkLabelAccessibleClass GtkLabelAccessibleClass;
|
||||
typedef struct _GtkLabelAccessible GtkLabelAccessible;
|
||||
typedef struct _GtkLabelAccessibleClass GtkLabelAccessibleClass;
|
||||
typedef struct _GtkLabelAccessiblePrivate GtkLabelAccessiblePrivate;
|
||||
|
||||
struct _GtkLabelAccessible
|
||||
{
|
||||
GtkWidgetAccessible parent;
|
||||
|
||||
gchar *text;
|
||||
gint cursor_position;
|
||||
gint selection_bound;
|
||||
GtkLabelAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkLabelAccessibleClass
|
||||
|
@ -23,6 +23,11 @@
|
||||
typedef struct _GtkLinkButtonAccessibleLink GtkLinkButtonAccessibleLink;
|
||||
typedef struct _GtkLinkButtonAccessibleLinkClass GtkLinkButtonAccessibleLinkClass;
|
||||
|
||||
struct _GtkLinkButtonAccessiblePrivate
|
||||
{
|
||||
AtkHyperlink *link;
|
||||
};
|
||||
|
||||
struct _GtkLinkButtonAccessibleLink
|
||||
{
|
||||
AtkHyperlink parent;
|
||||
@ -37,6 +42,8 @@ struct _GtkLinkButtonAccessibleLinkClass
|
||||
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
|
||||
GType _gtk_link_button_accessible_link_get_type (void);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessibleLink, _gtk_link_button_accessible_link, ATK_TYPE_HYPERLINK,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init))
|
||||
|
||||
@ -178,14 +185,14 @@ gtk_link_button_accessible_get_hyperlink (AtkHyperlinkImpl *impl)
|
||||
{
|
||||
GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (impl);
|
||||
|
||||
if (!button->link)
|
||||
if (!button->priv->link)
|
||||
{
|
||||
button->link = gtk_link_button_accessible_link_new (button);
|
||||
button->priv->link = gtk_link_button_accessible_link_new (button);
|
||||
g_signal_connect (gtk_accessible_get_widget (GTK_ACCESSIBLE (button)),
|
||||
"activate-link", G_CALLBACK (activate_link), button->link);
|
||||
"activate-link", G_CALLBACK (activate_link), button->priv->link);
|
||||
}
|
||||
|
||||
return g_object_ref (button->link);
|
||||
return g_object_ref (button->priv->link);
|
||||
}
|
||||
|
||||
static void atk_hypertext_impl_interface_init (AtkHyperlinkImplIface *iface);
|
||||
@ -196,6 +203,9 @@ G_DEFINE_TYPE_WITH_CODE (GtkLinkButtonAccessible, _gtk_link_button_accessible, G
|
||||
static void
|
||||
_gtk_link_button_accessible_init (GtkLinkButtonAccessible *button)
|
||||
{
|
||||
button->priv = G_TYPE_INSTANCE_GET_PRIVATE (button,
|
||||
GTK_TYPE_LINK_BUTTON_ACCESSIBLE,
|
||||
GtkLinkButtonAccessiblePrivate);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -203,8 +213,8 @@ gtk_link_button_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkLinkButtonAccessible *button = GTK_LINK_BUTTON_ACCESSIBLE (object);
|
||||
|
||||
if (button->link)
|
||||
g_object_unref (button->link);
|
||||
if (button->priv->link)
|
||||
g_object_unref (button->priv->link);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_link_button_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -213,6 +223,8 @@ static void
|
||||
_gtk_link_button_accessible_class_init (GtkLinkButtonAccessibleClass *klass)
|
||||
{
|
||||
G_OBJECT_CLASS (klass)->finalize = gtk_link_button_accessible_finalize;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkLinkButtonAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -29,14 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_LINK_BUTTON_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LINK_BUTTON_ACCESSIBLE))
|
||||
#define GTK_LINK_BUTTON_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LINK_BUTTON_ACCESSIBLE, GtkLinkButtonAccessibleClass))
|
||||
|
||||
typedef struct _GtkLinkButtonAccessible GtkLinkButtonAccessible;
|
||||
typedef struct _GtkLinkButtonAccessibleClass GtkLinkButtonAccessibleClass;
|
||||
typedef struct _GtkLinkButtonAccessible GtkLinkButtonAccessible;
|
||||
typedef struct _GtkLinkButtonAccessibleClass GtkLinkButtonAccessibleClass;
|
||||
typedef struct _GtkLinkButtonAccessiblePrivate GtkLinkButtonAccessiblePrivate;
|
||||
|
||||
struct _GtkLinkButtonAccessible
|
||||
{
|
||||
GtkButtonAccessible parent;
|
||||
|
||||
AtkHyperlink *link;
|
||||
GtkLinkButtonAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkLinkButtonAccessibleClass
|
||||
|
@ -30,12 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_LOCK_BUTTON_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_LOCK_BUTTON_ACCESSIBLE))
|
||||
#define GTK_LOCK_BUTTON_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_LOCK_BUTTON_ACCESSIBLE, GtkLockButtonAccessibleClass))
|
||||
|
||||
typedef struct _GtkLockButtonAccessible GtkLockButtonAccessible;
|
||||
typedef struct _GtkLockButtonAccessibleClass GtkLockButtonAccessibleClass;
|
||||
typedef struct _GtkLockButtonAccessible GtkLockButtonAccessible;
|
||||
typedef struct _GtkLockButtonAccessibleClass GtkLockButtonAccessibleClass;
|
||||
typedef struct _GtkLockButtonAccessiblePrivate GtkLockButtonAccessiblePrivate;
|
||||
|
||||
struct _GtkLockButtonAccessible
|
||||
{
|
||||
GtkButtonAccessible parent;
|
||||
|
||||
GtkLockButtonAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkLockButtonAccessibleClass
|
||||
|
@ -31,7 +31,7 @@ gtk_menu_accessible_initialize (AtkObject *obj,
|
||||
|
||||
obj->role = ATK_ROLE_MENU;
|
||||
|
||||
GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_POPUP;
|
||||
_gtk_widget_accessible_set_layer (GTK_WIDGET_ACCESSIBLE (obj), ATK_LAYER_POPUP);
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
|
@ -30,12 +30,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_MENU_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_MENU_ACCESSIBLE))
|
||||
#define GTK_MENU_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_MENU_ACCESSIBLE, GtkMenuAccessibleClass))
|
||||
|
||||
typedef struct _GtkMenuAccessible GtkMenuAccessible;
|
||||
typedef struct _GtkMenuAccessibleClass GtkMenuAccessibleClass;
|
||||
typedef struct _GtkMenuAccessible GtkMenuAccessible;
|
||||
typedef struct _GtkMenuAccessibleClass GtkMenuAccessibleClass;
|
||||
typedef struct _GtkMenuAccessiblePrivate GtkMenuAccessiblePrivate;
|
||||
|
||||
struct _GtkMenuAccessible
|
||||
{
|
||||
GtkMenuShellAccessible parent;
|
||||
|
||||
GtkMenuAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkMenuAccessibleClass
|
||||
|
@ -20,6 +20,11 @@
|
||||
#include "gtkmenuitemaccessible.h"
|
||||
#include "gtk/gtkmenuitemprivate.h"
|
||||
|
||||
struct _GtkMenuItemAccessiblePrivate
|
||||
{
|
||||
gchar *text;
|
||||
};
|
||||
|
||||
#define KEYBINDING_SEPARATOR ";"
|
||||
|
||||
static void menu_item_select (GtkMenuItem *item);
|
||||
@ -67,7 +72,7 @@ gtk_menu_item_accessible_initialize (AtkObject *obj,
|
||||
atk_object_set_parent (obj, gtk_widget_get_accessible (parent_widget));
|
||||
}
|
||||
|
||||
GTK_WIDGET_ACCESSIBLE (obj)->layer = ATK_LAYER_POPUP;
|
||||
_gtk_widget_accessible_set_layer (GTK_WIDGET_ACCESSIBLE (obj), ATK_LAYER_POPUP);
|
||||
|
||||
obj->role = ATK_ROLE_MENU_ITEM;
|
||||
|
||||
@ -193,10 +198,10 @@ gtk_menu_item_accessible_get_name (AtkObject *obj)
|
||||
accessible = GTK_MENU_ITEM_ACCESSIBLE (obj);
|
||||
label = get_label_from_container (widget);
|
||||
|
||||
g_free (accessible->text);
|
||||
accessible->text = get_text_from_label_widget (label);
|
||||
g_free (accessible->priv->text);
|
||||
accessible->priv->text = get_text_from_label_widget (label);
|
||||
|
||||
return accessible->text;
|
||||
return accessible->priv->text;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -204,7 +209,7 @@ gtk_menu_item_accessible_finalize (GObject *object)
|
||||
{
|
||||
GtkMenuItemAccessible *accessible = GTK_MENU_ITEM_ACCESSIBLE (object);
|
||||
|
||||
g_free (accessible->text);
|
||||
g_free (accessible->priv->text);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_menu_item_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
@ -244,11 +249,16 @@ _gtk_menu_item_accessible_class_init (GtkMenuItemAccessibleClass *klass)
|
||||
class->initialize = gtk_menu_item_accessible_initialize;
|
||||
class->get_name = gtk_menu_item_accessible_get_name;
|
||||
class->get_role = gtk_menu_item_accessible_get_role;
|
||||
|
||||
g_type_class_add_private (klass, sizeof (GtkMenuItemAccessiblePrivate));
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_menu_item_accessible_init (GtkMenuItemAccessible *menu_item)
|
||||
{
|
||||
menu_item->priv = G_TYPE_INSTANCE_GET_PRIVATE (menu_item,
|
||||
GTK_TYPE_MENU_ITEM_ACCESSIBLE,
|
||||
GtkMenuItemAccessiblePrivate);
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
@ -811,26 +821,14 @@ menu_item_add_gtk (GtkContainer *container,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkWidget *parent_widget;
|
||||
AtkObject *atk_parent;
|
||||
AtkObject *atk_child;
|
||||
GtkContainerAccessible *container_accessible;
|
||||
gint index;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_MENU (container), 1);
|
||||
|
||||
parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
|
||||
if (GTK_IS_MENU_ITEM (parent_widget))
|
||||
{
|
||||
atk_parent = gtk_widget_get_accessible (parent_widget);
|
||||
atk_child = gtk_widget_get_accessible (widget);
|
||||
GTK_CONTAINER_ACCESSIBLE_CLASS (_gtk_menu_item_accessible_parent_class)->add_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
container_accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
g_list_free (container_accessible->children);
|
||||
container_accessible->children = gtk_container_get_children (container);
|
||||
index = g_list_index (container_accessible->children, widget);
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::add",
|
||||
index, atk_child, NULL);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@ -840,30 +838,13 @@ menu_item_remove_gtk (GtkContainer *container,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkWidget *parent_widget;
|
||||
AtkObject *atk_parent;
|
||||
AtkObject *atk_child;
|
||||
GtkContainerAccessible *container_accessible;
|
||||
gint index;
|
||||
gint list_length;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_MENU (container), 1);
|
||||
|
||||
parent_widget = gtk_menu_get_attach_widget (GTK_MENU (container));
|
||||
if (GTK_IS_MENU_ITEM (parent_widget))
|
||||
{
|
||||
atk_parent = gtk_widget_get_accessible (parent_widget);
|
||||
atk_child = gtk_widget_get_accessible (widget);
|
||||
|
||||
g_object_notify (G_OBJECT (atk_child), "accessible-parent");
|
||||
|
||||
container_accessible = GTK_CONTAINER_ACCESSIBLE (atk_parent);
|
||||
index = g_list_index (container_accessible->children, widget);
|
||||
list_length = g_list_length (container_accessible->children);
|
||||
g_list_free (container_accessible->children);
|
||||
container_accessible->children = gtk_container_get_children (container);
|
||||
if (index >= 0 && index <= list_length)
|
||||
g_signal_emit_by_name (atk_parent, "children-changed::remove",
|
||||
index, atk_child, NULL);
|
||||
GTK_CONTAINER_ACCESSIBLE_CLASS (_gtk_menu_item_accessible_parent_class)->remove_gtk (container, widget, gtk_widget_get_accessible (parent_widget));
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -29,14 +29,15 @@ G_BEGIN_DECLS
|
||||
#define GTK_IS_MENU_ITEM_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_MENU_ITEM_ACCESSIBLE))
|
||||
#define GTK_MENU_ITEM_ACCESSIBLE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_MENU_ITEM_ACCESSIBLE, GtkMenuItemAccessibleClass))
|
||||
|
||||
typedef struct _GtkMenuItemAccessible GtkMenuItemAccessible;
|
||||
typedef struct _GtkMenuItemAccessibleClass GtkMenuItemAccessibleClass;
|
||||
typedef struct _GtkMenuItemAccessible GtkMenuItemAccessible;
|
||||
typedef struct _GtkMenuItemAccessibleClass GtkMenuItemAccessibleClass;
|
||||
typedef struct _GtkMenuItemAccessiblePrivate GtkMenuItemAccessiblePrivate;
|
||||
|
||||
struct _GtkMenuItemAccessible
|
||||
{
|
||||
GtkContainerAccessible parent;
|
||||
|
||||
gchar *text;
|
||||
GtkMenuItemAccessiblePrivate *priv;
|
||||
};
|
||||
|
||||
struct _GtkMenuItemAccessibleClass
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user