Compare commits
170 Commits
wip/css-op
...
wip/actor
Author | SHA1 | Date | |
---|---|---|---|
|
77a059162b | ||
|
3bbe53689a | ||
|
0d60250917 | ||
|
cb31648aa3 | ||
|
2081d36e88 | ||
|
37fa22c608 | ||
|
a137e66648 | ||
|
8c8a0e1bd6 | ||
|
fe956e983c | ||
|
17cb423a71 | ||
|
49a6d85310 | ||
|
2f691d4097 | ||
|
46570d6a76 | ||
|
f7ef7c11d3 | ||
|
e84af768f9 | ||
|
e6f5e4e448 | ||
|
bbe48d8144 | ||
|
ce2c4b2de0 | ||
|
cc86c700eb | ||
|
ec4516264b | ||
|
d85dacd40c | ||
|
99e9dc83fa | ||
|
55f3ad0bf3 | ||
|
38df4155b7 | ||
|
5474259dea | ||
|
fa1dc252df | ||
|
c50bcf5891 | ||
|
6b9b925add | ||
|
3e979d911b | ||
|
b068b18c78 | ||
|
cc986fdc1c | ||
|
b39bb4400e | ||
|
02b440b466 | ||
|
6a229fe50a | ||
|
5adecf183b | ||
|
4d4b6a8658 | ||
|
ec45d2f8c7 | ||
|
e00bc73de8 | ||
|
6410a43b76 | ||
|
aac4a027eb | ||
|
9555478b9e | ||
|
f84df03513 | ||
|
63b6c07fe0 | ||
|
75ee72f2ac | ||
|
3558e655b4 | ||
|
59830a9001 | ||
|
329372a343 | ||
|
5ee8b69418 | ||
|
8b9ccf4ee9 | ||
|
e801d06229 | ||
|
20b79b06ee | ||
|
3005f1b844 | ||
|
fc96ef51d7 | ||
|
4addb2108e | ||
|
9aa36d8d0d | ||
|
95a0c055da | ||
|
58e96f6cbd | ||
|
6bc2a2da48 | ||
|
38963870eb | ||
|
12f9b81b1e | ||
|
9e9824a0a1 | ||
|
d198ea6296 | ||
|
5fa4232404 | ||
|
c3577c66e5 | ||
|
07a00d5939 | ||
|
d2944ce633 | ||
|
4cd806ff0c | ||
|
651241b685 | ||
|
221ac71278 | ||
|
e4b5e94eb9 | ||
|
853b5e5fa2 | ||
|
20c12b0570 | ||
|
70a5718b15 | ||
|
4f2da634f1 | ||
|
308971cc2e | ||
|
a70e85702f | ||
|
81fa183b79 | ||
|
cd5fdc1e74 | ||
|
751a330ad8 | ||
|
3dfce49032 | ||
|
dfbabfbd6d | ||
|
9e65be6c48 | ||
|
54714cb228 | ||
|
9c3cd49abd | ||
|
0a808bea54 | ||
|
3824376afc | ||
|
05240be589 | ||
|
cf712c462d | ||
|
821a675013 | ||
|
6f86e57c4f | ||
|
52768ee6ec | ||
|
a73cc55e02 | ||
|
1bf3de223a | ||
|
f239edaf9c | ||
|
26186c74c6 | ||
|
94b65032a2 | ||
|
a612956ed5 | ||
|
8e4228bf12 | ||
|
eecb9607a5 | ||
|
33e5866b6f | ||
|
b85ae11e0e | ||
|
f229945dab | ||
|
5bee1a994f | ||
|
df1d331713 | ||
|
e9aeb2fbca | ||
|
099a2b04a2 | ||
|
597dc649e1 | ||
|
5e12aafacd | ||
|
4cfd1f51c0 | ||
|
f770e9ac1e | ||
|
531d0dc32a | ||
|
ebf9b9a0e7 | ||
|
4e60107c30 | ||
|
6e85a64cf6 | ||
|
343f1706bd | ||
|
17a3325b2d | ||
|
3782cf77c3 | ||
|
9dc4c5ce73 | ||
|
444a92d6d8 | ||
|
656ec39c29 | ||
|
0cb714fe62 | ||
|
4594e0fd34 | ||
|
ea479e6bb9 | ||
|
1c05915f51 | ||
|
796ae50064 | ||
|
a3e4fa3809 | ||
|
d8fae21b1c | ||
|
a1ee2b7b82 | ||
|
089eafb468 | ||
|
eb4667b6e1 | ||
|
03c626bb15 | ||
|
57e1e0de94 | ||
|
fb312af979 | ||
|
549a0af12b | ||
|
f1532993eb | ||
|
26ea8e710a | ||
|
b855e91f7a | ||
|
9d31a04d12 | ||
|
34318b9163 | ||
|
736ccb6ce1 | ||
|
4ca293e006 | ||
|
fd964ca178 | ||
|
6dfee46cdb | ||
|
e6de45964d | ||
|
bf35c2f044 | ||
|
53e08b58aa | ||
|
9ae9649188 | ||
|
82a6106920 | ||
|
1b1f4da5c7 | ||
|
055b5d83d5 | ||
|
7747910b9d | ||
|
a405c9917c | ||
|
fbbb66ae7d | ||
|
732e89e4f3 | ||
|
f79cd24937 | ||
|
6e2dec0344 | ||
|
7ee5e7af70 | ||
|
a61b359498 | ||
|
4dabc8ba84 | ||
|
cd016ef8e3 | ||
|
d3377e9d7a | ||
|
faaae520c9 | ||
|
47714f55ee | ||
|
c3e9112f7f | ||
|
7ec33e63c0 | ||
|
afc1a143a4 | ||
|
5833b8495e | ||
|
b4767ea9da | ||
|
85d8f3c51e | ||
|
c1e9d46c64 |
71
NEWS
71
NEWS
@@ -1,3 +1,74 @@
|
||||
Overview of Changes in GTK+ 3.7.4
|
||||
=================================
|
||||
|
||||
* GtkBuilder now lets you refer to external objects from a ui
|
||||
file if the objects have been exported with the new function
|
||||
gtk_builder_expose_object()
|
||||
|
||||
* Font handling has been improved:
|
||||
- The default font is no longer handled like a custom style sheet
|
||||
that overrides everything, but as the initial value. This is the
|
||||
same behavior as in web browsers.
|
||||
- It is now possible to set font-family and font-size like other
|
||||
CSS properties, and relative font sizes are supported. Font
|
||||
sizes in CSS can be specified as numbers or with keywords
|
||||
like xx-small, medium, smaller, larger,...
|
||||
|
||||
* GTK+ now uses proper Unicode ellipses in strings.
|
||||
|
||||
* The releases includes several noticable performance improvements:
|
||||
- Size allocation has been optimized, by avoiding excessive
|
||||
resizing in various situations.
|
||||
- The performance of size groups has been improved.
|
||||
- Text rendering in GtkLabel and other widgets has been optimized
|
||||
to avoid excessive recreation of Pango layouts.
|
||||
- Icon loading overhead was reduced by caching of GtkIconInfo.
|
||||
- The CSS is now keeping a tree of selectors to speed up matchinh.
|
||||
|
||||
* Deprecations and removals:
|
||||
- Custom CSS properties have been deprecated
|
||||
- Support for color schemes has been removed
|
||||
- gtk_style_provider_get_style, gtk_style_provider_get_icon_factory
|
||||
- GtkGradient and GtkSymbolicColor
|
||||
- All the padding style properties in menus
|
||||
|
||||
* Bugs closed:
|
||||
132333 Can't add a palette to the dialog of a color button
|
||||
371034 Doc for gtk_file_chooser_get_filename: Is the resulting path...
|
||||
447972 Add a way to specify user_data sent to signals
|
||||
548793 funny pattern for iterating GtkTreeModel
|
||||
595615 Use proper ellipses
|
||||
626499 GtkClipboard unnotified on change of OS X pasteboard owner
|
||||
668239 texts disappear when notebook switch page at zh_CN locate!
|
||||
677339 GTK+ 3 documentation wrong about GtkWidget scroll-event signal
|
||||
680065 treemodelfilter: Make the constructor binding friendly
|
||||
687065 InstallableOptions is not filtered in cups backend
|
||||
687816 GtkTreeView does not draw correctly since commit aaedc7b6
|
||||
688710 [PATCH] Splash screens shouldn't stay on top of all applicat...
|
||||
688744 Don't use gtk_style_context_set_background() to render icon/...
|
||||
688884 Typo in gtk_tree_view_set_tooltip_column documentation
|
||||
689012 "Copy file's location" menu item in file chooser dialog uses...
|
||||
689047 Obtain the recent files max age setting from xsettings
|
||||
689081 No caching of icons
|
||||
689168 Deprecate some menu style properties
|
||||
689401 xi2: Abort early if we don't have a proper GDK window
|
||||
689584 Add summary and description to "show-hidden" key
|
||||
689847 Add fast repeated typename -> GType resolver
|
||||
689923 Missing null-check in GtkEntryAccessible
|
||||
690099 GtkScrolledWindow with NEVER policy don't resize with children
|
||||
690266 Freeze with F10/Shift-F10 on submenus
|
||||
|
||||
* Translation updates:
|
||||
Assamese
|
||||
British English
|
||||
Dutch
|
||||
German
|
||||
Hebrew
|
||||
Polish
|
||||
Slovenian
|
||||
Spanish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.7.2
|
||||
=================================
|
||||
|
||||
|
@@ -10,7 +10,7 @@
|
||||
|
||||
m4_define([gtk_major_version], [3])
|
||||
m4_define([gtk_minor_version], [7])
|
||||
m4_define([gtk_micro_version], [3])
|
||||
m4_define([gtk_micro_version], [5])
|
||||
m4_define([gtk_interface_age], [0])
|
||||
m4_define([gtk_binary_age],
|
||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||
@@ -39,8 +39,8 @@ AC_CONFIG_AUX_DIR([build-aux])
|
||||
m4_define([gtk_binary_version], [3.0.0])
|
||||
|
||||
# required versions of other packages
|
||||
m4_define([glib_required_version], [2.35.0])
|
||||
m4_define([pango_required_version], [1.30.0])
|
||||
m4_define([glib_required_version], [2.35.3])
|
||||
m4_define([pango_required_version], [1.32.4])
|
||||
m4_define([atk_required_version], [2.5.3])
|
||||
m4_define([cairo_required_version], [1.10.0])
|
||||
m4_define([gdk_pixbuf_required_version], [2.26.0])
|
||||
@@ -1787,6 +1787,7 @@ gtk/makefile.msc
|
||||
gtk/gtkversion.h
|
||||
gtk/gtk-win32.rc
|
||||
gtk/a11y/Makefile
|
||||
gtk/actors/Makefile
|
||||
gtk/tests/Makefile
|
||||
libgail-util/Makefile
|
||||
modules/Makefile
|
||||
|
@@ -61,13 +61,9 @@
|
||||
<xi:include href="xml/gtkstyleproperties.xml" />
|
||||
<xi:include href="xml/gtkthemingengine.xml" />
|
||||
<xi:include href="xml/gtkwidgetpath.xml" />
|
||||
<xi:include href="xml/gtksymboliccolor.xml" />
|
||||
<xi:include href="xml/gtkgradient.xml" />
|
||||
<xi:include href="xml/gtkicontheme.xml" />
|
||||
<xi:include href="xml/gtkiconfactory.xml" />
|
||||
<xi:include href="xml/gtknumerableicon.xml" />
|
||||
<xi:include href="xml/gtkrc.xml" />
|
||||
<xi:include href="xml/gtkstyle.xml" />
|
||||
</part>
|
||||
|
||||
<part id="gtkobjects">
|
||||
@@ -128,8 +124,6 @@
|
||||
<xi:include href="xml/gtkentrybuffer.xml" />
|
||||
<xi:include href="xml/gtkentrycompletion.xml" />
|
||||
<xi:include href="xml/gtkscale.xml" />
|
||||
<xi:include href="xml/gtkhscale.xml" />
|
||||
<xi:include href="xml/gtkvscale.xml" />
|
||||
<xi:include href="xml/gtkspinbutton.xml" />
|
||||
<xi:include href="xml/gtksearchentry.xml" />
|
||||
<xi:include href="xml/gtkeditable.xml" />
|
||||
@@ -188,7 +182,6 @@
|
||||
<xi:include href="xml/gtkradiomenuitem.xml" />
|
||||
<xi:include href="xml/gtkcheckmenuitem.xml" />
|
||||
<xi:include href="xml/gtkseparatormenuitem.xml" />
|
||||
<xi:include href="xml/gtktearoffmenuitem.xml" />
|
||||
<xi:include href="xml/gtktoolshell.xml" />
|
||||
<xi:include href="xml/gtktoolbar.xml" />
|
||||
<xi:include href="xml/gtktoolitem.xml" />
|
||||
@@ -218,9 +211,6 @@
|
||||
<xi:include href="xml/gtkcolorbutton.xml" />
|
||||
<xi:include href="xml/gtkcolorchooserwidget.xml" />
|
||||
<xi:include href="xml/gtkcolorchooserdialog.xml" />
|
||||
<xi:include href="xml/gtkcolorsel.xml" />
|
||||
<xi:include href="xml/gtkcolorseldlg.xml" />
|
||||
<xi:include href="xml/gtkhsv.xml" />
|
||||
<xi:include href="xml/gtkfilechooser.xml" />
|
||||
<xi:include href="xml/gtkfilechooserbutton.xml" />
|
||||
<xi:include href="xml/gtkfilechooserdialog.xml" />
|
||||
@@ -230,8 +220,6 @@
|
||||
<xi:include href="xml/gtkfontbutton.xml" />
|
||||
<xi:include href="xml/gtkfontchooserwidget.xml" />
|
||||
<xi:include href="xml/gtkfontchooserdialog.xml" />
|
||||
<xi:include href="xml/gtkfontsel.xml" />
|
||||
<xi:include href="xml/gtkfontseldlg.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="LayoutContainers">
|
||||
@@ -240,18 +228,11 @@
|
||||
<xi:include href="xml/gtkalignment.xml" />
|
||||
<xi:include href="xml/gtkaspectframe.xml" />
|
||||
<xi:include href="xml/gtkbox.xml" />
|
||||
<xi:include href="xml/gtkhbox.xml" />
|
||||
<xi:include href="xml/gtkvbox.xml" />
|
||||
<xi:include href="xml/gtkbbox.xml" />
|
||||
<xi:include href="xml/gtkhbbox.xml" />
|
||||
<xi:include href="xml/gtkvbbox.xml" />
|
||||
<xi:include href="xml/gtkfixed.xml" />
|
||||
<xi:include href="xml/gtkpaned.xml" />
|
||||
<xi:include href="xml/gtkhpaned.xml" />
|
||||
<xi:include href="xml/gtkvpaned.xml" />
|
||||
<xi:include href="xml/gtklayout.xml" />
|
||||
<xi:include href="xml/gtknotebook.xml" />
|
||||
<xi:include href="xml/gtktable.xml" />
|
||||
<xi:include href="xml/gtkexpander.xml" />
|
||||
<xi:include href="xml/gtkoverlay.xml" />
|
||||
<xi:include href="xml/gtkorientable.xml" />
|
||||
@@ -261,15 +242,11 @@
|
||||
<title>Ornaments</title>
|
||||
<xi:include href="xml/gtkframe.xml" />
|
||||
<xi:include href="xml/gtkseparator.xml" />
|
||||
<xi:include href="xml/gtkhseparator.xml" />
|
||||
<xi:include href="xml/gtkvseparator.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="ScrollingWidgets">
|
||||
<title>Scrolling</title>
|
||||
<xi:include href="xml/gtkscrollbar.xml" />
|
||||
<xi:include href="xml/gtkhscrollbar.xml" />
|
||||
<xi:include href="xml/gtkvscrollbar.xml" />
|
||||
<xi:include href="xml/gtkscrolledwindow.xml" />
|
||||
<xi:include href="xml/gtkscrollable.xml" />
|
||||
</chapter>
|
||||
@@ -350,6 +327,34 @@
|
||||
<xi:include href="xml/gtkapplicationwindow.xml" />
|
||||
<xi:include href="xml/gtkactionable.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="DeprecatedObjects">
|
||||
<title>Deprecated</title>
|
||||
<xi:include href="xml/gtksymboliccolor.xml" />
|
||||
<xi:include href="xml/gtkgradient.xml" />
|
||||
<xi:include href="xml/gtkrc.xml" />
|
||||
<xi:include href="xml/gtkstyle.xml" />
|
||||
<xi:include href="xml/gtkhscale.xml" />
|
||||
<xi:include href="xml/gtkvscale.xml" />
|
||||
<xi:include href="xml/gtktearoffmenuitem.xml" />
|
||||
<xi:include href="xml/gtkcolorsel.xml" />
|
||||
<xi:include href="xml/gtkcolorseldlg.xml" />
|
||||
<xi:include href="xml/gtkhsv.xml" />
|
||||
<xi:include href="xml/gtkfontsel.xml" />
|
||||
<xi:include href="xml/gtkfontseldlg.xml" />
|
||||
<xi:include href="xml/gtkhbox.xml" />
|
||||
<xi:include href="xml/gtkvbox.xml" />
|
||||
<xi:include href="xml/gtkhbbox.xml" />
|
||||
<xi:include href="xml/gtkvbbox.xml" />
|
||||
<xi:include href="xml/gtkhpaned.xml" />
|
||||
<xi:include href="xml/gtkvpaned.xml" />
|
||||
<xi:include href="xml/gtktable.xml" />
|
||||
<xi:include href="xml/gtkhseparator.xml" />
|
||||
<xi:include href="xml/gtkvseparator.xml" />
|
||||
<xi:include href="xml/gtkhscrollbar.xml" />
|
||||
<xi:include href="xml/gtkvscrollbar.xml" />
|
||||
</chapter>
|
||||
|
||||
</part>
|
||||
|
||||
<part id="migrating">
|
||||
@@ -406,6 +411,10 @@
|
||||
<title>Index of new symbols in 3.6</title>
|
||||
<xi:include href="xml/api-index-3.6.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="api-index-3-8" role="3.8">
|
||||
<title>Index of new symbols in 3.8</title>
|
||||
<xi:include href="xml/api-index-3.8.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
|
||||
|
@@ -536,6 +536,7 @@ gtk_builder_add_objects_from_string
|
||||
gtk_builder_add_objects_from_resource
|
||||
gtk_builder_get_object
|
||||
gtk_builder_get_objects
|
||||
gtk_builder_expose_object
|
||||
gtk_builder_connect_signals
|
||||
gtk_builder_connect_signals_full
|
||||
gtk_builder_set_translation_domain
|
||||
|
@@ -15,7 +15,9 @@ AM_CPPFLAGS = \
|
||||
|
||||
LDADDS = $(GDK_DEP_LIBS)
|
||||
|
||||
noinst_LTLIBRARIES = libbroadway.la libgdk-broadway.la
|
||||
noinst_LTLIBRARIES = libgdk-broadway.la
|
||||
|
||||
bin_PROGRAMS = broadwayd
|
||||
|
||||
libgdkinclude_HEADERS = \
|
||||
gdkbroadway.h
|
||||
@@ -26,10 +28,6 @@ libgdkbroadwayinclude_HEADERS = \
|
||||
gdkbroadwaycursor.h \
|
||||
gdkbroadwayvisual.h
|
||||
|
||||
libbroadway_la_SOURCES = \
|
||||
broadway.h \
|
||||
broadway.c
|
||||
|
||||
clienthtml.h: client.html
|
||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/client.html client_html > $@
|
||||
|
||||
@@ -73,9 +71,19 @@ libgdk_broadway_la_SOURCES = \
|
||||
gdkvisual-broadway.c \
|
||||
gdkwindow-broadway.c \
|
||||
gdkwindow-broadway.h \
|
||||
gdkprivate-broadway.h
|
||||
gdkprivate-broadway.h \
|
||||
gdkbroadway-server.h \
|
||||
gdkbroadway-server.c
|
||||
|
||||
libgdk_broadway_la_LIBADD = libbroadway.la
|
||||
broadwayd_SOURCES = \
|
||||
broadway-protocol.h \
|
||||
broadwayd.c \
|
||||
broadway-server.h \
|
||||
broadway-server.c \
|
||||
broadway-output.h \
|
||||
broadway-output.c
|
||||
|
||||
broadwayd_LDADD = $(GDK_DEP_LIBS) -lrt
|
||||
|
||||
MAINTAINERCLEANFILES = $(broadway_built_sources)
|
||||
EXTRA_DIST += $(broadway_built_sources)
|
||||
|
13
gdk/broadway/TODO.broadway
Normal file
13
gdk/broadway/TODO.broadway
Normal file
@@ -0,0 +1,13 @@
|
||||
Cache surfaces that are opened via shm_open inbetween updates.
|
||||
Send configure event when a window is moved and no client
|
||||
Handle implicit grabs when in broadway-server.c
|
||||
Rewrite events (per-client serials, etc)
|
||||
keyboard focus handling
|
||||
Add resize handling to js WM
|
||||
Make canvas/title non-selectable in browser
|
||||
Handle browser window size changes
|
||||
_gdk_broadway_server_has_client is always FALSE, so resize don't work
|
||||
Send reset events on client disconnect (button up, normal state. Maybe grab state reset?)
|
||||
rgba suport
|
||||
shift-select in gedit doesn't work
|
||||
backdrop mode
|
@@ -5,7 +5,7 @@
|
||||
#include <errno.h>
|
||||
#include <cairo.h>
|
||||
|
||||
#include "broadway.h"
|
||||
#include "broadway-output.h"
|
||||
|
||||
/************************************************************************
|
||||
* Base64 functions *
|
||||
@@ -351,12 +351,12 @@ static void
|
||||
append_uint16 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
guint8 *buf;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 2);
|
||||
buf = (guint8 *)output->buf->str + old_len;
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
}
|
||||
@@ -371,12 +371,12 @@ static void
|
||||
append_uint32 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
guint8 *buf;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
||||
|
||||
g_string_set_size (output->buf, old_len + 4);
|
||||
buf = (guint8 *)output->buf->str + old_len;
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
@@ -422,7 +422,7 @@ broadway_output_copy_rectangles (BroadwayOutput *output, int id,
|
||||
{
|
||||
int i;
|
||||
|
||||
write_header (output, 'b');
|
||||
write_header (output, BROADWAY_OP_COPY_RECTANGLES);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
@@ -441,7 +441,7 @@ broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
int id,
|
||||
gboolean owner_event)
|
||||
{
|
||||
write_header (output, 'g');
|
||||
write_header (output, BROADWAY_OP_GRAB_POINTER);
|
||||
append_uint16 (output, id);
|
||||
append_bool (output, owner_event);
|
||||
}
|
||||
@@ -452,7 +452,7 @@ broadway_output_ungrab_pointer (BroadwayOutput *output)
|
||||
guint32 serial;
|
||||
|
||||
serial = output->serial;
|
||||
write_header (output, 'u');
|
||||
write_header (output, BROADWAY_OP_UNGRAB_POINTER);
|
||||
|
||||
return serial;
|
||||
}
|
||||
@@ -462,7 +462,7 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
int id, int x, int y, int w, int h,
|
||||
gboolean is_temp)
|
||||
{
|
||||
write_header (output, 's');
|
||||
write_header (output, BROADWAY_OP_NEW_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
@@ -474,21 +474,21 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
void
|
||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, 'S');
|
||||
write_header (output, BROADWAY_OP_SHOW_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, 'H');
|
||||
write_header (output, BROADWAY_OP_HIDE_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, 'd');
|
||||
write_header (output, BROADWAY_OP_DESTROY_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
}
|
||||
|
||||
@@ -508,7 +508,7 @@ broadway_output_move_resize_surface (BroadwayOutput *output,
|
||||
if (!has_pos && !has_size)
|
||||
return;
|
||||
|
||||
write_header (output, 'm');
|
||||
write_header (output, BROADWAY_OP_MOVE_RESIZE);
|
||||
val = (!!has_pos) | ((!!has_size) << 1);
|
||||
append_uint16 (output, id);
|
||||
append_flags (output, val);
|
||||
@@ -529,7 +529,7 @@ broadway_output_set_transient_for (BroadwayOutput *output,
|
||||
int id,
|
||||
int parent_id)
|
||||
{
|
||||
write_header (output, 'p');
|
||||
write_header (output, BROADWAY_OP_SET_TRANSIENT_FOR);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, parent_id);
|
||||
}
|
||||
@@ -541,7 +541,7 @@ broadway_output_put_rgb (BroadwayOutput *output, int id, int x, int y,
|
||||
{
|
||||
gsize size_start, image_start, len;
|
||||
|
||||
write_header (output, 'i');
|
||||
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
@@ -798,7 +798,7 @@ broadway_output_put_rgba (BroadwayOutput *output, int id, int x, int y,
|
||||
{
|
||||
guint8 *subdata;
|
||||
|
||||
write_header (output, 'i');
|
||||
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x + rects[i].x1);
|
||||
append_uint16 (output, y + rects[i].y1);
|
||||
@@ -830,6 +830,6 @@ void
|
||||
broadway_output_surface_flush (BroadwayOutput *output,
|
||||
int id)
|
||||
{
|
||||
write_header (output, 'f');
|
||||
write_header (output, BROADWAY_OP_FLUSH);
|
||||
append_uint16 (output, id);
|
||||
}
|
@@ -1,13 +1,12 @@
|
||||
#ifndef __BROADWAY_H__
|
||||
#define __BROADWAY_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
#include "broadway-protocol.h"
|
||||
|
||||
typedef struct BroadwayOutput BroadwayOutput;
|
||||
|
||||
typedef struct {
|
||||
int x, y;
|
||||
int width, height;
|
||||
} BroadwayRect;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_WS_CONTINUATION = 0,
|
||||
BROADWAY_WS_TEXT = 1,
|
||||
@@ -78,3 +77,5 @@ void broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
gboolean owner_event);
|
||||
guint32 broadway_output_ungrab_pointer (BroadwayOutput *output);
|
||||
void broadway_output_pong (BroadwayOutput *output);
|
||||
|
||||
#endif /* __BROADWAY_H__ */
|
264
gdk/broadway/broadway-protocol.h
Normal file
264
gdk/broadway/broadway-protocol.h
Normal file
@@ -0,0 +1,264 @@
|
||||
#ifndef __BROADWAY_PROTOCOL_H__
|
||||
#define __BROADWAY_PROTOCOL_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
typedef struct {
|
||||
gint32 x, y;
|
||||
gint32 width, height;
|
||||
} BroadwayRect;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_EVENT_ENTER = 'e',
|
||||
BROADWAY_EVENT_LEAVE = 'l',
|
||||
BROADWAY_EVENT_POINTER_MOVE = 'm',
|
||||
BROADWAY_EVENT_BUTTON_PRESS = 'b',
|
||||
BROADWAY_EVENT_BUTTON_RELEASE = 'B',
|
||||
BROADWAY_EVENT_SCROLL = 's',
|
||||
BROADWAY_EVENT_KEY_PRESS = 'k',
|
||||
BROADWAY_EVENT_KEY_RELEASE = 'K',
|
||||
BROADWAY_EVENT_GRAB_NOTIFY = 'g',
|
||||
BROADWAY_EVENT_UNGRAB_NOTIFY = 'u',
|
||||
BROADWAY_EVENT_CONFIGURE_NOTIFY = 'w',
|
||||
BROADWAY_EVENT_DELETE_NOTIFY = 'W',
|
||||
BROADWAY_EVENT_SCREEN_SIZE_CHANGED = 'd'
|
||||
} BroadwayEventType;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_OP_COPY_RECTANGLES = 'b',
|
||||
BROADWAY_OP_GRAB_POINTER = 'g',
|
||||
BROADWAY_OP_UNGRAB_POINTER = 'u',
|
||||
BROADWAY_OP_NEW_SURFACE = 's',
|
||||
BROADWAY_OP_SHOW_SURFACE = 'S',
|
||||
BROADWAY_OP_HIDE_SURFACE = 'H',
|
||||
BROADWAY_OP_DESTROY_SURFACE = 'd',
|
||||
BROADWAY_OP_MOVE_RESIZE = 'm',
|
||||
BROADWAY_OP_SET_TRANSIENT_FOR = 'p',
|
||||
BROADWAY_OP_PUT_RGB = 'i',
|
||||
BROADWAY_OP_FLUSH = 'f',
|
||||
} BroadwayOpType;
|
||||
|
||||
typedef struct {
|
||||
guint8 type;
|
||||
guint32 serial;
|
||||
guint64 time;
|
||||
} BroadwayInputBaseMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 event_window_id;
|
||||
gint32 root_x;
|
||||
gint32 root_y;
|
||||
gint32 win_x;
|
||||
gint32 win_y;
|
||||
guint32 state;
|
||||
} BroadwayInputPointerMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 mode;
|
||||
} BroadwayInputCrossingMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 button;
|
||||
} BroadwayInputButtonMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
gint32 dir;
|
||||
} BroadwayInputScrollMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 state;
|
||||
gint32 key;
|
||||
} BroadwayInputKeyMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 res;
|
||||
} BroadwayInputGrabReply;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 id;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
gint32 width;
|
||||
gint32 height;
|
||||
} BroadwayInputConfigureNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 width;
|
||||
gint32 height;
|
||||
} BroadwayInputScreenResizeNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 id;
|
||||
} BroadwayInputDeleteNotify;
|
||||
|
||||
typedef union {
|
||||
BroadwayInputBaseMsg base;
|
||||
BroadwayInputPointerMsg pointer;
|
||||
BroadwayInputCrossingMsg crossing;
|
||||
BroadwayInputButtonMsg button;
|
||||
BroadwayInputScrollMsg scroll;
|
||||
BroadwayInputKeyMsg key;
|
||||
BroadwayInputGrabReply grab_reply;
|
||||
BroadwayInputConfigureNotify configure_notify;
|
||||
BroadwayInputDeleteNotify delete_notify;
|
||||
BroadwayInputScreenResizeNotify screen_resize_notify;
|
||||
} BroadwayInputMsg;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_REQUEST_NEW_WINDOW,
|
||||
BROADWAY_REQUEST_FLUSH,
|
||||
BROADWAY_REQUEST_SYNC,
|
||||
BROADWAY_REQUEST_QUERY_MOUSE,
|
||||
BROADWAY_REQUEST_DESTROY_WINDOW,
|
||||
BROADWAY_REQUEST_SHOW_WINDOW,
|
||||
BROADWAY_REQUEST_HIDE_WINDOW,
|
||||
BROADWAY_REQUEST_SET_TRANSIENT_FOR,
|
||||
BROADWAY_REQUEST_TRANSLATE,
|
||||
BROADWAY_REQUEST_UPDATE,
|
||||
BROADWAY_REQUEST_MOVE_RESIZE,
|
||||
BROADWAY_REQUEST_GRAB_POINTER,
|
||||
BROADWAY_REQUEST_UNGRAB_POINTER
|
||||
} BroadwayRequestType;
|
||||
|
||||
typedef struct {
|
||||
guint32 size;
|
||||
guint32 serial;
|
||||
guint32 type;
|
||||
} BroadwayRequestBase, BroadwayRequestFlush, BroadwayRequestSync, BroadwayRequestQueryMouse;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
} BroadwayRequestDestroyWindow, BroadwayRequestShowWindow, BroadwayRequestHideWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
guint32 parent;
|
||||
} BroadwayRequestSetTransientFor;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
gint32 dx;
|
||||
gint32 dy;
|
||||
guint32 n_rects;
|
||||
BroadwayRect rects[1];
|
||||
} BroadwayRequestTranslate;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
char name[34];
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
} BroadwayRequestUpdate;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
guint32 owner_events;
|
||||
guint32 event_mask;
|
||||
guint32 time_;
|
||||
} BroadwayRequestGrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 time_;
|
||||
} BroadwayRequestUngrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
guint32 is_temp;
|
||||
} BroadwayRequestNewWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
} BroadwayRequestMoveResize;
|
||||
|
||||
typedef union {
|
||||
BroadwayRequestBase base;
|
||||
BroadwayRequestNewWindow new_window;
|
||||
BroadwayRequestFlush flush;
|
||||
BroadwayRequestSync sync;
|
||||
BroadwayRequestQueryMouse query_mouse;
|
||||
BroadwayRequestDestroyWindow destroy_window;
|
||||
BroadwayRequestShowWindow show_window;
|
||||
BroadwayRequestHideWindow hide_window;
|
||||
BroadwayRequestSetTransientFor set_transient_for;
|
||||
BroadwayRequestUpdate update;
|
||||
BroadwayRequestMoveResize move_resize;
|
||||
BroadwayRequestGrabPointer grab_pointer;
|
||||
BroadwayRequestUngrabPointer ungrab_pointer;
|
||||
BroadwayRequestTranslate translate;
|
||||
} BroadwayRequest;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_REPLY_EVENT,
|
||||
BROADWAY_REPLY_SYNC,
|
||||
BROADWAY_REPLY_QUERY_MOUSE,
|
||||
BROADWAY_REPLY_NEW_WINDOW,
|
||||
BROADWAY_REPLY_GRAB_POINTER,
|
||||
BROADWAY_REPLY_UNGRAB_POINTER
|
||||
} BroadwayReplyType;
|
||||
|
||||
typedef struct {
|
||||
guint32 size;
|
||||
guint32 last_serial;
|
||||
guint32 in_reply_to;
|
||||
guint32 type;
|
||||
} BroadwayReplyBase, BroadwayReplySync;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 id;
|
||||
} BroadwayReplyNewWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 status;
|
||||
} BroadwayReplyGrabPointer, BroadwayReplyUngrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 toplevel;
|
||||
gint32 root_x;
|
||||
gint32 root_y;
|
||||
guint32 mask;
|
||||
} BroadwayReplyQueryMouse;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
BroadwayInputMsg msg;
|
||||
} BroadwayReplyEvent;
|
||||
|
||||
typedef union {
|
||||
BroadwayReplyBase base;
|
||||
BroadwayReplyEvent event;
|
||||
BroadwayReplyQueryMouse query_mouse;
|
||||
BroadwayReplyNewWindow new_window;
|
||||
BroadwayReplyGrabPointer grab_pointer;
|
||||
BroadwayReplyUngrabPointer ungrab_pointer;
|
||||
} BroadwayReply;
|
||||
|
||||
#endif /* __BROADWAY_PROTOCOL_H__ */
|
1724
gdk/broadway/broadway-server.c
Normal file
1724
gdk/broadway/broadway-server.c
Normal file
File diff suppressed because it is too large
Load Diff
77
gdk/broadway/broadway-server.h
Normal file
77
gdk/broadway/broadway-server.h
Normal file
@@ -0,0 +1,77 @@
|
||||
#ifndef __BROADWAY_SERVER__
|
||||
#define __BROADWAY_SERVER__
|
||||
|
||||
#include "broadway-protocol.h"
|
||||
#include <glib-object.h>
|
||||
#include <cairo.h>
|
||||
|
||||
void broadway_events_got_input (BroadwayInputMsg *message,
|
||||
gint32 client_id);
|
||||
|
||||
typedef struct _BroadwayServer BroadwayServer;
|
||||
typedef struct _BroadwayServerClass BroadwayServerClass;
|
||||
|
||||
#define BROADWAY_TYPE_SERVER (broadway_server_get_type())
|
||||
#define BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BROADWAY_TYPE_SERVER, BroadwayServer))
|
||||
#define BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
||||
#define BROADWAY_IS_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BROADWAY_TYPE_SERVER))
|
||||
#define BROADWAY_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BROADWAY_TYPE_SERVER))
|
||||
#define BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
||||
|
||||
|
||||
BroadwayServer *broadway_server_new (int port,
|
||||
GError **error);
|
||||
gboolean broadway_server_has_client (BroadwayServer *server);
|
||||
void broadway_server_flush (BroadwayServer *server);
|
||||
void broadway_server_sync (BroadwayServer *server);
|
||||
gulong broadway_server_get_next_serial (BroadwayServer *server);
|
||||
guint32 broadway_server_get_last_seen_time (BroadwayServer *server);
|
||||
gboolean broadway_server_lookahead_event (BroadwayServer *server,
|
||||
const char *types);
|
||||
void broadway_server_query_mouse (BroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask);
|
||||
guint32 broadway_server_grab_pointer (BroadwayServer *server,
|
||||
gint client_id,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_);
|
||||
guint32 broadway_server_ungrab_pointer (BroadwayServer *server,
|
||||
guint32 time_);
|
||||
gint32 broadway_server_get_mouse_toplevel (BroadwayServer *server);
|
||||
guint32 broadway_server_new_window (BroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp);
|
||||
void broadway_server_destroy_window (BroadwayServer *server,
|
||||
gint id);
|
||||
gboolean broadway_server_window_show (BroadwayServer *server,
|
||||
gint id);
|
||||
gboolean broadway_server_window_hide (BroadwayServer *server,
|
||||
gint id);
|
||||
void broadway_server_window_set_transient_for (BroadwayServer *server,
|
||||
gint id,
|
||||
gint parent);
|
||||
gboolean broadway_server_window_translate (BroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy);
|
||||
cairo_surface_t * broadway_server_create_surface (int width,
|
||||
int height);
|
||||
void broadway_server_window_update (BroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface);
|
||||
gboolean broadway_server_window_move_resize (BroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
#endif /* __BROADWAY_SERVER__ */
|
@@ -132,18 +132,6 @@ function createXHR()
|
||||
return null;
|
||||
}
|
||||
|
||||
/* This resizes the window so the *inner* size is the specified size */
|
||||
function resizeBrowserWindow(window, w, h) {
|
||||
var innerW = window.innerWidth;
|
||||
var innerH = window.innerHeight;
|
||||
|
||||
var outerW = window.outerWidth;
|
||||
var outerH = window.outerHeight;
|
||||
|
||||
window.resizeTo(w + outerW - innerW,
|
||||
h + outerH - innerH);
|
||||
}
|
||||
|
||||
function resizeCanvas(canvas, w, h)
|
||||
{
|
||||
/* Canvas resize clears the data, so we need to save it first */
|
||||
@@ -163,8 +151,6 @@ function resizeCanvas(canvas, w, h)
|
||||
context.drawImage(tmpCanvas, 0, 0, tmpCanvas.width, tmpCanvas.height);
|
||||
}
|
||||
|
||||
var useToplevelWindows = false;
|
||||
var toplevelWindows = [];
|
||||
var grab = new Object();
|
||||
grab.window = null;
|
||||
grab.ownerEvents = false;
|
||||
@@ -276,121 +262,11 @@ function flushSurface(surface)
|
||||
}
|
||||
}
|
||||
|
||||
function ensureSurfaceInDocument(surface, doc)
|
||||
{
|
||||
if (surface.document != doc) {
|
||||
var oldCanvas = surface.canvas;
|
||||
var canvas = doc.importNode(oldCanvas, false);
|
||||
doc.body.appendChild(canvas);
|
||||
canvas.surface = surface;
|
||||
oldCanvas.parentNode.removeChild(oldCanvas);
|
||||
|
||||
surface.canvas = canvas;
|
||||
if (surface.toplevelElement == oldCanvas)
|
||||
surface.toplevelElement = canvas;
|
||||
surface.document = doc;
|
||||
}
|
||||
}
|
||||
|
||||
function sendConfigureNotify(surface)
|
||||
{
|
||||
sendInput("w", [surface.id, surface.x, surface.y, surface.width, surface.height]);
|
||||
}
|
||||
|
||||
var windowGeometryTimeout = null;
|
||||
|
||||
function updateBrowserWindowGeometry(win, alwaysSendConfigure) {
|
||||
if (win.closed)
|
||||
return;
|
||||
|
||||
var surface = win.surface;
|
||||
|
||||
var innerW = win.innerWidth;
|
||||
var innerH = win.innerHeight;
|
||||
|
||||
var x = surface.x;
|
||||
var y = surface.y;
|
||||
|
||||
if (win.mozInnerScreenX != undefined) {
|
||||
x = win.mozInnerScreenX;
|
||||
y = win.mozInnerScreenY;
|
||||
} else if (win.screenTop != undefined) {
|
||||
x = win.screenTop;
|
||||
y = win.screenLeft;
|
||||
} else {
|
||||
alert("No implementation to get window position");
|
||||
}
|
||||
|
||||
if (alwaysSendConfigure || x != surface.x || y != surface.y ||
|
||||
innerW != surface.width || innerH != surface.height) {
|
||||
var oldX = surface.x;
|
||||
var oldY = surface.y;
|
||||
surface.x = x;
|
||||
surface.y = y;
|
||||
if (surface.width != innerW || surface.height != innerH)
|
||||
resizeCanvas(surface.canvas, innerW, innerH);
|
||||
surface.width = innerW;
|
||||
surface.height = innerH;
|
||||
sendConfigureNotify(surface);
|
||||
for (id in surfaces) {
|
||||
var childSurface = surfaces[id];
|
||||
var transientToplevel = getTransientToplevel(childSurface);
|
||||
if (transientToplevel != null && transientToplevel == surface) {
|
||||
childSurface.x += surface.x - oldX;
|
||||
childSurface.y += surface.y - oldY;
|
||||
sendConfigureNotify(childSurface);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function browserWindowClosed(win) {
|
||||
var surface = win.surface;
|
||||
|
||||
sendInput ("W", [surface.id]);
|
||||
for (id in surfaces) {
|
||||
var childSurface = surfaces[id];
|
||||
var transientToplevel = getTransientToplevel(childSurface);
|
||||
if (transientToplevel != null && transientToplevel == surface) {
|
||||
sendInput ("W", [childSurface.id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function registerWindow(win)
|
||||
{
|
||||
toplevelWindows.push(win);
|
||||
win.onresize = function(ev) { updateBrowserWindowGeometry(ev.target, false); };
|
||||
if (!windowGeometryTimeout)
|
||||
windowGeometryTimeout = setInterval(function () {
|
||||
for (var i = 0; i < toplevelWindows.length; i++)
|
||||
updateBrowserWindowGeometry(toplevelWindows[i], false);
|
||||
}, 2000);
|
||||
win.onunload = function(ev) { browserWindowClosed(ev.target.defaultView); };
|
||||
}
|
||||
|
||||
function unregisterWindow(win)
|
||||
{
|
||||
var i = toplevelWindows.indexOf(win);
|
||||
if (i >= 0)
|
||||
toplevelWindows.splice(i, 1);
|
||||
|
||||
if (windowGeometryTimeout && toplevelWindows.length == 0) {
|
||||
clearInterval(windowGeometryTimeout);
|
||||
windowGeometryTimeout = null;
|
||||
}
|
||||
}
|
||||
|
||||
function getTransientToplevel(surface)
|
||||
{
|
||||
while (surface && surface.transientParent != 0) {
|
||||
surface = surfaces[surface.transientParent];
|
||||
if (surface && surface.window)
|
||||
return surface;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getStyle(el, styleProp)
|
||||
{
|
||||
if (el.currentStyle) {
|
||||
@@ -440,8 +316,6 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
||||
surface.drawQueue = [];
|
||||
surface.transientParent = 0;
|
||||
surface.visible = false;
|
||||
surface.window = null;
|
||||
surface.document = document;
|
||||
surface.frame = null;
|
||||
|
||||
var canvas = document.createElement("canvas");
|
||||
@@ -451,7 +325,7 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
||||
surface.canvas = canvas;
|
||||
var toplevelElement;
|
||||
|
||||
if (useToplevelWindows || isTemp) {
|
||||
if (isTemp) {
|
||||
toplevelElement = canvas;
|
||||
document.body.appendChild(canvas);
|
||||
} else {
|
||||
@@ -511,42 +385,10 @@ function cmdShowSurface(id)
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
|
||||
if (useToplevelWindows) {
|
||||
var doc = document;
|
||||
if (!surface.isTemp) {
|
||||
var options =
|
||||
'width='+surface.width+',height='+surface.height+
|
||||
',location=no,menubar=no,scrollbars=no,toolbar=no';
|
||||
if (surface.positioned)
|
||||
options = options +
|
||||
',left='+surface.x+',top='+surface.y+',screenX='+surface.x+',screenY='+surface.y;
|
||||
var win = window.open('','_blank', options);
|
||||
win.surface = surface;
|
||||
registerWindow(win);
|
||||
doc = win.document;
|
||||
doc.open();
|
||||
doc.write("<body></body>");
|
||||
setupDocument(doc);
|
||||
|
||||
surface.window = win;
|
||||
xOffset = 0;
|
||||
yOffset = 0;
|
||||
} else {
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
doc = transientToplevel.window.document;
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
}
|
||||
|
||||
ensureSurfaceInDocument(surface, doc);
|
||||
} else {
|
||||
if (surface.frame) {
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
if (surface.frame) {
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
|
||||
surface.toplevelElement.style["left"] = xOffset + "px";
|
||||
@@ -554,9 +396,6 @@ function cmdShowSurface(id)
|
||||
surface.toplevelElement.style["visibility"] = "visible";
|
||||
|
||||
restackWindows();
|
||||
|
||||
if (surface.window)
|
||||
updateBrowserWindowGeometry(surface.window, false);
|
||||
}
|
||||
|
||||
function cmdHideSurface(id)
|
||||
@@ -573,15 +412,6 @@ function cmdHideSurface(id)
|
||||
var element = surface.toplevelElement;
|
||||
|
||||
element.style["visibility"] = "hidden";
|
||||
|
||||
// Import the canvas into the main document
|
||||
ensureSurfaceInDocument(surface, document);
|
||||
|
||||
if (surface.window) {
|
||||
unregisterWindow(surface.window);
|
||||
surface.window.close();
|
||||
surface.window = null;
|
||||
}
|
||||
}
|
||||
|
||||
function cmdSetTransientFor(id, parentId)
|
||||
@@ -666,45 +496,30 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
|
||||
resizeCanvas(surface.canvas, w, h);
|
||||
|
||||
if (surface.visible) {
|
||||
if (surface.window) {
|
||||
/* TODO: This moves the outer frame position, we really want the inner position.
|
||||
* However this isn't *strictly* invalid, as any WM could have done whatever it
|
||||
* wanted with the positioning of the window.
|
||||
*/
|
||||
if (has_pos)
|
||||
surface.window.moveTo(surface.x, surface.y);
|
||||
if (has_size)
|
||||
resizeBrowserWindow(surface.window, w, h);
|
||||
} else {
|
||||
if (has_pos) {
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
if (has_pos) {
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
|
||||
var element = surface.canvas;
|
||||
if (surface.frame) {
|
||||
element = surface.frame;
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
|
||||
element.style["left"] = xOffset + "px";
|
||||
element.style["top"] = yOffset + "px";
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
|
||||
var element = surface.canvas;
|
||||
if (surface.frame) {
|
||||
element = surface.frame;
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
|
||||
element.style["left"] = xOffset + "px";
|
||||
element.style["top"] = yOffset + "px";
|
||||
}
|
||||
}
|
||||
|
||||
if (surface.window) {
|
||||
updateBrowserWindowGeometry(surface.window, true);
|
||||
} else {
|
||||
sendConfigureNotify(surface);
|
||||
}
|
||||
sendConfigureNotify(surface);
|
||||
}
|
||||
|
||||
function cmdFlushSurface(id)
|
||||
@@ -985,13 +800,8 @@ function getPositionsFromAbsCoord(absX, absY, relativeId) {
|
||||
|
||||
function getPositionsFromEvent(ev, relativeId) {
|
||||
var absX, absY;
|
||||
if (useToplevelWindows) {
|
||||
absX = ev.screenX;
|
||||
absY = ev.screenY;
|
||||
} else {
|
||||
absX = ev.pageX;
|
||||
absY = ev.pageY;
|
||||
}
|
||||
absX = ev.pageX;
|
||||
absY = ev.pageY;
|
||||
var res = getPositionsFromAbsCoord(absX, absY, relativeId);
|
||||
|
||||
lastX = res.rootX;
|
||||
@@ -1020,10 +830,6 @@ function updateForEvent(ev) {
|
||||
lastState |= GDK_MOD1_MASK;
|
||||
|
||||
lastTimeStamp = ev.timeStamp;
|
||||
if (ev.target.surface && ev.target.surface.window) {
|
||||
var win = ev.target.surface.window;
|
||||
updateBrowserWindowGeometry(win, false);
|
||||
}
|
||||
}
|
||||
|
||||
function onMouseMove (ev) {
|
||||
@@ -1141,7 +947,7 @@ function onMouseDown (ev) {
|
||||
localGrab.lastX = ev.pageX;
|
||||
localGrab.lastY = ev.pageY;
|
||||
moveToTop(localGrab.frame.frameFor);
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (id == 0 && ev.target.closeFor) { /* mouse click on frame */
|
||||
@@ -1153,13 +959,14 @@ function onMouseDown (ev) {
|
||||
localGrab.button = ev.target;
|
||||
localGrab.lastX = ev.pageX;
|
||||
localGrab.lastY = ev.pageY;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
var pos = getPositionsFromEvent(ev, id);
|
||||
if (grab.window == null)
|
||||
doGrab (id, false, true);
|
||||
sendInput ("b", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||
return false;
|
||||
}
|
||||
|
||||
function onMouseUp (ev) {
|
||||
@@ -1189,13 +996,15 @@ function onMouseUp (ev) {
|
||||
sendInput ("W", [localGrab.surface.id]);
|
||||
}
|
||||
localGrab = null;
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
sendInput ("B", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||
|
||||
if (grab.window != null && grab.implicit)
|
||||
doUngrab();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Some of the keyboard handling code is from noVNC and
|
||||
@@ -2671,7 +2480,7 @@ function handleKeyDown(e) {
|
||||
// browser behaviors or it has no corresponding keyPress
|
||||
// event, then send it immediately
|
||||
if (!ignoreKeyEvent(ev))
|
||||
sendInput("k", [keysym, lastState]);
|
||||
sendInput("k", [realWindowWithMouse, keysym, lastState]);
|
||||
suppress = true;
|
||||
}
|
||||
|
||||
@@ -2716,7 +2525,7 @@ function handleKeyPress(e) {
|
||||
|
||||
// Send the translated keysym
|
||||
if (keysym > 0)
|
||||
sendInput ("k", [keysym, lastState]);
|
||||
sendInput ("k", [realWindowWithMouse, keysym, lastState]);
|
||||
|
||||
// Stop keypress events just in case
|
||||
return cancelEvent(ev);
|
||||
@@ -2735,7 +2544,7 @@ function handleKeyUp(e) {
|
||||
}
|
||||
|
||||
if (keysym > 0)
|
||||
sendInput ("K", [keysym, lastState]);
|
||||
sendInput ("K", [realWindowWithMouse, keysym, lastState]);
|
||||
return cancelEvent(ev);
|
||||
}
|
||||
|
||||
@@ -2830,8 +2639,6 @@ function connect()
|
||||
var query_string = url.split("?");
|
||||
if (query_string.length > 1) {
|
||||
var params = query_string[1].split("&");
|
||||
if (params[0].indexOf("toplevel") != -1)
|
||||
useToplevelWindows = true;
|
||||
}
|
||||
|
||||
var loc = window.location.toString().replace("http:", "ws:");
|
||||
@@ -2848,19 +2655,14 @@ function connect()
|
||||
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]);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
@@ -2871,8 +2673,4 @@ function connect()
|
||||
};
|
||||
|
||||
setupDocument(document);
|
||||
window.onunload = function (ev) {
|
||||
for (var i = 0; i < toplevelWindows.length; i++)
|
||||
toplevelWindows[i].close();
|
||||
};
|
||||
}
|
||||
|
515
gdk/broadway/broadwayd.c
Normal file
515
gdk/broadway/broadwayd.c
Normal file
@@ -0,0 +1,515 @@
|
||||
#include "config.h"
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
|
||||
#include "broadway-server.h"
|
||||
|
||||
BroadwayServer *server;
|
||||
GList *clients;
|
||||
|
||||
static guint32 client_id_count = 1;
|
||||
|
||||
typedef struct {
|
||||
guint32 id;
|
||||
GSocketConnection *connection;
|
||||
GBufferedInputStream *in;
|
||||
guint32 last_seen_serial;
|
||||
GList *windows;
|
||||
guint disconnect_idle;
|
||||
} BroadwayClient;
|
||||
|
||||
static void
|
||||
client_free (BroadwayClient *client)
|
||||
{
|
||||
g_assert (client->windows == NULL);
|
||||
g_assert (client->disconnect_idle == 0);
|
||||
clients = g_list_remove (clients, client);
|
||||
g_object_unref (client->connection);
|
||||
g_object_unref (client->in);
|
||||
g_free (client);
|
||||
}
|
||||
|
||||
static void
|
||||
client_disconnected (BroadwayClient *client)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
if (client->disconnect_idle != 0)
|
||||
{
|
||||
g_source_remove (client->disconnect_idle);
|
||||
client->disconnect_idle = 0;
|
||||
}
|
||||
|
||||
for (l = client->windows; l != NULL; l = l->next)
|
||||
broadway_server_destroy_window (server,
|
||||
GPOINTER_TO_UINT (l->data));
|
||||
g_list_free (client->windows);
|
||||
client->windows = NULL;
|
||||
|
||||
broadway_server_flush (server);
|
||||
|
||||
client_free (client);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
disconnect_idle_cb (BroadwayClient *client)
|
||||
{
|
||||
client->disconnect_idle = 0;
|
||||
client_disconnected (client);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
client_disconnect_in_idle (BroadwayClient *client)
|
||||
{
|
||||
if (client->disconnect_idle == 0)
|
||||
client->disconnect_idle =
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT, (GSourceFunc)disconnect_idle_cb, client, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
send_reply (BroadwayClient *client,
|
||||
BroadwayRequest *request,
|
||||
BroadwayReply *reply,
|
||||
gsize size,
|
||||
guint32 type)
|
||||
{
|
||||
GOutputStream *output;
|
||||
|
||||
reply->base.size = size;
|
||||
reply->base.last_serial = client->last_seen_serial;
|
||||
reply->base.in_reply_to = request ? request->base.serial : 0;
|
||||
reply->base.type = type;
|
||||
|
||||
output = g_io_stream_get_output_stream (G_IO_STREAM (client->connection));
|
||||
if (!g_output_stream_write_all (output, reply, size, NULL, NULL, NULL))
|
||||
{
|
||||
g_printerr ("can't write to client");
|
||||
client_disconnect_in_idle (client);
|
||||
}
|
||||
}
|
||||
|
||||
static cairo_region_t *
|
||||
region_from_rects (BroadwayRect *rects, int n_rects)
|
||||
{
|
||||
cairo_region_t *region;
|
||||
cairo_rectangle_int_t *cairo_rects;
|
||||
int i;
|
||||
|
||||
cairo_rects = g_new (cairo_rectangle_int_t, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_rects[i].x = rects[i].x;
|
||||
cairo_rects[i].y = rects[i].y;
|
||||
cairo_rects[i].width = rects[i].width;
|
||||
cairo_rects[i].height = rects[i].height;
|
||||
}
|
||||
region = cairo_region_create_rectangles (cairo_rects, n_rects);
|
||||
g_free (cairo_rects);
|
||||
return region;
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} ShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_unmap (void *_data)
|
||||
{
|
||||
ShmSurfaceData *data = _data;
|
||||
munmap (data->data, data->data_size);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
open_surface (char *name, int width, int height)
|
||||
{
|
||||
ShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
gsize size;
|
||||
void *ptr;
|
||||
int fd;
|
||||
|
||||
size = width * height * sizeof (guint32);
|
||||
|
||||
fd = shm_open(name, O_RDONLY, 0600);
|
||||
if (fd == -1)
|
||||
{
|
||||
perror ("Failed to shm_open");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
data = g_new0 (ShmSurfaceData, 1);
|
||||
|
||||
data->data = ptr;
|
||||
data->data_size = size;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24,
|
||||
width, height,
|
||||
width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &shm_cairo_key,
|
||||
data, shm_data_unmap);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
static void
|
||||
client_handle_request (BroadwayClient *client,
|
||||
BroadwayRequest *request)
|
||||
{
|
||||
BroadwayReplyNewWindow reply_new_window;
|
||||
BroadwayReplySync reply_sync;
|
||||
BroadwayReplyQueryMouse reply_query_mouse;
|
||||
BroadwayReplyGrabPointer reply_grab_pointer;
|
||||
BroadwayReplyUngrabPointer reply_ungrab_pointer;
|
||||
cairo_region_t *area;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
client->last_seen_serial = request->base.serial;
|
||||
|
||||
switch (request->base.type)
|
||||
{
|
||||
case BROADWAY_REQUEST_NEW_WINDOW:
|
||||
reply_new_window.id =
|
||||
broadway_server_new_window (server,
|
||||
request->new_window.x,
|
||||
request->new_window.y,
|
||||
request->new_window.width,
|
||||
request->new_window.height,
|
||||
request->new_window.is_temp);
|
||||
client->windows =
|
||||
g_list_prepend (client->windows,
|
||||
GUINT_TO_POINTER (reply_new_window.id));
|
||||
|
||||
send_reply (client, request, (BroadwayReply *)&reply_new_window, sizeof (reply_new_window),
|
||||
BROADWAY_REPLY_NEW_WINDOW);
|
||||
break;
|
||||
case BROADWAY_REQUEST_FLUSH:
|
||||
broadway_server_flush (server);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SYNC:
|
||||
broadway_server_flush (server);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_sync, sizeof (reply_sync),
|
||||
BROADWAY_REPLY_SYNC);
|
||||
break;
|
||||
case BROADWAY_REQUEST_QUERY_MOUSE:
|
||||
broadway_server_query_mouse (server,
|
||||
&reply_query_mouse.toplevel,
|
||||
&reply_query_mouse.root_x,
|
||||
&reply_query_mouse.root_y,
|
||||
&reply_query_mouse.mask);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_query_mouse, sizeof (reply_query_mouse),
|
||||
BROADWAY_REPLY_QUERY_MOUSE);
|
||||
break;
|
||||
case BROADWAY_REQUEST_DESTROY_WINDOW:
|
||||
client->windows =
|
||||
g_list_remove (client->windows,
|
||||
GUINT_TO_POINTER (request->destroy_window.id));
|
||||
broadway_server_destroy_window (server, request->destroy_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SHOW_WINDOW:
|
||||
broadway_server_window_show (server, request->show_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_HIDE_WINDOW:
|
||||
broadway_server_window_hide (server, request->hide_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SET_TRANSIENT_FOR:
|
||||
broadway_server_window_set_transient_for (server,
|
||||
request->set_transient_for.id,
|
||||
request->set_transient_for.parent);
|
||||
break;
|
||||
case BROADWAY_REQUEST_TRANSLATE:
|
||||
area = region_from_rects (request->translate.rects,
|
||||
request->translate.n_rects);
|
||||
broadway_server_window_translate (server,
|
||||
request->translate.id,
|
||||
area,
|
||||
request->translate.dx,
|
||||
request->translate.dy);
|
||||
cairo_region_destroy (area);
|
||||
break;
|
||||
case BROADWAY_REQUEST_UPDATE:
|
||||
surface = open_surface (request->update.name,
|
||||
request->update.width,
|
||||
request->update.height);
|
||||
if (surface != NULL)
|
||||
{
|
||||
broadway_server_window_update (server,
|
||||
request->update.id,
|
||||
surface);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
break;
|
||||
case BROADWAY_REQUEST_MOVE_RESIZE:
|
||||
if (!broadway_server_window_move_resize (server,
|
||||
request->move_resize.id,
|
||||
request->move_resize.x,
|
||||
request->move_resize.y,
|
||||
request->move_resize.width,
|
||||
request->move_resize.height))
|
||||
{
|
||||
/* TODO: Send configure request */
|
||||
}
|
||||
break;
|
||||
case BROADWAY_REQUEST_GRAB_POINTER:
|
||||
reply_grab_pointer.status =
|
||||
broadway_server_grab_pointer (server,
|
||||
client->id,
|
||||
request->grab_pointer.id,
|
||||
request->grab_pointer.owner_events,
|
||||
request->grab_pointer.event_mask,
|
||||
request->grab_pointer.time_);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_grab_pointer, sizeof (reply_grab_pointer),
|
||||
BROADWAY_REPLY_GRAB_POINTER);
|
||||
break;
|
||||
case BROADWAY_REQUEST_UNGRAB_POINTER:
|
||||
reply_ungrab_pointer.status =
|
||||
broadway_server_ungrab_pointer (server,
|
||||
request->ungrab_pointer.time_);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_ungrab_pointer, sizeof (reply_ungrab_pointer),
|
||||
BROADWAY_REPLY_UNGRAB_POINTER);
|
||||
break;
|
||||
default:
|
||||
g_warning ("Unknown request of type %d\n", request->base.type);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
client_fill_cb (GObject *source_object,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BroadwayClient *client = user_data;
|
||||
gssize res;
|
||||
|
||||
res = g_buffered_input_stream_fill_finish (client->in, result, NULL);
|
||||
|
||||
if (res > 0)
|
||||
{
|
||||
guint32 size;
|
||||
gsize count, remaining;
|
||||
guint8 *buffer;
|
||||
BroadwayRequest request;
|
||||
|
||||
buffer = (guint8 *)g_buffered_input_stream_peek_buffer (client->in, &count);
|
||||
|
||||
remaining = count;
|
||||
while (remaining >= sizeof (guint32))
|
||||
{
|
||||
memcpy (&size, buffer, sizeof (guint32));
|
||||
|
||||
if (size <= remaining)
|
||||
{
|
||||
g_assert (size >= sizeof (BroadwayRequestBase));
|
||||
g_assert (size <= sizeof (BroadwayRequest));
|
||||
|
||||
memcpy (&request, buffer, size);
|
||||
client_handle_request (client, &request);
|
||||
|
||||
remaining -= size;
|
||||
buffer += size;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is guaranteed not to block */
|
||||
g_input_stream_skip (G_INPUT_STREAM (client->in), count - remaining, NULL, NULL);
|
||||
|
||||
g_buffered_input_stream_fill_async (client->in,
|
||||
4*1024,
|
||||
0,
|
||||
NULL,
|
||||
client_fill_cb, client);
|
||||
}
|
||||
else
|
||||
{
|
||||
client_disconnected (client);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
incoming_client (GSocketService *service,
|
||||
GSocketConnection *connection,
|
||||
GObject *source_object)
|
||||
{
|
||||
BroadwayClient *client;
|
||||
GInputStream *input;
|
||||
|
||||
client = g_new0 (BroadwayClient, 1);
|
||||
client->id = client_id_count++;
|
||||
client->connection = g_object_ref (connection);
|
||||
|
||||
input = g_io_stream_get_input_stream (G_IO_STREAM (client->connection));
|
||||
client->in = (GBufferedInputStream *)g_buffered_input_stream_new (input);
|
||||
|
||||
clients = g_list_prepend (clients, client);
|
||||
|
||||
g_buffered_input_stream_fill_async (client->in,
|
||||
4*1024,
|
||||
0,
|
||||
NULL,
|
||||
client_fill_cb, client);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GError *error = NULL;
|
||||
GOptionContext *context;
|
||||
GMainLoop *loop;
|
||||
GSocketAddress *address;
|
||||
GSocketService *listener;
|
||||
char *path, *base;
|
||||
int http_port = 0;
|
||||
int display = 1;
|
||||
const GOptionEntry entries[] = {
|
||||
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
context = g_option_context_new ("[:DISPLAY] - broadway display daemon");
|
||||
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
|
||||
if (!g_option_context_parse (context, &argc, &argv, &error))
|
||||
{
|
||||
g_printerr ("option parsing failed: %s\n", error->message);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
if (*argv[1] != ':')
|
||||
{
|
||||
g_printerr ("Usage broadwayd [:DISPLAY]\n");
|
||||
exit (1);
|
||||
}
|
||||
display = strtol(argv[1]+1, NULL, 10);
|
||||
if (display == 0)
|
||||
{
|
||||
g_printerr ("Failed to parse display num %s\n", argv[1]);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
if (http_port == 0)
|
||||
http_port = 8080 + (display - 1);
|
||||
|
||||
server = broadway_server_new (http_port, &error);
|
||||
if (server == NULL)
|
||||
{
|
||||
g_printerr ("%s\n", error->message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
base = g_strdup_printf ("broadway%d.socket", display);
|
||||
path = g_build_filename (g_get_user_runtime_dir (), base, NULL);
|
||||
g_free (base);
|
||||
g_print ("Listening on %s\n", path);
|
||||
address = g_unix_socket_address_new_with_type (path, -1,
|
||||
G_UNIX_SOCKET_ADDRESS_ABSTRACT);
|
||||
g_free (path);
|
||||
|
||||
listener = g_socket_service_new ();
|
||||
if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
|
||||
address,
|
||||
G_SOCKET_TYPE_STREAM,
|
||||
G_SOCKET_PROTOCOL_DEFAULT,
|
||||
G_OBJECT (server),
|
||||
NULL,
|
||||
&error))
|
||||
{
|
||||
g_printerr ("Can't listen: %s\n", error->message);
|
||||
return 1;
|
||||
}
|
||||
g_object_unref (address);
|
||||
|
||||
g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL);
|
||||
|
||||
g_socket_service_start (G_SOCKET_SERVICE (listener));
|
||||
|
||||
loop = g_main_loop_new (NULL, FALSE);
|
||||
g_main_loop_run (loop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gsize
|
||||
get_event_size (int type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case BROADWAY_EVENT_ENTER:
|
||||
case BROADWAY_EVENT_LEAVE:
|
||||
return sizeof (BroadwayInputCrossingMsg);
|
||||
case BROADWAY_EVENT_POINTER_MOVE:
|
||||
return sizeof (BroadwayInputPointerMsg);
|
||||
case BROADWAY_EVENT_BUTTON_PRESS:
|
||||
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||
return sizeof (BroadwayInputButtonMsg);
|
||||
case BROADWAY_EVENT_SCROLL:
|
||||
return sizeof (BroadwayInputScrollMsg);
|
||||
case BROADWAY_EVENT_KEY_PRESS:
|
||||
case BROADWAY_EVENT_KEY_RELEASE:
|
||||
return sizeof (BroadwayInputKeyMsg);
|
||||
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||
return sizeof (BroadwayInputGrabReply);
|
||||
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||
return sizeof (BroadwayInputConfigureNotify);
|
||||
case BROADWAY_EVENT_DELETE_NOTIFY:
|
||||
return sizeof (BroadwayInputDeleteNotify);
|
||||
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
|
||||
return sizeof (BroadwayInputScreenResizeNotify);
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
broadway_events_got_input (BroadwayInputMsg *message,
|
||||
gint32 client_id)
|
||||
{
|
||||
GList *l;
|
||||
BroadwayReplyEvent reply_event;
|
||||
gsize size;
|
||||
|
||||
size = get_event_size (message->base.type);
|
||||
|
||||
reply_event.msg = *message;
|
||||
|
||||
for (l = clients; l != NULL; l = l->next)
|
||||
{
|
||||
BroadwayClient *client = l->data;
|
||||
|
||||
if (client_id == -1 ||
|
||||
client->id == client_id)
|
||||
{
|
||||
send_reply (client, NULL, (BroadwayReply *)&reply_event,
|
||||
sizeof (BroadwayReplyBase) + size,
|
||||
BROADWAY_REPLY_EVENT);
|
||||
}
|
||||
}
|
||||
}
|
688
gdk/broadway/gdkbroadway-server.c
Normal file
688
gdk/broadway/gdkbroadway-server.c
Normal file
@@ -0,0 +1,688 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "gdkbroadway-server.h"
|
||||
|
||||
#include "gdkprivate-broadway.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
typedef struct BroadwayInput BroadwayInput;
|
||||
|
||||
struct _GdkBroadwayServer {
|
||||
GObject parent_instance;
|
||||
|
||||
guint32 next_serial;
|
||||
GSocketConnection *connection;
|
||||
|
||||
guint32 recv_buffer_size;
|
||||
guint8 recv_buffer[1024];
|
||||
|
||||
guint process_input_idle;
|
||||
GList *incomming;
|
||||
|
||||
};
|
||||
|
||||
struct _GdkBroadwayServerClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
static gboolean input_available_cb (gpointer stream, gpointer user_data);
|
||||
|
||||
G_DEFINE_TYPE (GdkBroadwayServer, gdk_broadway_server, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
gdk_broadway_server_init (GdkBroadwayServer *server)
|
||||
{
|
||||
server->next_serial = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_server_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (gdk_broadway_server_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_server_class_init (GdkBroadwayServerClass * class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_broadway_server_finalize;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_lookahead_event (GdkBroadwayServer *server,
|
||||
const char *types)
|
||||
{
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gulong
|
||||
_gdk_broadway_server_get_next_serial (GdkBroadwayServer *server)
|
||||
{
|
||||
return (gulong)server->next_serial;
|
||||
}
|
||||
|
||||
GdkBroadwayServer *
|
||||
_gdk_broadway_server_new (int port, GError **error)
|
||||
{
|
||||
GdkBroadwayServer *server;
|
||||
char *basename;
|
||||
GSocketClient *client;
|
||||
GSocketConnection *connection;
|
||||
GSocketAddress *address;
|
||||
GPollableInputStream *pollable;
|
||||
GInputStream *in;
|
||||
GSource *source;
|
||||
char *path;
|
||||
|
||||
basename = g_strdup_printf ("broadway%d.socket", port);
|
||||
path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
|
||||
g_free (basename);
|
||||
|
||||
address = g_unix_socket_address_new_with_type (path, -1,
|
||||
G_UNIX_SOCKET_ADDRESS_ABSTRACT);
|
||||
g_free (path);
|
||||
|
||||
client = g_socket_client_new ();
|
||||
|
||||
error = NULL;
|
||||
connection = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (address), NULL, error);
|
||||
|
||||
g_object_unref (address);
|
||||
g_object_unref (client);
|
||||
|
||||
if (connection == NULL)
|
||||
return NULL;
|
||||
|
||||
server = g_object_new (GDK_TYPE_BROADWAY_SERVER, NULL);
|
||||
server->connection = connection;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
pollable = G_POLLABLE_INPUT_STREAM (in);
|
||||
|
||||
source = g_pollable_input_stream_create_source (pollable, NULL);
|
||||
g_source_attach (source, NULL);
|
||||
g_source_set_callback (source, (GSourceFunc)input_available_cb, server, NULL);
|
||||
|
||||
return server;
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_get_last_seen_time (GdkBroadwayServer *server)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static guint32
|
||||
gdk_broadway_server_send_message_with_size (GdkBroadwayServer *server, BroadwayRequestBase *base,
|
||||
gsize size, guint32 type)
|
||||
{
|
||||
GOutputStream *out;
|
||||
gsize written;
|
||||
|
||||
base->size = size;
|
||||
base->type = type;
|
||||
base->serial = server->next_serial++;
|
||||
|
||||
out = g_io_stream_get_output_stream (G_IO_STREAM (server->connection));
|
||||
|
||||
if (!g_output_stream_write_all (out, base, size, &written, NULL, NULL))
|
||||
{
|
||||
g_printerr ("Unable to write to server\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
g_assert (written == size);
|
||||
|
||||
return base->serial;
|
||||
}
|
||||
|
||||
#define gdk_broadway_server_send_message(_server, _msg, _type) \
|
||||
gdk_broadway_server_send_message_with_size(_server, (BroadwayRequestBase *)&_msg, sizeof (_msg), _type)
|
||||
|
||||
static void
|
||||
parse_all_input (GdkBroadwayServer *server)
|
||||
{
|
||||
guint8 *p, *end;
|
||||
guint32 size;
|
||||
BroadwayReply *reply;
|
||||
|
||||
p = server->recv_buffer;
|
||||
end = p + server->recv_buffer_size;
|
||||
|
||||
while (p + sizeof (guint32) <= end)
|
||||
{
|
||||
memcpy (&size, p, sizeof (guint32));
|
||||
if (p + size > end)
|
||||
break;
|
||||
|
||||
reply = g_memdup (p, size);
|
||||
p += size;
|
||||
|
||||
server->incomming = g_list_append (server->incomming, reply);
|
||||
}
|
||||
|
||||
if (p < end)
|
||||
memmove (server->recv_buffer, p, end - p);
|
||||
server->recv_buffer_size = end - p;
|
||||
}
|
||||
|
||||
static void
|
||||
read_some_input_blocking (GdkBroadwayServer *server)
|
||||
{
|
||||
GInputStream *in;
|
||||
gssize res;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
|
||||
g_assert (server->recv_buffer_size < sizeof (server->recv_buffer));
|
||||
res = g_input_stream_read (in, &server->recv_buffer[server->recv_buffer_size],
|
||||
sizeof (server->recv_buffer) - server->recv_buffer_size,
|
||||
NULL, NULL);
|
||||
|
||||
if (res <= 0)
|
||||
{
|
||||
g_printerr ("Unable to read from broadway server\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
server->recv_buffer_size += res;
|
||||
}
|
||||
|
||||
static void
|
||||
read_some_input_nonblocking (GdkBroadwayServer *server)
|
||||
{
|
||||
GInputStream *in;
|
||||
GPollableInputStream *pollable;
|
||||
gssize res;
|
||||
GError *error;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
pollable = G_POLLABLE_INPUT_STREAM (in);
|
||||
|
||||
g_assert (server->recv_buffer_size < sizeof (server->recv_buffer));
|
||||
error = NULL;
|
||||
res = g_pollable_input_stream_read_nonblocking (pollable, &server->recv_buffer[server->recv_buffer_size],
|
||||
sizeof (server->recv_buffer) - server->recv_buffer_size,
|
||||
NULL, &error);
|
||||
|
||||
if (res < 0 && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
|
||||
{
|
||||
g_error_free (error);
|
||||
res = 0;
|
||||
}
|
||||
else if (res <= 0)
|
||||
{
|
||||
g_printerr ("Unable to read from broadway server: %s\n", error ? error->message : "eof");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
server->recv_buffer_size += res;
|
||||
}
|
||||
|
||||
static BroadwayReply *
|
||||
find_response_by_serial (GdkBroadwayServer *server, guint32 serial)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = server->incomming; l != NULL; l = l->next)
|
||||
{
|
||||
BroadwayReply *reply = l->data;
|
||||
|
||||
if (reply->base.in_reply_to == serial)
|
||||
return reply;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
process_input_messages (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayReply *reply;
|
||||
|
||||
if (server->process_input_idle != 0)
|
||||
{
|
||||
g_source_remove (server->process_input_idle);
|
||||
server->process_input_idle = 0;
|
||||
}
|
||||
|
||||
while (server->incomming)
|
||||
{
|
||||
reply = server->incomming->data;
|
||||
server->incomming =
|
||||
g_list_delete_link (server->incomming,
|
||||
server->incomming);
|
||||
|
||||
if (reply->base.type == BROADWAY_REPLY_EVENT)
|
||||
_gdk_broadway_events_got_input (&reply->event.msg);
|
||||
else
|
||||
g_warning ("Unhandled reply type %d\n", reply->base.type);
|
||||
g_free (reply);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
process_input_idle_cb (GdkBroadwayServer *server)
|
||||
{
|
||||
server->process_input_idle = 0;
|
||||
process_input_messages (server);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_process_input_at_idle (GdkBroadwayServer *server)
|
||||
{
|
||||
if (server->process_input_idle == 0)
|
||||
server->process_input_idle =
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT, (GSourceFunc)process_input_idle_cb, server, NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
input_available_cb (gpointer stream, gpointer user_data)
|
||||
{
|
||||
GdkBroadwayServer *server = user_data;
|
||||
|
||||
read_some_input_nonblocking (server);
|
||||
parse_all_input (server);
|
||||
|
||||
process_input_messages (server);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static BroadwayReply *
|
||||
gdk_broadway_server_wait_for_reply (GdkBroadwayServer *server,
|
||||
guint32 serial)
|
||||
{
|
||||
BroadwayReply *reply;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
reply = find_response_by_serial (server, serial);
|
||||
if (reply)
|
||||
{
|
||||
server->incomming = g_list_remove (server->incomming, reply);
|
||||
return reply;
|
||||
}
|
||||
|
||||
read_some_input_blocking (server);
|
||||
parse_all_input (server);
|
||||
}
|
||||
|
||||
queue_process_input_at_idle (server);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_flush (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayRequestFlush msg;
|
||||
|
||||
gdk_broadway_server_send_message(server, msg, BROADWAY_REQUEST_FLUSH);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_sync (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayRequestSync msg;
|
||||
guint32 serial;
|
||||
BroadwayReply *reply;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SYNC);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_SYNC);
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_query_mouse (GdkBroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask)
|
||||
{
|
||||
BroadwayRequestQueryMouse msg;
|
||||
guint32 serial;
|
||||
BroadwayReply *reply;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_QUERY_MOUSE);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_QUERY_MOUSE);
|
||||
|
||||
if (toplevel)
|
||||
*toplevel = reply->query_mouse.toplevel;
|
||||
if (root_x)
|
||||
*root_x = reply->query_mouse.root_x;
|
||||
if (root_y)
|
||||
*root_y = reply->query_mouse.root_y;
|
||||
if (mask)
|
||||
*mask = reply->query_mouse.mask;
|
||||
|
||||
g_free (reply);
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_new_window (GdkBroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp)
|
||||
{
|
||||
BroadwayRequestNewWindow msg;
|
||||
guint32 serial, id;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.x = x;
|
||||
msg.y = y;
|
||||
msg.width = width;
|
||||
msg.height = height;
|
||||
msg.is_temp = is_temp;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_NEW_WINDOW);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_NEW_WINDOW);
|
||||
|
||||
id = reply->new_window.id;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_destroy_window (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestDestroyWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_DESTROY_WINDOW);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_show (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestShowWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SHOW_WINDOW);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_hide (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestHideWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_HIDE_WINDOW);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_window_set_transient_for (GdkBroadwayServer *server,
|
||||
gint id, gint parent)
|
||||
{
|
||||
BroadwayRequestSetTransientFor msg;
|
||||
|
||||
msg.id = id;
|
||||
msg.parent = parent;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SET_TRANSIENT_FOR);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_translate (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy)
|
||||
{
|
||||
BroadwayRequestTranslate *msg;
|
||||
cairo_rectangle_int_t rect;
|
||||
int i, n_rects;
|
||||
gsize msg_size;
|
||||
|
||||
n_rects = cairo_region_num_rectangles (area);
|
||||
|
||||
msg_size = sizeof (BroadwayRequestTranslate) + (n_rects-1) * sizeof (BroadwayRect);
|
||||
msg = g_malloc (msg_size);
|
||||
|
||||
msg->id = id;
|
||||
msg->dx = dx;
|
||||
msg->dy = dy;
|
||||
msg->n_rects = n_rects;
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_region_get_rectangle (area, i, &rect);
|
||||
msg->rects[i].x = rect.x;
|
||||
msg->rects[i].y = rect.y;
|
||||
msg->rects[i].width = rect.width;
|
||||
msg->rects[i].height = rect.height;
|
||||
}
|
||||
|
||||
gdk_broadway_server_send_message_with_size (server, (BroadwayRequestBase *)msg, msg_size,
|
||||
BROADWAY_REQUEST_TRANSLATE);
|
||||
g_free (msg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static char
|
||||
make_valid_fs_char (char c)
|
||||
{
|
||||
if (c == 0 || c == '/')
|
||||
return c + 1;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* name must have at least space for 34 bytes */
|
||||
static int
|
||||
create_random_shm (char *name)
|
||||
{
|
||||
guint32 r;
|
||||
int i, o, fd;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
o = 0;
|
||||
name[o++] = '/';
|
||||
for (i = 0; i < 32/4; i++)
|
||||
{
|
||||
r = g_random_int ();
|
||||
name[o++] = make_valid_fs_char ((r >> 0) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 8) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 16) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 24) & 0xff);
|
||||
}
|
||||
name[o++] = 0;
|
||||
|
||||
fd = shm_open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
|
||||
if (errno != EEXIST)
|
||||
{
|
||||
g_printerr ("Unable to allocate shared mem for window");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t gdk_broadway_shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
char name[34];
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} BroadwayShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_destroy (void *_data)
|
||||
{
|
||||
BroadwayShmSurfaceData *data = _data;
|
||||
|
||||
munmap (data->data, data->data_size);
|
||||
shm_unlink (data->name);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
_gdk_broadway_server_create_surface (int width,
|
||||
int height)
|
||||
{
|
||||
BroadwayShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
int res;
|
||||
int fd;
|
||||
|
||||
data = g_new (BroadwayShmSurfaceData, 1);
|
||||
data->data_size = width * height * sizeof (guint32);
|
||||
|
||||
fd = create_random_shm (data->name);
|
||||
|
||||
res = ftruncate (fd, data->data_size);
|
||||
g_assert (res != -1);
|
||||
|
||||
data->data = mmap(0, data->data_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24, width, height, width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &gdk_broadway_shm_cairo_key,
|
||||
data, shm_data_destroy);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_window_update (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface)
|
||||
{
|
||||
BroadwayRequestUpdate msg;
|
||||
BroadwayShmSurfaceData *data;
|
||||
|
||||
if (surface == NULL)
|
||||
return;
|
||||
|
||||
data = cairo_surface_get_user_data (surface, &gdk_broadway_shm_cairo_key);
|
||||
g_assert (data != NULL);
|
||||
|
||||
msg.id = id;
|
||||
memcpy (msg.name, data->name, 34);
|
||||
msg.width = cairo_image_surface_get_width (surface);
|
||||
msg.height = cairo_image_surface_get_height (surface);
|
||||
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_UPDATE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_move_resize (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
BroadwayRequestMoveResize msg;
|
||||
|
||||
msg.id = id;
|
||||
msg.x = x;
|
||||
msg.y = y;
|
||||
msg.width = width;
|
||||
msg.height = height;
|
||||
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_MOVE_RESIZE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GdkGrabStatus
|
||||
_gdk_broadway_server_grab_pointer (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_)
|
||||
{
|
||||
BroadwayRequestGrabPointer msg;
|
||||
guint32 serial, status;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.id = id;
|
||||
msg.owner_events = owner_events;
|
||||
msg.event_mask = event_mask;
|
||||
msg.time_ = time_;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_GRAB_POINTER);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_GRAB_POINTER);
|
||||
|
||||
status = reply->grab_pointer.status;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_ungrab_pointer (GdkBroadwayServer *server,
|
||||
guint32 time_)
|
||||
{
|
||||
BroadwayRequestUngrabPointer msg;
|
||||
guint32 serial, status;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.time_ = time_;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_UNGRAB_POINTER);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_UNGRAB_POINTER);
|
||||
|
||||
status = reply->ungrab_pointer.status;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return status;
|
||||
}
|
70
gdk/broadway/gdkbroadway-server.h
Normal file
70
gdk/broadway/gdkbroadway-server.h
Normal file
@@ -0,0 +1,70 @@
|
||||
#ifndef __GDK_BROADWAY_SERVER__
|
||||
#define __GDK_BROADWAY_SERVER__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include "broadway-protocol.h"
|
||||
|
||||
typedef struct _GdkBroadwayServer GdkBroadwayServer;
|
||||
typedef struct _GdkBroadwayServerClass GdkBroadwayServerClass;
|
||||
|
||||
#define GDK_TYPE_BROADWAY_SERVER (gdk_broadway_server_get_type())
|
||||
#define GDK_BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServer))
|
||||
#define GDK_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass))
|
||||
#define GDK_IS_BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_BROADWAY_SERVER))
|
||||
#define GDK_IS_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_SERVER))
|
||||
#define GDK_BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass))
|
||||
|
||||
GdkBroadwayServer *_gdk_broadway_server_new (int port,
|
||||
GError **error);
|
||||
void _gdk_broadway_server_flush (GdkBroadwayServer *server);
|
||||
void _gdk_broadway_server_sync (GdkBroadwayServer *server);
|
||||
gulong _gdk_broadway_server_get_next_serial (GdkBroadwayServer *server);
|
||||
guint32 _gdk_broadway_server_get_last_seen_time (GdkBroadwayServer *server);
|
||||
gboolean _gdk_broadway_server_lookahead_event (GdkBroadwayServer *server,
|
||||
const char *types);
|
||||
void _gdk_broadway_server_query_mouse (GdkBroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask);
|
||||
GdkGrabStatus _gdk_broadway_server_grab_pointer (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_);
|
||||
guint32 _gdk_broadway_server_ungrab_pointer (GdkBroadwayServer *server,
|
||||
guint32 time_);
|
||||
gint32 _gdk_broadway_server_get_mouse_toplevel (GdkBroadwayServer *server);
|
||||
guint32 _gdk_broadway_server_new_window (GdkBroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp);
|
||||
void _gdk_broadway_server_destroy_window (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
gboolean _gdk_broadway_server_window_show (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
gboolean _gdk_broadway_server_window_hide (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
void _gdk_broadway_server_window_set_transient_for (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gint parent);
|
||||
gboolean _gdk_broadway_server_window_translate (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy);
|
||||
cairo_surface_t *_gdk_broadway_server_create_surface (int width,
|
||||
int height);
|
||||
void _gdk_broadway_server_window_update (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface);
|
||||
gboolean _gdk_broadway_server_window_move_resize (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
#endif /* __GDK_BROADWAY_SERVER__ */
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_BROADWAY_CURSOR_H__
|
||||
#define __GDK_BROADWAY_CURSOR_H__
|
||||
|
||||
#if !defined (__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_BROADWAY_CURSOR_H__
|
||||
#define __GDK_BROADWAY_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
#define __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined(__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
#define __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -156,7 +156,10 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
GdkDisplay *display;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
GdkScreen *screen;
|
||||
gint device_root_x, device_root_y;
|
||||
gint32 device_root_x, device_root_y;
|
||||
gint32 mouse_toplevel_id;
|
||||
GdkWindow *mouse_toplevel;
|
||||
guint32 mask32;
|
||||
|
||||
if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
|
||||
return;
|
||||
@@ -173,36 +176,12 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
*root_window = gdk_screen_get_root_window (screen);
|
||||
}
|
||||
|
||||
if (broadway_display->output)
|
||||
{
|
||||
_gdk_broadway_display_consume_all_input (display);
|
||||
if (root_x)
|
||||
*root_x = broadway_display->future_root_x;
|
||||
if (root_y)
|
||||
*root_y = broadway_display->future_root_y;
|
||||
/* TODO: Should really use future_x/y when we get configure events */
|
||||
if (win_x)
|
||||
*win_x = broadway_display->future_root_x - toplevel->x;
|
||||
if (win_y)
|
||||
*win_y = broadway_display->future_root_y - toplevel->y;
|
||||
if (mask)
|
||||
*mask = broadway_display->future_state;
|
||||
if (child_window)
|
||||
{
|
||||
if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
|
||||
*child_window =
|
||||
g_hash_table_lookup (broadway_display->id_ht,
|
||||
GINT_TO_POINTER (broadway_display->future_mouse_in_toplevel));
|
||||
else
|
||||
*child_window = toplevel; /* No native children */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Fallback when unconnected */
|
||||
|
||||
device_root_x = broadway_display->last_x;
|
||||
device_root_y = broadway_display->last_y;
|
||||
_gdk_broadway_server_query_mouse (broadway_display->server,
|
||||
&mouse_toplevel_id,
|
||||
&device_root_x,
|
||||
&device_root_y,
|
||||
&mask32);
|
||||
mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (mouse_toplevel_id));
|
||||
|
||||
if (root_x)
|
||||
*root_x = device_root_x;
|
||||
@@ -213,12 +192,12 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
if (win_y)
|
||||
*win_y = device_root_y - toplevel->y;
|
||||
if (mask)
|
||||
*mask = broadway_display->last_state;
|
||||
*mask = mask32;
|
||||
if (child_window)
|
||||
{
|
||||
if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
|
||||
{
|
||||
*child_window = broadway_display->mouse_in_toplevel;
|
||||
*child_window = mouse_toplevel;
|
||||
if (*child_window == NULL)
|
||||
*child_window = toplevel;
|
||||
}
|
||||
@@ -236,13 +215,10 @@ void
|
||||
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||
{
|
||||
GdkDisplay *display = gdk_window_get_display (window);
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
GdkDeviceManager *device_manager;
|
||||
GdkDeviceGrabInfo *grab;
|
||||
GList *devices, *d;
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
|
||||
/* Get all devices */
|
||||
@@ -257,8 +233,6 @@ _gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
grab->implicit_ungrab = TRUE;
|
||||
|
||||
broadway_display->pointer_grab_window = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -290,29 +264,11 @@ gdk_broadway_device_grab (GdkDevice *device,
|
||||
else
|
||||
{
|
||||
/* Device is a pointer */
|
||||
|
||||
if (broadway_display->pointer_grab_window != NULL &&
|
||||
time_ != 0 && broadway_display->pointer_grab_time > time_)
|
||||
return GDK_GRAB_ALREADY_GRABBED;
|
||||
|
||||
if (time_ == 0)
|
||||
time_ = broadway_display->last_seen_time;
|
||||
|
||||
broadway_display->pointer_grab_window = window;
|
||||
broadway_display->pointer_grab_owner_events = owner_events;
|
||||
broadway_display->pointer_grab_time = time_;
|
||||
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_grab_pointer (broadway_display->output,
|
||||
GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
|
||||
owner_events);
|
||||
gdk_display_flush (display);
|
||||
}
|
||||
|
||||
/* TODO: What about toplevel grab events if we're not connected? */
|
||||
|
||||
return GDK_GRAB_SUCCESS;
|
||||
return _gdk_broadway_server_grab_pointer (broadway_display->server,
|
||||
GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
|
||||
owner_events,
|
||||
event_mask,
|
||||
time_);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -340,31 +296,17 @@ gdk_broadway_device_ungrab (GdkDevice *device,
|
||||
else
|
||||
{
|
||||
/* Device is a pointer */
|
||||
serial = _gdk_broadway_server_ungrab_pointer (broadway_display->server, time_);
|
||||
|
||||
if (broadway_display->pointer_grab_window != NULL &&
|
||||
time_ != 0 && broadway_display->pointer_grab_time > time_)
|
||||
return;
|
||||
|
||||
/* TODO: What about toplevel grab events if we're not connected? */
|
||||
|
||||
if (broadway_display->output)
|
||||
if (serial != 0)
|
||||
{
|
||||
serial = broadway_output_ungrab_pointer (broadway_display->output);
|
||||
gdk_display_flush (display);
|
||||
grab = _gdk_display_get_last_device_grab (display, device);
|
||||
if (grab &&
|
||||
(time_ == GDK_CURRENT_TIME ||
|
||||
grab->time == GDK_CURRENT_TIME ||
|
||||
!TIME_IS_LATER (grab->time, time_)))
|
||||
grab->serial_end = serial;
|
||||
}
|
||||
else
|
||||
{
|
||||
serial = broadway_display->saved_serial;
|
||||
}
|
||||
|
||||
grab = _gdk_display_get_last_device_grab (display, device);
|
||||
if (grab &&
|
||||
(time_ == GDK_CURRENT_TIME ||
|
||||
grab->time == GDK_CURRENT_TIME ||
|
||||
!TIME_IS_LATER (grab->time, time_)))
|
||||
grab->serial_end = serial;
|
||||
|
||||
broadway_display->pointer_grab_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -375,7 +317,6 @@ gdk_broadway_device_window_at_position (GdkDevice *device,
|
||||
GdkModifierType *mask,
|
||||
gboolean get_toplevel)
|
||||
{
|
||||
gboolean res;
|
||||
GdkScreen *screen;
|
||||
GdkWindow *root_window;
|
||||
GdkWindow *window;
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,7 @@
|
||||
#include "gdkwindow.h"
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkmain.h"
|
||||
#include "broadway.h"
|
||||
#include "gdkbroadway-server.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -43,82 +43,6 @@ typedef struct BroadwayInput BroadwayInput;
|
||||
#define GDK_IS_BROADWAY_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_DISPLAY))
|
||||
#define GDK_BROADWAY_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplayClass))
|
||||
|
||||
typedef struct {
|
||||
char type;
|
||||
guint32 serial;
|
||||
guint64 time;
|
||||
} BroadwayInputBaseMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 event_window_id;
|
||||
int root_x;
|
||||
int root_y;
|
||||
int win_x;
|
||||
int win_y;
|
||||
guint32 state;
|
||||
} BroadwayInputPointerMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 mode;
|
||||
} BroadwayInputCrossingMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 button;
|
||||
} BroadwayInputButtonMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
int dir;
|
||||
} BroadwayInputScrollMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 state;
|
||||
int key;
|
||||
} BroadwayInputKeyMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int res;
|
||||
} BroadwayInputGrabReply;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int id;
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
} BroadwayInputConfigureNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int width;
|
||||
int height;
|
||||
} BroadwayInputScreenResizeNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int id;
|
||||
} BroadwayInputDeleteNotify;
|
||||
|
||||
typedef union {
|
||||
BroadwayInputBaseMsg base;
|
||||
BroadwayInputPointerMsg pointer;
|
||||
BroadwayInputCrossingMsg crossing;
|
||||
BroadwayInputButtonMsg button;
|
||||
BroadwayInputScrollMsg scroll;
|
||||
BroadwayInputKeyMsg key;
|
||||
BroadwayInputGrabReply grab_reply;
|
||||
BroadwayInputConfigureNotify configure_notify;
|
||||
BroadwayInputDeleteNotify delete_notify;
|
||||
BroadwayInputScreenResizeNotify screen_resize_notify;
|
||||
} BroadwayInputMsg;
|
||||
|
||||
struct _GdkBroadwayDisplay
|
||||
{
|
||||
GdkDisplay parent_instance;
|
||||
@@ -129,10 +53,6 @@ struct _GdkBroadwayDisplay
|
||||
GList *toplevels;
|
||||
|
||||
GSource *event_source;
|
||||
GdkWindow *mouse_in_toplevel;
|
||||
int last_x, last_y; /* in root coords */
|
||||
guint32 last_state;
|
||||
GdkWindow *real_mouse_in_toplevel; /* Not affected by grabs */
|
||||
|
||||
/* Keyboard related information */
|
||||
GdkKeymap *keymap;
|
||||
@@ -147,24 +67,7 @@ struct _GdkBroadwayDisplay
|
||||
/* The offscreen window that has the pointer in it (if any) */
|
||||
GdkWindow *active_offscreen_window;
|
||||
|
||||
GSocketService *service;
|
||||
BroadwayOutput *output;
|
||||
guint32 saved_serial;
|
||||
guint64 last_seen_time;
|
||||
BroadwayInput *input;
|
||||
GList *input_messages;
|
||||
guint process_input_idle;
|
||||
|
||||
/* Explicit pointer grabs: */
|
||||
GdkWindow *pointer_grab_window;
|
||||
guint32 pointer_grab_time;
|
||||
gboolean pointer_grab_owner_events;
|
||||
|
||||
/* Future data, from the currently queued events */
|
||||
int future_root_x;
|
||||
int future_root_y;
|
||||
GdkModifierType future_state;
|
||||
int future_mouse_in_toplevel;
|
||||
GdkBroadwayServer *server;
|
||||
};
|
||||
|
||||
struct _GdkBroadwayDisplayClass
|
||||
|
@@ -87,9 +87,9 @@ gdk_event_source_check (GSource *source)
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
BroadwayInputMsg *message)
|
||||
_gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
{
|
||||
GdkDisplay *display = gdk_display_get_default ();
|
||||
GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
|
||||
GdkScreen *screen;
|
||||
GdkWindow *window;
|
||||
@@ -97,17 +97,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
GList *node;
|
||||
|
||||
switch (message->base.type) {
|
||||
case 'e': /* Enter */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
case BROADWAY_EVENT_ENTER:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
|
||||
/* TODO: Unset when it dies */
|
||||
display_broadway->mouse_in_toplevel = window;
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (GDK_ENTER_NOTIFY);
|
||||
@@ -134,16 +125,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
break;
|
||||
case 'l': /* Leave */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
case BROADWAY_EVENT_LEAVE:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
|
||||
display_broadway->mouse_in_toplevel = NULL;
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (GDK_LEAVE_NOTIFY);
|
||||
@@ -170,13 +153,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
break;
|
||||
case 'm': /* Mouse move */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
case BROADWAY_EVENT_POINTER_MOVE:
|
||||
if (_gdk_broadway_moveresize_handle_event (display, message))
|
||||
break;
|
||||
|
||||
@@ -198,14 +175,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
}
|
||||
|
||||
break;
|
||||
case 'b':
|
||||
case 'B':
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
case BROADWAY_EVENT_BUTTON_PRESS:
|
||||
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||
if (message->base.type != 'b' &&
|
||||
_gdk_broadway_moveresize_handle_event (display, message))
|
||||
break;
|
||||
@@ -229,13 +200,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
}
|
||||
|
||||
break;
|
||||
case 's':
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
case BROADWAY_EVENT_SCROLL:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
if (window)
|
||||
{
|
||||
@@ -254,10 +219,10 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
}
|
||||
|
||||
break;
|
||||
case 'k':
|
||||
case 'K':
|
||||
window = display_broadway->mouse_in_toplevel;
|
||||
|
||||
case BROADWAY_EVENT_KEY_PRESS:
|
||||
case BROADWAY_EVENT_KEY_RELEASE:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht,
|
||||
GINT_TO_POINTER (message->key.mouse_window_id));
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (message->base.type == 'k' ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
|
||||
@@ -269,19 +234,17 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
event->key.length = 0;
|
||||
gdk_event_set_device (event, display->core_pointer);
|
||||
|
||||
display_broadway->last_state = message->key.state;
|
||||
|
||||
node = _gdk_event_queue_append (display, event);
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
|
||||
break;
|
||||
case 'g':
|
||||
case 'u':
|
||||
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
|
||||
break;
|
||||
|
||||
case 'w':
|
||||
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->configure_notify.id));
|
||||
if (window)
|
||||
{
|
||||
@@ -312,7 +275,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
}
|
||||
break;
|
||||
|
||||
case 'W':
|
||||
case BROADWAY_EVENT_DELETE_NOTIFY:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->delete_notify.id));
|
||||
if (window)
|
||||
{
|
||||
@@ -324,7 +287,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
}
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
|
||||
screen = gdk_display_get_default_screen (display);
|
||||
window = gdk_screen_get_root_window (screen);
|
||||
window->width = message->screen_resize_notify.width;
|
||||
@@ -335,7 +298,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
break;
|
||||
|
||||
default:
|
||||
g_printerr ("Unknown input command %c\n", message->base.type);
|
||||
g_printerr ("_gdk_broadway_events_got_input - Unknown input command %c\n", message->base.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -126,8 +126,7 @@ GList *_gdk_broadway_screen_list_visuals (GdkScreen *screen);
|
||||
void _gdk_broadway_screen_size_changed (GdkScreen *screen,
|
||||
BroadwayInputScreenResizeNotify *msg);
|
||||
|
||||
void _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
BroadwayInputMsg *message);
|
||||
void _gdk_broadway_events_got_input (BroadwayInputMsg *message);
|
||||
|
||||
void _gdk_broadway_screen_init_root_window (GdkScreen *screen);
|
||||
void _gdk_broadway_screen_init_visuals (GdkScreen *screen);
|
||||
|
@@ -83,95 +83,17 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
|
||||
gdk_window_impl_broadway,
|
||||
GDK_TYPE_WINDOW_IMPL)
|
||||
|
||||
static void
|
||||
diff_surfaces (cairo_surface_t *surface,
|
||||
cairo_surface_t *old_surface)
|
||||
{
|
||||
guint8 *data, *old_data;
|
||||
guint32 *line, *old_line;
|
||||
int w, h, stride, old_stride;
|
||||
int x, y;
|
||||
|
||||
data = cairo_image_surface_get_data (surface);
|
||||
old_data = cairo_image_surface_get_data (old_surface);
|
||||
|
||||
w = cairo_image_surface_get_width (surface);
|
||||
h = cairo_image_surface_get_height (surface);
|
||||
|
||||
stride = cairo_image_surface_get_stride (surface);
|
||||
old_stride = cairo_image_surface_get_stride (old_surface);
|
||||
|
||||
for (y = 0; y < h; y++)
|
||||
{
|
||||
line = (guint32 *)data;
|
||||
old_line = (guint32 *)old_data;
|
||||
|
||||
for (x = 0; x < w; x++)
|
||||
{
|
||||
if ((*line & 0xffffff) == (*old_line & 0xffffff))
|
||||
*old_line = 0;
|
||||
else
|
||||
*old_line = *line | 0xff000000;
|
||||
line ++;
|
||||
old_line ++;
|
||||
}
|
||||
|
||||
data += stride;
|
||||
old_data += old_stride;
|
||||
}
|
||||
}
|
||||
|
||||
static guint dirty_flush_id = 0;
|
||||
|
||||
static void
|
||||
window_data_send (BroadwayOutput *output, GdkWindowImplBroadway *impl)
|
||||
{
|
||||
cairo_t *cr;
|
||||
|
||||
if (impl->surface == NULL)
|
||||
return;
|
||||
|
||||
if (impl->last_synced)
|
||||
{
|
||||
diff_surfaces (impl->surface,
|
||||
impl->last_surface);
|
||||
broadway_output_put_rgba (output, impl->id, 0, 0,
|
||||
cairo_image_surface_get_width (impl->last_surface),
|
||||
cairo_image_surface_get_height (impl->last_surface),
|
||||
cairo_image_surface_get_stride (impl->last_surface),
|
||||
cairo_image_surface_get_data (impl->last_surface));
|
||||
}
|
||||
else
|
||||
{
|
||||
impl->last_synced = TRUE;
|
||||
broadway_output_put_rgb (output, impl->id, 0, 0,
|
||||
cairo_image_surface_get_width (impl->surface),
|
||||
cairo_image_surface_get_height (impl->surface),
|
||||
cairo_image_surface_get_stride (impl->surface),
|
||||
cairo_image_surface_get_data (impl->surface));
|
||||
}
|
||||
|
||||
broadway_output_surface_flush (output, impl->id);
|
||||
|
||||
cr = cairo_create (impl->last_surface);
|
||||
cairo_set_source_surface (cr, impl->surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dirty_flush_idle (gpointer data)
|
||||
{
|
||||
GList *l;
|
||||
GdkBroadwayDisplay *display;
|
||||
BroadwayOutput *output;
|
||||
|
||||
dirty_flush_id = 0;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
|
||||
output = display->output;
|
||||
if (output == NULL)
|
||||
return FALSE;
|
||||
|
||||
for (l = display->toplevels; l != NULL; l = l->next)
|
||||
{
|
||||
@@ -180,11 +102,15 @@ dirty_flush_idle (gpointer data)
|
||||
if (impl->dirty)
|
||||
{
|
||||
impl->dirty = FALSE;
|
||||
window_data_send (display->output, impl);
|
||||
_gdk_broadway_server_window_update (display->server,
|
||||
impl->id,
|
||||
impl->surface);
|
||||
}
|
||||
}
|
||||
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
/* We sync here to ensure all references to the impl->surface memory
|
||||
is done, as we may later paint new data in them. */
|
||||
gdk_display_sync (GDK_DISPLAY (display));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -192,64 +118,10 @@ dirty_flush_idle (gpointer data)
|
||||
static void
|
||||
queue_dirty_flush (GdkBroadwayDisplay *display)
|
||||
{
|
||||
if (dirty_flush_id == 0 && display->output != NULL)
|
||||
if (dirty_flush_id == 0)
|
||||
dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_resync_windows (void)
|
||||
{
|
||||
GdkBroadwayDisplay *display;
|
||||
GList *l;
|
||||
|
||||
dirty_flush_id = 0;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
|
||||
|
||||
/* First create all windows */
|
||||
for (l = display->toplevels; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = l->data;
|
||||
GdkWindow *window;
|
||||
|
||||
window = impl->wrapper;
|
||||
|
||||
if (impl->id == 0)
|
||||
continue; /* Skip root */
|
||||
|
||||
impl->dirty = FALSE;
|
||||
impl->last_synced = FALSE;
|
||||
broadway_output_new_surface (display->output,
|
||||
impl->id,
|
||||
window->x,
|
||||
window->y,
|
||||
window->width,
|
||||
window->height,
|
||||
window->window_type == GDK_WINDOW_TEMP);
|
||||
}
|
||||
|
||||
/* Then do everything that may reference other windows */
|
||||
for (l = display->toplevels; l != NULL; l = l->next)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = l->data;
|
||||
|
||||
if (impl->id == 0)
|
||||
continue; /* Skip root */
|
||||
|
||||
if (impl->transient_for)
|
||||
broadway_output_set_transient_for (display->output, impl->id, impl->transient_for);
|
||||
/* Can't check GDK_WINDOW_IS_MAPPED here, because that doesn't correctly handle
|
||||
withdrawn windows like menus */
|
||||
if (impl->visible)
|
||||
{
|
||||
broadway_output_show_surface (display->output, impl->id);
|
||||
window_data_send (display->output, impl);
|
||||
}
|
||||
}
|
||||
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
|
||||
{
|
||||
@@ -275,12 +147,6 @@ gdk_window_impl_broadway_finalize (GObject *object)
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
||||
|
||||
if (broadway_display->mouse_in_toplevel == GDK_WINDOW (wrapper))
|
||||
{
|
||||
/* TODO: Send leave + enter event, update cursors, etc */
|
||||
broadway_display->mouse_in_toplevel = NULL;
|
||||
}
|
||||
|
||||
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||
|
||||
if (impl->cursor)
|
||||
@@ -315,6 +181,7 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen)
|
||||
|
||||
impl->screen = screen;
|
||||
impl->wrapper = window;
|
||||
impl->id = 0;
|
||||
|
||||
window->window_type = GDK_WINDOW_ROOT;
|
||||
window->depth = 24;
|
||||
@@ -341,13 +208,17 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
{
|
||||
GdkWindowImplBroadway *impl;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
static int current_id = 1; /* 0 is the root window */
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
|
||||
impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
|
||||
window->impl = (GdkWindowImpl *)impl;
|
||||
impl->id = current_id++;
|
||||
impl->id = _gdk_broadway_server_new_window (broadway_display->server,
|
||||
window->x,
|
||||
window->y,
|
||||
window->width,
|
||||
window->height,
|
||||
window->window_type == GDK_WINDOW_TEMP);
|
||||
g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), window);
|
||||
impl->wrapper = window;
|
||||
|
||||
@@ -358,37 +229,22 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
|
||||
|
||||
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
|
||||
|
||||
if (broadway_display->output)
|
||||
broadway_output_new_surface (broadway_display->output,
|
||||
impl->id,
|
||||
window->x,
|
||||
window->y,
|
||||
window->width,
|
||||
window->height,
|
||||
window->window_type == GDK_WINDOW_TEMP);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_window_resize_surface (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
cairo_surface_t *old, *last_old;
|
||||
cairo_surface_t *old;
|
||||
|
||||
if (impl->surface)
|
||||
{
|
||||
old = impl->surface;
|
||||
last_old = impl->last_surface;
|
||||
|
||||
impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
||||
gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
||||
gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
impl->surface = _gdk_broadway_server_create_surface (gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
|
||||
cairo_surface_destroy (old);
|
||||
cairo_surface_destroy (last_old);
|
||||
}
|
||||
|
||||
if (impl->ref_surface)
|
||||
@@ -413,7 +269,6 @@ static cairo_surface_t *
|
||||
gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
cairo_t *cr;
|
||||
int w, h;
|
||||
|
||||
if (GDK_IS_WINDOW_IMPL_BROADWAY (window) &&
|
||||
@@ -425,22 +280,7 @@ gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
||||
|
||||
/* Create actual backing store if missing */
|
||||
if (!impl->surface)
|
||||
{
|
||||
impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
|
||||
impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h);
|
||||
|
||||
cr = cairo_create (impl->surface);
|
||||
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
|
||||
cairo_rectangle (cr, 0, 0, w, h);
|
||||
cairo_fill (cr);
|
||||
cairo_destroy (cr);
|
||||
|
||||
cr = cairo_create (impl->last_surface);
|
||||
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
|
||||
cairo_rectangle (cr, 0, 0, w, h);
|
||||
cairo_fill (cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
impl->surface = _gdk_broadway_server_create_surface (w, h);
|
||||
|
||||
/* Create a destroyable surface referencing the real one */
|
||||
if (!impl->ref_surface)
|
||||
@@ -485,16 +325,13 @@ _gdk_broadway_window_destroy (GdkWindow *window,
|
||||
{
|
||||
cairo_surface_destroy (impl->surface);
|
||||
impl->surface = NULL;
|
||||
cairo_surface_destroy (impl->last_surface);
|
||||
impl->last_surface = NULL;
|
||||
}
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||
|
||||
if (broadway_display->output)
|
||||
broadway_output_destroy_surface (broadway_display->output,
|
||||
impl->id);
|
||||
_gdk_broadway_server_destroy_window (broadway_display->server,
|
||||
impl->id);
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
@@ -546,11 +383,9 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
|
||||
_gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_show_surface (broadway_display->output, impl->id);
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
if (_gdk_broadway_server_window_show (broadway_display->server, impl->id))
|
||||
queue_dirty_flush (broadway_display);
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -569,17 +404,8 @@ gdk_window_broadway_hide (GdkWindow *window)
|
||||
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_hide_surface (broadway_display->output, impl->id);
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
|
||||
if (broadway_display->mouse_in_toplevel == window)
|
||||
{
|
||||
/* TODO: Send leave + enter event, update cursors, etc */
|
||||
broadway_display->mouse_in_toplevel = NULL;
|
||||
}
|
||||
if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
|
||||
queue_dirty_flush (broadway_display);
|
||||
|
||||
_gdk_window_clear_update_area (window);
|
||||
}
|
||||
@@ -601,7 +427,6 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
gboolean changed, size_changed;;
|
||||
gboolean with_resize;
|
||||
|
||||
size_changed = changed = FALSE;
|
||||
|
||||
@@ -613,10 +438,8 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
window->y = y;
|
||||
}
|
||||
|
||||
with_resize = FALSE;
|
||||
if (width > 0 || height > 0)
|
||||
{
|
||||
with_resize = TRUE;
|
||||
if (width < 1)
|
||||
width = 1;
|
||||
|
||||
@@ -644,12 +467,11 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
GdkEvent *event;
|
||||
GList *node;
|
||||
|
||||
if (broadway_display->output != NULL)
|
||||
if (_gdk_broadway_server_window_move_resize (broadway_display->server,
|
||||
impl->id,
|
||||
window->x, window->y,
|
||||
window->width, window->height))
|
||||
{
|
||||
broadway_output_move_resize_surface (broadway_display->output,
|
||||
impl->id,
|
||||
with_move, window->x, window->y,
|
||||
with_resize, window->width, window->height);
|
||||
queue_dirty_flush (broadway_display);
|
||||
if (size_changed)
|
||||
window->resize_count++;
|
||||
@@ -787,11 +609,7 @@ gdk_broadway_window_set_transient_for (GdkWindow *window,
|
||||
impl->transient_for = parent_id;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
||||
if (display->output)
|
||||
{
|
||||
broadway_output_set_transient_for (display->output, impl->id, impl->transient_for);
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
}
|
||||
_gdk_broadway_server_window_set_transient_for (display->server, impl->id, impl->transient_for);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1324,20 +1142,10 @@ moveresize_lookahead (GdkDisplay *display,
|
||||
BroadwayInputMsg *event)
|
||||
{
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
BroadwayInputMsg *message;
|
||||
GList *l;
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
for (l = broadway_display->input_messages; l != NULL; l = l->next)
|
||||
{
|
||||
message = l->data;
|
||||
if (message->base.type == 'm')
|
||||
return FALSE;
|
||||
if (message->base.type == 'b')
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return !_gdk_broadway_server_lookahead_event (broadway_display->server, "mb");
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -1480,8 +1288,6 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
||||
|
||||
/* We need a connection to be able to get mouse events, if not, punt */
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (!broadway_display->output)
|
||||
return;
|
||||
|
||||
mv_resize = get_move_resize_data (GDK_WINDOW_DISPLAY (window), TRUE);
|
||||
|
||||
@@ -1622,9 +1428,6 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
||||
{
|
||||
GdkWindowImplBroadway *impl;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
int n_rects, i;
|
||||
BroadwayRect *rects;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
|
||||
@@ -1632,26 +1435,11 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
||||
{
|
||||
copy_region (impl->surface, area, dx, dy);
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced &&
|
||||
broadway_display->output)
|
||||
{
|
||||
copy_region (impl->last_surface, area, dx, dy);
|
||||
n_rects = cairo_region_num_rectangles (area);
|
||||
rects = g_new (BroadwayRect, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_region_get_rectangle (area, i, &rect);
|
||||
rects[i].x = rect.x;
|
||||
rects[i].y = rect.y;
|
||||
rects[i].width = rect.width;
|
||||
rects[i].height = rect.height;
|
||||
}
|
||||
broadway_output_copy_rectangles (broadway_display->output,
|
||||
GDK_WINDOW_IMPL_BROADWAY (impl)->id,
|
||||
rects, n_rects, dx, dy);
|
||||
queue_dirty_flush (broadway_display);
|
||||
g_free (rects);
|
||||
}
|
||||
|
||||
if (_gdk_broadway_server_window_translate (broadway_display->server,
|
||||
impl->id,
|
||||
area, dx, dy))
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1661,8 +1449,7 @@ gdk_broadway_get_last_seen_time (GdkWindow *window)
|
||||
GdkDisplay *display;
|
||||
|
||||
display = gdk_window_get_display (window);
|
||||
_gdk_broadway_display_consume_all_input (display);
|
||||
return (guint32) GDK_BROADWAY_DISPLAY (display)->last_seen_time;
|
||||
return _gdk_broadway_server_get_last_seen_time (GDK_BROADWAY_DISPLAY (display)->server);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -18,13 +18,13 @@
|
||||
* Author: Alexander Larsson <alexl@redhat.com>
|
||||
*/
|
||||
|
||||
#ifndef __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_CAIRO_H__
|
||||
#define __GDK_CAIRO_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_CAIRO_H__
|
||||
#define __GDK_CAIRO_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdkcolor.h>
|
||||
#include <gdk/gdkrgba.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_COLOR_H__
|
||||
#define __GDK_COLOR_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_COLOR_H__
|
||||
#define __GDK_COLOR_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_CURSOR_H__
|
||||
#define __GDK_CURSOR_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_CURSOR_H__
|
||||
#define __GDK_CURSOR_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DEVICE_H__
|
||||
#define __GDK_DEVICE_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DEVICE_H__
|
||||
#define __GDK_DEVICE_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DEVICE_MANAGER_H__
|
||||
#define __GDK_DEVICE_MANAGER_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DEVICE_MANAGER_H__
|
||||
#define __GDK_DEVICE_MANAGER_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdevice.h>
|
||||
|
||||
|
@@ -19,13 +19,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DISPLAY_H__
|
||||
#define __GDK_DISPLAY_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DISPLAY_H__
|
||||
#define __GDK_DISPLAY_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkevents.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DISPLAY_MANAGER_H__
|
||||
#define __GDK_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DISPLAY_MANAGER_H__
|
||||
#define __GDK_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdisplay.h>
|
||||
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DND_H__
|
||||
#define __GDK_DND_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DND_H__
|
||||
#define __GDK_DND_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdevice.h>
|
||||
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_EVENTS_H__
|
||||
#define __GDK_EVENTS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_EVENTS_H__
|
||||
#define __GDK_EVENTS_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdkcolor.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_KEYS_H__
|
||||
#define __GDK_KEYS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_KEYS_H__
|
||||
#define __GDK_KEYS_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_MAIN_H__
|
||||
#define __GDK_MAIN_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_MAIN_H__
|
||||
#define __GDK_MAIN_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PANGO_H__
|
||||
#define __GDK_PANGO_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PANGO_H__
|
||||
#define __GDK_PANGO_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PIXBUF_H__
|
||||
#define __GDK_PIXBUF_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PIXBUF_H__
|
||||
#define __GDK_PIXBUF_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PROPERTY_H__
|
||||
#define __GDK_PROPERTY_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PROPERTY_H__
|
||||
#define __GDK_PROPERTY_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_RECTANGLE_H__
|
||||
#define __GDK_RECTANGLE_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_RECTANGLE_H__
|
||||
#define __GDK_RECTANGLE_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_RGBA_H__
|
||||
#define __GDK_RGBA_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_RGBA_H__
|
||||
#define __GDK_RGBA_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -19,13 +19,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_SCREEN_H__
|
||||
#define __GDK_SCREEN_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_SCREEN_H__
|
||||
#define __GDK_SCREEN_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_SELECTION_H__
|
||||
#define __GDK_SELECTION_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_SELECTION_H__
|
||||
#define __GDK_SELECTION_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -16,13 +16,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_TEST_UTILS_H__
|
||||
#define __GDK_TEST_UTILS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_TEST_UTILS_H__
|
||||
#define __GDK_TEST_UTILS_H__
|
||||
|
||||
#include <gdk/gdkwindow.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_THREADS_H__
|
||||
#define __GDK_THREADS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_THREADS_H__
|
||||
#define __GDK_THREADS_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_TYPES_H__
|
||||
#define __GDK_TYPES_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_TYPES_H__
|
||||
#define __GDK_TYPES_H__
|
||||
|
||||
/* GDK uses "glib". (And so does GTK).
|
||||
*/
|
||||
#include <glib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_VISUAL_H__
|
||||
#define __GDK_VISUAL_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_VISUAL_H__
|
||||
#define __GDK_VISUAL_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -6549,8 +6549,8 @@ gdk_window_set_background (GdkWindow *window,
|
||||
* See also gdk_window_set_background_pattern().
|
||||
**/
|
||||
void
|
||||
gdk_window_set_background_rgba (GdkWindow *window,
|
||||
GdkRGBA *rgba)
|
||||
gdk_window_set_background_rgba (GdkWindow *window,
|
||||
const GdkRGBA *rgba)
|
||||
{
|
||||
cairo_pattern_t *pattern;
|
||||
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WINDOW_H__
|
||||
#define __GDK_WINDOW_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WINDOW_H__
|
||||
#define __GDK_WINDOW_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkevents.h>
|
||||
@@ -659,8 +659,8 @@ void gdk_window_set_transient_for (GdkWindow *window,
|
||||
GDK_DEPRECATED_IN_3_4_FOR(gdk_window_set_background_rgba)
|
||||
void gdk_window_set_background (GdkWindow *window,
|
||||
const GdkColor *color);
|
||||
void gdk_window_set_background_rgba (GdkWindow *window,
|
||||
GdkRGBA *rgba);
|
||||
void gdk_window_set_background_rgba (GdkWindow *window,
|
||||
const GdkRGBA *rgba);
|
||||
void gdk_window_set_background_pattern (GdkWindow *window,
|
||||
cairo_pattern_t *pattern);
|
||||
cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow *window);
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_CURSOR_H__
|
||||
#define __GDK_QUARTZ_CURSOR_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_CURSOR_H__
|
||||
#define __GDK_QUARTZ_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DISPLAY_H__
|
||||
#define __GDK_QUARTZ_DISPLAY_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DISPLAY_H__
|
||||
#define __GDK_QUARTZ_DISPLAY_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
||||
#define __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
||||
#define __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -16,13 +16,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DND_H__
|
||||
#define __GDK_QUARTZ_DND_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DND_H__
|
||||
#define __GDK_QUARTZ_DND_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_KEYS_H__
|
||||
#define __GDK_QUARTZ_KEYS_H__
|
||||
|
||||
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_KEYS_H__
|
||||
#define __GDK_QUARTZ_KEYS_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -16,13 +16,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_SCREEN_H__
|
||||
#define __GDK_QUARTZ_SCREEN_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_SCREEN_H__
|
||||
#define __GDK_QUARTZ_SCREEN_H__
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_UTILS_H__
|
||||
#define __GDK_QUARTZ_UTILS_H__
|
||||
|
||||
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_UTILS_H__
|
||||
#define __GDK_QUARTZ_UTILS_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_VISUAL_H__
|
||||
#define __GDK_QUARTZ_VISUAL_H__
|
||||
|
||||
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_VISUAL_H__
|
||||
#define __GDK_QUARTZ_VISUAL_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_WINDOW_H__
|
||||
#define __GDK_QUARTZ_WINDOW_H__
|
||||
|
||||
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_WINDOW_H__
|
||||
#define __GDK_QUARTZ_WINDOW_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_CURSOR_H__
|
||||
#define __GDK_WIN32_CURSOR_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_CURSOR_H__
|
||||
#define __GDK_WIN32_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_DISPLAY_H__
|
||||
#define __GDK_WIN32_DISPLAY_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_DISPLAY_H__
|
||||
#define __GDK_WIN32_DISPLAY_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_DISPLAY_MANAGER_H__
|
||||
#define __GDK_WIN32_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_DISPLAY_MANAGER_H__
|
||||
#define __GDK_WIN32_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_DND_H__
|
||||
#define __GDK_WIN32_DND_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_DND_H__
|
||||
#define __GDK_WIN32_DND_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_KEYS_H__
|
||||
#define __GDK_WIN32_KEYS_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_KEYS_H__
|
||||
#define __GDK_WIN32_KEYS_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_SCREEN_H__
|
||||
#define __GDK_WIN32_SCREEN_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_SCREEN_H__
|
||||
#define __GDK_WIN32_SCREEN_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WIN32_WINDOW_H__
|
||||
#define __GDK_WIN32_WINDOW_H__
|
||||
|
||||
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WIN32_WINDOW_H__
|
||||
#define __GDK_WIN32_WINDOW_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -917,12 +917,14 @@ is_parent_of (GdkWindow *parent,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GdkWindow *
|
||||
static gboolean
|
||||
get_event_window (GdkEventTranslator *translator,
|
||||
XIEvent *ev)
|
||||
XIEvent *ev,
|
||||
GdkWindow **window_p)
|
||||
{
|
||||
GdkDisplay *display;
|
||||
GdkWindow *window = NULL;
|
||||
gboolean should_have_window = TRUE;
|
||||
|
||||
display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (translator));
|
||||
|
||||
@@ -976,9 +978,17 @@ get_event_window (GdkEventTranslator *translator,
|
||||
window = gdk_x11_window_lookup_for_display (display, xev->event);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
should_have_window = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
return window;
|
||||
*window_p = window;
|
||||
|
||||
if (should_have_window && !window)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -1122,7 +1132,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
||||
if (!ev)
|
||||
return FALSE;
|
||||
|
||||
window = get_event_window (translator, ev);
|
||||
if (!get_event_window (translator, ev, &window))
|
||||
return FALSE;
|
||||
|
||||
if (window && GDK_WINDOW_DESTROYED (window))
|
||||
return FALSE;
|
||||
@@ -1650,6 +1661,7 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
|
||||
{
|
||||
GdkX11DeviceManagerXI2 *device_manager;
|
||||
XIEvent *ev;
|
||||
GdkWindow *window = NULL;
|
||||
|
||||
device_manager = (GdkX11DeviceManagerXI2 *) translator;
|
||||
|
||||
@@ -1659,7 +1671,8 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
|
||||
|
||||
ev = (XIEvent *) xevent->xcookie.data;
|
||||
|
||||
return get_event_window (translator, ev);
|
||||
get_event_window (translator, ev, &window);
|
||||
return window;
|
||||
}
|
||||
|
||||
GdkDevice *
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_CURSOR_H__
|
||||
#define __GDK_X11_CURSOR_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_CURSOR_H__
|
||||
#define __GDK_X11_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_DEVICE_H__
|
||||
#define __GDK_X11_DEVICE_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_DEVICE_H__
|
||||
#define __GDK_X11_DEVICE_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_DEVICE_MANAGER_H__
|
||||
#define __GDK_X11_DEVICE_MANAGER_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_DEVICE_MANAGER_H__
|
||||
#define __GDK_X11_DEVICE_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_DISPLAY_H__
|
||||
#define __GDK_X11_DISPLAY_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_DISPLAY_H__
|
||||
#define __GDK_X11_DISPLAY_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_DISPLAY_MANAGER_H__
|
||||
#define __GDK_X11_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_DISPLAY_MANAGER_H__
|
||||
#define __GDK_X11_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_DND_H__
|
||||
#define __GDK_X11_DND_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_DND_H__
|
||||
#define __GDK_X11_DND_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_KEYS_H__
|
||||
#define __GDK_X11_KEYS_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_KEYS_H__
|
||||
#define __GDK_X11_KEYS_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_PROPERTY_H__
|
||||
#define __GDK_X11_PROPERTY_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_PROPERTY_H__
|
||||
#define __GDK_X11_PROPERTY_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_SCREEN_H__
|
||||
#define __GDK_X11_SCREEN_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_SCREEN_H__
|
||||
#define __GDK_X11_SCREEN_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_SELECTION_H__
|
||||
#define __GDK_X11_SELECTION_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_SELECTION_H__
|
||||
#define __GDK_X11_SELECTION_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_UTILS_H__
|
||||
#define __GDK_X11_UTILS_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_UTILS_H__
|
||||
#define __GDK_X11_UTILS_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_VISUAL_H__
|
||||
#define __GDK_X11_VISUAL_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_VISUAL_H__
|
||||
#define __GDK_X11_VISUAL_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_X11_WINDOW_H__
|
||||
#define __GDK_X11_WINDOW_H__
|
||||
|
||||
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkx.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_X11_WINDOW_H__
|
||||
#define __GDK_X11_WINDOW_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
@@ -16,7 +16,7 @@ else
|
||||
GTK_PRINT_PREVIEW_COMMAND="evince --unlink-tempfile --preview --print-settings %s %f"
|
||||
endif
|
||||
|
||||
SUBDIRS = a11y . tests
|
||||
SUBDIRS = a11y actors . tests
|
||||
|
||||
if HAVE_PAPI_CUPS
|
||||
GTK_PRINT_BACKENDS=file,papi,cups
|
||||
@@ -107,12 +107,14 @@ endif
|
||||
libgtkincludedir = $(includedir)/gtk-3.0/gtk
|
||||
libadd = \
|
||||
$(top_builddir)/gdk/libgdk-3.la \
|
||||
$(top_builddir)/gtk/a11y/libgail.la \
|
||||
$(top_builddir)/gtk/a11y/libgtka11y.la \
|
||||
$(top_builddir)/gtk/actors/libgtkactors.la \
|
||||
$(GMODULE_LIBS) \
|
||||
$(GTK_DEP_LIBS)
|
||||
deps = \
|
||||
$(top_builddir)/gdk/libgdk-3.la \
|
||||
$(top_builddir)/gtk/a11y/libgail.la
|
||||
$(top_builddir)/gtk/a11y/libgtka11y.la \
|
||||
$(top_builddir)/gtk/actors/libgtkactors.la
|
||||
|
||||
# libtool stuff: set version and export symbols for resolving
|
||||
# since automake doesn't support conditionalized libsomething_la_LDFLAGS
|
||||
@@ -176,6 +178,7 @@ deprecated_private_h_sources = \
|
||||
gtk_public_h_sources = \
|
||||
gtk.h \
|
||||
gtkx.h \
|
||||
gtk-a11y.h \
|
||||
gtkaboutdialog.h \
|
||||
gtkaccelgroup.h \
|
||||
gtkaccellabel.h \
|
||||
|
@@ -1,9 +1,11 @@
|
||||
include $(top_srcdir)/Makefile.decl
|
||||
|
||||
noinst_LTLIBRARIES = libgail.la
|
||||
noinst_LTLIBRARIES = libgtka11y.la
|
||||
|
||||
gail_c_sources = \
|
||||
gail.c \
|
||||
gtka11y_c_sources = \
|
||||
gtkaccessibility.c \
|
||||
gtkaccessibilitymisc.c \
|
||||
gtkaccessibilityutil.c \
|
||||
gtkarrowaccessible.c \
|
||||
gtkbooleancellaccessible.c \
|
||||
gtkbuttonaccessible.c \
|
||||
@@ -36,7 +38,6 @@ gail_c_sources = \
|
||||
gtkrenderercellaccessible.c \
|
||||
gtkscaleaccessible.c \
|
||||
gtkscalebuttonaccessible.c \
|
||||
gtkscrollbaraccessible.c \
|
||||
gtkscrolledwindowaccessible.c \
|
||||
gtkspinbuttonaccessible.c \
|
||||
gtkspinneraccessible.c \
|
||||
@@ -48,19 +49,16 @@ gail_c_sources = \
|
||||
gtktoplevelaccessible.c \
|
||||
gtktreeviewaccessible.c \
|
||||
gtkwidgetaccessible.c \
|
||||
gtkwindowaccessible.c \
|
||||
gailutil.c \
|
||||
gailmisc.c
|
||||
gtkwindowaccessible.c
|
||||
|
||||
gail_private_h_sources = \
|
||||
gail.h \
|
||||
gtka11yincludedir = $(includedir)/gtk-3.0/gtk/a11y
|
||||
gtka11yinclude_HEADERS = \
|
||||
gtkarrowaccessible.h \
|
||||
gtkbooleancellaccessible.h \
|
||||
gtkbuttonaccessible.h \
|
||||
gtkcellaccessible.h \
|
||||
gtkcellaccessibleparent.h \
|
||||
gtkcheckmenuitemaccessible.h \
|
||||
gtkcolorswatchaccessible.h \
|
||||
gtkcomboboxaccessible.h \
|
||||
gtkcontaineraccessible.h \
|
||||
gtkcontainercellaccessible.h \
|
||||
@@ -74,8 +72,8 @@ gail_private_h_sources = \
|
||||
gtklinkbuttonaccessible.h \
|
||||
gtklockbuttonaccessible.h \
|
||||
gtkmenuaccessible.h \
|
||||
gtkmenushellaccessible.h \
|
||||
gtkmenuitemaccessible.h \
|
||||
gtkmenushellaccessible.h \
|
||||
gtknotebookaccessible.h \
|
||||
gtknotebookpageaccessible.h \
|
||||
gtkpanedaccessible.h \
|
||||
@@ -86,7 +84,6 @@ gail_private_h_sources = \
|
||||
gtkrenderercellaccessible.h \
|
||||
gtkscaleaccessible.h \
|
||||
gtkscalebuttonaccessible.h \
|
||||
gtkscrollbaraccessible.h \
|
||||
gtkscrolledwindowaccessible.h \
|
||||
gtkspinbuttonaccessible.h \
|
||||
gtkspinneraccessible.h \
|
||||
@@ -98,15 +95,25 @@ gail_private_h_sources = \
|
||||
gtktoplevelaccessible.h \
|
||||
gtktreeviewaccessible.h \
|
||||
gtkwidgetaccessible.h \
|
||||
gtkwindowaccessible.h \
|
||||
gailutil.h \
|
||||
gailmisc.h
|
||||
gtkwindowaccessible.h
|
||||
|
||||
libgail_la_SOURCES = \
|
||||
$(gail_c_sources) \
|
||||
$(gail_private_h_sources)
|
||||
gtka11y_private_h_sources = \
|
||||
gtkaccessibility.h \
|
||||
gtkaccessibilitymisc.h \
|
||||
gtkaccessibilityutil.h \
|
||||
gtkcellaccessibleprivate.h \
|
||||
gtkcolorswatchaccessibleprivate.h \
|
||||
gtkiconviewaccessibleprivate.h \
|
||||
gtklockbuttonaccessibleprivate.h \
|
||||
gtktextviewaccessibleprivate.h \
|
||||
gtktreeviewaccessibleprivate.h \
|
||||
gtkwidgetaccessibleprivate.h
|
||||
|
||||
libgail_la_CPPFLAGS = \
|
||||
libgtka11y_la_SOURCES = \
|
||||
$(gtka11y_c_sources) \
|
||||
$(gtka11y_private_h_sources)
|
||||
|
||||
libgtka11y_la_CPPFLAGS = \
|
||||
-I$(top_srcdir) \
|
||||
-I$(top_srcdir)/gdk \
|
||||
-I$(top_builddir)/gdk \
|
||||
@@ -116,18 +123,18 @@ libgail_la_CPPFLAGS = \
|
||||
-DGTK_COMPILATION \
|
||||
$(AM_CPPFLAGS)
|
||||
|
||||
libgail_la_CFLAGS = \
|
||||
$(GTK_DEP_CFLAGS) \
|
||||
$(GTK_DEBUG_FLAGS) \
|
||||
libgtka11y_la_CFLAGS = \
|
||||
$(GTK_DEP_CFLAGS) \
|
||||
$(GTK_DEBUG_FLAGS) \
|
||||
$(AM_CFLAGS)
|
||||
|
||||
libgail_la_LIBADD = \
|
||||
$(GTK_DEP_LIBS) \
|
||||
libgtka11y_la_LIBADD = \
|
||||
$(GTK_DEP_LIBS) \
|
||||
$(INTLLIBS)
|
||||
|
||||
libgail_la_LDFLAGS = \
|
||||
libgtka11y_la_LDFLAGS = \
|
||||
$(LDFLAGS)
|
||||
|
||||
|
||||
dist-hook: ../../build/win32/vs9/libgail.vcproj ../../build/win32/vs10/libgail.vcxproj ../../build/win32/vs10/libgail.vcxproj.filters
|
||||
|
||||
../../build/win32/vs9/libgail.vcproj: ../../build/win32/vs9/libgail.vcprojin
|
||||
@@ -139,7 +146,7 @@ dist-hook: ../../build/win32/vs9/libgail.vcproj ../../build/win32/vs10/libgail.v
|
||||
done >libgail.sourcefiles
|
||||
$(CPP) -P - <$(top_srcdir)/build/win32/vs9/libgail.vcprojin >$@
|
||||
rm libgail.sourcefiles
|
||||
|
||||
|
||||
../../build/win32/vs10/libgail.vcxproj: ../../build/win32/vs10/libgail.vcxprojin
|
||||
for F in $(libgail_la_SOURCES); do \
|
||||
case $$F in \
|
||||
|
@@ -1,49 +0,0 @@
|
||||
/* 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 Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GAIL_MISC_H__
|
||||
#define __GAIL_MISC_H__
|
||||
|
||||
#include <atk/atk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GAIL_TYPE_MISC (_gail_misc_get_type ())
|
||||
#define GAIL_MISC(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GAIL_TYPE_MISC, GailMisc))
|
||||
#define GAIL_MISC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAIL_TYPE_MISC, GailMiscClass))
|
||||
#define GAIL_IS_MISC(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GAIL_TYPE_MISC))
|
||||
#define GAIL_IS_MISC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GAIL_TYPE_MISC))
|
||||
#define GAIL_MISC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GAIL_TYPE_MISC, GailMiscClass))
|
||||
|
||||
typedef struct _GailMisc GailMisc;
|
||||
typedef struct _GailMiscClass GailMiscClass;
|
||||
|
||||
struct _GailMisc
|
||||
{
|
||||
AtkMisc parent;
|
||||
};
|
||||
|
||||
struct _GailMiscClass
|
||||
{
|
||||
AtkMiscClass parent_class;
|
||||
};
|
||||
|
||||
GType _gail_misc_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GAIL_MISC_H__ */
|
@@ -1,373 +0,0 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
* Copyright 2011, F123 Consulting & Mais Diferenças
|
||||
* Copyright 2001, 2002, 2003 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/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include "gailutil.h"
|
||||
#include "gtktoplevelaccessible.h"
|
||||
#include "gtkwindowaccessible.h"
|
||||
|
||||
static GSList *key_listener_list = NULL;
|
||||
|
||||
typedef struct _GailKeyEventInfo GailKeyEventInfo;
|
||||
|
||||
struct _GailKeyEventInfo
|
||||
{
|
||||
AtkKeyEventStruct *key_event;
|
||||
gpointer func_data;
|
||||
};
|
||||
|
||||
static gboolean
|
||||
state_event_watcher (GSignalInvocationHint *hint,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer data)
|
||||
{
|
||||
GObject *object;
|
||||
GtkWidget *widget;
|
||||
AtkObject *atk_obj;
|
||||
AtkObject *parent;
|
||||
GdkEventWindowState *event;
|
||||
gchar *signal_name;
|
||||
|
||||
object = g_value_get_object (param_values + 0);
|
||||
if (!GTK_IS_WINDOW (object))
|
||||
return FALSE;
|
||||
|
||||
event = g_value_get_boxed (param_values + 1);
|
||||
if (event->type == GDK_WINDOW_STATE)
|
||||
return FALSE;
|
||||
widget = GTK_WIDGET (object);
|
||||
|
||||
if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
|
||||
signal_name = "maximize";
|
||||
else if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)
|
||||
signal_name = "minimize";
|
||||
else if (event->new_window_state == 0)
|
||||
signal_name = "restore";
|
||||
else
|
||||
return TRUE;
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj))
|
||||
{
|
||||
parent = atk_object_get_parent (atk_obj);
|
||||
if (parent == atk_get_root ())
|
||||
g_signal_emit_by_name (atk_obj, signal_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
configure_event_watcher (GSignalInvocationHint *hint,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer data)
|
||||
{
|
||||
GtkAllocation allocation;
|
||||
GObject *object;
|
||||
GtkWidget *widget;
|
||||
AtkObject *atk_obj;
|
||||
AtkObject *parent;
|
||||
GdkEvent *event;
|
||||
gchar *signal_name;
|
||||
|
||||
object = g_value_get_object (param_values + 0);
|
||||
if (!GTK_IS_WINDOW (object))
|
||||
return FALSE;
|
||||
|
||||
event = g_value_get_boxed (param_values + 1);
|
||||
if (event->type != GDK_CONFIGURE)
|
||||
return FALSE;
|
||||
widget = GTK_WIDGET (object);
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
if (allocation.x == ((GdkEventConfigure *)event)->x &&
|
||||
allocation.y == ((GdkEventConfigure *)event)->y &&
|
||||
allocation.width == ((GdkEventConfigure *)event)->width &&
|
||||
allocation.height == ((GdkEventConfigure *)event)->height)
|
||||
return TRUE;
|
||||
|
||||
if (allocation.width != ((GdkEventConfigure *)event)->width ||
|
||||
allocation.height != ((GdkEventConfigure *)event)->height)
|
||||
signal_name = "resize";
|
||||
else
|
||||
signal_name = "move";
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj))
|
||||
{
|
||||
parent = atk_object_get_parent (atk_obj);
|
||||
if (parent == atk_get_root ())
|
||||
g_signal_emit_by_name (atk_obj, signal_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
window_focus (GtkWidget *widget,
|
||||
GdkEventFocus *event)
|
||||
{
|
||||
AtkObject *atk_obj;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
g_signal_emit_by_name (atk_obj, event->in ? "activate" : "deactivate");
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
window_added (AtkObject *atk_obj,
|
||||
guint index,
|
||||
AtkObject *child)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
if (!GTK_IS_WINDOW_ACCESSIBLE (child))
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child));
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
g_signal_connect (widget, "focus-in-event", (GCallback) window_focus, NULL);
|
||||
g_signal_connect (widget, "focus-out-event", (GCallback) window_focus, NULL);
|
||||
g_signal_emit_by_name (child, "create");
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
window_removed (AtkObject *atk_obj,
|
||||
guint index,
|
||||
AtkObject *child)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkWindow *window;
|
||||
|
||||
if (!GTK_IS_WINDOW_ACCESSIBLE (child))
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child));
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
window = GTK_WINDOW (widget);
|
||||
/*
|
||||
* Deactivate window if it is still focused and we are removing it. This
|
||||
* can happen when a dialog displayed by gok is removed.
|
||||
*/
|
||||
if (gtk_window_is_active (window) &&
|
||||
gtk_window_has_toplevel_focus (window))
|
||||
g_signal_emit_by_name (child, "deactivate");
|
||||
|
||||
g_signal_handlers_disconnect_by_func (widget, (gpointer) window_focus, NULL);
|
||||
g_signal_emit_by_name (child, "destroy");
|
||||
}
|
||||
|
||||
static void
|
||||
do_window_event_initialization (void)
|
||||
{
|
||||
AtkObject *root;
|
||||
|
||||
g_type_class_ref (GTK_TYPE_WINDOW_ACCESSIBLE);
|
||||
g_signal_add_emission_hook (g_signal_lookup ("window-state-event", GTK_TYPE_WIDGET),
|
||||
0, state_event_watcher, NULL, (GDestroyNotify) NULL);
|
||||
g_signal_add_emission_hook (g_signal_lookup ("configure-event", GTK_TYPE_WIDGET),
|
||||
0, configure_event_watcher, NULL, (GDestroyNotify) NULL);
|
||||
|
||||
root = atk_get_root ();
|
||||
g_signal_connect (root, "children-changed::add",
|
||||
(GCallback) window_added, NULL);
|
||||
g_signal_connect (root, "children-changed::remove",
|
||||
(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)
|
||||
{
|
||||
AtkKeyEventStruct *event = g_new0 (AtkKeyEventStruct, 1);
|
||||
switch (key->type)
|
||||
{
|
||||
case GDK_KEY_PRESS:
|
||||
event->type = ATK_KEY_EVENT_PRESS;
|
||||
break;
|
||||
case GDK_KEY_RELEASE:
|
||||
event->type = ATK_KEY_EVENT_RELEASE;
|
||||
break;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return NULL;
|
||||
}
|
||||
event->state = key->state;
|
||||
event->keyval = key->keyval;
|
||||
event->length = key->length;
|
||||
if (key->string && key->string [0] &&
|
||||
(key->state & GDK_CONTROL_MASK ||
|
||||
g_unichar_isgraph (g_utf8_get_char (key->string))))
|
||||
{
|
||||
event->string = key->string;
|
||||
}
|
||||
else if (key->type == GDK_KEY_PRESS ||
|
||||
key->type == GDK_KEY_RELEASE)
|
||||
{
|
||||
event->string = gdk_keyval_name (key->keyval);
|
||||
}
|
||||
event->keycode = key->hardware_keycode;
|
||||
event->timestamp = key->time;
|
||||
#ifdef GAIL_DEBUG
|
||||
g_print ("GailKey:\tsym %u\n\tmods %x\n\tcode %u\n\ttime %lx\n",
|
||||
(unsigned int) event->keyval,
|
||||
(unsigned int) event->state,
|
||||
(unsigned int) event->keycode,
|
||||
(unsigned long int) event->timestamp);
|
||||
#endif
|
||||
return event;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
AtkKeySnoopFunc func;
|
||||
gpointer data;
|
||||
guint key;
|
||||
} KeyEventListener;
|
||||
|
||||
gboolean
|
||||
_gail_util_key_snooper (GtkWidget *the_widget,
|
||||
GdkEventKey *event)
|
||||
{
|
||||
GSList *l;
|
||||
AtkKeyEventStruct *atk_event;
|
||||
gboolean result;
|
||||
|
||||
atk_event = atk_key_event_from_gdk_event_key (event);
|
||||
|
||||
result = FALSE;
|
||||
|
||||
for (l = key_listener_list; l; l = l->next)
|
||||
{
|
||||
KeyEventListener *listener = l->data;
|
||||
|
||||
result |= listener->func (atk_event, listener->data);
|
||||
}
|
||||
g_free (atk_event);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static guint
|
||||
gail_util_add_key_event_listener (AtkKeySnoopFunc listener_func,
|
||||
gpointer listener_data)
|
||||
{
|
||||
static guint key = 0;
|
||||
KeyEventListener *listener;
|
||||
|
||||
key++;
|
||||
|
||||
listener = g_slice_new0 (KeyEventListener);
|
||||
listener->func = listener_func;
|
||||
listener->data = listener_data;
|
||||
listener->key = key;
|
||||
|
||||
key_listener_list = g_slist_append (key_listener_list, listener);
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
static void
|
||||
gail_util_remove_key_event_listener (guint listener_key)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
for (l = key_listener_list; l; l = l->next)
|
||||
{
|
||||
KeyEventListener *listener = l->data;
|
||||
|
||||
if (listener->key == listener_key)
|
||||
{
|
||||
g_slice_free (KeyEventListener, listener);
|
||||
key_listener_list = g_slist_delete_link (key_listener_list, l);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
gail_util_get_root (void)
|
||||
{
|
||||
static AtkObject *root = NULL;
|
||||
|
||||
if (!root)
|
||||
{
|
||||
root = g_object_new (GTK_TYPE_TOPLEVEL_ACCESSIBLE, NULL);
|
||||
atk_object_initialize (root, NULL);
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
gail_util_get_toolkit_name (void)
|
||||
{
|
||||
return "gtk";
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
gail_util_get_toolkit_version (void)
|
||||
{
|
||||
return GTK_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_uninstall (void)
|
||||
{
|
||||
undo_window_event_initialization ();
|
||||
}
|
||||
|
||||
void
|
||||
_gail_util_install (void)
|
||||
{
|
||||
AtkUtilClass *atk_class = ATK_UTIL_CLASS (g_type_class_ref (ATK_TYPE_UTIL));
|
||||
|
||||
atk_class->add_key_event_listener = gail_util_add_key_event_listener;
|
||||
atk_class->remove_key_event_listener = gail_util_remove_key_event_listener;
|
||||
atk_class->get_root = gail_util_get_root;
|
||||
atk_class->get_toolkit_name = gail_util_get_toolkit_name;
|
||||
atk_class->get_toolkit_version = gail_util_get_toolkit_version;
|
||||
|
||||
do_window_event_initialization ();
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -17,7 +17,11 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gail.h"
|
||||
#include "gtkaccessibility.h"
|
||||
#include "gtkaccessibilityutil.h"
|
||||
#include "gtkaccessibilitymisc.h"
|
||||
|
||||
#include "gtkwindowaccessible.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@@ -32,8 +36,6 @@
|
||||
#include <gtk/gtktogglebutton.h>
|
||||
#include <gtk/gtkcombobox.h>
|
||||
#include <gtk/gtkaccessible.h>
|
||||
#include "gailutil.h"
|
||||
#include "gailmisc.h"
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
#include <atk-bridge.h>
|
||||
@@ -66,7 +68,7 @@ static void gail_focus_tracker_init (void);
|
||||
static void gail_focus_object_destroyed (gpointer data);
|
||||
static void gail_focus_tracker (AtkObject *object);
|
||||
static void gail_set_focus_widget (GtkWidget *focus_widget,
|
||||
GtkWidget *widget);
|
||||
GtkWidget *widget);
|
||||
static void gail_set_focus_object (AtkObject *focus_obj,
|
||||
AtkObject *obj);
|
||||
|
||||
@@ -75,14 +77,14 @@ static GtkWidget* next_focus_widget = NULL;
|
||||
static gboolean was_deselect = FALSE;
|
||||
static GtkWidget* subsequent_focus_widget = NULL;
|
||||
static GtkWidget* focus_before_menu = NULL;
|
||||
static guint focus_notify_handler = 0;
|
||||
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,
|
||||
gboolean *transient)
|
||||
get_accessible_for_widget (GtkWidget *widget,
|
||||
gboolean *transient)
|
||||
{
|
||||
AtkObject *obj = NULL;
|
||||
|
||||
@@ -516,13 +518,13 @@ gail_focus_notify (GtkWidget *widget)
|
||||
else
|
||||
{
|
||||
if (_focus_widget)
|
||||
atk_obj = gail_get_accessible_for_widget (_focus_widget, &transient);
|
||||
atk_obj = get_accessible_for_widget (_focus_widget, &transient);
|
||||
else
|
||||
atk_obj = NULL;
|
||||
/*
|
||||
* Do not report focus on redundant object
|
||||
*/
|
||||
if (atk_obj &&
|
||||
if (atk_obj &&
|
||||
(atk_object_get_role(atk_obj) != ATK_ROLE_REDUNDANT_OBJECT))
|
||||
atk_focus_tracker_notify (atk_obj);
|
||||
if (atk_obj && transient)
|
||||
@@ -797,6 +799,186 @@ gail_set_focus_object (AtkObject *focus_obj,
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
state_event_watcher (GSignalInvocationHint *hint,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer data)
|
||||
{
|
||||
GObject *object;
|
||||
GtkWidget *widget;
|
||||
AtkObject *atk_obj;
|
||||
AtkObject *parent;
|
||||
GdkEventWindowState *event;
|
||||
gchar *signal_name;
|
||||
|
||||
object = g_value_get_object (param_values + 0);
|
||||
if (!GTK_IS_WINDOW (object))
|
||||
return FALSE;
|
||||
|
||||
event = g_value_get_boxed (param_values + 1);
|
||||
if (event->type == GDK_WINDOW_STATE)
|
||||
return FALSE;
|
||||
widget = GTK_WIDGET (object);
|
||||
|
||||
if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
|
||||
signal_name = "maximize";
|
||||
else if (event->new_window_state & GDK_WINDOW_STATE_ICONIFIED)
|
||||
signal_name = "minimize";
|
||||
else if (event->new_window_state == 0)
|
||||
signal_name = "restore";
|
||||
else
|
||||
return TRUE;
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj))
|
||||
{
|
||||
parent = atk_object_get_parent (atk_obj);
|
||||
if (parent == atk_get_root ())
|
||||
g_signal_emit_by_name (atk_obj, signal_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
configure_event_watcher (GSignalInvocationHint *hint,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer data)
|
||||
{
|
||||
GtkAllocation allocation;
|
||||
GObject *object;
|
||||
GtkWidget *widget;
|
||||
AtkObject *atk_obj;
|
||||
AtkObject *parent;
|
||||
GdkEvent *event;
|
||||
gchar *signal_name;
|
||||
|
||||
object = g_value_get_object (param_values + 0);
|
||||
if (!GTK_IS_WINDOW (object))
|
||||
return FALSE;
|
||||
|
||||
event = g_value_get_boxed (param_values + 1);
|
||||
if (event->type != GDK_CONFIGURE)
|
||||
return FALSE;
|
||||
widget = GTK_WIDGET (object);
|
||||
gtk_widget_get_allocation (widget, &allocation);
|
||||
if (allocation.x == ((GdkEventConfigure *)event)->x &&
|
||||
allocation.y == ((GdkEventConfigure *)event)->y &&
|
||||
allocation.width == ((GdkEventConfigure *)event)->width &&
|
||||
allocation.height == ((GdkEventConfigure *)event)->height)
|
||||
return TRUE;
|
||||
|
||||
if (allocation.width != ((GdkEventConfigure *)event)->width ||
|
||||
allocation.height != ((GdkEventConfigure *)event)->height)
|
||||
signal_name = "resize";
|
||||
else
|
||||
signal_name = "move";
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
if (GTK_IS_WINDOW_ACCESSIBLE (atk_obj))
|
||||
{
|
||||
parent = atk_object_get_parent (atk_obj);
|
||||
if (parent == atk_get_root ())
|
||||
g_signal_emit_by_name (atk_obj, signal_name);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
window_focus (GtkWidget *widget,
|
||||
GdkEventFocus *event)
|
||||
{
|
||||
AtkObject *atk_obj;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
||||
|
||||
atk_obj = gtk_widget_get_accessible (widget);
|
||||
g_signal_emit_by_name (atk_obj, event->in ? "activate" : "deactivate");
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
window_added (AtkObject *atk_obj,
|
||||
guint index,
|
||||
AtkObject *child)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
if (!GTK_IS_WINDOW_ACCESSIBLE (child))
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child));
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
g_signal_connect (widget, "focus-in-event", (GCallback) window_focus, NULL);
|
||||
g_signal_connect (widget, "focus-out-event", (GCallback) window_focus, NULL);
|
||||
g_signal_emit_by_name (child, "create");
|
||||
}
|
||||
|
||||
static void
|
||||
window_removed (AtkObject *atk_obj,
|
||||
guint index,
|
||||
AtkObject *child)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GtkWindow *window;
|
||||
|
||||
if (!GTK_IS_WINDOW_ACCESSIBLE (child))
|
||||
return;
|
||||
|
||||
widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (child));
|
||||
if (!widget)
|
||||
return;
|
||||
|
||||
window = GTK_WINDOW (widget);
|
||||
/*
|
||||
* Deactivate window if it is still focused and we are removing it. This
|
||||
* can happen when a dialog displayed by gok is removed.
|
||||
*/
|
||||
if (gtk_window_is_active (window) && gtk_window_has_toplevel_focus (window))
|
||||
g_signal_emit_by_name (child, "deactivate");
|
||||
|
||||
g_signal_handlers_disconnect_by_func (widget, (gpointer) window_focus, NULL);
|
||||
g_signal_emit_by_name (child, "destroy");
|
||||
}
|
||||
|
||||
static void
|
||||
do_window_event_initialization (void)
|
||||
{
|
||||
AtkObject *root;
|
||||
|
||||
g_type_class_ref (GTK_TYPE_WINDOW_ACCESSIBLE);
|
||||
g_signal_add_emission_hook (g_signal_lookup ("window-state-event", GTK_TYPE_WIDGET),
|
||||
0, state_event_watcher, NULL, (GDestroyNotify) NULL);
|
||||
g_signal_add_emission_hook (g_signal_lookup ("configure-event", GTK_TYPE_WIDGET),
|
||||
0, configure_event_watcher, NULL, (GDestroyNotify) NULL);
|
||||
|
||||
root = atk_get_root ();
|
||||
g_signal_connect (root, "children-changed::add", (GCallback) window_added, NULL);
|
||||
g_signal_connect (root, "children-changed::remove", (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);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_gtk_accessibility_shutdown (void)
|
||||
{
|
||||
@@ -810,13 +992,13 @@ _gtk_accessibility_shutdown (void)
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
atk_bridge_adaptor_cleanup ();
|
||||
#endif
|
||||
_gail_util_uninstall ();
|
||||
|
||||
undo_window_event_initialization ();
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_init (void)
|
||||
{
|
||||
|
||||
if (initialized)
|
||||
return;
|
||||
|
||||
@@ -826,10 +1008,12 @@ _gtk_accessibility_init (void)
|
||||
atk_focus_tracker_init (gail_focus_tracker_init);
|
||||
focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker);
|
||||
|
||||
_gail_util_install ();
|
||||
_gtk_accessibility_override_atk_util ();
|
||||
do_window_event_initialization ();
|
||||
|
||||
#ifdef GDK_WINDOWING_X11
|
||||
atk_bridge_adaptor_init (NULL, NULL);
|
||||
#endif
|
||||
|
||||
atk_misc_instance = g_object_new (GAIL_TYPE_MISC, NULL);
|
||||
atk_misc_instance = g_object_new (GTK_TYPE_MISC_IMPL, NULL);
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -15,16 +15,20 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_GAIL_H__
|
||||
#define __GTK_GAIL_H__
|
||||
#ifndef __GTK_ACCESSIBILITY_H__
|
||||
#define __GTK_ACCESSIBILITY_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include "gtk/gtkwidget.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gtk_accessibility_shutdown (void);
|
||||
void _gtk_accessibility_init (void);
|
||||
void _gtk_accessibility_shutdown (void);
|
||||
void _gtk_accessibility_init (void);
|
||||
|
||||
gboolean _gtk_accessibility_key_snooper (GtkWidget *widget,
|
||||
GdkEventKey *event);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_GAIL_H__ */
|
||||
#endif /* __GTK_ACCESSIBILITY_H__ */
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001, 2002, 2003 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -18,33 +18,33 @@
|
||||
#include "config.h"
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "gailmisc.h"
|
||||
#include "gtkaccessibilitymisc.h"
|
||||
|
||||
|
||||
G_DEFINE_TYPE (GailMisc, _gail_misc, ATK_TYPE_MISC)
|
||||
G_DEFINE_TYPE (GtkMiscImpl, _gtk_misc_impl, ATK_TYPE_MISC)
|
||||
|
||||
static void
|
||||
gail_misc_threads_enter (AtkMisc *misc)
|
||||
gtk_misc_impl_threads_enter (AtkMisc *misc)
|
||||
{
|
||||
gdk_threads_enter ();
|
||||
}
|
||||
|
||||
static void
|
||||
gail_misc_threads_leave (AtkMisc *misc)
|
||||
gtk_misc_impl_threads_leave (AtkMisc *misc)
|
||||
{
|
||||
gdk_threads_leave ();
|
||||
}
|
||||
|
||||
static void
|
||||
_gail_misc_class_init (GailMiscClass *klass)
|
||||
_gtk_misc_impl_class_init (GtkMiscImplClass *klass)
|
||||
{
|
||||
AtkMiscClass *misc_class = ATK_MISC_CLASS (klass);
|
||||
|
||||
misc_class->threads_enter = gail_misc_threads_enter;
|
||||
misc_class->threads_leave = gail_misc_threads_leave;
|
||||
misc_class->threads_enter = gtk_misc_impl_threads_enter;
|
||||
misc_class->threads_leave = gtk_misc_impl_threads_leave;
|
||||
}
|
||||
|
||||
static void
|
||||
_gail_misc_init (GailMisc *misc)
|
||||
_gtk_misc_impl_init (GtkMiscImpl *misc)
|
||||
{
|
||||
}
|
44
gtk/a11y/gtkaccessibilitymisc.h
Normal file
44
gtk/a11y/gtkaccessibilitymisc.h
Normal file
@@ -0,0 +1,44 @@
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library 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
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_ACCESSIBILITY_MISC_H__
|
||||
#define __GTK_ACCESSIBILITY_MISC_H__
|
||||
|
||||
#include <atk/atk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_MISC_IMPL (_gtk_misc_impl_get_type ())
|
||||
|
||||
typedef struct _GtkMiscImpl GtkMiscImpl;
|
||||
typedef struct _GtkMiscImplClass GtkMiscImplClass;
|
||||
|
||||
struct _GtkMiscImpl
|
||||
{
|
||||
AtkMisc parent;
|
||||
};
|
||||
|
||||
struct _GtkMiscImplClass
|
||||
{
|
||||
AtkMiscClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_misc_impl_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACCESSIBILITY_MISC_H__ */
|
156
gtk/a11y/gtkaccessibilityutil.c
Normal file
156
gtk/a11y/gtkaccessibilityutil.c
Normal file
@@ -0,0 +1,156 @@
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2011, F123 Consulting & Mais Diferenças
|
||||
* Copyright 2001, 2002, 2003 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/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkaccessibility.h"
|
||||
#include "gtkaccessibilityutil.h"
|
||||
#include "gtktoplevelaccessible.h"
|
||||
|
||||
static GSList *key_listener_list = NULL;
|
||||
|
||||
typedef struct {
|
||||
AtkKeySnoopFunc func;
|
||||
gpointer data;
|
||||
guint key;
|
||||
} KeyEventListener;
|
||||
|
||||
static guint
|
||||
add_key_event_listener (AtkKeySnoopFunc listener_func,
|
||||
gpointer listener_data)
|
||||
{
|
||||
static guint key = 0;
|
||||
KeyEventListener *listener;
|
||||
|
||||
key++;
|
||||
|
||||
listener = g_slice_new0 (KeyEventListener);
|
||||
listener->func = listener_func;
|
||||
listener->data = listener_data;
|
||||
listener->key = key;
|
||||
|
||||
key_listener_list = g_slist_append (key_listener_list, listener);
|
||||
|
||||
return key;
|
||||
}
|
||||
|
||||
static void
|
||||
remove_key_event_listener (guint listener_key)
|
||||
{
|
||||
GSList *l;
|
||||
|
||||
for (l = key_listener_list; l; l = l->next)
|
||||
{
|
||||
KeyEventListener *listener = l->data;
|
||||
|
||||
if (listener->key == listener_key)
|
||||
{
|
||||
g_slice_free (KeyEventListener, listener);
|
||||
key_listener_list = g_slist_delete_link (key_listener_list, l);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static AtkObject *
|
||||
get_root (void)
|
||||
{
|
||||
static AtkObject *root = NULL;
|
||||
|
||||
if (!root)
|
||||
{
|
||||
root = g_object_new (GTK_TYPE_TOPLEVEL_ACCESSIBLE, NULL);
|
||||
atk_object_initialize (root, NULL);
|
||||
}
|
||||
|
||||
return root;
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
get_toolkit_name (void)
|
||||
{
|
||||
return "gtk";
|
||||
}
|
||||
|
||||
static const gchar *
|
||||
get_toolkit_version (void)
|
||||
{
|
||||
return GTK_VERSION;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_accessibility_override_atk_util (void)
|
||||
{
|
||||
AtkUtilClass *atk_class = ATK_UTIL_CLASS (g_type_class_ref (ATK_TYPE_UTIL));
|
||||
|
||||
atk_class->add_key_event_listener = add_key_event_listener;
|
||||
atk_class->remove_key_event_listener = remove_key_event_listener;
|
||||
atk_class->get_root = get_root;
|
||||
atk_class->get_toolkit_name = get_toolkit_name;
|
||||
atk_class->get_toolkit_version = get_toolkit_version;
|
||||
}
|
||||
|
||||
static void
|
||||
atk_key_event_from_gdk_event_key (GdkEventKey *key,
|
||||
AtkKeyEventStruct *event)
|
||||
{
|
||||
if (key->type == GDK_KEY_PRESS)
|
||||
event->type = ATK_KEY_EVENT_PRESS;
|
||||
else if (key->type == GDK_KEY_RELEASE)
|
||||
event->type = ATK_KEY_EVENT_RELEASE;
|
||||
else
|
||||
g_assert_not_reached ();
|
||||
|
||||
event->state = key->state;
|
||||
event->keyval = key->keyval;
|
||||
event->length = key->length;
|
||||
if (key->string && key->string[0] &&
|
||||
(key->state & GDK_CONTROL_MASK ||
|
||||
g_unichar_isgraph (g_utf8_get_char (key->string))))
|
||||
event->string = key->string;
|
||||
else
|
||||
event->string = gdk_keyval_name (key->keyval);
|
||||
|
||||
event->keycode = key->hardware_keycode;
|
||||
event->timestamp = key->time;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_accessibility_key_snooper (GtkWidget *widget,
|
||||
GdkEventKey *event)
|
||||
{
|
||||
GSList *l;
|
||||
AtkKeyEventStruct atk_event;
|
||||
gboolean result;
|
||||
|
||||
result = FALSE;
|
||||
|
||||
atk_key_event_from_gdk_event_key (event, &atk_event);
|
||||
|
||||
for (l = key_listener_list; l; l = l->next)
|
||||
{
|
||||
KeyEventListener *listener = l->data;
|
||||
|
||||
result |= listener->func (&atk_event, listener->data);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -15,19 +15,15 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GAIL_UTIL_H__
|
||||
#define __GAIL_UTIL_H__
|
||||
#ifndef __GTK_ACCESSIBILITY_UTIL_H__
|
||||
#define __GTK_ACCESSIBILITY_UTIL_H__
|
||||
|
||||
#include <atk/atk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gail_util_install (void);
|
||||
void _gail_util_uninstall (void);
|
||||
|
||||
gboolean _gail_util_key_snooper (GtkWidget *the_widget,
|
||||
GdkEventKey *event);
|
||||
void _gtk_accessibility_override_atk_util (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GAIL_UTIL_H__ */
|
||||
#endif /* __GTK_ACCESSIBILITY_UTIL_H__ */
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -27,14 +27,14 @@ struct _GtkArrowAccessiblePrivate
|
||||
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkArrowAccessible, _gtk_arrow_accessible, GTK_TYPE_WIDGET_ACCESSIBLE,
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkArrowAccessible, gtk_arrow_accessible, GTK_TYPE_WIDGET_ACCESSIBLE,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE, atk_image_interface_init))
|
||||
|
||||
static void
|
||||
gtk_arrow_accessible_initialize (AtkObject *accessible,
|
||||
gpointer data)
|
||||
{
|
||||
ATK_OBJECT_CLASS (_gtk_arrow_accessible_parent_class)->initialize (accessible, data);
|
||||
ATK_OBJECT_CLASS (gtk_arrow_accessible_parent_class)->initialize (accessible, data);
|
||||
|
||||
accessible->role = ATK_ROLE_ICON;
|
||||
}
|
||||
@@ -46,11 +46,11 @@ gtk_arrow_accessible_finalize (GObject *object)
|
||||
|
||||
g_free (arrow->priv->image_description);
|
||||
|
||||
G_OBJECT_CLASS (_gtk_arrow_accessible_parent_class)->finalize (object);
|
||||
G_OBJECT_CLASS (gtk_arrow_accessible_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_arrow_accessible_class_init (GtkArrowAccessibleClass *klass)
|
||||
gtk_arrow_accessible_class_init (GtkArrowAccessibleClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
|
||||
@@ -63,7 +63,7 @@ _gtk_arrow_accessible_class_init (GtkArrowAccessibleClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_arrow_accessible_init (GtkArrowAccessible *arrow)
|
||||
gtk_arrow_accessible_init (GtkArrowAccessible *arrow)
|
||||
{
|
||||
arrow->priv = G_TYPE_INSTANCE_GET_PRIVATE (arrow,
|
||||
GTK_TYPE_ARROW_ACCESSIBLE,
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -18,11 +18,15 @@
|
||||
#ifndef __GTK_ARROW_ACCESSIBLE_H__
|
||||
#define __GTK_ARROW_ACCESSIBLE_H__
|
||||
|
||||
#include "gtkwidgetaccessible.h"
|
||||
#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk-a11y.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/a11y/gtkwidgetaccessible.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_ARROW_ACCESSIBLE (_gtk_arrow_accessible_get_type ())
|
||||
#define GTK_TYPE_ARROW_ACCESSIBLE (gtk_arrow_accessible_get_type ())
|
||||
#define GTK_ARROW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ARROW_ACCESSIBLE, GtkArrowAccessible))
|
||||
#define GTK_ARROW_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ARROW_ACCESSIBLE, GtkArrowAccessibleClass))
|
||||
#define GTK_IS_ARROW_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ARROW_ACCESSIBLE))
|
||||
@@ -45,7 +49,7 @@ struct _GtkArrowAccessibleClass
|
||||
GtkWidgetAccessibleClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_arrow_accessible_get_type (void);
|
||||
GType gtk_arrow_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Enabling Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -76,7 +76,7 @@ gtk_boolean_cell_accessible_action_interface_init (AtkActionIface *iface)
|
||||
}
|
||||
|
||||
|
||||
G_DEFINE_TYPE_EXTENDED (GtkBooleanCellAccessible, _gtk_boolean_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE, 0,
|
||||
G_DEFINE_TYPE_EXTENDED (GtkBooleanCellAccessible, gtk_boolean_cell_accessible, GTK_TYPE_RENDERER_CELL_ACCESSIBLE, 0,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, gtk_boolean_cell_accessible_action_interface_init))
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ gtk_boolean_cell_accessible_ref_state_set (AtkObject *accessible)
|
||||
GtkBooleanCellAccessible *cell = GTK_BOOLEAN_CELL_ACCESSIBLE (accessible);
|
||||
AtkStateSet *state_set;
|
||||
|
||||
state_set = ATK_OBJECT_CLASS (_gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
|
||||
state_set = ATK_OBJECT_CLASS (gtk_boolean_cell_accessible_parent_class)->ref_state_set (accessible);
|
||||
|
||||
if (cell->priv->cell_value)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_CHECKED);
|
||||
@@ -130,7 +130,7 @@ gtk_boolean_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
|
||||
gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
|
||||
{
|
||||
GtkCellAccessibleClass *cell_class = GTK_CELL_ACCESSIBLE_CLASS (klass);
|
||||
AtkObjectClass *atkobject_class = ATK_OBJECT_CLASS (klass);
|
||||
@@ -143,7 +143,7 @@ _gtk_boolean_cell_accessible_class_init (GtkBooleanCellAccessibleClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
|
||||
gtk_boolean_cell_accessible_init (GtkBooleanCellAccessible *cell)
|
||||
{
|
||||
cell->priv = G_TYPE_INSTANCE_GET_PRIVATE (cell,
|
||||
GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE,
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Enabling Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -18,12 +18,16 @@
|
||||
#ifndef __GTK_BOOLEAN_CELL_ACCESSIBLE_H__
|
||||
#define __GTK_BOOLEAN_CELL_ACCESSIBLE_H__
|
||||
|
||||
#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk-a11y.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <atk/atk.h>
|
||||
#include "gtkrenderercellaccessible.h"
|
||||
#include <gtk/a11y/gtkrenderercellaccessible.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE (_gtk_boolean_cell_accessible_get_type ())
|
||||
#define GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE (gtk_boolean_cell_accessible_get_type ())
|
||||
#define GTK_BOOLEAN_CELL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE, GtkBooleanCellAccessible))
|
||||
#define GTK_BOOLEAN_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GAIL_BOOLEAN_CELL, GtkBooleanCellAccessibleClass))
|
||||
#define GTK_IS_BOOLEAN_CELL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_BOOLEAN_CELL_ACCESSIBLE))
|
||||
@@ -46,7 +50,7 @@ struct _GtkBooleanCellAccessibleClass
|
||||
GtkRendererCellAccessibleClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_boolean_cell_accessible_get_type (void);
|
||||
GType gtk_boolean_cell_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001, 2002, 2003 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -25,7 +25,7 @@
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
static void atk_image_interface_init (AtkImageIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkButtonAccessible, _gtk_button_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkButtonAccessible, gtk_button_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_IMAGE, atk_image_interface_init))
|
||||
|
||||
@@ -55,7 +55,7 @@ gtk_button_accessible_initialize (AtkObject *obj,
|
||||
{
|
||||
GtkWidget *parent;
|
||||
|
||||
ATK_OBJECT_CLASS (_gtk_button_accessible_parent_class)->initialize (obj, data);
|
||||
ATK_OBJECT_CLASS (gtk_button_accessible_parent_class)->initialize (obj, data);
|
||||
|
||||
g_signal_connect (data, "state-flags-changed", G_CALLBACK (state_changed_cb), NULL);
|
||||
|
||||
@@ -143,7 +143,7 @@ gtk_button_accessible_get_name (AtkObject *obj)
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
name = ATK_OBJECT_CLASS (_gtk_button_accessible_parent_class)->get_name (obj);
|
||||
name = ATK_OBJECT_CLASS (gtk_button_accessible_parent_class)->get_name (obj);
|
||||
if (name != NULL)
|
||||
return name;
|
||||
|
||||
@@ -190,7 +190,7 @@ gtk_button_accessible_ref_state_set (AtkObject *obj)
|
||||
if (widget == NULL)
|
||||
return NULL;
|
||||
|
||||
state_set = ATK_OBJECT_CLASS (_gtk_button_accessible_parent_class)->ref_state_set (obj);
|
||||
state_set = ATK_OBJECT_CLASS (gtk_button_accessible_parent_class)->ref_state_set (obj);
|
||||
|
||||
if ((gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_ACTIVE) != 0)
|
||||
atk_state_set_add_state (state_set, ATK_STATE_ARMED);
|
||||
@@ -216,11 +216,11 @@ gtk_button_accessible_notify_gtk (GObject *obj,
|
||||
g_signal_emit_by_name (atk_obj, "visible-data-changed");
|
||||
}
|
||||
else
|
||||
GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_button_accessible_parent_class)->notify_gtk (obj, pspec);
|
||||
GTK_WIDGET_ACCESSIBLE_CLASS (gtk_button_accessible_parent_class)->notify_gtk (obj, pspec);
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_button_accessible_class_init (GtkButtonAccessibleClass *klass)
|
||||
gtk_button_accessible_class_init (GtkButtonAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
GtkContainerAccessibleClass *container_class = (GtkContainerAccessibleClass*)klass;
|
||||
@@ -239,7 +239,7 @@ _gtk_button_accessible_class_init (GtkButtonAccessibleClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_button_accessible_init (GtkButtonAccessible *button)
|
||||
gtk_button_accessible_init (GtkButtonAccessible *button)
|
||||
{
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -18,11 +18,15 @@
|
||||
#ifndef __GTK_BUTTON_ACCESSIBLE_H__
|
||||
#define __GTK_BUTTON_ACCESSIBLE_H__
|
||||
|
||||
#include "gtkcontaineraccessible.h"
|
||||
#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk-a11y.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/a11y/gtkcontaineraccessible.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_BUTTON_ACCESSIBLE (_gtk_button_accessible_get_type ())
|
||||
#define GTK_TYPE_BUTTON_ACCESSIBLE (gtk_button_accessible_get_type ())
|
||||
#define GTK_BUTTON_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_BUTTON_ACCESSIBLE, GtkButtonAccessible))
|
||||
#define GTK_BUTTON_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_BUTTON_ACCESSIBLE, GtkButtonAccessibleClass))
|
||||
#define GTK_IS_BUTTON_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_BUTTON_ACCESSIBLE))
|
||||
@@ -45,7 +49,7 @@ struct _GtkButtonAccessibleClass
|
||||
GtkContainerAccessibleClass parent_class;
|
||||
};
|
||||
|
||||
GType _gtk_button_accessible_get_type (void);
|
||||
GType gtk_button_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "gtkcontainercellaccessible.h"
|
||||
#include "gtkcellaccessible.h"
|
||||
#include "gtkcellaccessibleprivate.h"
|
||||
#include "gtkcellaccessibleparent.h"
|
||||
|
||||
static const struct {
|
||||
@@ -37,10 +37,11 @@ static const struct {
|
||||
{ ATK_STATE_EXPANDED, GTK_CELL_RENDERER_EXPANDED, FALSE },
|
||||
};
|
||||
|
||||
static GtkCellRendererState gtk_cell_accessible_get_state (GtkCellAccessible *cell);
|
||||
static void atk_action_interface_init (AtkActionIface *iface);
|
||||
static void atk_component_interface_init (AtkComponentIface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkCellAccessible, _gtk_cell_accessible, GTK_TYPE_ACCESSIBLE,
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkCellAccessible, gtk_cell_accessible, GTK_TYPE_ACCESSIBLE,
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
|
||||
G_IMPLEMENT_INTERFACE (ATK_TYPE_COMPONENT, atk_component_interface_init))
|
||||
|
||||
@@ -70,7 +71,7 @@ gtk_cell_accessible_object_finalize (GObject *obj)
|
||||
}
|
||||
g_object_unref (relation_set);
|
||||
}
|
||||
G_OBJECT_CLASS (_gtk_cell_accessible_parent_class)->finalize (obj);
|
||||
G_OBJECT_CLASS (gtk_cell_accessible_parent_class)->finalize (obj);
|
||||
}
|
||||
|
||||
static gint
|
||||
@@ -83,13 +84,13 @@ 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_get_children (GTK_CONTAINER_CELL_ACCESSIBLE (parent)), 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)
|
||||
return -1;
|
||||
|
||||
return _gtk_cell_accessible_parent_get_child_index (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
return gtk_cell_accessible_parent_get_child_index (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
}
|
||||
|
||||
static AtkStateSet *
|
||||
@@ -110,7 +111,7 @@ gtk_cell_accessible_ref_state_set (AtkObject *accessible)
|
||||
return state_set;
|
||||
}
|
||||
|
||||
flags = _gtk_cell_accessible_get_state (cell_accessible);
|
||||
flags = gtk_cell_accessible_get_state (cell_accessible);
|
||||
|
||||
atk_state_set_add_state (state_set, ATK_STATE_FOCUSABLE);
|
||||
atk_state_set_add_state (state_set, ATK_STATE_SELECTABLE);
|
||||
@@ -139,7 +140,7 @@ gtk_cell_accessible_ref_state_set (AtkObject *accessible)
|
||||
|
||||
|
||||
static void
|
||||
_gtk_cell_accessible_class_init (GtkCellAccessibleClass *klass)
|
||||
gtk_cell_accessible_class_init (GtkCellAccessibleClass *klass)
|
||||
{
|
||||
AtkObjectClass *class = ATK_OBJECT_CLASS (klass);
|
||||
GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
|
||||
@@ -151,12 +152,12 @@ _gtk_cell_accessible_class_init (GtkCellAccessibleClass *klass)
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_cell_accessible_init (GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_init (GtkCellAccessible *cell)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_initialise (GtkCellAccessible *cell,
|
||||
_gtk_cell_accessible_initialize (GtkCellAccessible *cell,
|
||||
GtkWidget *widget,
|
||||
AtkObject *parent)
|
||||
{
|
||||
@@ -286,13 +287,13 @@ gtk_cell_accessible_action_do_action (AtkAction *action,
|
||||
switch (index)
|
||||
{
|
||||
case 0:
|
||||
_gtk_cell_accessible_parent_expand_collapse (parent, cell);
|
||||
gtk_cell_accessible_parent_expand_collapse (parent, cell);
|
||||
break;
|
||||
case 1:
|
||||
_gtk_cell_accessible_parent_edit (parent, cell);
|
||||
gtk_cell_accessible_parent_edit (parent, cell);
|
||||
break;
|
||||
case 2:
|
||||
_gtk_cell_accessible_parent_activate (parent, cell);
|
||||
gtk_cell_accessible_parent_activate (parent, cell);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
@@ -325,7 +326,7 @@ gtk_cell_accessible_get_extents (AtkComponent *component,
|
||||
cell = GTK_CELL_ACCESSIBLE (component);
|
||||
parent = gtk_widget_get_accessible (gtk_accessible_get_widget (GTK_ACCESSIBLE (cell)));
|
||||
|
||||
_gtk_cell_accessible_parent_get_cell_extents (GTK_CELL_ACCESSIBLE_PARENT (parent),
|
||||
gtk_cell_accessible_parent_get_cell_extents (GTK_CELL_ACCESSIBLE_PARENT (parent),
|
||||
cell,
|
||||
x, y, width, height, coord_type);
|
||||
}
|
||||
@@ -339,7 +340,7 @@ gtk_cell_accessible_grab_focus (AtkComponent *component)
|
||||
cell = GTK_CELL_ACCESSIBLE (component);
|
||||
parent = gtk_widget_get_accessible (gtk_accessible_get_widget (GTK_ACCESSIBLE (cell)));
|
||||
|
||||
return _gtk_cell_accessible_parent_grab_focus (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
return gtk_cell_accessible_parent_grab_focus (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -349,16 +350,8 @@ atk_component_interface_init (AtkComponentIface *iface)
|
||||
iface->grab_focus = gtk_cell_accessible_grab_focus;
|
||||
}
|
||||
|
||||
/**
|
||||
* _gtk_cell_accessible_get_state:
|
||||
* @cell: a #GtkCellAccessible
|
||||
*
|
||||
* Gets the state that would be used to render the area referenced by @cell.
|
||||
*
|
||||
* Returns: the #GtkCellRendererState for cell
|
||||
**/
|
||||
GtkCellRendererState
|
||||
_gtk_cell_accessible_get_state (GtkCellAccessible *cell)
|
||||
static GtkCellRendererState
|
||||
gtk_cell_accessible_get_state (GtkCellAccessible *cell)
|
||||
{
|
||||
AtkObject *parent;
|
||||
|
||||
@@ -368,11 +361,11 @@ _gtk_cell_accessible_get_state (GtkCellAccessible *cell)
|
||||
if (parent == NULL)
|
||||
return 0;
|
||||
|
||||
return _gtk_cell_accessible_parent_get_renderer_state (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
return gtk_cell_accessible_parent_get_renderer_state (GTK_CELL_ACCESSIBLE_PARENT (parent), cell);
|
||||
}
|
||||
|
||||
/**
|
||||
* _gtk_cell_accessible_state_changed:
|
||||
/*
|
||||
* gtk_cell_accessible_state_changed:
|
||||
* @cell: a #GtkCellAccessible
|
||||
* @added: the flags that were added from @cell
|
||||
* @removed: the flags that were removed from @cell
|
||||
@@ -397,18 +390,18 @@ _gtk_cell_accessible_state_changed (GtkCellAccessible *cell,
|
||||
for (i = 0; i < G_N_ELEMENTS (state_map); i++)
|
||||
{
|
||||
if (added & state_map[i].renderer_state)
|
||||
atk_object_notify_state_change (object,
|
||||
atk_object_notify_state_change (object,
|
||||
state_map[i].atk_state,
|
||||
!state_map[i].invert);
|
||||
if (added & state_map[i].renderer_state)
|
||||
atk_object_notify_state_change (object,
|
||||
atk_object_notify_state_change (object,
|
||||
state_map[i].atk_state,
|
||||
state_map[i].invert);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _gtk_cell_accessible_update_cache:
|
||||
/*
|
||||
* gtk_cell_accessible_update_cache:
|
||||
* @cell: the cell that is changed
|
||||
*
|
||||
* Notifies the cell that the values in the data in the row that
|
||||
@@ -416,7 +409,7 @@ _gtk_cell_accessible_state_changed (GtkCellAccessible *cell,
|
||||
* cell_changed function of @cell is called to send update
|
||||
* notifications for the properties it takes from its cell
|
||||
* renderer.
|
||||
*
|
||||
*
|
||||
* Note that there is no higher granularity available about which
|
||||
* properties changed, so you will need to make do with this
|
||||
* function.
|
||||
@@ -425,7 +418,7 @@ void
|
||||
_gtk_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleClass *klass;
|
||||
|
||||
|
||||
g_return_if_fail (GTK_CELL_ACCESSIBLE (cell));
|
||||
|
||||
klass = GTK_CELL_ACCESSIBLE_GET_CLASS (cell);
|
||||
@@ -433,4 +426,3 @@ _gtk_cell_accessible_update_cache (GtkCellAccessible *cell)
|
||||
if (klass->update_cache)
|
||||
klass->update_cache (cell);
|
||||
}
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -18,12 +18,16 @@
|
||||
#ifndef __GTK_CELL_ACCESSIBLE_H__
|
||||
#define __GTK_CELL_ACCESSIBLE_H__
|
||||
|
||||
#if !defined (__GTK_A11Y_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk-a11y.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <atk/atk.h>
|
||||
#include "gtk/gtkaccessible.h"
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_CELL_ACCESSIBLE (_gtk_cell_accessible_get_type ())
|
||||
#define GTK_TYPE_CELL_ACCESSIBLE (gtk_cell_accessible_get_type ())
|
||||
#define GTK_CELL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_CELL_ACCESSIBLE, GtkCellAccessible))
|
||||
#define GTK_CELL_ACCESSIBLE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_CELL_ACCESSIBLE, GtkCellAccessibleClass))
|
||||
#define GTK_IS_CELL_ACCESSIBLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_CELL_ACCESSIBLE))
|
||||
@@ -47,24 +51,7 @@ struct _GtkCellAccessibleClass
|
||||
void (*update_cache) (GtkCellAccessible *cell);
|
||||
};
|
||||
|
||||
GType _gtk_cell_accessible_get_type (void);
|
||||
|
||||
GtkCellRendererState
|
||||
_gtk_cell_accessible_get_state (GtkCellAccessible *cell);
|
||||
void _gtk_cell_accessible_state_changed (GtkCellAccessible *cell,
|
||||
GtkCellRendererState added,
|
||||
GtkCellRendererState removed);
|
||||
void _gtk_cell_accessible_update_cache (GtkCellAccessible *cell);
|
||||
|
||||
void _gtk_cell_accessible_initialise (GtkCellAccessible *cell,
|
||||
GtkWidget *widget,
|
||||
AtkObject *parent);
|
||||
gboolean _gtk_cell_accessible_add_state (GtkCellAccessible *cell,
|
||||
AtkStateType state_type,
|
||||
gboolean emit_signal);
|
||||
gboolean _gtk_cell_accessible_remove_state (GtkCellAccessible *cell,
|
||||
AtkStateType state_type,
|
||||
gboolean emit_signal);
|
||||
GType gtk_cell_accessible_get_type (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -1,5 +1,4 @@
|
||||
/* GAIL - The GNOME Accessibility Implementation Library
|
||||
|
||||
/* GTK+ - accessibility implementations
|
||||
* Copyright 2001 Sun Microsystems Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
@@ -22,7 +21,7 @@
|
||||
#include "gtkcellaccessibleparent.h"
|
||||
|
||||
GType
|
||||
_gtk_cell_accessible_parent_get_type (void)
|
||||
gtk_cell_accessible_parent_get_type (void)
|
||||
{
|
||||
static volatile gsize g_define_type_id__volatile = 0;
|
||||
|
||||
@@ -44,13 +43,13 @@ _gtk_cell_accessible_parent_get_type (void)
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_parent_get_cell_extents (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gint *width,
|
||||
gint *height,
|
||||
AtkCoordType coord_type)
|
||||
gtk_cell_accessible_parent_get_cell_extents (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell,
|
||||
gint *x,
|
||||
gint *y,
|
||||
gint *width,
|
||||
gint *height,
|
||||
AtkCoordType coord_type)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -63,9 +62,9 @@ _gtk_cell_accessible_parent_get_cell_extents (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_parent_get_cell_area (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell,
|
||||
GdkRectangle *cell_rect)
|
||||
gtk_cell_accessible_parent_get_cell_area (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell,
|
||||
GdkRectangle *cell_rect)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -79,8 +78,8 @@ _gtk_cell_accessible_parent_get_cell_area (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_cell_accessible_parent_grab_focus (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_grab_focus (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -95,8 +94,8 @@ _gtk_cell_accessible_parent_grab_focus (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
int
|
||||
_gtk_cell_accessible_parent_get_child_index (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_get_child_index (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -111,8 +110,8 @@ _gtk_cell_accessible_parent_get_child_index (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
GtkCellRendererState
|
||||
_gtk_cell_accessible_parent_get_renderer_state (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_get_renderer_state (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -128,8 +127,8 @@ _gtk_cell_accessible_parent_get_renderer_state (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_parent_expand_collapse (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_expand_collapse (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -143,8 +142,8 @@ _gtk_cell_accessible_parent_expand_collapse (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_parent_activate (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_activate (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
@@ -158,8 +157,8 @@ _gtk_cell_accessible_parent_activate (GtkCellAccessibleParent *parent,
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_cell_accessible_parent_edit (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
gtk_cell_accessible_parent_edit (GtkCellAccessibleParent *parent,
|
||||
GtkCellAccessible *cell)
|
||||
{
|
||||
GtkCellAccessibleParentIface *iface;
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user