Compare commits
314 Commits
wip/css-op
...
wip/a11y
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a696408b2 | ||
|
|
b0e2fd453c | ||
|
|
6088f59b5e | ||
|
|
bc907c1471 | ||
|
|
a1bb39a42b | ||
|
|
6c68b25008 | ||
|
|
0c6deef968 | ||
|
|
8eb20f751e | ||
|
|
9b933c2a0c | ||
|
|
1205e3b043 | ||
|
|
ced451b09a | ||
|
|
fff4c8e841 | ||
|
|
974f8dfc71 | ||
|
|
a4db4d1f88 | ||
|
|
a2dc30ca8b | ||
|
|
bc675d46f1 | ||
|
|
2fcbe3a9b4 | ||
|
|
246438812a | ||
|
|
88b247f0ba | ||
|
|
213b82e87e | ||
|
|
1aabfbaae8 | ||
|
|
ada20f475d | ||
|
|
da8ff82df5 | ||
|
|
2e76e5a543 | ||
|
|
53083ea7b4 | ||
|
|
befde1f7de | ||
|
|
b39cfb304a | ||
|
|
e8f5bf0b30 | ||
|
|
e8224d138d | ||
|
|
5708e2bc2c | ||
|
|
d5812de2e6 | ||
|
|
35c295da89 | ||
|
|
8e686357c4 | ||
|
|
4d7b822059 | ||
|
|
f72d1a8d2b | ||
|
|
6f910e5e02 | ||
|
|
c83d35d1df | ||
|
|
71e7912940 | ||
|
|
ad723bd9a9 | ||
|
|
b495ce5446 | ||
|
|
9be7e3e2d8 | ||
|
|
da100207b3 | ||
|
|
33e690a9ad | ||
|
|
b867970bf4 | ||
|
|
cd67593c9f | ||
|
|
5509bf2872 | ||
|
|
212a21026f | ||
|
|
8a644e4f16 | ||
|
|
15129ae170 | ||
|
|
7114e63cee | ||
|
|
00795e8d05 | ||
|
|
7ace438166 | ||
|
|
d2c6a6bdfe | ||
|
|
f48e9b1d20 | ||
|
|
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 | ||
|
|
6f69a0fef6 | ||
|
|
f08fc12741 | ||
|
|
c74d79bb55 | ||
|
|
907447c72d | ||
|
|
9bf091e2ac | ||
|
|
1460487635 | ||
|
|
d8306aaeb3 | ||
|
|
1688403ae6 | ||
|
|
5942099f00 | ||
|
|
891a4ab347 | ||
|
|
a23bc88557 | ||
|
|
1a61e1ea23 | ||
|
|
0d9d576172 | ||
|
|
1dd3ee6b59 | ||
|
|
3ff7f1fd43 | ||
|
|
41f8ba3c35 | ||
|
|
fe61e6b3fe | ||
|
|
be53513954 | ||
|
|
fc67f0d4f8 | ||
|
|
0c12a6ffcb | ||
|
|
35362337ec | ||
|
|
8560ff88cd | ||
|
|
e0586e3680 | ||
|
|
66d22f101d | ||
|
|
a5770cef36 | ||
|
|
4ccb8e5d33 | ||
|
|
cc0b493216 | ||
|
|
3c279b1492 | ||
|
|
9eea724e3b | ||
|
|
f619f91a8f | ||
|
|
e36f80f0ef | ||
|
|
3c421db473 | ||
|
|
2dbeabdc58 | ||
|
|
528e6032ae | ||
|
|
42716cb60f | ||
|
|
d69c6fff7a | ||
|
|
c10a0962cf | ||
|
|
fd4712590a | ||
|
|
9b989a1427 | ||
|
|
146b6f3a93 | ||
|
|
3d5e8f98ec | ||
|
|
6bec577771 | ||
|
|
f678827918 | ||
|
|
6b85db7555 | ||
|
|
69feabd139 | ||
|
|
0ede06d229 | ||
|
|
d6932dd823 | ||
|
|
63cb467e06 | ||
|
|
1bfa6593c8 | ||
|
|
daefb12a23 | ||
|
|
16f2b20f96 | ||
|
|
3b4040d619 | ||
|
|
cfdc68db5c | ||
|
|
92e904a257 | ||
|
|
e75860e466 | ||
|
|
5b9c687595 | ||
|
|
b3b83545c4 | ||
|
|
c5c7323942 | ||
|
|
52af9aede6 | ||
|
|
4557e4d7a5 | ||
|
|
9ba32fec6e | ||
|
|
6400eeba35 | ||
|
|
a7ed598d37 | ||
|
|
3519226c5a | ||
|
|
bf26d46cb2 | ||
|
|
ce6f43a522 | ||
|
|
5230cfe805 | ||
|
|
256f168525 | ||
|
|
50acce4074 | ||
|
|
149de71624 | ||
|
|
709f12b9ac | ||
|
|
e2144fbb7e | ||
|
|
fd301e7847 | ||
|
|
4d0ca91c72 | ||
|
|
29c8420746 | ||
|
|
7f3595a6be | ||
|
|
ea415cd350 | ||
|
|
1a79ee4d3e | ||
|
|
01dc23cdec | ||
|
|
a69619edbc | ||
|
|
d3051ca79c | ||
|
|
9ac005abee | ||
|
|
943de24211 | ||
|
|
db6d6fcc84 | ||
|
|
941851fc86 | ||
|
|
e8659679cd | ||
|
|
693581250e | ||
|
|
ceb866dfe6 | ||
|
|
788f1a0934 | ||
|
|
6b33ee9c53 | ||
|
|
239c631ad3 | ||
|
|
4498ff314e | ||
|
|
87b351e6e6 | ||
|
|
1d805139db | ||
|
|
f204473ee0 | ||
|
|
2ab65ef771 | ||
|
|
da7a4089fe | ||
|
|
41486895d5 | ||
|
|
0862afaded | ||
|
|
fb643c1c12 | ||
|
|
df25349d63 | ||
|
|
9aac4dffc5 | ||
|
|
4f9a8e6b3d | ||
|
|
42dc0ea0fd | ||
|
|
08ac1504d2 | ||
|
|
b8e58015eb | ||
|
|
94b80cc774 | ||
|
|
5ca35bd5dd | ||
|
|
932794e105 | ||
|
|
324ff12553 | ||
|
|
45b4fb02b1 | ||
|
|
fbdb81bbdf | ||
|
|
840f09bdc8 | ||
|
|
b05ee6aa29 |
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
|
Overview of Changes in GTK+ 3.7.2
|
||||||
=================================
|
=================================
|
||||||
|
|
||||||
|
|||||||
45
configure.ac
45
configure.ac
@@ -10,7 +10,7 @@
|
|||||||
|
|
||||||
m4_define([gtk_major_version], [3])
|
m4_define([gtk_major_version], [3])
|
||||||
m4_define([gtk_minor_version], [7])
|
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_interface_age], [0])
|
||||||
m4_define([gtk_binary_age],
|
m4_define([gtk_binary_age],
|
||||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||||
@@ -24,11 +24,14 @@ AC_INIT([gtk+], [gtk_version],
|
|||||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=gtk%2B],
|
[http://bugzilla.gnome.org/enter_bug.cgi?product=gtk%2B],
|
||||||
[gtk+])
|
[gtk+])
|
||||||
|
|
||||||
AC_CONFIG_HEADER([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([gdk/gdktypes.h])
|
AC_CONFIG_SRCDIR([gdk/gdktypes.h])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
|
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
AC_CANONICAL_TARGET
|
||||||
|
|
||||||
# Define a string for the earliest version that this release has
|
# Define a string for the earliest version that this release has
|
||||||
# backwards binary compatibility with for all interfaces a module
|
# backwards binary compatibility with for all interfaces a module
|
||||||
# might. Unless we add module-only API with lower stability
|
# might. Unless we add module-only API with lower stability
|
||||||
@@ -39,8 +42,8 @@ AC_CONFIG_AUX_DIR([build-aux])
|
|||||||
m4_define([gtk_binary_version], [3.0.0])
|
m4_define([gtk_binary_version], [3.0.0])
|
||||||
|
|
||||||
# required versions of other packages
|
# required versions of other packages
|
||||||
m4_define([glib_required_version], [2.35.0])
|
m4_define([glib_required_version], [2.35.3])
|
||||||
m4_define([pango_required_version], [1.30.0])
|
m4_define([pango_required_version], [1.32.4])
|
||||||
m4_define([atk_required_version], [2.5.3])
|
m4_define([atk_required_version], [2.5.3])
|
||||||
m4_define([cairo_required_version], [1.10.0])
|
m4_define([cairo_required_version], [1.10.0])
|
||||||
m4_define([gdk_pixbuf_required_version], [2.26.0])
|
m4_define([gdk_pixbuf_required_version], [2.26.0])
|
||||||
@@ -123,8 +126,8 @@ AC_SUBST([GAIL_LT_CURRENT_MINUS_AGE],[gail_lt_current_minus_age])
|
|||||||
|
|
||||||
# Checks for programs.
|
# Checks for programs.
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
AX_PROG_CC_FOR_BUILD
|
||||||
AC_PROG_CC_C_O
|
AC_PROG_CC_C_O
|
||||||
AC_PROG_CC_STDC
|
|
||||||
AC_PROG_MKDIR_P
|
AC_PROG_MKDIR_P
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_MAKE_SET
|
AC_PROG_MAKE_SET
|
||||||
@@ -135,8 +138,6 @@ AC_SUBST(GETTEXT_PACKAGE)
|
|||||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE",
|
||||||
[The prefix for our gettext translation domains.])
|
[The prefix for our gettext translation domains.])
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
|
||||||
|
|
||||||
MATH_LIB=-lm
|
MATH_LIB=-lm
|
||||||
AC_MSG_CHECKING([for native Win32])
|
AC_MSG_CHECKING([for native Win32])
|
||||||
LIB_EXE_MACHINE_FLAG=X86
|
LIB_EXE_MACHINE_FLAG=X86
|
||||||
@@ -386,6 +387,7 @@ AC_SUBST(DISABLE_ON_QUARTZ)
|
|||||||
if test "x$enable_broadway_backend" = xyes; then
|
if test "x$enable_broadway_backend" = xyes; then
|
||||||
GDK_BACKENDS="$GDK_BACKENDS broadway"
|
GDK_BACKENDS="$GDK_BACKENDS broadway"
|
||||||
cairo_backends="$cairo_backends cairo"
|
cairo_backends="$cairo_backends cairo"
|
||||||
|
have_gio_unix=yes
|
||||||
GDK_WINDOWING="$GDK_WINDOWING
|
GDK_WINDOWING="$GDK_WINDOWING
|
||||||
#define GDK_WINDOWING_BROADWAY"
|
#define GDK_WINDOWING_BROADWAY"
|
||||||
GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lz"
|
GDK_EXTRA_LIBS="$GDK_EXTRA_LIBS -lz"
|
||||||
@@ -905,14 +907,32 @@ dnl Look for a host system's gdk-pixbuf-csource if we are cross-compiling
|
|||||||
|
|
||||||
AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes)
|
AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes)
|
||||||
|
|
||||||
if test "x$cross_compiling" = xyes || test "x$enable_gtk2_dependency" = xyes; then
|
AS_IF([test "x$enable_gtk2_dependency" = xyes],
|
||||||
AC_PATH_PROG(GTK_UPDATE_ICON_CACHE, gtk-update-icon-cache, no)
|
[AC_PATH_PROG(GTK_UPDATE_ICON_CACHE, gtk-update-icon-cache, no)
|
||||||
if test x$GTK_UPDATE_ICON_CACHE = xno; then
|
if test x$GTK_UPDATE_ICON_CACHE = xno; then
|
||||||
REBUILD_PNGS=#
|
REBUILD_PNGS=#
|
||||||
fi
|
fi],
|
||||||
fi
|
|
||||||
|
|
||||||
AM_CONDITIONAL(USE_EXTERNAL_ICON_CACHE, [test "x$cross_compiling" = xyes || test "x$enable_gtk2_dependency" = xyes])
|
[test "x$cross_compiling" = xyes],
|
||||||
|
[# If no GTK+2 dependency and cross compiling, we need to find a host gdk-pixbuf.
|
||||||
|
# pkg.m4 blocks all variable starting with PKG, so allow this one
|
||||||
|
m4_pattern_allow([PKG_CONFIG_FOR_BUILD])
|
||||||
|
|
||||||
|
AS_IF([test x$PKG_CONFIG_FOR_BUILD = x],
|
||||||
|
[AC_MSG_ERROR([You must define PKG_CONFIG_FOR_BUILD when cross compiling])])
|
||||||
|
|
||||||
|
AC_MSG_CHECKING([for native gdk-pixbuf])
|
||||||
|
AS_IF([AC_RUN_LOG([$PKG_CONFIG_FOR_BUILD --exists --print-errors gdk-pixbuf-2.0])],
|
||||||
|
[AC_MSG_RESULT([yes])],
|
||||||
|
[AC_MSG_ERROR([native gdk-pixbuf not found])])
|
||||||
|
|
||||||
|
NATIVE_GDKPIXBUF_CFLAGS=`$PKG_CONFIG_FOR_BUILD --cflags gdk-pixbuf-2.0`
|
||||||
|
NATIVE_GDKPIXBUF_LIBS=`$PKG_CONFIG_FOR_BUILD --libs gdk-pixbuf-2.0`
|
||||||
|
AC_SUBST(NATIVE_GDKPIXBUF_CFLAGS)
|
||||||
|
AC_SUBST(NATIVE_GDKPIXBUF_LIBS)]
|
||||||
|
)
|
||||||
|
|
||||||
|
AM_CONDITIONAL(USE_EXTERNAL_ICON_CACHE, [test "x$enable_gtk2_dependency" = xyes])
|
||||||
|
|
||||||
AC_PATH_PROG(GDK_PIXBUF_CSOURCE, gdk-pixbuf-csource, no)
|
AC_PATH_PROG(GDK_PIXBUF_CSOURCE, gdk-pixbuf-csource, no)
|
||||||
|
|
||||||
@@ -1787,6 +1807,7 @@ gtk/makefile.msc
|
|||||||
gtk/gtkversion.h
|
gtk/gtkversion.h
|
||||||
gtk/gtk-win32.rc
|
gtk/gtk-win32.rc
|
||||||
gtk/a11y/Makefile
|
gtk/a11y/Makefile
|
||||||
|
gtk/native/Makefile
|
||||||
gtk/tests/Makefile
|
gtk/tests/Makefile
|
||||||
libgail-util/Makefile
|
libgail-util/Makefile
|
||||||
modules/Makefile
|
modules/Makefile
|
||||||
|
|||||||
@@ -56,6 +56,9 @@ get_democodedir (void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#undef DEMOCODEDIR
|
||||||
|
#define DEMOCODEDIR getenv ("GTK_DEMO_DATA_DIR")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* demo_find_file:
|
* demo_find_file:
|
||||||
* @base: base filename
|
* @base: base filename
|
||||||
|
|||||||
@@ -147,4 +147,11 @@ include $(top_srcdir)/gtk-doc.make
|
|||||||
# Other files to distribute
|
# Other files to distribute
|
||||||
EXTRA_DIST += version.xml.in
|
EXTRA_DIST += version.xml.in
|
||||||
|
|
||||||
|
if ENABLE_GTK_DOC
|
||||||
|
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||||
|
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||||
|
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||||
|
TESTS = $(GTKDOC_CHECK)
|
||||||
|
endif
|
||||||
|
|
||||||
-include $(top_srcdir)/git.mk
|
-include $(top_srcdir)/git.mk
|
||||||
|
|||||||
@@ -449,6 +449,13 @@ MAINTAINERCLEANFILES = $(man_MANS) $(BUILT_SOURCES)
|
|||||||
|
|
||||||
EXTRA_DIST += $(man_MANS)
|
EXTRA_DIST += $(man_MANS)
|
||||||
|
|
||||||
|
if ENABLE_GTK_DOC
|
||||||
|
TESTS_ENVIRONMENT = cd $(srcdir) && \
|
||||||
|
DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \
|
||||||
|
SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir)
|
||||||
|
TESTS = $(GTKDOC_CHECK)
|
||||||
|
endif
|
||||||
|
|
||||||
dist-hook-local: dist-local-check-mans-enabled all-local
|
dist-hook-local: dist-local-check-mans-enabled all-local
|
||||||
|
|
||||||
gtk-docs-clean: clean
|
gtk-docs-clean: clean
|
||||||
|
|||||||
@@ -61,13 +61,9 @@
|
|||||||
<xi:include href="xml/gtkstyleproperties.xml" />
|
<xi:include href="xml/gtkstyleproperties.xml" />
|
||||||
<xi:include href="xml/gtkthemingengine.xml" />
|
<xi:include href="xml/gtkthemingengine.xml" />
|
||||||
<xi:include href="xml/gtkwidgetpath.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/gtkicontheme.xml" />
|
||||||
<xi:include href="xml/gtkiconfactory.xml" />
|
<xi:include href="xml/gtkiconfactory.xml" />
|
||||||
<xi:include href="xml/gtknumerableicon.xml" />
|
<xi:include href="xml/gtknumerableicon.xml" />
|
||||||
<xi:include href="xml/gtkrc.xml" />
|
|
||||||
<xi:include href="xml/gtkstyle.xml" />
|
|
||||||
</part>
|
</part>
|
||||||
|
|
||||||
<part id="gtkobjects">
|
<part id="gtkobjects">
|
||||||
@@ -128,8 +124,6 @@
|
|||||||
<xi:include href="xml/gtkentrybuffer.xml" />
|
<xi:include href="xml/gtkentrybuffer.xml" />
|
||||||
<xi:include href="xml/gtkentrycompletion.xml" />
|
<xi:include href="xml/gtkentrycompletion.xml" />
|
||||||
<xi:include href="xml/gtkscale.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/gtkspinbutton.xml" />
|
||||||
<xi:include href="xml/gtksearchentry.xml" />
|
<xi:include href="xml/gtksearchentry.xml" />
|
||||||
<xi:include href="xml/gtkeditable.xml" />
|
<xi:include href="xml/gtkeditable.xml" />
|
||||||
@@ -188,7 +182,6 @@
|
|||||||
<xi:include href="xml/gtkradiomenuitem.xml" />
|
<xi:include href="xml/gtkradiomenuitem.xml" />
|
||||||
<xi:include href="xml/gtkcheckmenuitem.xml" />
|
<xi:include href="xml/gtkcheckmenuitem.xml" />
|
||||||
<xi:include href="xml/gtkseparatormenuitem.xml" />
|
<xi:include href="xml/gtkseparatormenuitem.xml" />
|
||||||
<xi:include href="xml/gtktearoffmenuitem.xml" />
|
|
||||||
<xi:include href="xml/gtktoolshell.xml" />
|
<xi:include href="xml/gtktoolshell.xml" />
|
||||||
<xi:include href="xml/gtktoolbar.xml" />
|
<xi:include href="xml/gtktoolbar.xml" />
|
||||||
<xi:include href="xml/gtktoolitem.xml" />
|
<xi:include href="xml/gtktoolitem.xml" />
|
||||||
@@ -218,9 +211,6 @@
|
|||||||
<xi:include href="xml/gtkcolorbutton.xml" />
|
<xi:include href="xml/gtkcolorbutton.xml" />
|
||||||
<xi:include href="xml/gtkcolorchooserwidget.xml" />
|
<xi:include href="xml/gtkcolorchooserwidget.xml" />
|
||||||
<xi:include href="xml/gtkcolorchooserdialog.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/gtkfilechooser.xml" />
|
||||||
<xi:include href="xml/gtkfilechooserbutton.xml" />
|
<xi:include href="xml/gtkfilechooserbutton.xml" />
|
||||||
<xi:include href="xml/gtkfilechooserdialog.xml" />
|
<xi:include href="xml/gtkfilechooserdialog.xml" />
|
||||||
@@ -230,8 +220,6 @@
|
|||||||
<xi:include href="xml/gtkfontbutton.xml" />
|
<xi:include href="xml/gtkfontbutton.xml" />
|
||||||
<xi:include href="xml/gtkfontchooserwidget.xml" />
|
<xi:include href="xml/gtkfontchooserwidget.xml" />
|
||||||
<xi:include href="xml/gtkfontchooserdialog.xml" />
|
<xi:include href="xml/gtkfontchooserdialog.xml" />
|
||||||
<xi:include href="xml/gtkfontsel.xml" />
|
|
||||||
<xi:include href="xml/gtkfontseldlg.xml" />
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="LayoutContainers">
|
<chapter id="LayoutContainers">
|
||||||
@@ -240,18 +228,11 @@
|
|||||||
<xi:include href="xml/gtkalignment.xml" />
|
<xi:include href="xml/gtkalignment.xml" />
|
||||||
<xi:include href="xml/gtkaspectframe.xml" />
|
<xi:include href="xml/gtkaspectframe.xml" />
|
||||||
<xi:include href="xml/gtkbox.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/gtkbbox.xml" />
|
||||||
<xi:include href="xml/gtkhbbox.xml" />
|
|
||||||
<xi:include href="xml/gtkvbbox.xml" />
|
|
||||||
<xi:include href="xml/gtkfixed.xml" />
|
<xi:include href="xml/gtkfixed.xml" />
|
||||||
<xi:include href="xml/gtkpaned.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/gtklayout.xml" />
|
||||||
<xi:include href="xml/gtknotebook.xml" />
|
<xi:include href="xml/gtknotebook.xml" />
|
||||||
<xi:include href="xml/gtktable.xml" />
|
|
||||||
<xi:include href="xml/gtkexpander.xml" />
|
<xi:include href="xml/gtkexpander.xml" />
|
||||||
<xi:include href="xml/gtkoverlay.xml" />
|
<xi:include href="xml/gtkoverlay.xml" />
|
||||||
<xi:include href="xml/gtkorientable.xml" />
|
<xi:include href="xml/gtkorientable.xml" />
|
||||||
@@ -261,15 +242,11 @@
|
|||||||
<title>Ornaments</title>
|
<title>Ornaments</title>
|
||||||
<xi:include href="xml/gtkframe.xml" />
|
<xi:include href="xml/gtkframe.xml" />
|
||||||
<xi:include href="xml/gtkseparator.xml" />
|
<xi:include href="xml/gtkseparator.xml" />
|
||||||
<xi:include href="xml/gtkhseparator.xml" />
|
|
||||||
<xi:include href="xml/gtkvseparator.xml" />
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="ScrollingWidgets">
|
<chapter id="ScrollingWidgets">
|
||||||
<title>Scrolling</title>
|
<title>Scrolling</title>
|
||||||
<xi:include href="xml/gtkscrollbar.xml" />
|
<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/gtkscrolledwindow.xml" />
|
||||||
<xi:include href="xml/gtkscrollable.xml" />
|
<xi:include href="xml/gtkscrollable.xml" />
|
||||||
</chapter>
|
</chapter>
|
||||||
@@ -350,6 +327,34 @@
|
|||||||
<xi:include href="xml/gtkapplicationwindow.xml" />
|
<xi:include href="xml/gtkapplicationwindow.xml" />
|
||||||
<xi:include href="xml/gtkactionable.xml" />
|
<xi:include href="xml/gtkactionable.xml" />
|
||||||
</chapter>
|
</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>
|
||||||
|
|
||||||
<part id="migrating">
|
<part id="migrating">
|
||||||
@@ -406,6 +411,10 @@
|
|||||||
<title>Index of new symbols in 3.6</title>
|
<title>Index of new symbols in 3.6</title>
|
||||||
<xi:include href="xml/api-index-3.6.xml"><xi:fallback /></xi:include>
|
<xi:include href="xml/api-index-3.6.xml"><xi:fallback /></xi:include>
|
||||||
</index>
|
</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>
|
<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_add_objects_from_resource
|
||||||
gtk_builder_get_object
|
gtk_builder_get_object
|
||||||
gtk_builder_get_objects
|
gtk_builder_get_objects
|
||||||
|
gtk_builder_expose_object
|
||||||
gtk_builder_connect_signals
|
gtk_builder_connect_signals
|
||||||
gtk_builder_connect_signals_full
|
gtk_builder_connect_signals_full
|
||||||
gtk_builder_set_translation_domain
|
gtk_builder_set_translation_domain
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ AM_CPPFLAGS = \
|
|||||||
|
|
||||||
LDADDS = $(GDK_DEP_LIBS)
|
LDADDS = $(GDK_DEP_LIBS)
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libbroadway.la libgdk-broadway.la
|
noinst_LTLIBRARIES = libgdk-broadway.la
|
||||||
|
|
||||||
|
bin_PROGRAMS = broadwayd
|
||||||
|
|
||||||
libgdkinclude_HEADERS = \
|
libgdkinclude_HEADERS = \
|
||||||
gdkbroadway.h
|
gdkbroadway.h
|
||||||
@@ -26,10 +28,6 @@ libgdkbroadwayinclude_HEADERS = \
|
|||||||
gdkbroadwaycursor.h \
|
gdkbroadwaycursor.h \
|
||||||
gdkbroadwayvisual.h
|
gdkbroadwayvisual.h
|
||||||
|
|
||||||
libbroadway_la_SOURCES = \
|
|
||||||
broadway.h \
|
|
||||||
broadway.c
|
|
||||||
|
|
||||||
clienthtml.h: client.html
|
clienthtml.h: client.html
|
||||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/client.html client_html > $@
|
$(PERL) $(srcdir)/toarray.pl $(srcdir)/client.html client_html > $@
|
||||||
|
|
||||||
@@ -73,9 +71,19 @@ libgdk_broadway_la_SOURCES = \
|
|||||||
gdkvisual-broadway.c \
|
gdkvisual-broadway.c \
|
||||||
gdkwindow-broadway.c \
|
gdkwindow-broadway.c \
|
||||||
gdkwindow-broadway.h \
|
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)
|
MAINTAINERCLEANFILES = $(broadway_built_sources)
|
||||||
EXTRA_DIST += $(broadway_built_sources)
|
EXTRA_DIST += $(broadway_built_sources)
|
||||||
|
|||||||
11
gdk/broadway/TODO.broadway
Normal file
11
gdk/broadway/TODO.broadway
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Cache surfaces that are opened via shm_open inbetween updates.
|
||||||
|
Handle implicit grabs when in broadway-server.c
|
||||||
|
keyboard focus handling
|
||||||
|
Add resize handling to js WM
|
||||||
|
Support window titles
|
||||||
|
_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
|
||||||
|
clean up /dev/shm on abrupt client exit
|
||||||
@@ -5,7 +5,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
|
|
||||||
#include "broadway.h"
|
#include "broadway-output.h"
|
||||||
|
|
||||||
/************************************************************************
|
/************************************************************************
|
||||||
* Base64 functions *
|
* Base64 functions *
|
||||||
@@ -351,12 +351,12 @@ static void
|
|||||||
append_uint16 (BroadwayOutput *output, guint32 v)
|
append_uint16 (BroadwayOutput *output, guint32 v)
|
||||||
{
|
{
|
||||||
gsize old_len = output->buf->len;
|
gsize old_len = output->buf->len;
|
||||||
|
guint8 *buf;
|
||||||
|
|
||||||
if (output->binary)
|
if (output->binary)
|
||||||
{
|
{
|
||||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
|
||||||
|
|
||||||
g_string_set_size (output->buf, old_len + 2);
|
g_string_set_size (output->buf, old_len + 2);
|
||||||
|
buf = (guint8 *)output->buf->str + old_len;
|
||||||
buf[0] = (v >> 0) & 0xff;
|
buf[0] = (v >> 0) & 0xff;
|
||||||
buf[1] = (v >> 8) & 0xff;
|
buf[1] = (v >> 8) & 0xff;
|
||||||
}
|
}
|
||||||
@@ -371,12 +371,12 @@ static void
|
|||||||
append_uint32 (BroadwayOutput *output, guint32 v)
|
append_uint32 (BroadwayOutput *output, guint32 v)
|
||||||
{
|
{
|
||||||
gsize old_len = output->buf->len;
|
gsize old_len = output->buf->len;
|
||||||
|
guint8 *buf;
|
||||||
|
|
||||||
if (output->binary)
|
if (output->binary)
|
||||||
{
|
{
|
||||||
guint8 *buf = (guint8 *)output->buf->str + old_len;
|
|
||||||
|
|
||||||
g_string_set_size (output->buf, old_len + 4);
|
g_string_set_size (output->buf, old_len + 4);
|
||||||
|
buf = (guint8 *)output->buf->str + old_len;
|
||||||
buf[0] = (v >> 0) & 0xff;
|
buf[0] = (v >> 0) & 0xff;
|
||||||
buf[1] = (v >> 8) & 0xff;
|
buf[1] = (v >> 8) & 0xff;
|
||||||
buf[2] = (v >> 16) & 0xff;
|
buf[2] = (v >> 16) & 0xff;
|
||||||
@@ -422,7 +422,7 @@ broadway_output_copy_rectangles (BroadwayOutput *output, int id,
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
write_header (output, 'b');
|
write_header (output, BROADWAY_OP_COPY_RECTANGLES);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_uint16 (output, n_rects);
|
append_uint16 (output, n_rects);
|
||||||
for (i = 0; i < n_rects; i++)
|
for (i = 0; i < n_rects; i++)
|
||||||
@@ -441,7 +441,7 @@ broadway_output_grab_pointer (BroadwayOutput *output,
|
|||||||
int id,
|
int id,
|
||||||
gboolean owner_event)
|
gboolean owner_event)
|
||||||
{
|
{
|
||||||
write_header (output, 'g');
|
write_header (output, BROADWAY_OP_GRAB_POINTER);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_bool (output, owner_event);
|
append_bool (output, owner_event);
|
||||||
}
|
}
|
||||||
@@ -452,7 +452,7 @@ broadway_output_ungrab_pointer (BroadwayOutput *output)
|
|||||||
guint32 serial;
|
guint32 serial;
|
||||||
|
|
||||||
serial = output->serial;
|
serial = output->serial;
|
||||||
write_header (output, 'u');
|
write_header (output, BROADWAY_OP_UNGRAB_POINTER);
|
||||||
|
|
||||||
return serial;
|
return serial;
|
||||||
}
|
}
|
||||||
@@ -462,7 +462,7 @@ broadway_output_new_surface(BroadwayOutput *output,
|
|||||||
int id, int x, int y, int w, int h,
|
int id, int x, int y, int w, int h,
|
||||||
gboolean is_temp)
|
gboolean is_temp)
|
||||||
{
|
{
|
||||||
write_header (output, 's');
|
write_header (output, BROADWAY_OP_NEW_SURFACE);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_uint16 (output, x);
|
append_uint16 (output, x);
|
||||||
append_uint16 (output, y);
|
append_uint16 (output, y);
|
||||||
@@ -474,21 +474,21 @@ broadway_output_new_surface(BroadwayOutput *output,
|
|||||||
void
|
void
|
||||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||||
{
|
{
|
||||||
write_header (output, 'S');
|
write_header (output, BROADWAY_OP_SHOW_SURFACE);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
||||||
{
|
{
|
||||||
write_header (output, 'H');
|
write_header (output, BROADWAY_OP_HIDE_SURFACE);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
||||||
{
|
{
|
||||||
write_header (output, 'd');
|
write_header (output, BROADWAY_OP_DESTROY_SURFACE);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -508,7 +508,7 @@ broadway_output_move_resize_surface (BroadwayOutput *output,
|
|||||||
if (!has_pos && !has_size)
|
if (!has_pos && !has_size)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
write_header (output, 'm');
|
write_header (output, BROADWAY_OP_MOVE_RESIZE);
|
||||||
val = (!!has_pos) | ((!!has_size) << 1);
|
val = (!!has_pos) | ((!!has_size) << 1);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_flags (output, val);
|
append_flags (output, val);
|
||||||
@@ -529,7 +529,7 @@ broadway_output_set_transient_for (BroadwayOutput *output,
|
|||||||
int id,
|
int id,
|
||||||
int parent_id)
|
int parent_id)
|
||||||
{
|
{
|
||||||
write_header (output, 'p');
|
write_header (output, BROADWAY_OP_SET_TRANSIENT_FOR);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_uint16 (output, parent_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;
|
gsize size_start, image_start, len;
|
||||||
|
|
||||||
write_header (output, 'i');
|
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||||
|
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_uint16 (output, x);
|
append_uint16 (output, x);
|
||||||
@@ -798,7 +798,7 @@ broadway_output_put_rgba (BroadwayOutput *output, int id, int x, int y,
|
|||||||
{
|
{
|
||||||
guint8 *subdata;
|
guint8 *subdata;
|
||||||
|
|
||||||
write_header (output, 'i');
|
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
append_uint16 (output, x + rects[i].x1);
|
append_uint16 (output, x + rects[i].x1);
|
||||||
append_uint16 (output, y + rects[i].y1);
|
append_uint16 (output, y + rects[i].y1);
|
||||||
@@ -830,6 +830,6 @@ void
|
|||||||
broadway_output_surface_flush (BroadwayOutput *output,
|
broadway_output_surface_flush (BroadwayOutput *output,
|
||||||
int id)
|
int id)
|
||||||
{
|
{
|
||||||
write_header (output, 'f');
|
write_header (output, BROADWAY_OP_FLUSH);
|
||||||
append_uint16 (output, id);
|
append_uint16 (output, id);
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
|
#ifndef __BROADWAY_H__
|
||||||
|
#define __BROADWAY_H__
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
#include "broadway-protocol.h"
|
||||||
|
|
||||||
typedef struct BroadwayOutput BroadwayOutput;
|
typedef struct BroadwayOutput BroadwayOutput;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int x, y;
|
|
||||||
int width, height;
|
|
||||||
} BroadwayRect;
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
BROADWAY_WS_CONTINUATION = 0,
|
BROADWAY_WS_CONTINUATION = 0,
|
||||||
BROADWAY_WS_TEXT = 1,
|
BROADWAY_WS_TEXT = 1,
|
||||||
@@ -78,3 +77,5 @@ void broadway_output_grab_pointer (BroadwayOutput *output,
|
|||||||
gboolean owner_event);
|
gboolean owner_event);
|
||||||
guint32 broadway_output_ungrab_pointer (BroadwayOutput *output);
|
guint32 broadway_output_ungrab_pointer (BroadwayOutput *output);
|
||||||
void broadway_output_pong (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 {
|
||||||
|
guint32 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;
|
||||||
|
guint32 width;
|
||||||
|
guint32 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;
|
||||||
|
guint32 with_move;
|
||||||
|
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 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__ */
|
||||||
1840
gdk/broadway/broadway-server.c
Normal file
1840
gdk/broadway/broadway-server.c
Normal file
File diff suppressed because it is too large
Load Diff
82
gdk/broadway/broadway-server.h
Normal file
82
gdk/broadway/broadway-server.h
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
#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 (char *address,
|
||||||
|
int port,
|
||||||
|
GError **error);
|
||||||
|
gboolean broadway_server_has_client (BroadwayServer *server);
|
||||||
|
void broadway_server_flush (BroadwayServer *server);
|
||||||
|
void broadway_server_sync (BroadwayServer *server);
|
||||||
|
void broadway_server_get_screen_size (BroadwayServer *server,
|
||||||
|
guint32 *width,
|
||||||
|
guint32 *height);
|
||||||
|
guint32 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,
|
||||||
|
gboolean with_move,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
|
#endif /* __BROADWAY_SERVER__ */
|
||||||
@@ -132,18 +132,6 @@ function createXHR()
|
|||||||
return null;
|
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)
|
function resizeCanvas(canvas, w, h)
|
||||||
{
|
{
|
||||||
/* Canvas resize clears the data, so we need to save it first */
|
/* 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);
|
context.drawImage(tmpCanvas, 0, 0, tmpCanvas.width, tmpCanvas.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
var useToplevelWindows = false;
|
|
||||||
var toplevelWindows = [];
|
|
||||||
var grab = new Object();
|
var grab = new Object();
|
||||||
grab.window = null;
|
grab.window = null;
|
||||||
grab.ownerEvents = false;
|
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)
|
function sendConfigureNotify(surface)
|
||||||
{
|
{
|
||||||
sendInput("w", [surface.id, surface.x, surface.y, surface.width, surface.height]);
|
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)
|
function getStyle(el, styleProp)
|
||||||
{
|
{
|
||||||
if (el.currentStyle) {
|
if (el.currentStyle) {
|
||||||
@@ -440,8 +316,6 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
|||||||
surface.drawQueue = [];
|
surface.drawQueue = [];
|
||||||
surface.transientParent = 0;
|
surface.transientParent = 0;
|
||||||
surface.visible = false;
|
surface.visible = false;
|
||||||
surface.window = null;
|
|
||||||
surface.document = document;
|
|
||||||
surface.frame = null;
|
surface.frame = null;
|
||||||
|
|
||||||
var canvas = document.createElement("canvas");
|
var canvas = document.createElement("canvas");
|
||||||
@@ -451,7 +325,7 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
|||||||
surface.canvas = canvas;
|
surface.canvas = canvas;
|
||||||
var toplevelElement;
|
var toplevelElement;
|
||||||
|
|
||||||
if (useToplevelWindows || isTemp) {
|
if (isTemp) {
|
||||||
toplevelElement = canvas;
|
toplevelElement = canvas;
|
||||||
document.body.appendChild(canvas);
|
document.body.appendChild(canvas);
|
||||||
} else {
|
} else {
|
||||||
@@ -476,10 +350,6 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
|||||||
|
|
||||||
toplevelElement = frame;
|
toplevelElement = frame;
|
||||||
document.body.appendChild(frame);
|
document.body.appendChild(frame);
|
||||||
|
|
||||||
surface.x = 100 + positionIndex * 10;
|
|
||||||
surface.y = 100 + positionIndex * 10;
|
|
||||||
positionIndex = (positionIndex + 1) % 20;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
surface.toplevelElement = toplevelElement;
|
surface.toplevelElement = toplevelElement;
|
||||||
@@ -511,52 +381,17 @@ function cmdShowSurface(id)
|
|||||||
var xOffset = surface.x;
|
var xOffset = surface.x;
|
||||||
var yOffset = surface.y;
|
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) {
|
if (surface.frame) {
|
||||||
var offset = getFrameOffset(surface);
|
var offset = getFrameOffset(surface);
|
||||||
xOffset -= offset.x;
|
xOffset -= offset.x;
|
||||||
yOffset -= offset.y;
|
yOffset -= offset.y;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
surface.toplevelElement.style["left"] = xOffset + "px";
|
surface.toplevelElement.style["left"] = xOffset + "px";
|
||||||
surface.toplevelElement.style["top"] = yOffset + "px";
|
surface.toplevelElement.style["top"] = yOffset + "px";
|
||||||
surface.toplevelElement.style["visibility"] = "visible";
|
surface.toplevelElement.style["visibility"] = "visible";
|
||||||
|
|
||||||
restackWindows();
|
restackWindows();
|
||||||
|
|
||||||
if (surface.window)
|
|
||||||
updateBrowserWindowGeometry(surface.window, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function cmdHideSurface(id)
|
function cmdHideSurface(id)
|
||||||
@@ -573,15 +408,6 @@ function cmdHideSurface(id)
|
|||||||
var element = surface.toplevelElement;
|
var element = surface.toplevelElement;
|
||||||
|
|
||||||
element.style["visibility"] = "hidden";
|
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)
|
function cmdSetTransientFor(id, parentId)
|
||||||
@@ -666,16 +492,6 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
|
|||||||
resizeCanvas(surface.canvas, w, h);
|
resizeCanvas(surface.canvas, w, h);
|
||||||
|
|
||||||
if (surface.visible) {
|
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) {
|
if (has_pos) {
|
||||||
var xOffset = surface.x;
|
var xOffset = surface.x;
|
||||||
var yOffset = surface.y;
|
var yOffset = surface.y;
|
||||||
@@ -698,14 +514,9 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
|
|||||||
element.style["top"] = yOffset + "px";
|
element.style["top"] = yOffset + "px";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (surface.window) {
|
|
||||||
updateBrowserWindowGeometry(surface.window, true);
|
|
||||||
} else {
|
|
||||||
sendConfigureNotify(surface);
|
sendConfigureNotify(surface);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
function cmdFlushSurface(id)
|
function cmdFlushSurface(id)
|
||||||
{
|
{
|
||||||
@@ -985,13 +796,8 @@ function getPositionsFromAbsCoord(absX, absY, relativeId) {
|
|||||||
|
|
||||||
function getPositionsFromEvent(ev, relativeId) {
|
function getPositionsFromEvent(ev, relativeId) {
|
||||||
var absX, absY;
|
var absX, absY;
|
||||||
if (useToplevelWindows) {
|
|
||||||
absX = ev.screenX;
|
|
||||||
absY = ev.screenY;
|
|
||||||
} else {
|
|
||||||
absX = ev.pageX;
|
absX = ev.pageX;
|
||||||
absY = ev.pageY;
|
absY = ev.pageY;
|
||||||
}
|
|
||||||
var res = getPositionsFromAbsCoord(absX, absY, relativeId);
|
var res = getPositionsFromAbsCoord(absX, absY, relativeId);
|
||||||
|
|
||||||
lastX = res.rootX;
|
lastX = res.rootX;
|
||||||
@@ -1020,10 +826,6 @@ function updateForEvent(ev) {
|
|||||||
lastState |= GDK_MOD1_MASK;
|
lastState |= GDK_MOD1_MASK;
|
||||||
|
|
||||||
lastTimeStamp = ev.timeStamp;
|
lastTimeStamp = ev.timeStamp;
|
||||||
if (ev.target.surface && ev.target.surface.window) {
|
|
||||||
var win = ev.target.surface.window;
|
|
||||||
updateBrowserWindowGeometry(win, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function onMouseMove (ev) {
|
function onMouseMove (ev) {
|
||||||
@@ -1036,6 +838,8 @@ function onMouseMove (ev) {
|
|||||||
surface.x += dx;
|
surface.x += dx;
|
||||||
surface.y += dy;
|
surface.y += dy;
|
||||||
var offset = getFrameOffset(surface);
|
var offset = getFrameOffset(surface);
|
||||||
|
if (surface.y < offset.y)
|
||||||
|
surface.y = offset.y;
|
||||||
localGrab.frame.style["left"] = (surface.x - offset.x) + "px";
|
localGrab.frame.style["left"] = (surface.x - offset.x) + "px";
|
||||||
localGrab.frame.style["top"] = (surface.y - offset.y) + "px";
|
localGrab.frame.style["top"] = (surface.y - offset.y) + "px";
|
||||||
sendConfigureNotify(surface);
|
sendConfigureNotify(surface);
|
||||||
@@ -1141,7 +945,7 @@ function onMouseDown (ev) {
|
|||||||
localGrab.lastX = ev.pageX;
|
localGrab.lastX = ev.pageX;
|
||||||
localGrab.lastY = ev.pageY;
|
localGrab.lastY = ev.pageY;
|
||||||
moveToTop(localGrab.frame.frameFor);
|
moveToTop(localGrab.frame.frameFor);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (id == 0 && ev.target.closeFor) { /* mouse click on frame */
|
if (id == 0 && ev.target.closeFor) { /* mouse click on frame */
|
||||||
@@ -1153,13 +957,14 @@ function onMouseDown (ev) {
|
|||||||
localGrab.button = ev.target;
|
localGrab.button = ev.target;
|
||||||
localGrab.lastX = ev.pageX;
|
localGrab.lastX = ev.pageX;
|
||||||
localGrab.lastY = ev.pageY;
|
localGrab.lastY = ev.pageY;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pos = getPositionsFromEvent(ev, id);
|
var pos = getPositionsFromEvent(ev, id);
|
||||||
if (grab.window == null)
|
if (grab.window == null)
|
||||||
doGrab (id, false, true);
|
doGrab (id, false, true);
|
||||||
sendInput ("b", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
sendInput ("b", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function onMouseUp (ev) {
|
function onMouseUp (ev) {
|
||||||
@@ -1189,13 +994,15 @@ function onMouseUp (ev) {
|
|||||||
sendInput ("W", [localGrab.surface.id]);
|
sendInput ("W", [localGrab.surface.id]);
|
||||||
}
|
}
|
||||||
localGrab = null;
|
localGrab = null;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
sendInput ("B", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
sendInput ("B", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||||
|
|
||||||
if (grab.window != null && grab.implicit)
|
if (grab.window != null && grab.implicit)
|
||||||
doUngrab();
|
doUngrab();
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Some of the keyboard handling code is from noVNC and
|
/* Some of the keyboard handling code is from noVNC and
|
||||||
@@ -2671,7 +2478,7 @@ function handleKeyDown(e) {
|
|||||||
// browser behaviors or it has no corresponding keyPress
|
// browser behaviors or it has no corresponding keyPress
|
||||||
// event, then send it immediately
|
// event, then send it immediately
|
||||||
if (!ignoreKeyEvent(ev))
|
if (!ignoreKeyEvent(ev))
|
||||||
sendInput("k", [keysym, lastState]);
|
sendInput("k", [realWindowWithMouse, keysym, lastState]);
|
||||||
suppress = true;
|
suppress = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2716,7 +2523,7 @@ function handleKeyPress(e) {
|
|||||||
|
|
||||||
// Send the translated keysym
|
// Send the translated keysym
|
||||||
if (keysym > 0)
|
if (keysym > 0)
|
||||||
sendInput ("k", [keysym, lastState]);
|
sendInput ("k", [realWindowWithMouse, keysym, lastState]);
|
||||||
|
|
||||||
// Stop keypress events just in case
|
// Stop keypress events just in case
|
||||||
return cancelEvent(ev);
|
return cancelEvent(ev);
|
||||||
@@ -2735,7 +2542,7 @@ function handleKeyUp(e) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (keysym > 0)
|
if (keysym > 0)
|
||||||
sendInput ("K", [keysym, lastState]);
|
sendInput ("K", [realWindowWithMouse, keysym, lastState]);
|
||||||
return cancelEvent(ev);
|
return cancelEvent(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2830,8 +2637,6 @@ function connect()
|
|||||||
var query_string = url.split("?");
|
var query_string = url.split("?");
|
||||||
if (query_string.length > 1) {
|
if (query_string.length > 1) {
|
||||||
var params = query_string[1].split("&");
|
var params = query_string[1].split("&");
|
||||||
if (params[0].indexOf("toplevel") != -1)
|
|
||||||
useToplevelWindows = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var loc = window.location.toString().replace("http:", "ws:");
|
var loc = window.location.toString().replace("http:", "ws:");
|
||||||
@@ -2848,10 +2653,6 @@ function connect()
|
|||||||
ws.onopen = function() {
|
ws.onopen = function() {
|
||||||
inputSocket = ws;
|
inputSocket = ws;
|
||||||
var w, h;
|
var w, h;
|
||||||
if (useToplevelWindows) {
|
|
||||||
w = window.screen.width;
|
|
||||||
h = window.screen.height;
|
|
||||||
} else {
|
|
||||||
w = window.innerWidth;
|
w = window.innerWidth;
|
||||||
h = window.innerHeight;
|
h = window.innerHeight;
|
||||||
window.onresize = function(ev) {
|
window.onresize = function(ev) {
|
||||||
@@ -2860,7 +2661,6 @@ function connect()
|
|||||||
h = window.innerHeight;
|
h = window.innerHeight;
|
||||||
sendInput ("d", [w, h]);
|
sendInput ("d", [w, h]);
|
||||||
};
|
};
|
||||||
}
|
|
||||||
sendInput ("d", [w, h]);
|
sendInput ("d", [w, h]);
|
||||||
};
|
};
|
||||||
ws.onclose = function() {
|
ws.onclose = function() {
|
||||||
@@ -2871,8 +2671,4 @@ function connect()
|
|||||||
};
|
};
|
||||||
|
|
||||||
setupDocument(document);
|
setupDocument(document);
|
||||||
window.onunload = function (ev) {
|
|
||||||
for (var i = 0; i < toplevelWindows.length; i++)
|
|
||||||
toplevelWindows[i].close();
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
636
gdk/broadway/broadwayd.c
Normal file
636
gdk/broadway/broadwayd.c
Normal file
@@ -0,0 +1,636 @@
|
|||||||
|
#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;
|
||||||
|
|
||||||
|
/* Serials:
|
||||||
|
*
|
||||||
|
* Broadway tracks serials for all clients primarily to get the right behaviour wrt
|
||||||
|
* grabs. Each request the client sends gets an increasing per-client serial number, starting
|
||||||
|
* at 1. Thus, the client can now when a mouse event is seen whether the mouse event was
|
||||||
|
* sent before or after the server saw the grab request from the client (as this affects how
|
||||||
|
* the event is handled).
|
||||||
|
*
|
||||||
|
* There is only a single stream of increasing serials sent from the daemon to the web browser
|
||||||
|
* though, called "daemon serials", so we need to map back from the daemon serials to the client
|
||||||
|
* serials when we send an event to a client. So, each client keeps track of the mappings
|
||||||
|
* between its serials and daemon serials for any outstanding requests.
|
||||||
|
*
|
||||||
|
* There is some additional complexity in that there may be multiple consecutive web browser
|
||||||
|
* sessions, so we need to keep track of the last daemon serial used inbetween each web client
|
||||||
|
* connection so that the daemon serials can be strictly increasing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
guint32 client_serial;
|
||||||
|
guint32 daemon_serial;
|
||||||
|
} BroadwaySerialMapping;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
guint32 id;
|
||||||
|
GSocketConnection *connection;
|
||||||
|
GBufferedInputStream *in;
|
||||||
|
GSList *serial_mappings;
|
||||||
|
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_slist_free_full (client->serial_mappings, g_free);
|
||||||
|
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.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
add_client_serial_mapping (BroadwayClient *client,
|
||||||
|
guint32 client_serial,
|
||||||
|
guint32 daemon_serial)
|
||||||
|
{
|
||||||
|
BroadwaySerialMapping *map;
|
||||||
|
GSList *last;
|
||||||
|
|
||||||
|
last = g_slist_last (client->serial_mappings);
|
||||||
|
|
||||||
|
if (last != NULL)
|
||||||
|
{
|
||||||
|
map = last->data;
|
||||||
|
|
||||||
|
/* If we have no web client, don't grow forever */
|
||||||
|
if (map->daemon_serial == daemon_serial)
|
||||||
|
{
|
||||||
|
map->client_serial = client_serial;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
map = g_new0 (BroadwaySerialMapping, 1);
|
||||||
|
map->client_serial = client_serial;
|
||||||
|
map->daemon_serial = daemon_serial;
|
||||||
|
client->serial_mappings = g_slist_append (client->serial_mappings, map);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns the latest seen client serial at the time we sent
|
||||||
|
a daemon request to the browser with a specific daemon serial */
|
||||||
|
guint32
|
||||||
|
get_client_serial (BroadwayClient *client, guint32 daemon_serial)
|
||||||
|
{
|
||||||
|
BroadwaySerialMapping *map;
|
||||||
|
GSList *l, *found;
|
||||||
|
guint32 client_serial = 0;
|
||||||
|
|
||||||
|
found = NULL;
|
||||||
|
for (l = client->serial_mappings; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
map = l->data;
|
||||||
|
|
||||||
|
if (map->daemon_serial <= daemon_serial)
|
||||||
|
{
|
||||||
|
found = l;
|
||||||
|
client_serial = map->client_serial;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remove mappings before the found one, they will never more be used */
|
||||||
|
while (found != NULL &&
|
||||||
|
client->serial_mappings != found)
|
||||||
|
{
|
||||||
|
g_free (client->serial_mappings->data);
|
||||||
|
client->serial_mappings =
|
||||||
|
g_slist_delete_link (client->serial_mappings, client->serial_mappings);
|
||||||
|
}
|
||||||
|
|
||||||
|
return client_serial;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
guint32 before_serial, now_serial;
|
||||||
|
|
||||||
|
before_serial = broadway_server_get_next_serial (server);
|
||||||
|
|
||||||
|
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:
|
||||||
|
broadway_server_window_move_resize (server,
|
||||||
|
request->move_resize.id,
|
||||||
|
request->move_resize.with_move,
|
||||||
|
request->move_resize.x,
|
||||||
|
request->move_resize.y,
|
||||||
|
request->move_resize.width,
|
||||||
|
request->move_resize.height);
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
now_serial = broadway_server_get_next_serial (server);
|
||||||
|
|
||||||
|
/* If we sent a new output request, map that this client serial to that, otherwise
|
||||||
|
update old mapping for previously sent daemon serial */
|
||||||
|
if (now_serial != before_serial)
|
||||||
|
add_client_serial_mapping (client,
|
||||||
|
request->base.serial,
|
||||||
|
before_serial);
|
||||||
|
else
|
||||||
|
add_client_serial_mapping (client,
|
||||||
|
request->base.serial,
|
||||||
|
before_serial - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
BroadwayInputMsg ev = { {0} };
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
/* Send initial resize notify */
|
||||||
|
ev.base.type = BROADWAY_EVENT_SCREEN_SIZE_CHANGED;
|
||||||
|
ev.base.serial = broadway_server_get_next_serial (server) - 1;
|
||||||
|
ev.base.time = broadway_server_get_last_seen_time (server);
|
||||||
|
broadway_server_get_screen_size (server,
|
||||||
|
&ev.screen_resize_notify.width,
|
||||||
|
&ev.screen_resize_notify.height);
|
||||||
|
|
||||||
|
broadway_events_got_input (&ev,
|
||||||
|
client->id);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
GOptionContext *context;
|
||||||
|
GMainLoop *loop;
|
||||||
|
GSocketAddress *address;
|
||||||
|
GSocketService *listener;
|
||||||
|
char *path, *base;
|
||||||
|
char *http_address = NULL;
|
||||||
|
int http_port = 0;
|
||||||
|
int display = 1;
|
||||||
|
const GOptionEntry entries[] = {
|
||||||
|
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
|
||||||
|
{ "address", 'a', 0, G_OPTION_ARG_STRING, &http_address, "Ip address to bind to ", "ADDRESS" },
|
||||||
|
{ 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_address, 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;
|
||||||
|
guint32 daemon_serial;
|
||||||
|
|
||||||
|
size = get_event_size (message->base.type);
|
||||||
|
g_assert (sizeof (BroadwayReplyBase) + size <= sizeof (BroadwayReplyEvent));
|
||||||
|
|
||||||
|
memset (&reply_event, 0, sizeof (BroadwayReplyEvent));
|
||||||
|
daemon_serial = message->base.serial;
|
||||||
|
|
||||||
|
memcpy (&reply_event.msg, message, size);
|
||||||
|
|
||||||
|
for (l = clients; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
BroadwayClient *client = l->data;
|
||||||
|
|
||||||
|
if (client_id == -1 ||
|
||||||
|
client->id == client_id)
|
||||||
|
{
|
||||||
|
reply_event.msg.base.serial = get_client_serial (client, daemon_serial);
|
||||||
|
|
||||||
|
send_reply (client, NULL, (BroadwayReply *)&reply_event,
|
||||||
|
G_STRUCT_OFFSET (BroadwayReplyEvent, msg) + size,
|
||||||
|
BROADWAY_REPLY_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
695
gdk/broadway/gdkbroadway-server.c
Normal file
695
gdk/broadway/gdkbroadway-server.c
Normal file
@@ -0,0 +1,695 @@
|
|||||||
|
#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);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_some_input_blocking (server);
|
||||||
|
parse_all_input (server);
|
||||||
|
}
|
||||||
|
|
||||||
|
queue_process_input_at_idle (server);
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
char chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890";
|
||||||
|
|
||||||
|
return chars[c % sizeof (chars)];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 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++] = '/';
|
||||||
|
name[o++] = 'b';
|
||||||
|
name[o++] = 'd';
|
||||||
|
name[o++] = 'w';
|
||||||
|
name[o++] = '-';
|
||||||
|
for (i = 0; i < 32/4 - 1; 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,
|
||||||
|
gboolean with_move,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height)
|
||||||
|
{
|
||||||
|
BroadwayRequestMoveResize msg;
|
||||||
|
|
||||||
|
msg.id = id;
|
||||||
|
msg.with_move = with_move;
|
||||||
|
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;
|
||||||
|
}
|
||||||
71
gdk/broadway/gdkbroadway-server.h
Normal file
71
gdk/broadway/gdkbroadway-server.h
Normal file
@@ -0,0 +1,71 @@
|
|||||||
|
#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,
|
||||||
|
gboolean with_move,
|
||||||
|
int x,
|
||||||
|
int y,
|
||||||
|
int width,
|
||||||
|
int height);
|
||||||
|
|
||||||
|
#endif /* __GDK_BROADWAY_SERVER__ */
|
||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_BROADWAY_CURSOR_H__
|
|
||||||
#define __GDK_BROADWAY_CURSOR_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
|
||||||
#define __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -156,7 +156,10 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
|||||||
GdkDisplay *display;
|
GdkDisplay *display;
|
||||||
GdkBroadwayDisplay *broadway_display;
|
GdkBroadwayDisplay *broadway_display;
|
||||||
GdkScreen *screen;
|
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)
|
if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
|
||||||
return;
|
return;
|
||||||
@@ -173,36 +176,12 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
|||||||
*root_window = gdk_screen_get_root_window (screen);
|
*root_window = gdk_screen_get_root_window (screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (broadway_display->output)
|
_gdk_broadway_server_query_mouse (broadway_display->server,
|
||||||
{
|
&mouse_toplevel_id,
|
||||||
_gdk_broadway_display_consume_all_input (display);
|
&device_root_x,
|
||||||
if (root_x)
|
&device_root_y,
|
||||||
*root_x = broadway_display->future_root_x;
|
&mask32);
|
||||||
if (root_y)
|
mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (mouse_toplevel_id));
|
||||||
*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;
|
|
||||||
|
|
||||||
if (root_x)
|
if (root_x)
|
||||||
*root_x = device_root_x;
|
*root_x = device_root_x;
|
||||||
@@ -213,12 +192,12 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
|||||||
if (win_y)
|
if (win_y)
|
||||||
*win_y = device_root_y - toplevel->y;
|
*win_y = device_root_y - toplevel->y;
|
||||||
if (mask)
|
if (mask)
|
||||||
*mask = broadway_display->last_state;
|
*mask = mask32;
|
||||||
if (child_window)
|
if (child_window)
|
||||||
{
|
{
|
||||||
if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
|
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)
|
if (*child_window == NULL)
|
||||||
*child_window = toplevel;
|
*child_window = toplevel;
|
||||||
}
|
}
|
||||||
@@ -236,13 +215,10 @@ void
|
|||||||
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||||
{
|
{
|
||||||
GdkDisplay *display = gdk_window_get_display (window);
|
GdkDisplay *display = gdk_window_get_display (window);
|
||||||
GdkBroadwayDisplay *broadway_display;
|
|
||||||
GdkDeviceManager *device_manager;
|
GdkDeviceManager *device_manager;
|
||||||
GdkDeviceGrabInfo *grab;
|
GdkDeviceGrabInfo *grab;
|
||||||
GList *devices, *d;
|
GList *devices, *d;
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
|
||||||
|
|
||||||
device_manager = gdk_display_get_device_manager (display);
|
device_manager = gdk_display_get_device_manager (display);
|
||||||
|
|
||||||
/* Get all devices */
|
/* Get all devices */
|
||||||
@@ -257,8 +233,6 @@ _gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
|||||||
{
|
{
|
||||||
grab->serial_end = grab->serial_start;
|
grab->serial_end = grab->serial_start;
|
||||||
grab->implicit_ungrab = TRUE;
|
grab->implicit_ungrab = TRUE;
|
||||||
|
|
||||||
broadway_display->pointer_grab_window = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -290,29 +264,11 @@ gdk_broadway_device_grab (GdkDevice *device,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Device is a pointer */
|
/* Device is a pointer */
|
||||||
|
return _gdk_broadway_server_grab_pointer (broadway_display->server,
|
||||||
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,
|
GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
|
||||||
owner_events);
|
owner_events,
|
||||||
gdk_display_flush (display);
|
event_mask,
|
||||||
}
|
time_);
|
||||||
|
|
||||||
/* TODO: What about toplevel grab events if we're not connected? */
|
|
||||||
|
|
||||||
return GDK_GRAB_SUCCESS;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,31 +296,17 @@ gdk_broadway_device_ungrab (GdkDevice *device,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Device is a pointer */
|
/* Device is a pointer */
|
||||||
|
serial = _gdk_broadway_server_ungrab_pointer (broadway_display->server, time_);
|
||||||
|
|
||||||
if (broadway_display->pointer_grab_window != NULL &&
|
if (serial != 0)
|
||||||
time_ != 0 && broadway_display->pointer_grab_time > time_)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* TODO: What about toplevel grab events if we're not connected? */
|
|
||||||
|
|
||||||
if (broadway_display->output)
|
|
||||||
{
|
{
|
||||||
serial = broadway_output_ungrab_pointer (broadway_display->output);
|
|
||||||
gdk_display_flush (display);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
serial = broadway_display->saved_serial;
|
|
||||||
}
|
|
||||||
|
|
||||||
grab = _gdk_display_get_last_device_grab (display, device);
|
grab = _gdk_display_get_last_device_grab (display, device);
|
||||||
if (grab &&
|
if (grab &&
|
||||||
(time_ == GDK_CURRENT_TIME ||
|
(time_ == GDK_CURRENT_TIME ||
|
||||||
grab->time == GDK_CURRENT_TIME ||
|
grab->time == GDK_CURRENT_TIME ||
|
||||||
!TIME_IS_LATER (grab->time, time_)))
|
!TIME_IS_LATER (grab->time, time_)))
|
||||||
grab->serial_end = serial;
|
grab->serial_end = serial;
|
||||||
|
}
|
||||||
broadway_display->pointer_grab_window = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,7 +317,6 @@ gdk_broadway_device_window_at_position (GdkDevice *device,
|
|||||||
GdkModifierType *mask,
|
GdkModifierType *mask,
|
||||||
gboolean get_toplevel)
|
gboolean get_toplevel)
|
||||||
{
|
{
|
||||||
gboolean res;
|
|
||||||
GdkScreen *screen;
|
GdkScreen *screen;
|
||||||
GdkWindow *root_window;
|
GdkWindow *root_window;
|
||||||
GdkWindow *window;
|
GdkWindow *window;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -27,15 +27,13 @@
|
|||||||
#include "gdkwindow.h"
|
#include "gdkwindow.h"
|
||||||
#include "gdkinternals.h"
|
#include "gdkinternals.h"
|
||||||
#include "gdkmain.h"
|
#include "gdkmain.h"
|
||||||
#include "broadway.h"
|
#include "gdkbroadway-server.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _GdkBroadwayDisplay GdkBroadwayDisplay;
|
typedef struct _GdkBroadwayDisplay GdkBroadwayDisplay;
|
||||||
typedef struct _GdkBroadwayDisplayClass GdkBroadwayDisplayClass;
|
typedef struct _GdkBroadwayDisplayClass GdkBroadwayDisplayClass;
|
||||||
|
|
||||||
typedef struct BroadwayInput BroadwayInput;
|
|
||||||
|
|
||||||
#define GDK_TYPE_BROADWAY_DISPLAY (gdk_broadway_display_get_type())
|
#define GDK_TYPE_BROADWAY_DISPLAY (gdk_broadway_display_get_type())
|
||||||
#define GDK_BROADWAY_DISPLAY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplay))
|
#define GDK_BROADWAY_DISPLAY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplay))
|
||||||
#define GDK_BROADWAY_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplayClass))
|
#define GDK_BROADWAY_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplayClass))
|
||||||
@@ -43,82 +41,6 @@ typedef struct BroadwayInput BroadwayInput;
|
|||||||
#define GDK_IS_BROADWAY_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_DISPLAY))
|
#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))
|
#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
|
struct _GdkBroadwayDisplay
|
||||||
{
|
{
|
||||||
GdkDisplay parent_instance;
|
GdkDisplay parent_instance;
|
||||||
@@ -129,10 +51,6 @@ struct _GdkBroadwayDisplay
|
|||||||
GList *toplevels;
|
GList *toplevels;
|
||||||
|
|
||||||
GSource *event_source;
|
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 */
|
/* Keyboard related information */
|
||||||
GdkKeymap *keymap;
|
GdkKeymap *keymap;
|
||||||
@@ -147,24 +65,7 @@ struct _GdkBroadwayDisplay
|
|||||||
/* The offscreen window that has the pointer in it (if any) */
|
/* The offscreen window that has the pointer in it (if any) */
|
||||||
GdkWindow *active_offscreen_window;
|
GdkWindow *active_offscreen_window;
|
||||||
|
|
||||||
GSocketService *service;
|
GdkBroadwayServer *server;
|
||||||
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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GdkBroadwayDisplayClass
|
struct _GdkBroadwayDisplayClass
|
||||||
|
|||||||
@@ -87,9 +87,9 @@ gdk_event_source_check (GSource *source)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_gdk_broadway_events_got_input (GdkDisplay *display,
|
_gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||||
BroadwayInputMsg *message)
|
|
||||||
{
|
{
|
||||||
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
|
GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
|
||||||
GdkScreen *screen;
|
GdkScreen *screen;
|
||||||
GdkWindow *window;
|
GdkWindow *window;
|
||||||
@@ -97,17 +97,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
GList *node;
|
GList *node;
|
||||||
|
|
||||||
switch (message->base.type) {
|
switch (message->base.type) {
|
||||||
case 'e': /* Enter */
|
case BROADWAY_EVENT_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));
|
|
||||||
|
|
||||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
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)
|
if (window)
|
||||||
{
|
{
|
||||||
event = gdk_event_new (GDK_ENTER_NOTIFY);
|
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);
|
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'l': /* Leave */
|
case BROADWAY_EVENT_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));
|
|
||||||
|
|
||||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
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)
|
if (window)
|
||||||
{
|
{
|
||||||
event = gdk_event_new (GDK_LEAVE_NOTIFY);
|
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);
|
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'm': /* Mouse move */
|
case BROADWAY_EVENT_POINTER_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));
|
|
||||||
|
|
||||||
if (_gdk_broadway_moveresize_handle_event (display, message))
|
if (_gdk_broadway_moveresize_handle_event (display, message))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -198,14 +175,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'b':
|
case BROADWAY_EVENT_BUTTON_PRESS:
|
||||||
case 'B':
|
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||||
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));
|
|
||||||
|
|
||||||
if (message->base.type != 'b' &&
|
if (message->base.type != 'b' &&
|
||||||
_gdk_broadway_moveresize_handle_event (display, message))
|
_gdk_broadway_moveresize_handle_event (display, message))
|
||||||
break;
|
break;
|
||||||
@@ -229,13 +200,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 's':
|
case BROADWAY_EVENT_SCROLL:
|
||||||
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));
|
|
||||||
|
|
||||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||||
if (window)
|
if (window)
|
||||||
{
|
{
|
||||||
@@ -254,10 +219,10 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'k':
|
case BROADWAY_EVENT_KEY_PRESS:
|
||||||
case 'K':
|
case BROADWAY_EVENT_KEY_RELEASE:
|
||||||
window = display_broadway->mouse_in_toplevel;
|
window = g_hash_table_lookup (display_broadway->id_ht,
|
||||||
|
GINT_TO_POINTER (message->key.mouse_window_id));
|
||||||
if (window)
|
if (window)
|
||||||
{
|
{
|
||||||
event = gdk_event_new (message->base.type == 'k' ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
|
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;
|
event->key.length = 0;
|
||||||
gdk_event_set_device (event, display->core_pointer);
|
gdk_event_set_device (event, display->core_pointer);
|
||||||
|
|
||||||
display_broadway->last_state = message->key.state;
|
|
||||||
|
|
||||||
node = _gdk_event_queue_append (display, event);
|
node = _gdk_event_queue_append (display, event);
|
||||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'g':
|
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||||
case 'u':
|
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||||
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
|
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'w':
|
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->configure_notify.id));
|
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->configure_notify.id));
|
||||||
if (window)
|
if (window)
|
||||||
{
|
{
|
||||||
@@ -312,7 +275,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'W':
|
case BROADWAY_EVENT_DELETE_NOTIFY:
|
||||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->delete_notify.id));
|
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->delete_notify.id));
|
||||||
if (window)
|
if (window)
|
||||||
{
|
{
|
||||||
@@ -324,7 +287,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
|
||||||
screen = gdk_display_get_default_screen (display);
|
screen = gdk_display_get_default_screen (display);
|
||||||
window = gdk_screen_get_root_window (screen);
|
window = gdk_screen_get_root_window (screen);
|
||||||
window->width = message->screen_resize_notify.width;
|
window->width = message->screen_resize_notify.width;
|
||||||
@@ -335,7 +298,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,8 +126,7 @@ GList *_gdk_broadway_screen_list_visuals (GdkScreen *screen);
|
|||||||
void _gdk_broadway_screen_size_changed (GdkScreen *screen,
|
void _gdk_broadway_screen_size_changed (GdkScreen *screen,
|
||||||
BroadwayInputScreenResizeNotify *msg);
|
BroadwayInputScreenResizeNotify *msg);
|
||||||
|
|
||||||
void _gdk_broadway_events_got_input (GdkDisplay *display,
|
void _gdk_broadway_events_got_input (BroadwayInputMsg *message);
|
||||||
BroadwayInputMsg *message);
|
|
||||||
|
|
||||||
void _gdk_broadway_screen_init_root_window (GdkScreen *screen);
|
void _gdk_broadway_screen_init_root_window (GdkScreen *screen);
|
||||||
void _gdk_broadway_screen_init_visuals (GdkScreen *screen);
|
void _gdk_broadway_screen_init_visuals (GdkScreen *screen);
|
||||||
|
|||||||
@@ -83,95 +83,17 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
|
|||||||
gdk_window_impl_broadway,
|
gdk_window_impl_broadway,
|
||||||
GDK_TYPE_WINDOW_IMPL)
|
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 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
|
static gboolean
|
||||||
dirty_flush_idle (gpointer data)
|
dirty_flush_idle (gpointer data)
|
||||||
{
|
{
|
||||||
GList *l;
|
GList *l;
|
||||||
GdkBroadwayDisplay *display;
|
GdkBroadwayDisplay *display;
|
||||||
BroadwayOutput *output;
|
|
||||||
|
|
||||||
dirty_flush_id = 0;
|
dirty_flush_id = 0;
|
||||||
|
|
||||||
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
|
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)
|
for (l = display->toplevels; l != NULL; l = l->next)
|
||||||
{
|
{
|
||||||
@@ -180,11 +102,15 @@ dirty_flush_idle (gpointer data)
|
|||||||
if (impl->dirty)
|
if (impl->dirty)
|
||||||
{
|
{
|
||||||
impl->dirty = FALSE;
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -192,64 +118,10 @@ dirty_flush_idle (gpointer data)
|
|||||||
static void
|
static void
|
||||||
queue_dirty_flush (GdkBroadwayDisplay *display)
|
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);
|
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
|
static void
|
||||||
gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
|
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));
|
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));
|
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||||
|
|
||||||
if (impl->cursor)
|
if (impl->cursor)
|
||||||
@@ -315,6 +181,7 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen)
|
|||||||
|
|
||||||
impl->screen = screen;
|
impl->screen = screen;
|
||||||
impl->wrapper = window;
|
impl->wrapper = window;
|
||||||
|
impl->id = 0;
|
||||||
|
|
||||||
window->window_type = GDK_WINDOW_ROOT;
|
window->window_type = GDK_WINDOW_ROOT;
|
||||||
window->depth = 24;
|
window->depth = 24;
|
||||||
@@ -341,13 +208,17 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
|||||||
{
|
{
|
||||||
GdkWindowImplBroadway *impl;
|
GdkWindowImplBroadway *impl;
|
||||||
GdkBroadwayDisplay *broadway_display;
|
GdkBroadwayDisplay *broadway_display;
|
||||||
static int current_id = 1; /* 0 is the root window */
|
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||||
|
|
||||||
impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
|
impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
|
||||||
window->impl = (GdkWindowImpl *)impl;
|
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);
|
g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), window);
|
||||||
impl->wrapper = 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);
|
g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
|
||||||
|
|
||||||
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
|
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
|
void
|
||||||
_gdk_broadway_window_resize_surface (GdkWindow *window)
|
_gdk_broadway_window_resize_surface (GdkWindow *window)
|
||||||
{
|
{
|
||||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||||
cairo_surface_t *old, *last_old;
|
cairo_surface_t *old;
|
||||||
|
|
||||||
if (impl->surface)
|
if (impl->surface)
|
||||||
{
|
{
|
||||||
old = impl->surface;
|
old = impl->surface;
|
||||||
last_old = impl->last_surface;
|
|
||||||
|
|
||||||
impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
impl->surface = _gdk_broadway_server_create_surface (gdk_window_get_width (impl->wrapper),
|
||||||
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));
|
gdk_window_get_height (impl->wrapper));
|
||||||
|
|
||||||
cairo_surface_destroy (old);
|
cairo_surface_destroy (old);
|
||||||
cairo_surface_destroy (last_old);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (impl->ref_surface)
|
if (impl->ref_surface)
|
||||||
@@ -413,7 +269,6 @@ static cairo_surface_t *
|
|||||||
gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
||||||
{
|
{
|
||||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||||
cairo_t *cr;
|
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
if (GDK_IS_WINDOW_IMPL_BROADWAY (window) &&
|
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 */
|
/* Create actual backing store if missing */
|
||||||
if (!impl->surface)
|
if (!impl->surface)
|
||||||
{
|
impl->surface = _gdk_broadway_server_create_surface (w, h);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a destroyable surface referencing the real one */
|
/* Create a destroyable surface referencing the real one */
|
||||||
if (!impl->ref_surface)
|
if (!impl->ref_surface)
|
||||||
@@ -485,15 +325,12 @@ _gdk_broadway_window_destroy (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
cairo_surface_destroy (impl->surface);
|
cairo_surface_destroy (impl->surface);
|
||||||
impl->surface = NULL;
|
impl->surface = NULL;
|
||||||
cairo_surface_destroy (impl->last_surface);
|
|
||||||
impl->last_surface = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||||
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||||
|
|
||||||
if (broadway_display->output)
|
_gdk_broadway_server_destroy_window (broadway_display->server,
|
||||||
broadway_output_destroy_surface (broadway_display->output,
|
|
||||||
impl->id);
|
impl->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,11 +383,9 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
|
|||||||
_gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
|
_gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||||
if (broadway_display->output)
|
if (_gdk_broadway_server_window_show (broadway_display->server, impl->id))
|
||||||
{
|
|
||||||
broadway_output_show_surface (broadway_display->output, impl->id);
|
|
||||||
queue_dirty_flush (broadway_display);
|
queue_dirty_flush (broadway_display);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -569,17 +404,8 @@ gdk_window_broadway_hide (GdkWindow *window)
|
|||||||
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
|
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||||
if (broadway_display->output)
|
if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
|
||||||
{
|
|
||||||
broadway_output_hide_surface (broadway_display->output, impl->id);
|
|
||||||
queue_dirty_flush (broadway_display);
|
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
_gdk_window_clear_update_area (window);
|
_gdk_window_clear_update_area (window);
|
||||||
}
|
}
|
||||||
@@ -600,23 +426,14 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||||
GdkBroadwayDisplay *broadway_display;
|
GdkBroadwayDisplay *broadway_display;
|
||||||
gboolean changed, size_changed;;
|
gboolean size_changed;
|
||||||
gboolean with_resize;
|
|
||||||
|
|
||||||
size_changed = changed = FALSE;
|
size_changed = FALSE;
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||||
if (with_move)
|
|
||||||
{
|
|
||||||
changed = TRUE;
|
|
||||||
window->x = x;
|
|
||||||
window->y = y;
|
|
||||||
}
|
|
||||||
|
|
||||||
with_resize = FALSE;
|
|
||||||
if (width > 0 || height > 0)
|
if (width > 0 || height > 0)
|
||||||
{
|
{
|
||||||
with_resize = TRUE;
|
|
||||||
if (width < 1)
|
if (width < 1)
|
||||||
width = 1;
|
width = 1;
|
||||||
|
|
||||||
@@ -626,7 +443,6 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
|||||||
if (width != window->width ||
|
if (width != window->width ||
|
||||||
height != window->height)
|
height != window->height)
|
||||||
{
|
{
|
||||||
changed = TRUE;
|
|
||||||
size_changed = TRUE;
|
size_changed = TRUE;
|
||||||
|
|
||||||
/* Resize clears the content */
|
/* Resize clears the content */
|
||||||
@@ -639,37 +455,16 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed)
|
_gdk_broadway_server_window_move_resize (broadway_display->server,
|
||||||
{
|
|
||||||
GdkEvent *event;
|
|
||||||
GList *node;
|
|
||||||
|
|
||||||
if (broadway_display->output != NULL)
|
|
||||||
{
|
|
||||||
broadway_output_move_resize_surface (broadway_display->output,
|
|
||||||
impl->id,
|
impl->id,
|
||||||
with_move, window->x, window->y,
|
with_move,
|
||||||
with_resize, window->width, window->height);
|
x, y,
|
||||||
|
window->width, window->height);
|
||||||
queue_dirty_flush (broadway_display);
|
queue_dirty_flush (broadway_display);
|
||||||
if (size_changed)
|
if (size_changed)
|
||||||
window->resize_count++;
|
window->resize_count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
event = gdk_event_new (GDK_CONFIGURE);
|
|
||||||
event->configure.window = g_object_ref (window);
|
|
||||||
event->configure.x = window->x;
|
|
||||||
event->configure.y = window->y;
|
|
||||||
event->configure.width = window->width;
|
|
||||||
event->configure.height = window->height;
|
|
||||||
|
|
||||||
gdk_event_set_device (event, GDK_DISPLAY_OBJECT (broadway_display)->core_pointer);
|
|
||||||
|
|
||||||
node = _gdk_event_queue_append (GDK_DISPLAY_OBJECT (broadway_display), event);
|
|
||||||
_gdk_windowing_got_event (GDK_DISPLAY_OBJECT (broadway_display), node, event,
|
|
||||||
_gdk_display_get_next_serial (GDK_DISPLAY (broadway_display)) - 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gdk_window_broadway_reparent (GdkWindow *window,
|
gdk_window_broadway_reparent (GdkWindow *window,
|
||||||
GdkWindow *new_parent,
|
GdkWindow *new_parent,
|
||||||
@@ -787,11 +582,7 @@ gdk_broadway_window_set_transient_for (GdkWindow *window,
|
|||||||
impl->transient_for = parent_id;
|
impl->transient_for = parent_id;
|
||||||
|
|
||||||
display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
||||||
if (display->output)
|
_gdk_broadway_server_window_set_transient_for (display->server, impl->id, impl->transient_for);
|
||||||
{
|
|
||||||
broadway_output_set_transient_for (display->output, impl->id, impl->transient_for);
|
|
||||||
gdk_display_flush (GDK_DISPLAY (display));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1324,20 +1115,10 @@ moveresize_lookahead (GdkDisplay *display,
|
|||||||
BroadwayInputMsg *event)
|
BroadwayInputMsg *event)
|
||||||
{
|
{
|
||||||
GdkBroadwayDisplay *broadway_display;
|
GdkBroadwayDisplay *broadway_display;
|
||||||
BroadwayInputMsg *message;
|
|
||||||
GList *l;
|
|
||||||
|
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
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
|
gboolean
|
||||||
@@ -1480,8 +1261,6 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
|||||||
|
|
||||||
/* We need a connection to be able to get mouse events, if not, punt */
|
/* We need a connection to be able to get mouse events, if not, punt */
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
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);
|
mv_resize = get_move_resize_data (GDK_WINDOW_DISPLAY (window), TRUE);
|
||||||
|
|
||||||
@@ -1622,9 +1401,6 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
GdkWindowImplBroadway *impl;
|
GdkWindowImplBroadway *impl;
|
||||||
GdkBroadwayDisplay *broadway_display;
|
GdkBroadwayDisplay *broadway_display;
|
||||||
int n_rects, i;
|
|
||||||
BroadwayRect *rects;
|
|
||||||
cairo_rectangle_int_t rect;
|
|
||||||
|
|
||||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||||
|
|
||||||
@@ -1632,26 +1408,11 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
|||||||
{
|
{
|
||||||
copy_region (impl->surface, area, dx, dy);
|
copy_region (impl->surface, area, dx, dy);
|
||||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||||
if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced &&
|
|
||||||
broadway_display->output)
|
if (_gdk_broadway_server_window_translate (broadway_display->server,
|
||||||
{
|
impl->id,
|
||||||
copy_region (impl->last_surface, area, dx, dy);
|
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);
|
queue_dirty_flush (broadway_display);
|
||||||
g_free (rects);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1661,8 +1422,7 @@ gdk_broadway_get_last_seen_time (GdkWindow *window)
|
|||||||
GdkDisplay *display;
|
GdkDisplay *display;
|
||||||
|
|
||||||
display = gdk_window_get_display (window);
|
display = gdk_window_get_display (window);
|
||||||
_gdk_broadway_display_consume_all_input (display);
|
return _gdk_broadway_server_get_last_seen_time (GDK_BROADWAY_DISPLAY (display)->server);
|
||||||
return (guint32) GDK_BROADWAY_DISPLAY (display)->last_seen_time;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
@@ -18,13 +18,13 @@
|
|||||||
* Author: Alexander Larsson <alexl@redhat.com>
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_APP_LAUNCH_CONTEXT_H__
|
|
||||||
#define __GDK_APP_LAUNCH_CONTEXT_H__
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_CAIRO_H__
|
|
||||||
#define __GDK_CAIRO_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdkcolor.h>
|
#include <gdk/gdkcolor.h>
|
||||||
#include <gdk/gdkrgba.h>
|
#include <gdk/gdkrgba.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_COLOR_H__
|
||||||
|
#define __GDK_COLOR_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_COLOR_H__
|
|
||||||
#define __GDK_COLOR_H__
|
|
||||||
|
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_CURSOR_H__
|
||||||
|
#define __GDK_CURSOR_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_CURSOR_H__
|
|
||||||
#define __GDK_CURSOR_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_DEVICE_H__
|
|
||||||
#define __GDK_DEVICE_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_DEVICE_MANAGER_H__
|
|
||||||
#define __GDK_DEVICE_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk/gdkdevice.h>
|
#include <gdk/gdkdevice.h>
|
||||||
|
|
||||||
|
|||||||
@@ -19,13 +19,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_DISPLAY_H__
|
|
||||||
#define __GDK_DISPLAY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk/gdkevents.h>
|
#include <gdk/gdkevents.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_DISPLAY_MANAGER_H__
|
|
||||||
#define __GDK_DISPLAY_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk/gdkdisplay.h>
|
#include <gdk/gdkdisplay.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_DND_H__
|
||||||
|
#define __GDK_DND_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_DND_H__
|
|
||||||
#define __GDK_DND_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk/gdkdevice.h>
|
#include <gdk/gdkdevice.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_EVENTS_H__
|
||||||
|
#define __GDK_EVENTS_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_EVENTS_H__
|
|
||||||
#define __GDK_EVENTS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdkcolor.h>
|
#include <gdk/gdkcolor.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_KEYS_H__
|
||||||
|
#define __GDK_KEYS_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_KEYS_H__
|
|
||||||
#define __GDK_KEYS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_MAIN_H__
|
||||||
|
#define __GDK_MAIN_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_MAIN_H__
|
|
||||||
#define __GDK_MAIN_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_PANGO_H__
|
|
||||||
#define __GDK_PANGO_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_PIXBUF_H__
|
||||||
|
#define __GDK_PIXBUF_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_PIXBUF_H__
|
|
||||||
#define __GDK_PIXBUF_H__
|
|
||||||
|
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_PROPERTY_H__
|
||||||
|
#define __GDK_PROPERTY_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_PROPERTY_H__
|
|
||||||
#define __GDK_PROPERTY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_RECTANGLE_H__
|
||||||
|
#define __GDK_RECTANGLE_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_RECTANGLE_H__
|
|
||||||
#define __GDK_RECTANGLE_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_RGBA_H__
|
||||||
|
#define __GDK_RGBA_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_RGBA_H__
|
|
||||||
#define __GDK_RGBA_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -19,13 +19,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_SCREEN_H__
|
|
||||||
#define __GDK_SCREEN_H__
|
|
||||||
|
|
||||||
#include <cairo.h>
|
#include <cairo.h>
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_SELECTION_H__
|
||||||
|
#define __GDK_SELECTION_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_SELECTION_H__
|
|
||||||
#define __GDK_SELECTION_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_TEST_UTILS_H__
|
|
||||||
#define __GDK_TEST_UTILS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkwindow.h>
|
#include <gdk/gdkwindow.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_THREADS_H__
|
||||||
|
#define __GDK_THREADS_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_THREADS_H__
|
|
||||||
#define __GDK_THREADS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_TYPES_H__
|
||||||
|
#define __GDK_TYPES_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_TYPES_H__
|
|
||||||
#define __GDK_TYPES_H__
|
|
||||||
|
|
||||||
/* GDK uses "glib". (And so does GTK).
|
/* GDK uses "glib". (And so does GTK).
|
||||||
*/
|
*/
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_VISUAL_H__
|
||||||
|
#define __GDK_VISUAL_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_VISUAL_H__
|
|
||||||
#define __GDK_VISUAL_H__
|
|
||||||
|
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -6550,7 +6550,7 @@ gdk_window_set_background (GdkWindow *window,
|
|||||||
**/
|
**/
|
||||||
void
|
void
|
||||||
gdk_window_set_background_rgba (GdkWindow *window,
|
gdk_window_set_background_rgba (GdkWindow *window,
|
||||||
GdkRGBA *rgba)
|
const GdkRGBA *rgba)
|
||||||
{
|
{
|
||||||
cairo_pattern_t *pattern;
|
cairo_pattern_t *pattern;
|
||||||
|
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __GDK_WINDOW_H__
|
||||||
|
#define __GDK_WINDOW_H__
|
||||||
|
|
||||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdk.h> can be included directly."
|
#error "Only <gdk/gdk.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WINDOW_H__
|
|
||||||
#define __GDK_WINDOW_H__
|
|
||||||
|
|
||||||
#include <gdk/gdkversionmacros.h>
|
#include <gdk/gdkversionmacros.h>
|
||||||
#include <gdk/gdktypes.h>
|
#include <gdk/gdktypes.h>
|
||||||
#include <gdk/gdkevents.h>
|
#include <gdk/gdkevents.h>
|
||||||
@@ -660,7 +660,7 @@ GDK_DEPRECATED_IN_3_4_FOR(gdk_window_set_background_rgba)
|
|||||||
void gdk_window_set_background (GdkWindow *window,
|
void gdk_window_set_background (GdkWindow *window,
|
||||||
const GdkColor *color);
|
const GdkColor *color);
|
||||||
void gdk_window_set_background_rgba (GdkWindow *window,
|
void gdk_window_set_background_rgba (GdkWindow *window,
|
||||||
GdkRGBA *rgba);
|
const GdkRGBA *rgba);
|
||||||
void gdk_window_set_background_pattern (GdkWindow *window,
|
void gdk_window_set_background_pattern (GdkWindow *window,
|
||||||
cairo_pattern_t *pattern);
|
cairo_pattern_t *pattern);
|
||||||
cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow *window);
|
cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow *window);
|
||||||
|
|||||||
@@ -28,9 +28,14 @@ GdkWindow *_gdk_root = NULL;
|
|||||||
GdkOSXVersion
|
GdkOSXVersion
|
||||||
gdk_quartz_osx_version (void)
|
gdk_quartz_osx_version (void)
|
||||||
{
|
{
|
||||||
gint minor;
|
static gint32 minor = GDK_OSX_UNSUPPORTED;
|
||||||
OSErr err = Gestalt (gestaltSystemVersionMinor, &minor);
|
|
||||||
|
if (minor == GDK_OSX_UNSUPPORTED)
|
||||||
|
{
|
||||||
|
OSErr err = Gestalt (gestaltSystemVersionMinor, (SInt32*)&minor);
|
||||||
|
|
||||||
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
||||||
|
}
|
||||||
|
|
||||||
if (minor < GDK_OSX_MIN)
|
if (minor < GDK_OSX_MIN)
|
||||||
return GDK_OSX_UNSUPPORTED;
|
return GDK_OSX_UNSUPPORTED;
|
||||||
|
|||||||
@@ -48,7 +48,8 @@ typedef enum
|
|||||||
GDK_OSX_LEOPARD = 5,
|
GDK_OSX_LEOPARD = 5,
|
||||||
GDK_OSX_SNOW_LEOPARD = 6,
|
GDK_OSX_SNOW_LEOPARD = 6,
|
||||||
GDK_OSX_LION = 7,
|
GDK_OSX_LION = 7,
|
||||||
GDK_OSX_CURRENT = 7,
|
GDK_OSX_MOUNTAIN_LION = 8,
|
||||||
|
GDK_OSX_CURRENT = 8,
|
||||||
GDK_OSX_NEW = 99
|
GDK_OSX_NEW = 99
|
||||||
} GdkOSXVersion;
|
} GdkOSXVersion;
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_CURSOR_H__
|
|
||||||
#define __GDK_QUARTZ_CURSOR_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_DEVICE_CORE_H__
|
|
||||||
#define __GDK_QUARTZ_DEVICE_CORE_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
|
||||||
#define __GDK_QUARTZ_DEVICE_MANAGER_CORE_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_DISPLAY_H__
|
|
||||||
#define __GDK_QUARTZ_DISPLAY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
|
||||||
#define __GDK_QUARTZ_DISPLAY_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_DND_H__
|
|
||||||
#define __GDK_QUARTZ_DND_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_KEYS_H__
|
|
||||||
#define __GDK_QUARTZ_KEYS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -16,13 +16,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_SCREEN_H__
|
|
||||||
#define __GDK_QUARTZ_SCREEN_H__
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_UTILS_H__
|
|
||||||
#define __GDK_QUARTZ_UTILS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_VISUAL_H__
|
|
||||||
#define __GDK_QUARTZ_VISUAL_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -17,13 +17,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_QUARTZ_WINDOW_H__
|
|
||||||
#define __GDK_QUARTZ_WINDOW_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_CURSOR_H__
|
|
||||||
#define __GDK_WIN32_CURSOR_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_DISPLAY_H__
|
|
||||||
#define __GDK_WIN32_DISPLAY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_DISPLAY_MANAGER_H__
|
|
||||||
#define __GDK_WIN32_DISPLAY_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_DND_H__
|
|
||||||
#define __GDK_WIN32_DND_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_KEYS_H__
|
|
||||||
#define __GDK_WIN32_KEYS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_SCREEN_H__
|
|
||||||
#define __GDK_WIN32_SCREEN_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKWIN32_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkwin32.h> can be included directly."
|
#error "Only <gdk/gdkwin32.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_WIN32_WINDOW_H__
|
|
||||||
#define __GDK_WIN32_WINDOW_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
#include "gdk.h"
|
#include "gdk.h"
|
||||||
#include "gdkwindowimpl.h"
|
#include "gdkwindowimpl.h"
|
||||||
@@ -1533,7 +1534,7 @@ gdk_win32_window_set_urgency_hint (GdkWindow *window,
|
|||||||
gboolean urgent)
|
gboolean urgent)
|
||||||
{
|
{
|
||||||
FLASHWINFO flashwinfo;
|
FLASHWINFO flashwinfo;
|
||||||
typedef BOOL (*PFN_FlashWindowEx) (FLASHWINFO*);
|
typedef BOOL (WINAPI *PFN_FlashWindowEx) (FLASHWINFO*);
|
||||||
PFN_FlashWindowEx flashWindowEx = NULL;
|
PFN_FlashWindowEx flashWindowEx = NULL;
|
||||||
|
|
||||||
g_return_if_fail (GDK_IS_WINDOW (window));
|
g_return_if_fail (GDK_IS_WINDOW (window));
|
||||||
@@ -3264,7 +3265,7 @@ gdk_win32_window_set_opacity (GdkWindow *window,
|
|||||||
gdouble opacity)
|
gdouble opacity)
|
||||||
{
|
{
|
||||||
LONG exstyle;
|
LONG exstyle;
|
||||||
typedef BOOL (*PFN_SetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
|
typedef BOOL (WINAPI *PFN_SetLayeredWindowAttributes) (HWND, COLORREF, BYTE, DWORD);
|
||||||
PFN_SetLayeredWindowAttributes setLayeredWindowAttributes = NULL;
|
PFN_SetLayeredWindowAttributes setLayeredWindowAttributes = NULL;
|
||||||
|
|
||||||
g_return_if_fail (GDK_IS_WINDOW (window));
|
g_return_if_fail (GDK_IS_WINDOW (window));
|
||||||
|
|||||||
@@ -917,12 +917,14 @@ is_parent_of (GdkWindow *parent,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GdkWindow *
|
static gboolean
|
||||||
get_event_window (GdkEventTranslator *translator,
|
get_event_window (GdkEventTranslator *translator,
|
||||||
XIEvent *ev)
|
XIEvent *ev,
|
||||||
|
GdkWindow **window_p)
|
||||||
{
|
{
|
||||||
GdkDisplay *display;
|
GdkDisplay *display;
|
||||||
GdkWindow *window = NULL;
|
GdkWindow *window = NULL;
|
||||||
|
gboolean should_have_window = TRUE;
|
||||||
|
|
||||||
display = gdk_device_manager_get_display (GDK_DEVICE_MANAGER (translator));
|
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);
|
window = gdk_x11_window_lookup_for_display (display, xev->event);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
should_have_window = FALSE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return window;
|
*window_p = window;
|
||||||
|
|
||||||
|
if (should_have_window && !window)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -1122,7 +1132,8 @@ gdk_x11_device_manager_xi2_translate_event (GdkEventTranslator *translator,
|
|||||||
if (!ev)
|
if (!ev)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
window = get_event_window (translator, ev);
|
if (!get_event_window (translator, ev, &window))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
if (window && GDK_WINDOW_DESTROYED (window))
|
if (window && GDK_WINDOW_DESTROYED (window))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -1650,6 +1661,7 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
|
|||||||
{
|
{
|
||||||
GdkX11DeviceManagerXI2 *device_manager;
|
GdkX11DeviceManagerXI2 *device_manager;
|
||||||
XIEvent *ev;
|
XIEvent *ev;
|
||||||
|
GdkWindow *window = NULL;
|
||||||
|
|
||||||
device_manager = (GdkX11DeviceManagerXI2 *) translator;
|
device_manager = (GdkX11DeviceManagerXI2 *) translator;
|
||||||
|
|
||||||
@@ -1659,7 +1671,8 @@ gdk_x11_device_manager_xi2_get_window (GdkEventTranslator *translator,
|
|||||||
|
|
||||||
ev = (XIEvent *) xevent->xcookie.data;
|
ev = (XIEvent *) xevent->xcookie.data;
|
||||||
|
|
||||||
return get_event_window (translator, ev);
|
get_event_window (translator, ev, &window);
|
||||||
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
GdkDevice *
|
GdkDevice *
|
||||||
|
|||||||
@@ -1369,15 +1369,14 @@ _gdk_x11_display_open (const gchar *display_name)
|
|||||||
XSynchronize (display_x11->xdisplay, True);
|
XSynchronize (display_x11->xdisplay, True);
|
||||||
|
|
||||||
class_hint = XAllocClassHint();
|
class_hint = XAllocClassHint();
|
||||||
class_hint->res_name = g_get_prgname ();
|
class_hint->res_name = (char *) g_get_prgname ();
|
||||||
|
|
||||||
class_hint->res_class = (char *)gdk_get_program_class ();
|
class_hint->res_class = (char *)gdk_get_program_class ();
|
||||||
|
|
||||||
/* XmbSetWMProperties sets the RESOURCE_NAME environment variable
|
/* XmbSetWMProperties sets the RESOURCE_NAME environment variable
|
||||||
* from argv[0], so we just synthesize an argument array here.
|
* from argv[0], so we just synthesize an argument array here.
|
||||||
*/
|
*/
|
||||||
argc = 1;
|
argc = 1;
|
||||||
argv[0] = g_get_prgname ();
|
argv[0] = (char *) g_get_prgname ();
|
||||||
|
|
||||||
XmbSetWMProperties (display_x11->xdisplay,
|
XmbSetWMProperties (display_x11->xdisplay,
|
||||||
display_x11->leader_window,
|
display_x11->leader_window,
|
||||||
|
|||||||
@@ -280,6 +280,10 @@ get_current_desktop (GdkScreen *screen)
|
|||||||
unsigned char *data_return = NULL;
|
unsigned char *data_return = NULL;
|
||||||
int workspace = 0;
|
int workspace = 0;
|
||||||
|
|
||||||
|
if (!gdk_x11_screen_supports_net_wm_hint (screen,
|
||||||
|
gdk_atom_intern_static_string ("_NET_CURRENT_DESKTOP")))
|
||||||
|
return workspace;
|
||||||
|
|
||||||
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
|
display = GDK_DISPLAY_XDISPLAY (gdk_screen_get_display (screen));
|
||||||
win = XRootWindow (display, GDK_SCREEN_XNUMBER (screen));
|
win = XRootWindow (display, GDK_SCREEN_XNUMBER (screen));
|
||||||
|
|
||||||
@@ -330,6 +334,10 @@ get_work_area (GdkScreen *screen,
|
|||||||
area->width = gdk_screen_get_width (screen);
|
area->width = gdk_screen_get_width (screen);
|
||||||
area->height = gdk_screen_get_height (screen);
|
area->height = gdk_screen_get_height (screen);
|
||||||
|
|
||||||
|
if (!gdk_x11_screen_supports_net_wm_hint (screen,
|
||||||
|
gdk_atom_intern_static_string ("_NET_WORKAREA")))
|
||||||
|
return;
|
||||||
|
|
||||||
if (workarea == None)
|
if (workarea == None)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|||||||
@@ -82,7 +82,8 @@ static const char gdk_settings_names[] =
|
|||||||
"Gtk/VisibleFocus\0" "gtk-visible-focus\0"
|
"Gtk/VisibleFocus\0" "gtk-visible-focus\0"
|
||||||
"Gtk/ShellShowsAppMenu\0" "gtk-shell-shows-app-menu\0"
|
"Gtk/ShellShowsAppMenu\0" "gtk-shell-shows-app-menu\0"
|
||||||
"Gtk/ShellShowsMenubar\0" "gtk-shell-shows-menubar\0"
|
"Gtk/ShellShowsMenubar\0" "gtk-shell-shows-menubar\0"
|
||||||
"Gtk/EnablePrimaryPaste\0" "gtk-enable-primary-paste\0";
|
"Gtk/EnablePrimaryPaste\0" "gtk-enable-primary-paste\0"
|
||||||
|
"Gtk/RecentFilesMaxAge\0" "gtk-recent-files-max-age\0";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -140,5 +141,6 @@ static const struct
|
|||||||
{ 1767, 1784 },
|
{ 1767, 1784 },
|
||||||
{ 1802, 1824 },
|
{ 1802, 1824 },
|
||||||
{ 1849, 1871 },
|
{ 1849, 1871 },
|
||||||
{ 1895, 1918 }
|
{ 1895, 1918 },
|
||||||
|
{ 1943, 1965 }
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1738,7 +1738,9 @@ static void
|
|||||||
move_to_current_desktop (GdkWindow *window)
|
move_to_current_desktop (GdkWindow *window)
|
||||||
{
|
{
|
||||||
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
||||||
gdk_atom_intern_static_string ("_NET_WM_DESKTOP")))
|
gdk_atom_intern_static_string ("_NET_WM_DESKTOP")) &&
|
||||||
|
gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
||||||
|
gdk_atom_intern_static_string ("_NET_CURRENT_DESKTOP")))
|
||||||
{
|
{
|
||||||
Atom type;
|
Atom type;
|
||||||
gint format;
|
gint format;
|
||||||
@@ -2717,7 +2719,9 @@ gdk_x11_window_get_frame_extents (GdkWindow *window,
|
|||||||
xwindow = GDK_WINDOW_XID (window);
|
xwindow = GDK_WINDOW_XID (window);
|
||||||
|
|
||||||
/* first try: use _NET_FRAME_EXTENTS */
|
/* first try: use _NET_FRAME_EXTENTS */
|
||||||
if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), xwindow,
|
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
||||||
|
gdk_atom_intern_static_string ("_NET_FRAME_EXTENTS")) &&
|
||||||
|
XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), xwindow,
|
||||||
gdk_x11_get_xatom_by_name_for_display (display,
|
gdk_x11_get_xatom_by_name_for_display (display,
|
||||||
"_NET_FRAME_EXTENTS"),
|
"_NET_FRAME_EXTENTS"),
|
||||||
0, G_MAXLONG, False, XA_CARDINAL, &type_return,
|
0, G_MAXLONG, False, XA_CARDINAL, &type_return,
|
||||||
@@ -2764,7 +2768,9 @@ gdk_x11_window_get_frame_extents (GdkWindow *window,
|
|||||||
/* use NETWM_VIRTUAL_ROOTS if available */
|
/* use NETWM_VIRTUAL_ROOTS if available */
|
||||||
root = GDK_WINDOW_XROOTWIN (window);
|
root = GDK_WINDOW_XROOTWIN (window);
|
||||||
|
|
||||||
if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), root,
|
if (gdk_x11_screen_supports_net_wm_hint (GDK_WINDOW_SCREEN (window),
|
||||||
|
gdk_atom_intern_static_string ("_NET_VIRTUAL_ROOTS")) &&
|
||||||
|
XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), root,
|
||||||
gdk_x11_get_xatom_by_name_for_display (display,
|
gdk_x11_get_xatom_by_name_for_display (display,
|
||||||
"_NET_VIRTUAL_ROOTS"),
|
"_NET_VIRTUAL_ROOTS"),
|
||||||
0, G_MAXLONG, False, XA_WINDOW, &type_return,
|
0, G_MAXLONG, False, XA_WINDOW, &type_return,
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
|
||||||
#define __GDK_X11_APP_LAUNCH_CONTEXT_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_CURSOR_H__
|
|
||||||
#define __GDK_X11_CURSOR_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_DEVICE_H__
|
|
||||||
#define __GDK_X11_DEVICE_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_DEVICE_MANAGER_H__
|
|
||||||
#define __GDK_X11_DEVICE_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_DISPLAY_H__
|
|
||||||
#define __GDK_X11_DISPLAY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_DISPLAY_MANAGER_H__
|
|
||||||
#define __GDK_X11_DISPLAY_MANAGER_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_DND_H__
|
|
||||||
#define __GDK_X11_DND_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -15,13 +15,13 @@
|
|||||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_KEYS_H__
|
|
||||||
#define __GDK_X11_KEYS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_PROPERTY_H__
|
|
||||||
#define __GDK_X11_PROPERTY_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_SCREEN_H__
|
|
||||||
#define __GDK_X11_SCREEN_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_SELECTION_H__
|
|
||||||
#define __GDK_X11_SELECTION_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_UTILS_H__
|
|
||||||
#define __GDK_X11_UTILS_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_VISUAL_H__
|
|
||||||
#define __GDK_X11_VISUAL_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -22,13 +22,13 @@
|
|||||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
* 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)
|
#if !defined (__GDKX_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||||
#error "Only <gdk/gdkx.h> can be included directly."
|
#error "Only <gdk/gdkx.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __GDK_X11_WINDOW_H__
|
|
||||||
#define __GDK_X11_WINDOW_H__
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ else
|
|||||||
GTK_PRINT_PREVIEW_COMMAND="evince --unlink-tempfile --preview --print-settings %s %f"
|
GTK_PRINT_PREVIEW_COMMAND="evince --unlink-tempfile --preview --print-settings %s %f"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = a11y . tests
|
SUBDIRS = a11y native . tests
|
||||||
|
|
||||||
if HAVE_PAPI_CUPS
|
if HAVE_PAPI_CUPS
|
||||||
GTK_PRINT_BACKENDS=file,papi,cups
|
GTK_PRINT_BACKENDS=file,papi,cups
|
||||||
@@ -107,12 +107,12 @@ endif
|
|||||||
libgtkincludedir = $(includedir)/gtk-3.0/gtk
|
libgtkincludedir = $(includedir)/gtk-3.0/gtk
|
||||||
libadd = \
|
libadd = \
|
||||||
$(top_builddir)/gdk/libgdk-3.la \
|
$(top_builddir)/gdk/libgdk-3.la \
|
||||||
$(top_builddir)/gtk/a11y/libgail.la \
|
$(top_builddir)/gtk/a11y/libgtka11y.la \
|
||||||
$(GMODULE_LIBS) \
|
$(GMODULE_LIBS) \
|
||||||
$(GTK_DEP_LIBS)
|
$(GTK_DEP_LIBS)
|
||||||
deps = \
|
deps = \
|
||||||
$(top_builddir)/gdk/libgdk-3.la \
|
$(top_builddir)/gdk/libgdk-3.la \
|
||||||
$(top_builddir)/gtk/a11y/libgail.la
|
$(top_builddir)/gtk/a11y/libgtka11y.la
|
||||||
|
|
||||||
# libtool stuff: set version and export symbols for resolving
|
# libtool stuff: set version and export symbols for resolving
|
||||||
# since automake doesn't support conditionalized libsomething_la_LDFLAGS
|
# since automake doesn't support conditionalized libsomething_la_LDFLAGS
|
||||||
@@ -148,6 +148,7 @@ deprecated_h_sources = \
|
|||||||
deprecated/gtkcolorsel.h \
|
deprecated/gtkcolorsel.h \
|
||||||
deprecated/gtkcolorseldialog.h \
|
deprecated/gtkcolorseldialog.h \
|
||||||
deprecated/gtkfontsel.h \
|
deprecated/gtkfontsel.h \
|
||||||
|
deprecated/gtkgradient.h \
|
||||||
deprecated/gtkhandlebox.h \
|
deprecated/gtkhandlebox.h \
|
||||||
deprecated/gtkhbbox.h \
|
deprecated/gtkhbbox.h \
|
||||||
deprecated/gtkhbox.h \
|
deprecated/gtkhbox.h \
|
||||||
@@ -156,8 +157,9 @@ deprecated_h_sources = \
|
|||||||
deprecated/gtkhscrollbar.h \
|
deprecated/gtkhscrollbar.h \
|
||||||
deprecated/gtkhseparator.h \
|
deprecated/gtkhseparator.h \
|
||||||
deprecated/gtkhsv.h \
|
deprecated/gtkhsv.h \
|
||||||
deprecated/gtkstyle.h \
|
|
||||||
deprecated/gtkrc.h \
|
deprecated/gtkrc.h \
|
||||||
|
deprecated/gtkstyle.h \
|
||||||
|
deprecated/gtksymboliccolor.h \
|
||||||
deprecated/gtktable.h \
|
deprecated/gtktable.h \
|
||||||
deprecated/gtktearoffmenuitem.h \
|
deprecated/gtktearoffmenuitem.h \
|
||||||
deprecated/gtkvbbox.h \
|
deprecated/gtkvbbox.h \
|
||||||
@@ -167,9 +169,14 @@ deprecated_h_sources = \
|
|||||||
deprecated/gtkvseparator.h \
|
deprecated/gtkvseparator.h \
|
||||||
deprecated/gtkvpaned.h
|
deprecated/gtkvpaned.h
|
||||||
|
|
||||||
|
deprecated_private_h_sources = \
|
||||||
|
deprecated/gtkgradientprivate.h \
|
||||||
|
deprecated/gtksymboliccolorprivate.h
|
||||||
|
|
||||||
gtk_public_h_sources = \
|
gtk_public_h_sources = \
|
||||||
gtk.h \
|
gtk.h \
|
||||||
gtkx.h \
|
gtkx.h \
|
||||||
|
gtk-a11y.h \
|
||||||
gtkaboutdialog.h \
|
gtkaboutdialog.h \
|
||||||
gtkaccelgroup.h \
|
gtkaccelgroup.h \
|
||||||
gtkaccellabel.h \
|
gtkaccellabel.h \
|
||||||
@@ -249,7 +256,6 @@ gtk_public_h_sources = \
|
|||||||
gtkfontchooserdialog.h \
|
gtkfontchooserdialog.h \
|
||||||
gtkfontchooserwidget.h \
|
gtkfontchooserwidget.h \
|
||||||
gtkframe.h \
|
gtkframe.h \
|
||||||
gtkgradient.h \
|
|
||||||
gtkgrid.h \
|
gtkgrid.h \
|
||||||
gtkiconfactory.h \
|
gtkiconfactory.h \
|
||||||
gtkicontheme.h \
|
gtkicontheme.h \
|
||||||
@@ -330,7 +336,6 @@ gtk_public_h_sources = \
|
|||||||
gtkstyleproperties.h \
|
gtkstyleproperties.h \
|
||||||
gtkstyleprovider.h \
|
gtkstyleprovider.h \
|
||||||
gtkswitch.h \
|
gtkswitch.h \
|
||||||
gtksymboliccolor.h \
|
|
||||||
gtktestutils.h \
|
gtktestutils.h \
|
||||||
gtktextattributes.h \
|
gtktextattributes.h \
|
||||||
gtktextbuffer.h \
|
gtktextbuffer.h \
|
||||||
@@ -478,7 +483,6 @@ gtk_private_h_sources = \
|
|||||||
gtkfilesystemmodel.h \
|
gtkfilesystemmodel.h \
|
||||||
gtkfontchooserprivate.h \
|
gtkfontchooserprivate.h \
|
||||||
gtkfontchooserutils.h \
|
gtkfontchooserutils.h \
|
||||||
gtkgradientprivate.h \
|
|
||||||
gtkhslaprivate.h \
|
gtkhslaprivate.h \
|
||||||
gtkiconcache.h \
|
gtkiconcache.h \
|
||||||
gtkiconhelperprivate.h \
|
gtkiconhelperprivate.h \
|
||||||
@@ -527,7 +531,6 @@ gtk_private_h_sources = \
|
|||||||
gtkstylepropertiesprivate.h \
|
gtkstylepropertiesprivate.h \
|
||||||
gtkstylepropertyprivate.h \
|
gtkstylepropertyprivate.h \
|
||||||
gtkstyleproviderprivate.h \
|
gtkstyleproviderprivate.h \
|
||||||
gtksymboliccolorprivate.h \
|
|
||||||
gtktextbtree.h \
|
gtktextbtree.h \
|
||||||
gtktextbufferserialize.h \
|
gtktextbufferserialize.h \
|
||||||
gtktextchildprivate.h \
|
gtktextchildprivate.h \
|
||||||
@@ -556,6 +559,7 @@ deprecated_c_sources = \
|
|||||||
deprecated/gtkcolorsel.c \
|
deprecated/gtkcolorsel.c \
|
||||||
deprecated/gtkcolorseldialog.c \
|
deprecated/gtkcolorseldialog.c \
|
||||||
deprecated/gtkfontsel.c \
|
deprecated/gtkfontsel.c \
|
||||||
|
deprecated/gtkgradient.c \
|
||||||
deprecated/gtkhandlebox.c \
|
deprecated/gtkhandlebox.c \
|
||||||
deprecated/gtkhbbox.c \
|
deprecated/gtkhbbox.c \
|
||||||
deprecated/gtkhbox.c \
|
deprecated/gtkhbox.c \
|
||||||
@@ -566,6 +570,7 @@ deprecated_c_sources = \
|
|||||||
deprecated/gtkhsv.c \
|
deprecated/gtkhsv.c \
|
||||||
deprecated/gtkrc.c \
|
deprecated/gtkrc.c \
|
||||||
deprecated/gtkstyle.c \
|
deprecated/gtkstyle.c \
|
||||||
|
deprecated/gtksymboliccolor.c \
|
||||||
deprecated/gtktable.c \
|
deprecated/gtktable.c \
|
||||||
deprecated/gtktearoffmenuitem.c \
|
deprecated/gtktearoffmenuitem.c \
|
||||||
deprecated/gtkvbbox.c \
|
deprecated/gtkvbbox.c \
|
||||||
@@ -721,7 +726,6 @@ gtk_base_c_sources = \
|
|||||||
gtkfontchooserutils.c \
|
gtkfontchooserutils.c \
|
||||||
gtkfontchooserwidget.c \
|
gtkfontchooserwidget.c \
|
||||||
gtkframe.c \
|
gtkframe.c \
|
||||||
gtkgradient.c \
|
|
||||||
gtkgrid.c \
|
gtkgrid.c \
|
||||||
gtkhsla.c \
|
gtkhsla.c \
|
||||||
gtkiconcache.c \
|
gtkiconcache.c \
|
||||||
@@ -824,7 +828,6 @@ gtk_base_c_sources = \
|
|||||||
gtkstyleprovider.c \
|
gtkstyleprovider.c \
|
||||||
gtkstyleproviderprivate.c \
|
gtkstyleproviderprivate.c \
|
||||||
gtkswitch.c \
|
gtkswitch.c \
|
||||||
gtksymboliccolor.c \
|
|
||||||
gtktestutils.c \
|
gtktestutils.c \
|
||||||
gtktextattributes.c \
|
gtktextattributes.c \
|
||||||
gtktextbtree.c \
|
gtktextbtree.c \
|
||||||
@@ -973,6 +976,7 @@ gtk_private_h_sources += $(gtk_use_quartz_private_h_sources)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
gtk_all_private_h_sources = \
|
gtk_all_private_h_sources = \
|
||||||
|
$(deprecated_private_h_sources) \
|
||||||
$(gtk_private_h_sources) \
|
$(gtk_private_h_sources) \
|
||||||
$(gtk_use_x11_private_h_sources) \
|
$(gtk_use_x11_private_h_sources) \
|
||||||
$(gtk_use_win32_private_h_sources) \
|
$(gtk_use_win32_private_h_sources) \
|
||||||
@@ -1650,12 +1654,20 @@ stamp-icons: $(STOCK_ICONS)
|
|||||||
if USE_EXTERNAL_ICON_CACHE
|
if USE_EXTERNAL_ICON_CACHE
|
||||||
gtk_update_icon_cache_program = $(GTK_UPDATE_ICON_CACHE)
|
gtk_update_icon_cache_program = $(GTK_UPDATE_ICON_CACHE)
|
||||||
else
|
else
|
||||||
|
if CROSS_COMPILING
|
||||||
|
gtk_update_icon_cache_program = ./native/native-update-icon-cache
|
||||||
|
else
|
||||||
gtk_update_icon_cache_program = ./gtk-update-icon-cache
|
gtk_update_icon_cache_program = ./gtk-update-icon-cache
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
gtkbuiltincache.h: @REBUILD@ stamp-icons
|
gtkbuiltincache.h: @REBUILD@ stamp-icons
|
||||||
if !USE_EXTERNAL_ICON_CACHE
|
if !USE_EXTERNAL_ICON_CACHE
|
||||||
$(AM_V_at) $(MAKE) $(AM_MAKEFLAGS) gtk-update-icon-cache$(EXEEXT) $(GTK_UPDATE_ICON_CACHE_MANIFEST)
|
if CROSS_COMPILING
|
||||||
|
$(AM_V_at) $(MAKE) $(AM_MAKEFLAGS) -C native/
|
||||||
|
else
|
||||||
|
$(AM_V_at) $(MAKE) $(AM_MAKEFLAGS) gtk-update-icon-cache$(EXEEXT)
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
$(AM_V_GEN) $(gtk_update_icon_cache_program) --quiet --force --ignore-theme-index \
|
$(AM_V_GEN) $(gtk_update_icon_cache_program) --quiet --force --ignore-theme-index \
|
||||||
--source builtin_icons stock-icons > gtkbuiltincache.h.tmp && \
|
--source builtin_icons stock-icons > gtkbuiltincache.h.tmp && \
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
include $(top_srcdir)/Makefile.decl
|
include $(top_srcdir)/Makefile.decl
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libgail.la
|
noinst_LTLIBRARIES = libgtka11y.la
|
||||||
|
|
||||||
gail_c_sources = \
|
gtka11y_c_sources = \
|
||||||
gail.c \
|
gtkaccessibility.c \
|
||||||
|
gtkaccessibilitymisc.c \
|
||||||
|
gtkaccessibilityutil.c \
|
||||||
gtkarrowaccessible.c \
|
gtkarrowaccessible.c \
|
||||||
gtkbooleancellaccessible.c \
|
gtkbooleancellaccessible.c \
|
||||||
gtkbuttonaccessible.c \
|
gtkbuttonaccessible.c \
|
||||||
@@ -36,7 +38,6 @@ gail_c_sources = \
|
|||||||
gtkrenderercellaccessible.c \
|
gtkrenderercellaccessible.c \
|
||||||
gtkscaleaccessible.c \
|
gtkscaleaccessible.c \
|
||||||
gtkscalebuttonaccessible.c \
|
gtkscalebuttonaccessible.c \
|
||||||
gtkscrollbaraccessible.c \
|
|
||||||
gtkscrolledwindowaccessible.c \
|
gtkscrolledwindowaccessible.c \
|
||||||
gtkspinbuttonaccessible.c \
|
gtkspinbuttonaccessible.c \
|
||||||
gtkspinneraccessible.c \
|
gtkspinneraccessible.c \
|
||||||
@@ -48,19 +49,16 @@ gail_c_sources = \
|
|||||||
gtktoplevelaccessible.c \
|
gtktoplevelaccessible.c \
|
||||||
gtktreeviewaccessible.c \
|
gtktreeviewaccessible.c \
|
||||||
gtkwidgetaccessible.c \
|
gtkwidgetaccessible.c \
|
||||||
gtkwindowaccessible.c \
|
gtkwindowaccessible.c
|
||||||
gailutil.c \
|
|
||||||
gailmisc.c
|
|
||||||
|
|
||||||
gail_private_h_sources = \
|
gtka11yincludedir = $(includedir)/gtk-3.0/gtk/a11y
|
||||||
gail.h \
|
gtka11yinclude_HEADERS = \
|
||||||
gtkarrowaccessible.h \
|
gtkarrowaccessible.h \
|
||||||
gtkbooleancellaccessible.h \
|
gtkbooleancellaccessible.h \
|
||||||
gtkbuttonaccessible.h \
|
gtkbuttonaccessible.h \
|
||||||
gtkcellaccessible.h \
|
gtkcellaccessible.h \
|
||||||
gtkcellaccessibleparent.h \
|
gtkcellaccessibleparent.h \
|
||||||
gtkcheckmenuitemaccessible.h \
|
gtkcheckmenuitemaccessible.h \
|
||||||
gtkcolorswatchaccessible.h \
|
|
||||||
gtkcomboboxaccessible.h \
|
gtkcomboboxaccessible.h \
|
||||||
gtkcontaineraccessible.h \
|
gtkcontaineraccessible.h \
|
||||||
gtkcontainercellaccessible.h \
|
gtkcontainercellaccessible.h \
|
||||||
@@ -74,8 +72,8 @@ gail_private_h_sources = \
|
|||||||
gtklinkbuttonaccessible.h \
|
gtklinkbuttonaccessible.h \
|
||||||
gtklockbuttonaccessible.h \
|
gtklockbuttonaccessible.h \
|
||||||
gtkmenuaccessible.h \
|
gtkmenuaccessible.h \
|
||||||
gtkmenushellaccessible.h \
|
|
||||||
gtkmenuitemaccessible.h \
|
gtkmenuitemaccessible.h \
|
||||||
|
gtkmenushellaccessible.h \
|
||||||
gtknotebookaccessible.h \
|
gtknotebookaccessible.h \
|
||||||
gtknotebookpageaccessible.h \
|
gtknotebookpageaccessible.h \
|
||||||
gtkpanedaccessible.h \
|
gtkpanedaccessible.h \
|
||||||
@@ -86,7 +84,6 @@ gail_private_h_sources = \
|
|||||||
gtkrenderercellaccessible.h \
|
gtkrenderercellaccessible.h \
|
||||||
gtkscaleaccessible.h \
|
gtkscaleaccessible.h \
|
||||||
gtkscalebuttonaccessible.h \
|
gtkscalebuttonaccessible.h \
|
||||||
gtkscrollbaraccessible.h \
|
|
||||||
gtkscrolledwindowaccessible.h \
|
gtkscrolledwindowaccessible.h \
|
||||||
gtkspinbuttonaccessible.h \
|
gtkspinbuttonaccessible.h \
|
||||||
gtkspinneraccessible.h \
|
gtkspinneraccessible.h \
|
||||||
@@ -98,15 +95,29 @@ gail_private_h_sources = \
|
|||||||
gtktoplevelaccessible.h \
|
gtktoplevelaccessible.h \
|
||||||
gtktreeviewaccessible.h \
|
gtktreeviewaccessible.h \
|
||||||
gtkwidgetaccessible.h \
|
gtkwidgetaccessible.h \
|
||||||
gtkwindowaccessible.h \
|
gtkwindowaccessible.h
|
||||||
gailutil.h \
|
|
||||||
gailmisc.h
|
|
||||||
|
|
||||||
libgail_la_SOURCES = \
|
gtka11y_private_h_sources = \
|
||||||
$(gail_c_sources) \
|
gtkaccessibility.h \
|
||||||
$(gail_private_h_sources)
|
gtkaccessibilitymisc.h \
|
||||||
|
gtkaccessibilityutil.h \
|
||||||
|
gtkcellaccessibleprivate.h \
|
||||||
|
gtkcolorswatchaccessibleprivate.h \
|
||||||
|
gtkcontaineraccessibleprivate.h \
|
||||||
|
gtkiconviewaccessibleprivate.h \
|
||||||
|
gtklinkbuttonaccessibleprivate.h \
|
||||||
|
gtklockbuttonaccessibleprivate.h \
|
||||||
|
gtkrangeaccessibleprivate.h \
|
||||||
|
gtkstatusbaraccessibleprivate.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) \
|
||||||
-I$(top_srcdir)/gdk \
|
-I$(top_srcdir)/gdk \
|
||||||
-I$(top_builddir)/gdk \
|
-I$(top_builddir)/gdk \
|
||||||
@@ -116,16 +127,16 @@ libgail_la_CPPFLAGS = \
|
|||||||
-DGTK_COMPILATION \
|
-DGTK_COMPILATION \
|
||||||
$(AM_CPPFLAGS)
|
$(AM_CPPFLAGS)
|
||||||
|
|
||||||
libgail_la_CFLAGS = \
|
libgtka11y_la_CFLAGS = \
|
||||||
$(GTK_DEP_CFLAGS) \
|
$(GTK_DEP_CFLAGS) \
|
||||||
$(GTK_DEBUG_FLAGS) \
|
$(GTK_DEBUG_FLAGS) \
|
||||||
$(AM_CFLAGS)
|
$(AM_CFLAGS)
|
||||||
|
|
||||||
libgail_la_LIBADD = \
|
libgtka11y_la_LIBADD = \
|
||||||
$(GTK_DEP_LIBS) \
|
$(GTK_DEP_LIBS) \
|
||||||
$(INTLLIBS)
|
$(INTLLIBS)
|
||||||
|
|
||||||
libgail_la_LDFLAGS = \
|
libgtka11y_la_LDFLAGS = \
|
||||||
$(LDFLAGS)
|
$(LDFLAGS)
|
||||||
|
|
||||||
dist-hook: ../../build/win32/vs9/libgail.vcproj ../../build/win32/vs10/libgail.vcxproj ../../build/win32/vs10/libgail.vcxproj.filters
|
dist-hook: ../../build/win32/vs9/libgail.vcproj ../../build/win32/vs10/libgail.vcxproj ../../build/win32/vs10/libgail.vcxproj.filters
|
||||||
|
|||||||
@@ -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.
|
* Copyright 2001 Sun Microsystems Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@@ -17,7 +17,11 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "gail.h"
|
#include "gtkaccessibility.h"
|
||||||
|
#include "gtkaccessibilityutil.h"
|
||||||
|
#include "gtkaccessibilitymisc.h"
|
||||||
|
|
||||||
|
#include "gtkwindowaccessible.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -32,8 +36,6 @@
|
|||||||
#include <gtk/gtktogglebutton.h>
|
#include <gtk/gtktogglebutton.h>
|
||||||
#include <gtk/gtkcombobox.h>
|
#include <gtk/gtkcombobox.h>
|
||||||
#include <gtk/gtkaccessible.h>
|
#include <gtk/gtkaccessible.h>
|
||||||
#include "gailutil.h"
|
|
||||||
#include "gailmisc.h"
|
|
||||||
|
|
||||||
#ifdef GDK_WINDOWING_X11
|
#ifdef GDK_WINDOWING_X11
|
||||||
#include <atk-bridge.h>
|
#include <atk-bridge.h>
|
||||||
@@ -81,7 +83,7 @@ static GQuark quark_focus_object = 0;
|
|||||||
static int initialized = FALSE;
|
static int initialized = FALSE;
|
||||||
|
|
||||||
static AtkObject*
|
static AtkObject*
|
||||||
gail_get_accessible_for_widget (GtkWidget *widget,
|
get_accessible_for_widget (GtkWidget *widget,
|
||||||
gboolean *transient)
|
gboolean *transient)
|
||||||
{
|
{
|
||||||
AtkObject *obj = NULL;
|
AtkObject *obj = NULL;
|
||||||
@@ -516,7 +518,7 @@ gail_focus_notify (GtkWidget *widget)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (_focus_widget)
|
if (_focus_widget)
|
||||||
atk_obj = gail_get_accessible_for_widget (_focus_widget, &transient);
|
atk_obj = get_accessible_for_widget (_focus_widget, &transient);
|
||||||
else
|
else
|
||||||
atk_obj = NULL;
|
atk_obj = NULL;
|
||||||
/*
|
/*
|
||||||
@@ -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
|
void
|
||||||
_gtk_accessibility_shutdown (void)
|
_gtk_accessibility_shutdown (void)
|
||||||
{
|
{
|
||||||
@@ -810,13 +992,13 @@ _gtk_accessibility_shutdown (void)
|
|||||||
#ifdef GDK_WINDOWING_X11
|
#ifdef GDK_WINDOWING_X11
|
||||||
atk_bridge_adaptor_cleanup ();
|
atk_bridge_adaptor_cleanup ();
|
||||||
#endif
|
#endif
|
||||||
_gail_util_uninstall ();
|
|
||||||
|
undo_window_event_initialization ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_gtk_accessibility_init (void)
|
_gtk_accessibility_init (void)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (initialized)
|
if (initialized)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -826,10 +1008,12 @@ _gtk_accessibility_init (void)
|
|||||||
atk_focus_tracker_init (gail_focus_tracker_init);
|
atk_focus_tracker_init (gail_focus_tracker_init);
|
||||||
focus_tracker_id = atk_add_focus_tracker (gail_focus_tracker);
|
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
|
#ifdef GDK_WINDOWING_X11
|
||||||
atk_bridge_adaptor_init (NULL, NULL);
|
atk_bridge_adaptor_init (NULL, NULL);
|
||||||
#endif
|
#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.
|
* Copyright 2001 Sun Microsystems Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* 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/>.
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __GTK_GAIL_H__
|
#ifndef __GTK_ACCESSIBILITY_H__
|
||||||
#define __GTK_GAIL_H__
|
#define __GTK_ACCESSIBILITY_H__
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
#include "gtk/gtkwidget.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
void _gtk_accessibility_shutdown (void);
|
void _gtk_accessibility_shutdown (void);
|
||||||
void _gtk_accessibility_init (void);
|
void _gtk_accessibility_init (void);
|
||||||
|
|
||||||
|
gboolean _gtk_accessibility_key_snooper (GtkWidget *widget,
|
||||||
|
GdkEventKey *event);
|
||||||
|
|
||||||
G_END_DECLS
|
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.
|
* Copyright 2001, 2002, 2003 Sun Microsystems Inc.
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
@@ -18,33 +18,33 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include <gtk/gtk.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
|
static void
|
||||||
gail_misc_threads_enter (AtkMisc *misc)
|
gtk_misc_impl_threads_enter (AtkMisc *misc)
|
||||||
{
|
{
|
||||||
gdk_threads_enter ();
|
gdk_threads_enter ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gail_misc_threads_leave (AtkMisc *misc)
|
gtk_misc_impl_threads_leave (AtkMisc *misc)
|
||||||
{
|
{
|
||||||
gdk_threads_leave ();
|
gdk_threads_leave ();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_gail_misc_class_init (GailMiscClass *klass)
|
_gtk_misc_impl_class_init (GtkMiscImplClass *klass)
|
||||||
{
|
{
|
||||||
AtkMiscClass *misc_class = ATK_MISC_CLASS (klass);
|
AtkMiscClass *misc_class = ATK_MISC_CLASS (klass);
|
||||||
|
|
||||||
misc_class->threads_enter = gail_misc_threads_enter;
|
misc_class->threads_enter = gtk_misc_impl_threads_enter;
|
||||||
misc_class->threads_leave = gail_misc_threads_leave;
|
misc_class->threads_leave = gtk_misc_impl_threads_leave;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
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;
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user