Merge master into places-sidebar to keep up with development

This commit is contained in:
Federico Mena Quintero 2012-10-19 11:35:22 -05:00
commit 1dfd0e8c9b
416 changed files with 219126 additions and 56116 deletions

View File

@ -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
View File

@ -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
==================================

View File

@ -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

View File

@ -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

View File

@ -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" />

View File

@ -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>

View File

@ -69,16 +69,17 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h&#x0D;&#x0A;
echo on&#x0D;&#x0A;
mkdir $(CopyDir)\bin&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*.dll $(CopyDir)\bin&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin&#x0D;&#x0A;
mkdir $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*.exe $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo&#x0D;&#x0A;
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo&#x0D;&#x0A;
mkdir $(CopyDir)\lib&#x0D;&#x0A;
copy $(ConfigurationName)\$(PlatformName)\bin\*-$(GtkApiVersion).lib $(CopyDir)\lib&#x0D;&#x0A;
@ -222,12 +223,14 @@ copy ..\..\..\gtk\gtkinfobar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;
copy ..\..\..\gtk\gtkinvisible.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtklockbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmain.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkmenutoolbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
@ -268,6 +271,7 @@ copy ..\..\..\gtk\gtkscalebutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#
copy ..\..\..\gtk\gtkscrollable.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;
copy ..\..\..\gtk\gtkseparatormenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk&#x0D;&#x0A;

View File

@ -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" />

View File

@ -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)

View File

@ -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

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -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",

View File

@ -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 */
* {

View File

@ -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",

View File

@ -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);
}
*/
*/

View 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;
}

View File

@ -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);
}

View 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;
}

View 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);
}

View File

@ -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>

View File

@ -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;
}

View File

@ -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);

View File

@ -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

View File

@ -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.

View File

@ -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">

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -55,6 +55,7 @@ noinst_PROGRAMS = \
bloatpad \
plugman \
sunny \
action-namespace \
grid-packing \
drawing \
builder

134
examples/action-namespace.c Normal file
View 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);
}

View File

@ -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 ();

View File

@ -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 )

View File

@ -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);
}

View File

@ -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);

View File

@ -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) {

View File

@ -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");

View File

@ -24,6 +24,8 @@
#include "config.h"
#include "gdkdisplay.h"
#include "gdkmain.h"
#include "gdkwindow.h"
/**
* gdk_pointer_ungrab:

View File

@ -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,

View File

@ -24,6 +24,7 @@
#include "config.h"
#include "gdkkeys.h"
#include "gdktypes.h"

View File

@ -21,6 +21,7 @@
#include "config.h"
#include "gdkinternals.h"
#include "gdkscreenprivate.h"
#include "gdkrectangle.h"
#include "gdkwindow.h"

View File

@ -29,7 +29,7 @@ G_BEGIN_DECLS
/**
* SECTION:gdktesting
* SECTION:gdktestutils
* @Short_description: Test utilities
* @Title: Testing
*

View File

@ -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__ */

View File

@ -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);

View File

@ -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)
{

View File

@ -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 &&

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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, &registry_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

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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)
{

View File

@ -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 \

View File

@ -54,6 +54,7 @@ gail_c_sources = \
gailmisc.c
gail_private_h_sources = \
gail.h \
gtkarrowaccessible.h \
gtkbooleancellaccessible.h \
gtkboxaccessible.h \

View File

@ -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
View 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__ */

View File

@ -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)
{

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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*

View File

@ -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

View File

@ -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;
}

View File

@ -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

View File

@ -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)
{

View File

@ -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

View File

@ -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 */

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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 *

View File

@ -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

View File

@ -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;
}

View File

@ -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