Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 39c8db124d | |||
| 1c11f6ed1a | |||
| 291ff93a6b | |||
| ccc4f0f133 | |||
| eecd228493 | |||
| f69179b562 | |||
| b79946956b | |||
| 1b5615df75 | |||
| adce361ec5 | |||
| 209e39ab8a | |||
| 3158630a68 | |||
| 2b02d97a93 | |||
| f194d499c3 | |||
| 3fd45e0267 | |||
| 2a537b5b8b | |||
| 89e420b390 | |||
| 426e8c8c97 | |||
| 78a8782b13 | |||
| da8de20928 | |||
| 2eaabf5ad3 | |||
| e299dfa462 | |||
| edd21e61f2 | |||
| 80a89c5245 | |||
| 739b6e1862 | |||
| 03a7331c5c |
+5
-5
@@ -18,12 +18,12 @@ GTK+ requires the following packages:
|
||||
Simple install procedure
|
||||
========================
|
||||
|
||||
% tar xf gtk+-@GTK_VERSION@.tar.xz # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
% gzip -cd gtk+-@GTK_VERSION@.tar.gz | tar xvf - # unpack the sources
|
||||
% cd gtk+-@GTK_VERSION@ # change to the toplevel directory
|
||||
% ./configure # run the `configure' script
|
||||
% make # build GTK+
|
||||
[ Become root if necessary ]
|
||||
% make install # install GTK+
|
||||
% make install # install GTK+
|
||||
|
||||
The Details
|
||||
===========
|
||||
|
||||
@@ -1,349 +1,3 @@
|
||||
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
|
||||
=================================
|
||||
|
||||
* Theming:
|
||||
- Improve touch text handle theming
|
||||
- Always draw background of menuitems
|
||||
|
||||
* Geometry management
|
||||
- Size groups now handle height-for-width
|
||||
- Fix corner cases in label size allocation
|
||||
|
||||
* Accessibility
|
||||
- Make entry icons accessible
|
||||
|
||||
* Filechooser
|
||||
- Don't add duplicate bookmarks
|
||||
- Remember sidebar width
|
||||
|
||||
* Wayland: Build against wayland-client 1.0
|
||||
|
||||
* Bugs fixed:
|
||||
524295 remember the file chooser side pane's position
|
||||
577806 gtk_file_chooser_add_shortcut_folder adds duplicates...
|
||||
677609 GtkSizeGroup regression in GTK+ 3.3.20
|
||||
683896 Clean up global resources when the display is closed
|
||||
686021 spinner animation should not be subject to enable-an...
|
||||
686347 Clickable icons are not accessible as children of te...
|
||||
687059 icon-theme: support loading symbolic GFileIcons from...
|
||||
687196 filesystemmodel: invalidate nodes on file remove
|
||||
687467 Commit "Implement proper cross-fades for gradients" ...
|
||||
687842 Support partially transparent widgets
|
||||
687872 Segfault when attempting to get character extents fo...
|
||||
687977 icon-theme: Add some preconditions for NULL arguments
|
||||
|
||||
* Translation updates:
|
||||
Assamese
|
||||
Brazilian Portuguese
|
||||
Estonian
|
||||
Galician
|
||||
German
|
||||
Greek
|
||||
Gujarati
|
||||
Indonesian
|
||||
Latvian
|
||||
Lithuanian
|
||||
Marathi
|
||||
Norwegian bokmål
|
||||
Serbian
|
||||
Slovenian
|
||||
Spanish
|
||||
Traditional Chinese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.7.0
|
||||
=================================
|
||||
|
||||
* Add an "inverted" property to GtkLevelBar
|
||||
|
||||
* Support RTL flipping in GtkLevelBar
|
||||
|
||||
* Various memory leak fixes
|
||||
|
||||
* Wayland: Update for protocol changes
|
||||
|
||||
* Bugs fixed:
|
||||
684288 level-bar: add an "inverted" property like GtkProgr...
|
||||
684415 Fix drag-motion event handling
|
||||
684980 Improve the appearance of the dragged header
|
||||
686013 CSS: crash drawing a GtkEntry in gedit
|
||||
686152 Calls gdk_window_get_frame_extents with a potential...
|
||||
686209 memleak with "text-shadow" css
|
||||
686265 scrolledwindow: set GDK_EXPOSURE_MASK on the oversh...
|
||||
686280 GtkScrollbar and GtkScale rendering broken in gtk 3.6
|
||||
686366 Use named union for _GtkSymbolicColor in gtk/gtksym...
|
||||
|
||||
* Translation updates:
|
||||
Czech
|
||||
Estonian
|
||||
Galician
|
||||
Indonesian
|
||||
Lithuanian
|
||||
Serbian
|
||||
Slovak
|
||||
Slovenian
|
||||
Spanish
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.6.1
|
||||
=================================
|
||||
|
||||
* CSS:
|
||||
- huge refactoring to avoid computing wrong values
|
||||
- treeview: Invalidate children properly
|
||||
- treeview: Fix computing child paths
|
||||
|
||||
* Broadway:
|
||||
- use binary websockets when available
|
||||
|
||||
* Bugs fixed:
|
||||
646221 Imperfect Russian translation of 'Print preview'...
|
||||
682395 Nautilus tabs have black background
|
||||
684517 window: Delay showing auto mnemonics on focus in
|
||||
684639 GTK+ 3.5.18 makes Epiphany unusable
|
||||
684984 No focus rendering for Icon Views in SELECTION_N...
|
||||
685449 Non-uniform borders on GtkScrolledWindow break c...
|
||||
685996 trivial build fix: test uses = not ==
|
||||
Fix a multi-display problem in touch handle code
|
||||
App chooser: respect NoDisplay
|
||||
|
||||
* Translation updates:
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Italian
|
||||
Japanese
|
||||
Khmer
|
||||
Norwegian bokmål
|
||||
Russian
|
||||
Slovak
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.6.0
|
||||
=================================
|
||||
|
||||
* Add support for blur to CSS shadows
|
||||
|
||||
* Bugs fixed:
|
||||
679883 When printing Custom paper sizes GTK Print Dialog...
|
||||
684258 Crash when calling gtk_application_set_menubar twice
|
||||
684606 GtkMenuButton: implement rtl flipping
|
||||
684607 GtkSearchEntry: flip the clear icon in rtl
|
||||
Fix style context path for internal buttons
|
||||
|
||||
* Translation updates:
|
||||
Bengali
|
||||
Brazilian Portuguese
|
||||
Bulgarian
|
||||
Catalan
|
||||
Catalan (Valencian)
|
||||
Czech
|
||||
Galician
|
||||
German
|
||||
Gujarati
|
||||
Hebrew
|
||||
Hindi
|
||||
Kannada
|
||||
Kyrgyz
|
||||
Latvian
|
||||
Malayalam
|
||||
Punjabi
|
||||
Russian
|
||||
Serbian
|
||||
Telugu
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.18
|
||||
==================================
|
||||
|
||||
* GMenu:
|
||||
- Support namespaces for actions
|
||||
- Allow submenus to have actions for opening
|
||||
- New function: gtk_menu_shell_bind_model
|
||||
|
||||
* CSS:
|
||||
- Parse and support CSS animations
|
||||
- Support cross-fading and transitions
|
||||
|
||||
* OS X:
|
||||
- Adjust scrollbar and scale behavior according to platform
|
||||
|
||||
* Bugs fixed
|
||||
643611 Leak on gail_widget_get_description
|
||||
658694 GtkAssistant: Unable to change current page in prepare...
|
||||
670390 -GtkMenuBar-shadow-type: none disables background inst...
|
||||
671786 Glade XML files cannot set an ImageMenuItem accelerato...
|
||||
674108 Hard crash due to wrong NSAutoreleasePool stacking
|
||||
676890 GtkButton are still highlighted after removing them fr...
|
||||
677559 argument of Gdk.Keymap.map_virtual_modifiers is not co...
|
||||
680962 GtkMenuButton doesn't display accelerators when used w...
|
||||
682630 GMenuModel attribute for an action to toggle on submen...
|
||||
682831 gtkmodelmenu: expose API for action namespace
|
||||
683474 Print dialog lists custom paper sizes twice for "Print...
|
||||
683627 Memory leak in style_data_lookup
|
||||
683718 box: Fix typo
|
||||
683738 Simplify GtkApplicationWindow accel handling
|
||||
683874 Load settings.ini also from XDG_CONFIG_DIRS
|
||||
683896 Clean up global resources when the display is closed
|
||||
684038 togglebutton: always set PRELIGHT state when in_button...
|
||||
684076 clean up a11y on shutdown
|
||||
684096 GtkWidget:drag-data-received code sample refers to rem...
|
||||
684156 fontchooserwidget: scroll to the currently selected row
|
||||
|
||||
* Translation updates
|
||||
Arabic
|
||||
Assamese
|
||||
Belarusian
|
||||
Brazilian Portuguese
|
||||
British English
|
||||
Danish
|
||||
Finnish
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Hebrew
|
||||
Hungarian
|
||||
Indonesian
|
||||
Korean
|
||||
Lithuanian
|
||||
Persian
|
||||
Polish
|
||||
Portuguese
|
||||
Punjabi
|
||||
Serbian
|
||||
Slovenian
|
||||
Thai
|
||||
Spanish
|
||||
Russian
|
||||
Traditional Chinese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.16
|
||||
==================================
|
||||
|
||||
* Fix critical warnings on startup in nautilus
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.14
|
||||
==================================
|
||||
|
||||
* Input method support
|
||||
- Propagate input purpose and hints to individual IMs
|
||||
- Add a hint to suppress on-screen keyboards
|
||||
|
||||
* GtkEntry can now set Pango attributes for its text
|
||||
|
||||
* GtkEntry and GtkTextView show 'selection handles' when
|
||||
used with touch devices
|
||||
|
||||
* GtkSpinButton can be oriented vertically
|
||||
|
||||
* Bugs fixed
|
||||
645065 GtkFileChooserButton doesn't handle closing its dialo...
|
||||
661973 gtk+ reacts on F10 press incorrectly with xkeyboard-c...
|
||||
672046 Issues with widget state propagation
|
||||
672431 the alt+tab app switch makes mnemonics flash
|
||||
676787 Update printing demo to use new print setting
|
||||
679144 Gdk doesn't properly find the child area with alpha
|
||||
681617 radio button text isn't centered when draw indicator ...
|
||||
682129 Print Dialog / Improving "Print to file" option
|
||||
682291 GtkMenuButton .ui issues
|
||||
682552 Improve the layout of the mount operations dialog
|
||||
682662 GtkAspectFrame: vertical alignment should be top/bott...
|
||||
682724 Fix a typo in the the comments
|
||||
682825 Also compile gtkdbusgenerated.c on non-UNIX environme...
|
||||
682919 Crash in GTK+-3.x (3.0.x-3.5.12+) on Windows with CJK...
|
||||
683001 Make headings bold in message dialogs by default
|
||||
683168 Make spinbutton orientable
|
||||
|
||||
* Translation updates
|
||||
Assamese
|
||||
French
|
||||
Galician
|
||||
Greek
|
||||
Indonesian
|
||||
Japanese
|
||||
Kazakh
|
||||
Latvian
|
||||
Lithuanian
|
||||
Norwegian bokmål
|
||||
Persian
|
||||
Polish
|
||||
Punjabi
|
||||
Spanish
|
||||
Vietnamese
|
||||
|
||||
|
||||
Overview of Changes in GTK+ 3.5.12
|
||||
==================================
|
||||
|
||||
|
||||
@@ -75,17 +75,8 @@ Patches should be in unified diff form. (The -up option to GNU diff.)
|
||||
Release notes for 3.6
|
||||
=====================
|
||||
|
||||
* The accessibility bridge code that exports accessible objects
|
||||
on the bus is now used by default; atk-bridge has been converted
|
||||
into a library that GTK+ links against. To void the linking,
|
||||
pass --without-atk-bridge when configuring GTK+.
|
||||
|
||||
* GDK threading support has been deprecated. It is recommended to
|
||||
use g_idle_add(), g_main_context_invoke() and similar funtions
|
||||
to make all GTK+ calls from the main thread.
|
||||
|
||||
* GTK+ now follows the XDG Base Directory specification for
|
||||
user configuration and data files. In detail,
|
||||
* Now follows the XDG Base Directory specification for user
|
||||
configuration and data files. In detail,
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/custom-papers is the new location
|
||||
for $HOME/.gtk-custom-papers
|
||||
* $XDG_CONFIG_HOME/gtk-3.0/bookmarks is the new location
|
||||
|
||||
+10
-16
@@ -5,7 +5,7 @@
|
||||
<CopyDir>$(GlibEtcInstallRoot)</CopyDir>
|
||||
<DefDir>$(SolutionDir)$(Configuration)\$(Platform)\obj\$(ProjectName)</DefDir>
|
||||
<GtkApiVersion>3.0</GtkApiVersion>
|
||||
<GtkBinaryVersion>3.0.0</GtkBinaryVersion>
|
||||
<GtkBinaryVersion>2.10.0</GtkBinaryVersion>
|
||||
<GtkDummyPrefix>\"/dummy\"</GtkDummyPrefix>
|
||||
<GtkPrefixDefine>GTK_PREFIX="\"$(GtkDummyPrefix)\""</GtkPrefixDefine>
|
||||
<GdkDefines>GDK_COMPILATION;G_LOG_DOMAIN="\"Gdk\""</GdkDefines>
|
||||
@@ -18,24 +18,24 @@ mkdir $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.dll $(CopyDir)\bin
|
||||
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin
|
||||
|
||||
mkdir $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
mkdir $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy $(Configuration)\$(Platform)\bin\*.exe $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.c $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.css $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.h $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.ui $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.jpg $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.png $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\share\gtk-$(GtkApiVersion)\demo
|
||||
copy ..\..\..\demos\gtk-demo\*.gif $(CopyDir)\bin\gtk3-demo
|
||||
|
||||
|
||||
mkdir $(CopyDir)\lib
|
||||
@@ -319,8 +319,6 @@ copy ..\..\..\gtk\gtklabel.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklayout.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklevelbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtklinkbutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkliststore.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@@ -333,8 +331,6 @@ copy ..\..\..\gtk\gtkmenu.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenubutton.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenuitem.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkmenushell.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
@@ -415,8 +411,6 @@ copy ..\..\..\gtk\gtkscrollbar.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkscrolledwindow.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtksearchentry.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkselection.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
copy ..\..\..\gtk\gtkseparator.h $(CopyDir)\include\gtk-$(GtkApiVersion)\gtk
|
||||
|
||||
@@ -176,8 +176,6 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\drawingarea.c" />
|
||||
|
||||
@@ -47,12 +47,6 @@
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_multiplebgs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_pixbufs.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\css_shadows.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\..\demos\gtk-demo\demo_resources.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
|
||||
@@ -41,7 +41,7 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h

|
||||
/>
|
||||
<UserMacro
|
||||
Name="GtkBinaryVersion"
|
||||
Value="3.0.0"
|
||||
Value="2.10.0"
|
||||
/>
|
||||
<UserMacro
|
||||
Name="GtkDummyPrefix"
|
||||
@@ -69,17 +69,16 @@ copy ..\..\..\gdk\gdkconfig.h.win32 ..\..\..\gdk\gdkconfig.h

|
||||
echo on

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

|
||||
|
||||
@@ -171,8 +171,6 @@
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\combobox.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_accordion.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_basics.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_pixbufs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_shadows.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\css_multiplebgs.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\demo_resources.c" />
|
||||
<File RelativePath="..\..\..\demos\gtk-demo\dialog.c" />
|
||||
|
||||
+3
-5
@@ -20,6 +20,9 @@
|
||||
/* Define the location where the catalogs will be installed */
|
||||
#define GTK_LOCALEDIR "NONE/share/locale"
|
||||
|
||||
/* Define if we're using atk-bridge-2.0 */
|
||||
/* #undef HAVE_ATK_BRIDGE */
|
||||
|
||||
/* Define to 1 if you have the `bind_textdomain_codeset' function. */
|
||||
#define HAVE_BIND_TEXTDOMAIN_CODESET 1
|
||||
|
||||
@@ -296,11 +299,6 @@
|
||||
/* Define to 1 if the X Window System is missing or not being used. */
|
||||
/* #undef X_DISPLAY_MISSING */
|
||||
|
||||
/* Enable large inode numbers on Mac OS X 10.5. */
|
||||
#ifndef _DARWIN_USE_64_BIT_INODE
|
||||
# define _DARWIN_USE_64_BIT_INODE 1
|
||||
#endif
|
||||
|
||||
/* Number of bits in a file offset, on hosts where this is settable. */
|
||||
/* #undef _FILE_OFFSET_BITS */
|
||||
|
||||
|
||||
+10
-23
@@ -9,8 +9,8 @@
|
||||
# set GTK_BINARY_AGE and GTK_INTERFACE_AGE to 0.
|
||||
|
||||
m4_define([gtk_major_version], [3])
|
||||
m4_define([gtk_minor_version], [7])
|
||||
m4_define([gtk_micro_version], [5])
|
||||
m4_define([gtk_minor_version], [5])
|
||||
m4_define([gtk_micro_version], [13])
|
||||
m4_define([gtk_interface_age], [0])
|
||||
m4_define([gtk_binary_age],
|
||||
[m4_eval(100 * gtk_minor_version + gtk_micro_version)])
|
||||
@@ -39,8 +39,8 @@ AC_CONFIG_AUX_DIR([build-aux])
|
||||
m4_define([gtk_binary_version], [3.0.0])
|
||||
|
||||
# required versions of other packages
|
||||
m4_define([glib_required_version], [2.35.3])
|
||||
m4_define([pango_required_version], [1.32.4])
|
||||
m4_define([glib_required_version], [2.33.1])
|
||||
m4_define([pango_required_version], [1.30.0])
|
||||
m4_define([atk_required_version], [2.5.3])
|
||||
m4_define([cairo_required_version], [1.10.0])
|
||||
m4_define([gdk_pixbuf_required_version], [2.26.0])
|
||||
@@ -383,7 +383,7 @@ else
|
||||
fi
|
||||
AC_SUBST(DISABLE_ON_QUARTZ)
|
||||
|
||||
if test "x$enable_broadway_backend" = xyes; then
|
||||
if test "x$enable_broadway_backend" == xyes; then
|
||||
GDK_BACKENDS="$GDK_BACKENDS broadway"
|
||||
cairo_backends="$cairo_backends cairo"
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
@@ -394,8 +394,8 @@ else
|
||||
AM_CONDITIONAL(USE_BROADWAY, false)
|
||||
fi
|
||||
|
||||
if test "x$enable_wayland_backend" = "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
if test "x$enable_wayland_backend" == "xyes"; then
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
# Wayland can use cairo-gl
|
||||
cairo_backends="$cairo_backends cairo-gl"
|
||||
AC_DEFINE(GDK_WAYLAND_USE_EGL, [1], [Whether to use EGL in Wayland backend])
|
||||
@@ -407,8 +407,8 @@ if test "x$enable_wayland_backend" = "xyes"; then
|
||||
have_gio_unix=yes
|
||||
GDK_WINDOWING="$GDK_WINDOWING
|
||||
#define GDK_WINDOWING_WAYLAND"
|
||||
WAYLAND_PACKAGES="wayland-client >= 1.0.0 xkbcommon >= 0.2.0 wayland-cursor"
|
||||
if test "x$enable_wayland_cairo_gl" = "xyes"; then
|
||||
WAYLAND_PACKAGES="wayland-client xkbcommon wayland-cursor"
|
||||
if test "x$enable_wayland_cairo_gl" == "xyes"; then
|
||||
WAYLAND_PACKAGES="$WAYLAND_PACKAGES wayland-egl egl"
|
||||
fi
|
||||
AM_CONDITIONAL(USE_WAYLAND, true)
|
||||
@@ -714,6 +714,7 @@ AM_PATH_GLIB_2_0(glib_required_version, :,
|
||||
*** GLIB is always available from ftp://ftp.gtk.org/pub/gtk/.]),
|
||||
gobject gmodule-no-export)
|
||||
|
||||
dnl
|
||||
dnl Check for bind_textdomain_codeset, including -lintl if GLib brings it in.
|
||||
dnl
|
||||
gtk_save_LIBS=$LIBS
|
||||
@@ -747,19 +748,6 @@ else
|
||||
AC_MSG_RESULT([no])
|
||||
fi
|
||||
|
||||
#
|
||||
# Disable deprecation checks for all libraries we depend on on stable branches.
|
||||
# This is so newer versions of those libraries don't cause more warnings with
|
||||
# a stable GTK version.
|
||||
# We don't ever want to turn off deprecation warnings for master however, because
|
||||
# that's where we get rid of deprecated API we use.
|
||||
#
|
||||
if test m4_eval(gtk_minor_version % 2) = 0 ; then
|
||||
AC_DEFINE_UNQUOTED(GLIB_DISABLE_DEPRECATION_WARNINGS, 1,
|
||||
[Disable deprecation warnings from glib])
|
||||
fi
|
||||
|
||||
dnl
|
||||
saved_cflags="$CFLAGS"
|
||||
saved_ldflags="$LDFLAGS"
|
||||
|
||||
@@ -1787,7 +1775,6 @@ gtk/makefile.msc
|
||||
gtk/gtkversion.h
|
||||
gtk/gtk-win32.rc
|
||||
gtk/a11y/Makefile
|
||||
gtk/actors/Makefile
|
||||
gtk/tests/Makefile
|
||||
libgail-util/Makefile
|
||||
modules/Makefile
|
||||
|
||||
@@ -18,8 +18,6 @@ demos = \
|
||||
css_accordion.c \
|
||||
css_basics.c \
|
||||
css_multiplebgs.c \
|
||||
css_pixbufs.c \
|
||||
css_shadows.c \
|
||||
dialog.c \
|
||||
drawingarea.c \
|
||||
editable_cells.c \
|
||||
@@ -120,8 +118,6 @@ RESOURCES= application.ui \
|
||||
css_accordion.css \
|
||||
css_basics.css \
|
||||
css_multiplebgs.css \
|
||||
css_pixbufs.css \
|
||||
css_shadows.css \
|
||||
cssview.css \
|
||||
fancy.css \
|
||||
reset.css
|
||||
|
||||
@@ -61,7 +61,6 @@ do_css_accordion (GtkWidget *do_widget)
|
||||
data = g_bytes_get_data (bytes, &data_size);
|
||||
|
||||
gtk_css_provider_load_from_data (GTK_CSS_PROVIDER (provider), (gchar *)data, data_size, NULL);
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import url("resource:///reset.css");
|
||||
@import url("reset.css");
|
||||
|
||||
* {
|
||||
transition-property: color, background-color, border-color, background-image, padding, border-width;
|
||||
@@ -49,4 +49,4 @@ GtkWindow {
|
||||
.button:hover:active,
|
||||
.button:active {
|
||||
background-color: #993401;
|
||||
}
|
||||
}
|
||||
@@ -100,7 +100,6 @@ do_css_basics (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_basics/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("reset.css");
|
||||
|
||||
/* Set a very futuristic style by default */
|
||||
* {
|
||||
|
||||
@@ -149,7 +149,6 @@ do_css_multiplebgs (GtkWidget *do_widget)
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_multiplebgs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
g_bytes_unref (bytes);
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
|
||||
#canvas {
|
||||
transition-property: background-color, background-image;
|
||||
@@ -56,7 +56,7 @@
|
||||
/*
|
||||
#bricks-button {
|
||||
background-color: #eef;
|
||||
background-image: url('resource:///css_multiplebgs/brick.png');
|
||||
background-image: url('brick.png');
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
}
|
||||
@@ -133,4 +133,4 @@
|
||||
background-image: linear-gradient(90deg, transparent 79px, alpha(#999, 0.40) 79px, #999 80px, alpha(#999, 0.40) 81px, transparent 81px),
|
||||
linear-gradient(alpha(#bbb, 0.60), alpha(#bbb, 0.60) 1px, transparent 1px);
|
||||
}
|
||||
*/
|
||||
*/
|
||||
@@ -1,127 +0,0 @@
|
||||
/* CSS Theming/Animated backgrounds
|
||||
*
|
||||
* This demo is done in honour of the Pixbufs demo further down. It is done exclusively
|
||||
* with CSS as the background of the window.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_pixbufs (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
/* Need a filler so we get a handle */
|
||||
child = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_pixbufs/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -6,8 +6,8 @@
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
@import url("reset.css");
|
||||
@import url("cssview.css");
|
||||
|
||||
@keyframes move-the-image {
|
||||
0% { background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%; }
|
||||
@@ -46,31 +46,21 @@
|
||||
}
|
||||
|
||||
@keyframes size-the-image {
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, auto }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
|
||||
0% { background-size: 96px, 12px, 96px, 12px, 96px, 12px, 96px, 12px, 100% }
|
||||
100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, 100% }
|
||||
}
|
||||
|
||||
GtkWindow {
|
||||
background-image: url("resource:///css_pixbufs/apple-red.png"),
|
||||
url("resource:///css_pixbufs/gnome-applets.png"),
|
||||
url("resource:///css_pixbufs/gnome-calendar.png"),
|
||||
url("resource:///css_pixbufs/gnome-foot.png"),
|
||||
url("resource:///css_pixbufs/gnome-gmush.png"),
|
||||
url("resource:///css_pixbufs/gnome-gimp.png"),
|
||||
url("resource:///css_pixbufs/gnome-gsame.png"),
|
||||
url("resource:///css_pixbufs/gnu-keys.png"),
|
||||
url("resource:///css_pixbufs/background.jpg");
|
||||
background-image: url("apple-red.png"),
|
||||
url("gnome-applets.png"),
|
||||
url("gnome-calendar.png"),
|
||||
url("gnome-foot.png"),
|
||||
url("gnome-gmush.png"),
|
||||
url("gnome-gimp.png"),
|
||||
url("gnome-gsame.png"),
|
||||
url("gnu-keys.png"),
|
||||
url("background.jpg");
|
||||
background-position: 50.00% 75.00%, 67.68% 67.68%, 75.00% 50.00%, 67.68% 32.32%, 50.00% 25.00%, 32.32% 32.32%, 25.00% 50.00%, 32.32% 67.68%, 0% 0%;
|
||||
background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, repeat;
|
||||
animation: move-the-image infinite linear 3s, size-the-image infinite alternate ease-in-out 0.75s;
|
||||
}
|
||||
|
||||
/* Make the text editor has a nice style */
|
||||
.view, .scrollbar, .pane-separator {
|
||||
color: black;
|
||||
background-color: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.view:selected {
|
||||
background-color: rgba(127,127,255,0.5);
|
||||
}
|
||||
|
||||
@@ -1,147 +0,0 @@
|
||||
/* CSS Theming/Shadows
|
||||
*
|
||||
* This demo shows how to use CSS shadows.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static void
|
||||
show_parsing_error (GtkCssProvider *provider,
|
||||
GtkCssSection *section,
|
||||
const GError *error,
|
||||
GtkTextBuffer *buffer)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
const char *tag_name;
|
||||
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&start,
|
||||
gtk_css_section_get_start_line (section),
|
||||
gtk_css_section_get_start_position (section));
|
||||
gtk_text_buffer_get_iter_at_line_index (buffer,
|
||||
&end,
|
||||
gtk_css_section_get_end_line (section),
|
||||
gtk_css_section_get_end_position (section));
|
||||
|
||||
if (g_error_matches (error, GTK_CSS_PROVIDER_ERROR, GTK_CSS_PROVIDER_ERROR_DEPRECATED))
|
||||
tag_name = "warning";
|
||||
else
|
||||
tag_name = "error";
|
||||
|
||||
gtk_text_buffer_apply_tag_by_name (buffer, tag_name, &start, &end);
|
||||
}
|
||||
|
||||
static void
|
||||
css_text_changed (GtkTextBuffer *buffer,
|
||||
GtkCssProvider *provider)
|
||||
{
|
||||
GtkTextIter start, end;
|
||||
char *text;
|
||||
|
||||
gtk_text_buffer_get_start_iter (buffer, &start);
|
||||
gtk_text_buffer_get_end_iter (buffer, &end);
|
||||
gtk_text_buffer_remove_all_tags (buffer, &start, &end);
|
||||
|
||||
text = gtk_text_buffer_get_text (buffer, &start, &end, FALSE);
|
||||
gtk_css_provider_load_from_data (provider, text, -1, NULL);
|
||||
g_free (text);
|
||||
|
||||
gtk_style_context_reset_widgets (gdk_screen_get_default ());
|
||||
}
|
||||
|
||||
static void
|
||||
apply_css (GtkWidget *widget, GtkStyleProvider *provider)
|
||||
{
|
||||
gtk_style_context_add_provider (gtk_widget_get_style_context (widget), provider, G_MAXUINT);
|
||||
if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) apply_css, provider);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
create_toolbar (void)
|
||||
{
|
||||
GtkWidget *toolbar;
|
||||
GtkToolItem *item;
|
||||
|
||||
toolbar = gtk_toolbar_new ();
|
||||
gtk_widget_set_valign (toolbar, GTK_ALIGN_CENTER);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_FORWARD);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new_from_stock (GTK_STOCK_GO_BACK);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
item = gtk_tool_button_new (NULL, "Hello World");
|
||||
gtk_tool_item_set_is_important (item, TRUE);
|
||||
gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, -1);
|
||||
|
||||
return toolbar;
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
do_css_shadows (GtkWidget *do_widget)
|
||||
{
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *paned, *container, *child;
|
||||
GtkStyleProvider *provider;
|
||||
GtkTextBuffer *text;
|
||||
GBytes *bytes;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (do_widget));
|
||||
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
paned = gtk_paned_new (GTK_ORIENTATION_VERTICAL);
|
||||
gtk_container_add (GTK_CONTAINER (window), paned);
|
||||
|
||||
child = create_toolbar ();
|
||||
gtk_container_add (GTK_CONTAINER (paned), child);
|
||||
|
||||
text = gtk_text_buffer_new (NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"warning",
|
||||
"underline", PANGO_UNDERLINE_SINGLE,
|
||||
NULL);
|
||||
gtk_text_buffer_create_tag (text,
|
||||
"error",
|
||||
"underline", PANGO_UNDERLINE_ERROR,
|
||||
NULL);
|
||||
|
||||
provider = GTK_STYLE_PROVIDER (gtk_css_provider_new ());
|
||||
|
||||
container = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (paned), container);
|
||||
child = gtk_text_view_new_with_buffer (text);
|
||||
gtk_container_add (GTK_CONTAINER (container), child);
|
||||
g_signal_connect (text,
|
||||
"changed",
|
||||
G_CALLBACK (css_text_changed),
|
||||
provider);
|
||||
|
||||
bytes = g_resources_lookup_data ("/css_shadows/gtk.css", 0, NULL);
|
||||
gtk_text_buffer_set_text (text, g_bytes_get_data (bytes, NULL), g_bytes_get_size (bytes));
|
||||
|
||||
g_signal_connect (provider,
|
||||
"parsing-error",
|
||||
G_CALLBACK (show_parsing_error),
|
||||
gtk_text_view_get_buffer (GTK_TEXT_VIEW (child)));
|
||||
|
||||
apply_css (window, provider);
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show_all (window);
|
||||
else
|
||||
{
|
||||
gtk_widget_destroy (window);
|
||||
window = NULL;
|
||||
}
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
/* You can edit the text in this window to change the
|
||||
* appearance of this Window.
|
||||
* Be careful, if you screw it up, nothing might be visible
|
||||
* anymore. :)
|
||||
*/
|
||||
|
||||
/* This CSS resets all properties to their defaults values
|
||||
* and overrides all user settings and the theme in use */
|
||||
@import url("resource:///reset.css");
|
||||
@import url("resource:///cssview.css");
|
||||
|
||||
/* Get a nice background for the window */
|
||||
.background {
|
||||
background-color: #4870bc;
|
||||
background-image: linear-gradient(to left, transparent, rgba(255,255,255,.07) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, rgba(255,255,255,.13) 50%, transparent 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.17) 50%),
|
||||
linear-gradient(to left, transparent, transparent 50%, rgba(255,255,255,.19) 50%);
|
||||
background-size: 29px, 59px, 73px, 109px;
|
||||
}
|
||||
|
||||
.button {
|
||||
color: black;
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
transition: all 250ms ease-in;
|
||||
border: 1px transparent solid;
|
||||
}
|
||||
|
||||
.button:hover {
|
||||
text-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
icon-shadow: 3px 3px 5px alpha(black, 0.75);
|
||||
box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
|
||||
border: solid 1px alpha(black, 0.75);
|
||||
}
|
||||
|
||||
.button:active {
|
||||
padding: 11px 9px 9px 11px;
|
||||
text-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
</gresource>
|
||||
<gresource prefix="/css_multiplebgs">
|
||||
<file alias="gtk.css">css_multiplebgs.css</file>
|
||||
<file>brick.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/theming_custom_css">
|
||||
<file alias="gtk.css">fancy.css</file>
|
||||
@@ -28,19 +27,4 @@
|
||||
<gresource prefix="/theming_style_classes">
|
||||
<file preprocess="xml-stripblanks">theming.ui</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_pixbufs">
|
||||
<file alias="gtk.css">css_pixbufs.css</file>
|
||||
<file>background.jpg</file>
|
||||
<file>apple-red.png</file>
|
||||
<file>gnome-applets.png</file>
|
||||
<file>gnome-calendar.png</file>
|
||||
<file>gnome-foot.png</file>
|
||||
<file>gnome-gmush.png</file>
|
||||
<file>gnome-gimp.png</file>
|
||||
<file>gnome-gsame.png</file>
|
||||
<file>gnu-keys.png</file>
|
||||
</gresource>
|
||||
<gresource prefix="/css_shadows">
|
||||
<file alias="gtk.css">css_shadows.css</file>
|
||||
</gresource>
|
||||
</gresources>
|
||||
|
||||
+14
-55
@@ -1,65 +1,24 @@
|
||||
GtkButton#fancy {
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 0.7),
|
||||
alpha(white, 0) 30%),
|
||||
linear-gradient(to top,
|
||||
alpha(#babdb6, 0.4),
|
||||
alpha(#babdb6, 0) 50%),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: #3465a4;
|
||||
font-weight: bold;
|
||||
text-shadow: 0 1px white;
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, yellow, blue);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
GtkButton#fancy:hover {
|
||||
transition: all 250ms linear;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(white, 1),
|
||||
alpha(white, 0)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec 10%,
|
||||
white 40%,
|
||||
#d3d7cf,
|
||||
white 70%,
|
||||
#babdb6);
|
||||
color: #204a87;
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(135deg, blue, yellow);
|
||||
border-radius: 20px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
GtkButton#fancy:active,
|
||||
GtkButton#fancy:active:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(to bottom,
|
||||
alpha(#555753, 0.5),
|
||||
alpha(#babdb6, 0.3)),
|
||||
linear-gradient(135deg,
|
||||
#eeeeec,
|
||||
white 20%,
|
||||
#d3d7cf,
|
||||
white 80%,
|
||||
#babdb6);
|
||||
color: white;
|
||||
text-shadow: 0 1px black;
|
||||
}
|
||||
|
||||
GtkButton#fancy:backdrop,
|
||||
GtkButton#fancy:backdrop:hover {
|
||||
transition: none;
|
||||
background-image: linear-gradient(135deg,
|
||||
alpha(#eeeeec, 0.5) 10%,
|
||||
alpha(white, 0.5) 40%,
|
||||
alpha(#d3d7cf, 0.5),
|
||||
alpha(white, 0.5) 70%,
|
||||
alpha(#babdb6, 0.5));
|
||||
color: #babdb6;
|
||||
GtkButton#fancy:active {
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(yellow, yellow);
|
||||
border-radius: 20px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
GtkButton#fancy * {
|
||||
/* Yeah this should be inherited by default */
|
||||
color: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
@@ -579,7 +579,10 @@ load_file (const gchar *filename)
|
||||
}
|
||||
|
||||
if (current_file && !strcmp (current_file, names[0]))
|
||||
goto out;
|
||||
{
|
||||
g_string_free (buffer, TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
g_free (current_file);
|
||||
current_file = g_strdup (names[0]);
|
||||
@@ -595,7 +598,7 @@ load_file (const gchar *filename)
|
||||
{
|
||||
g_warning ("%s", err->message);
|
||||
g_error_free (err);
|
||||
goto out;
|
||||
return;
|
||||
}
|
||||
|
||||
file = g_fopen (full_filename, "r");
|
||||
@@ -606,7 +609,7 @@ load_file (const gchar *filename)
|
||||
g_free (full_filename);
|
||||
|
||||
if (!file)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
gtk_text_buffer_get_iter_at_offset (info_buffer, &start, 0);
|
||||
while (read_line (file, buffer))
|
||||
@@ -722,7 +725,6 @@ load_file (const gchar *filename)
|
||||
|
||||
fontify ();
|
||||
|
||||
out:
|
||||
g_string_free (buffer, TRUE);
|
||||
|
||||
g_strfreev (names);
|
||||
|
||||
@@ -149,6 +149,8 @@ do_printing (GtkWidget *do_widget)
|
||||
GtkPrintOperation *operation;
|
||||
GtkPrintSettings *settings;
|
||||
PrintData *data;
|
||||
gchar *uri, *ext;
|
||||
const gchar *dir;
|
||||
GError *error = NULL;
|
||||
|
||||
operation = gtk_print_operation_new ();
|
||||
@@ -168,14 +170,25 @@ do_printing (GtkWidget *do_widget)
|
||||
gtk_print_operation_set_embed_page_setup (operation, TRUE);
|
||||
|
||||
settings = gtk_print_settings_new ();
|
||||
dir = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
|
||||
if (dir == NULL)
|
||||
dir = g_get_home_dir ();
|
||||
if (g_strcmp0 (gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT), "ps") == 0)
|
||||
ext = ".ps";
|
||||
else if (g_strcmp0 (gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT), "svg") == 0)
|
||||
ext = ".svg";
|
||||
else
|
||||
ext = ".pdf";
|
||||
|
||||
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_BASENAME, "gtk-demo");
|
||||
uri = g_strconcat ("file://", dir, "/", "gtk-demo", ext, NULL);
|
||||
gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_OUTPUT_URI, uri);
|
||||
gtk_print_operation_set_print_settings (operation, settings);
|
||||
|
||||
gtk_print_operation_run (operation, GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, GTK_WINDOW (do_widget), &error);
|
||||
|
||||
g_object_unref (operation);
|
||||
g_object_unref (settings);
|
||||
g_free (uri);
|
||||
|
||||
if (error)
|
||||
{
|
||||
|
||||
@@ -65,26 +65,12 @@ show_about (GtkMenuItem *item, GtkWidget *window)
|
||||
g_object_unref (pixbuf);
|
||||
}
|
||||
|
||||
static void
|
||||
on_page_toggled (GtkToggleButton *button,
|
||||
GtkNotebook *pages)
|
||||
{
|
||||
gint page;
|
||||
|
||||
if (!gtk_toggle_button_get_active (button))
|
||||
return;
|
||||
|
||||
page = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "page"));
|
||||
gtk_notebook_set_current_page (pages, page);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
GtkWidget *window;
|
||||
GtkWidget *widget;
|
||||
GtkWidget *notebook;
|
||||
gboolean dark = FALSE;
|
||||
|
||||
gtk_init (&argc, &argv);
|
||||
@@ -102,15 +88,6 @@ main (int argc, char *argv[])
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (dark_toggled), NULL);
|
||||
gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (widget), dark);
|
||||
|
||||
notebook = (GtkWidget*) gtk_builder_get_object (builder, "toplevel_notebook");
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage1");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (0));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "togglepage2");
|
||||
g_object_set_data (G_OBJECT (widget), "page", GINT_TO_POINTER (1));
|
||||
g_signal_connect (widget, "toggled", G_CALLBACK (on_page_toggled), notebook);
|
||||
|
||||
widget = (GtkWidget*) gtk_builder_get_object (builder, "aboutmenuitem");
|
||||
g_signal_connect (widget, "activate", G_CALLBACK (show_about), window);
|
||||
|
||||
|
||||
+1449
-1532
File diff suppressed because it is too large
Load Diff
+13
-8
@@ -89,20 +89,25 @@ Make sure that gtk-doc is the latest released version.
|
||||
it to download.gnome.org. If you don't have an account on master.gnome.org,
|
||||
find someone who can do it for you. The command for this looks like
|
||||
|
||||
scp gtk+-2.12.10.tar.xz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org ftpadmin install gtk+-2.12.10.tar.xz
|
||||
scp gtk+-2.12.10.tar.gz matthiasc@master.gnome.org:
|
||||
ssh matthiasc@master.gnome.org
|
||||
install-module gtk+-2.12.10.tar.gz
|
||||
|
||||
15) Upload the tarball and checksum to ftp.gtk.org and put them in the right
|
||||
directory below /ftp/pub. Pay attention to correct ownership, and don't
|
||||
forget to update the LATEST file in the directory.
|
||||
15) Get the .bz2 tarball and the .md5sum files back from master.gnome.org
|
||||
You can probably also create it locally, but I've experienced md5
|
||||
mismatches when doing so.
|
||||
|
||||
16) Go to the gnome-announce list archives, find the last announce message,
|
||||
16) Upload the .gz and .bz2 tarballs and checksums to ftp.gtk.org and put
|
||||
them in the right directory below /ftp/pub. Pay attention to correct
|
||||
ownership, and don't forget to update the LATEST file in the directory.
|
||||
|
||||
17) Go to the gnome-announce list archives, find the last announce message,
|
||||
create a new message in the same form, replacing version numbers,
|
||||
commentary at the top about "what this release is about" and the
|
||||
summary of changes.
|
||||
|
||||
17) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
18) Send it to gnome-announce-list, gtk-list, gtk-app-devel-list and
|
||||
gtk-devel-list. Set reply-to to desktop-devel-list.
|
||||
|
||||
18) Add a link to the release announcement to www.gtk.org which lives
|
||||
19) Add a link to the release announcement to www.gtk.org which lives
|
||||
in the gtk-web git module.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gdk3/">http://developer.gnome.org/gdk3/</ulink>.
|
||||
If you are looking for the older GDK 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk2/">http://developer.gnome.org/gdk2/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gdk/">http://developer.gnome.org/gdk/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
<xi:include href="xml/cairo_interaction.xml" />
|
||||
<xi:include href="xml/x_interaction.xml" />
|
||||
<xi:include href="xml/gdkapplaunchcontext.xml" />
|
||||
<xi:include href="xml/gdktestutils.xml" />
|
||||
<xi:include href="xml/gdktesting.xml" />
|
||||
</reference>
|
||||
|
||||
<index id="api-index-full">
|
||||
|
||||
@@ -1145,8 +1145,8 @@ gdk_app_launch_context_get_type
|
||||
|
||||
<SECTION>
|
||||
<TITLE>Testing</TITLE>
|
||||
<FILE>gdktestutils</FILE>
|
||||
<FILE>gdktesting</FILE>
|
||||
gdk_test_render_sync
|
||||
gdk_test_simulate_button
|
||||
gdk_test_simulate_key
|
||||
</SECTION>
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<chapter id="gtk-getting-started" xmlns:xi="http://www.w3.org/2003/XInclude">
|
||||
<title>Getting Started with GTK+</title>
|
||||
|
||||
<para>This chapter contains some tutorial information to get you
|
||||
<para>This chapter is contains some tutorial information to get you
|
||||
started with GTK+ programming. It assumes that you have GTK+, its
|
||||
dependencies and a C compiler installed and ready to use. If you
|
||||
need to build GTK+ itself first, refer to the
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
The latest versions can be found online at
|
||||
<ulink role="online-location" url="http://developer.gnome.org/gtk3/">http://developer.gnome.org/gtk3/</ulink>.
|
||||
If you are looking for the older GTK+ 2 series of libraries,
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk2/">http://developer.gnome.org/gtk2/</ulink>.
|
||||
see <ulink role="online-location" url="http://developer.gnome.org/gtk/">http://developer.gnome.org/gtk/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
@@ -61,9 +61,13 @@
|
||||
<xi:include href="xml/gtkstyleproperties.xml" />
|
||||
<xi:include href="xml/gtkthemingengine.xml" />
|
||||
<xi:include href="xml/gtkwidgetpath.xml" />
|
||||
<xi:include href="xml/gtksymboliccolor.xml" />
|
||||
<xi:include href="xml/gtkgradient.xml" />
|
||||
<xi:include href="xml/gtkicontheme.xml" />
|
||||
<xi:include href="xml/gtkiconfactory.xml" />
|
||||
<xi:include href="xml/gtknumerableicon.xml" />
|
||||
<xi:include href="xml/gtkrc.xml" />
|
||||
<xi:include href="xml/gtkstyle.xml" />
|
||||
</part>
|
||||
|
||||
<part id="gtkobjects">
|
||||
@@ -124,6 +128,8 @@
|
||||
<xi:include href="xml/gtkentrybuffer.xml" />
|
||||
<xi:include href="xml/gtkentrycompletion.xml" />
|
||||
<xi:include href="xml/gtkscale.xml" />
|
||||
<xi:include href="xml/gtkhscale.xml" />
|
||||
<xi:include href="xml/gtkvscale.xml" />
|
||||
<xi:include href="xml/gtkspinbutton.xml" />
|
||||
<xi:include href="xml/gtksearchentry.xml" />
|
||||
<xi:include href="xml/gtkeditable.xml" />
|
||||
@@ -182,6 +188,7 @@
|
||||
<xi:include href="xml/gtkradiomenuitem.xml" />
|
||||
<xi:include href="xml/gtkcheckmenuitem.xml" />
|
||||
<xi:include href="xml/gtkseparatormenuitem.xml" />
|
||||
<xi:include href="xml/gtktearoffmenuitem.xml" />
|
||||
<xi:include href="xml/gtktoolshell.xml" />
|
||||
<xi:include href="xml/gtktoolbar.xml" />
|
||||
<xi:include href="xml/gtktoolitem.xml" />
|
||||
@@ -211,6 +218,9 @@
|
||||
<xi:include href="xml/gtkcolorbutton.xml" />
|
||||
<xi:include href="xml/gtkcolorchooserwidget.xml" />
|
||||
<xi:include href="xml/gtkcolorchooserdialog.xml" />
|
||||
<xi:include href="xml/gtkcolorsel.xml" />
|
||||
<xi:include href="xml/gtkcolorseldlg.xml" />
|
||||
<xi:include href="xml/gtkhsv.xml" />
|
||||
<xi:include href="xml/gtkfilechooser.xml" />
|
||||
<xi:include href="xml/gtkfilechooserbutton.xml" />
|
||||
<xi:include href="xml/gtkfilechooserdialog.xml" />
|
||||
@@ -220,6 +230,8 @@
|
||||
<xi:include href="xml/gtkfontbutton.xml" />
|
||||
<xi:include href="xml/gtkfontchooserwidget.xml" />
|
||||
<xi:include href="xml/gtkfontchooserdialog.xml" />
|
||||
<xi:include href="xml/gtkfontsel.xml" />
|
||||
<xi:include href="xml/gtkfontseldlg.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="LayoutContainers">
|
||||
@@ -228,11 +240,18 @@
|
||||
<xi:include href="xml/gtkalignment.xml" />
|
||||
<xi:include href="xml/gtkaspectframe.xml" />
|
||||
<xi:include href="xml/gtkbox.xml" />
|
||||
<xi:include href="xml/gtkhbox.xml" />
|
||||
<xi:include href="xml/gtkvbox.xml" />
|
||||
<xi:include href="xml/gtkbbox.xml" />
|
||||
<xi:include href="xml/gtkhbbox.xml" />
|
||||
<xi:include href="xml/gtkvbbox.xml" />
|
||||
<xi:include href="xml/gtkfixed.xml" />
|
||||
<xi:include href="xml/gtkpaned.xml" />
|
||||
<xi:include href="xml/gtkhpaned.xml" />
|
||||
<xi:include href="xml/gtkvpaned.xml" />
|
||||
<xi:include href="xml/gtklayout.xml" />
|
||||
<xi:include href="xml/gtknotebook.xml" />
|
||||
<xi:include href="xml/gtktable.xml" />
|
||||
<xi:include href="xml/gtkexpander.xml" />
|
||||
<xi:include href="xml/gtkoverlay.xml" />
|
||||
<xi:include href="xml/gtkorientable.xml" />
|
||||
@@ -242,11 +261,15 @@
|
||||
<title>Ornaments</title>
|
||||
<xi:include href="xml/gtkframe.xml" />
|
||||
<xi:include href="xml/gtkseparator.xml" />
|
||||
<xi:include href="xml/gtkhseparator.xml" />
|
||||
<xi:include href="xml/gtkvseparator.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="ScrollingWidgets">
|
||||
<title>Scrolling</title>
|
||||
<xi:include href="xml/gtkscrollbar.xml" />
|
||||
<xi:include href="xml/gtkhscrollbar.xml" />
|
||||
<xi:include href="xml/gtkvscrollbar.xml" />
|
||||
<xi:include href="xml/gtkscrolledwindow.xml" />
|
||||
<xi:include href="xml/gtkscrollable.xml" />
|
||||
</chapter>
|
||||
@@ -327,34 +350,6 @@
|
||||
<xi:include href="xml/gtkapplicationwindow.xml" />
|
||||
<xi:include href="xml/gtkactionable.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter id="DeprecatedObjects">
|
||||
<title>Deprecated</title>
|
||||
<xi:include href="xml/gtksymboliccolor.xml" />
|
||||
<xi:include href="xml/gtkgradient.xml" />
|
||||
<xi:include href="xml/gtkrc.xml" />
|
||||
<xi:include href="xml/gtkstyle.xml" />
|
||||
<xi:include href="xml/gtkhscale.xml" />
|
||||
<xi:include href="xml/gtkvscale.xml" />
|
||||
<xi:include href="xml/gtktearoffmenuitem.xml" />
|
||||
<xi:include href="xml/gtkcolorsel.xml" />
|
||||
<xi:include href="xml/gtkcolorseldlg.xml" />
|
||||
<xi:include href="xml/gtkhsv.xml" />
|
||||
<xi:include href="xml/gtkfontsel.xml" />
|
||||
<xi:include href="xml/gtkfontseldlg.xml" />
|
||||
<xi:include href="xml/gtkhbox.xml" />
|
||||
<xi:include href="xml/gtkvbox.xml" />
|
||||
<xi:include href="xml/gtkhbbox.xml" />
|
||||
<xi:include href="xml/gtkvbbox.xml" />
|
||||
<xi:include href="xml/gtkhpaned.xml" />
|
||||
<xi:include href="xml/gtkvpaned.xml" />
|
||||
<xi:include href="xml/gtktable.xml" />
|
||||
<xi:include href="xml/gtkhseparator.xml" />
|
||||
<xi:include href="xml/gtkvseparator.xml" />
|
||||
<xi:include href="xml/gtkhscrollbar.xml" />
|
||||
<xi:include href="xml/gtkvscrollbar.xml" />
|
||||
</chapter>
|
||||
|
||||
</part>
|
||||
|
||||
<part id="migrating">
|
||||
@@ -411,10 +406,6 @@
|
||||
<title>Index of new symbols in 3.6</title>
|
||||
<xi:include href="xml/api-index-3.6.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="api-index-3-8" role="3.8">
|
||||
<title>Index of new symbols in 3.8</title>
|
||||
<xi:include href="xml/api-index-3.8.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
|
||||
|
||||
@@ -139,7 +139,6 @@ gtk_accel_label_set_accel_closure
|
||||
gtk_accel_label_get_accel_widget
|
||||
gtk_accel_label_set_accel_widget
|
||||
gtk_accel_label_get_accel_width
|
||||
gtk_accel_label_set_accel
|
||||
gtk_accel_label_refetch
|
||||
<SUBSECTION Standard>
|
||||
GTK_ACCEL_LABEL
|
||||
@@ -264,8 +263,6 @@ gtk_action_group_get_sensitive
|
||||
gtk_action_group_set_sensitive
|
||||
gtk_action_group_get_visible
|
||||
gtk_action_group_set_visible
|
||||
gtk_action_group_get_accel_group
|
||||
gtk_action_group_set_accel_group
|
||||
gtk_action_group_get_action
|
||||
gtk_action_group_list_actions
|
||||
gtk_action_group_add_action
|
||||
@@ -533,10 +530,8 @@ gtk_builder_add_from_resource
|
||||
gtk_builder_add_from_string
|
||||
gtk_builder_add_objects_from_file
|
||||
gtk_builder_add_objects_from_string
|
||||
gtk_builder_add_objects_from_resource
|
||||
gtk_builder_get_object
|
||||
gtk_builder_get_objects
|
||||
gtk_builder_expose_object
|
||||
gtk_builder_connect_signals
|
||||
gtk_builder_connect_signals_full
|
||||
gtk_builder_set_translation_domain
|
||||
@@ -588,8 +583,6 @@ gtk_button_set_image
|
||||
gtk_button_get_image
|
||||
gtk_button_set_image_position
|
||||
gtk_button_get_image_position
|
||||
gtk_button_set_always_show_image
|
||||
gtk_button_get_always_show_image
|
||||
gtk_button_get_event_window
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@@ -1053,8 +1046,6 @@ gtk_entry_get_layout
|
||||
gtk_entry_get_layout_offsets
|
||||
gtk_entry_layout_index_to_text_index
|
||||
gtk_entry_text_index_to_layout_index
|
||||
gtk_entry_set_attributes
|
||||
gtk_entry_get_attributes
|
||||
gtk_entry_get_max_length
|
||||
gtk_entry_get_visibility
|
||||
gtk_entry_set_completion
|
||||
@@ -1817,7 +1808,6 @@ gtk_image_new_from_stock
|
||||
gtk_image_new_from_animation
|
||||
gtk_image_new_from_icon_name
|
||||
gtk_image_new_from_gicon
|
||||
gtk_image_new_from_resource
|
||||
gtk_image_set_from_file
|
||||
gtk_image_set_from_icon_set
|
||||
gtk_image_set_from_pixbuf
|
||||
@@ -1825,7 +1815,6 @@ gtk_image_set_from_stock
|
||||
gtk_image_set_from_animation
|
||||
gtk_image_set_from_icon_name
|
||||
gtk_image_set_from_gicon
|
||||
gtk_image_set_from_resource
|
||||
gtk_image_clear
|
||||
gtk_image_new
|
||||
gtk_image_set_pixel_size
|
||||
@@ -2255,7 +2244,6 @@ gtk_menu_shell_set_take_focus
|
||||
gtk_menu_shell_get_take_focus
|
||||
gtk_menu_shell_get_selected_item
|
||||
gtk_menu_shell_get_parent_shell
|
||||
gtk_menu_shell_bind_model
|
||||
GtkMenuDirectionType
|
||||
<SUBSECTION Standard>
|
||||
GTK_MENU_SHELL
|
||||
@@ -3282,8 +3270,6 @@ gtk_level_bar_set_min_value
|
||||
gtk_level_bar_get_min_value
|
||||
gtk_level_bar_set_max_value
|
||||
gtk_level_bar_get_max_value
|
||||
gtk_level_bar_set_inverted
|
||||
gtk_level_bar_get_inverted
|
||||
gtk_level_bar_add_offset_value
|
||||
gtk_level_bar_remove_offset_value
|
||||
gtk_level_bar_get_offset_value
|
||||
@@ -5292,7 +5278,6 @@ gtk_widget_get_sensitive
|
||||
gtk_widget_is_sensitive
|
||||
gtk_widget_get_state
|
||||
gtk_widget_get_visible
|
||||
gtk_widget_is_visible
|
||||
gtk_widget_set_visible
|
||||
gtk_widget_set_state_flags
|
||||
gtk_widget_unset_state_flags
|
||||
@@ -5780,8 +5765,6 @@ GTK_STYLE_CLASS_LINKED
|
||||
GTK_STYLE_CLASS_ARROW
|
||||
GTK_STYLE_CLASS_OSD
|
||||
GTK_STYLE_CLASS_LEVEL_BAR
|
||||
GTK_STYLE_CLASS_CURSOR_HANDLE
|
||||
GTK_STYLE_CLASS_INSERTION_CURSOR
|
||||
GTK_STYLE_REGION_COLUMN
|
||||
GTK_STYLE_REGION_COLUMN_HEADER
|
||||
GTK_STYLE_REGION_ROW
|
||||
@@ -5991,7 +5974,6 @@ gtk_gradient_add_color_stop
|
||||
gtk_gradient_ref
|
||||
gtk_gradient_unref
|
||||
gtk_gradient_resolve
|
||||
gtk_gradient_resolve_for_context
|
||||
gtk_gradient_to_string
|
||||
|
||||
<SUBSECTION Standard>
|
||||
@@ -7124,7 +7106,6 @@ gtk_application_add_window
|
||||
gtk_application_remove_window
|
||||
gtk_application_get_windows
|
||||
gtk_application_get_window_by_id
|
||||
gtk_application_get_active_window
|
||||
|
||||
<SUBSECTION>
|
||||
GtkApplicationInhibitFlags
|
||||
|
||||
@@ -55,7 +55,6 @@ noinst_PROGRAMS = \
|
||||
bloatpad \
|
||||
plugman \
|
||||
sunny \
|
||||
action-namespace \
|
||||
grid-packing \
|
||||
drawing \
|
||||
builder
|
||||
|
||||
@@ -1,134 +0,0 @@
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static void
|
||||
action_activated (GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWindow *parent = user_data;
|
||||
GtkWidget *dialog;
|
||||
|
||||
dialog = gtk_message_dialog_new (parent,
|
||||
GTK_DIALOG_DESTROY_WITH_PARENT,
|
||||
GTK_MESSAGE_INFO,
|
||||
GTK_BUTTONS_CLOSE,
|
||||
"Activated action `%s`",
|
||||
g_action_get_name (G_ACTION (action)));
|
||||
|
||||
g_signal_connect_swapped (dialog, "response",
|
||||
G_CALLBACK (gtk_widget_destroy), dialog);
|
||||
|
||||
gtk_widget_show_all (dialog);
|
||||
}
|
||||
|
||||
static GActionEntry doc_entries[] = {
|
||||
{ "save", action_activated },
|
||||
{ "print", action_activated },
|
||||
{ "share", action_activated }
|
||||
};
|
||||
|
||||
static GActionEntry win_entries[] = {
|
||||
{ "fullscreen", action_activated },
|
||||
{ "close", action_activated },
|
||||
};
|
||||
|
||||
const gchar *menu_ui =
|
||||
"<interface>"
|
||||
" <menu id='doc-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Save</attribute>"
|
||||
" <attribute name='action'>save</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Print</attribute>"
|
||||
" <attribute name='action'>print</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Share</attribute>"
|
||||
" <attribute name='action'>share</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
" <menu id='win-menu'>"
|
||||
" <section>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Fullscreen</attribute>"
|
||||
" <attribute name='action'>fullscreen</attribute>"
|
||||
" </item>"
|
||||
" <item>"
|
||||
" <attribute name='label'>_Close</attribute>"
|
||||
" <attribute name='action'>close</attribute>"
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </menu>"
|
||||
"</interface>";
|
||||
|
||||
static void
|
||||
activate (GApplication *app,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *win;
|
||||
GtkWidget *button;
|
||||
GSimpleActionGroup *doc_actions;
|
||||
GtkBuilder *builder;
|
||||
GMenuModel *doc_menu;
|
||||
GMenuModel *win_menu;
|
||||
GMenu *button_menu;
|
||||
GMenuItem *section;
|
||||
|
||||
if (gtk_application_get_windows (GTK_APPLICATION (app)) != NULL)
|
||||
return;
|
||||
|
||||
win = gtk_application_window_new (GTK_APPLICATION (app));
|
||||
|
||||
doc_actions = g_simple_action_group_new ();
|
||||
g_simple_action_group_add_entries (doc_actions, doc_entries,
|
||||
G_N_ELEMENTS (doc_entries), win);
|
||||
|
||||
g_action_map_add_action_entries (G_ACTION_MAP (win), win_entries,
|
||||
G_N_ELEMENTS (win_entries), win);
|
||||
|
||||
builder = gtk_builder_new ();
|
||||
gtk_builder_add_from_string (builder, menu_ui, -1, NULL);
|
||||
|
||||
doc_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "doc-menu"));
|
||||
win_menu = G_MENU_MODEL (gtk_builder_get_object (builder, "win-menu"));
|
||||
|
||||
button_menu = g_menu_new ();
|
||||
|
||||
section = g_menu_item_new_section (NULL, doc_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "doc");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
section = g_menu_item_new_section (NULL, win_menu);
|
||||
g_menu_item_set_attribute (section, "action-namespace", "s", "win");
|
||||
g_menu_append_item (button_menu, section);
|
||||
g_object_unref (section);
|
||||
|
||||
button = gtk_menu_button_new ();
|
||||
gtk_button_set_label (GTK_BUTTON (button), "Menu");
|
||||
gtk_widget_insert_action_group (button, "doc", G_ACTION_GROUP (doc_actions));
|
||||
gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (button), G_MENU_MODEL (button_menu));
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (win), button);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (win), 12);
|
||||
gtk_widget_show_all (win);
|
||||
|
||||
g_object_unref (button_menu);
|
||||
g_object_unref (doc_actions);
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,
|
||||
char **argv)
|
||||
{
|
||||
GtkApplication *app;
|
||||
|
||||
app = gtk_application_new ("org.gtk.Example", 0);
|
||||
g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
|
||||
|
||||
return g_application_run (G_APPLICATION (app), argc, argv);
|
||||
}
|
||||
+4
-81
@@ -191,14 +191,7 @@ bloat_pad_open (GApplication *application,
|
||||
new_window (application, files[i]);
|
||||
}
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkApplication parent_instance;
|
||||
|
||||
GMenu *time;
|
||||
guint timeout;
|
||||
} BloatPad;
|
||||
|
||||
typedef GtkApplication BloatPad;
|
||||
typedef GtkApplicationClass BloatPadClass;
|
||||
|
||||
G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)
|
||||
@@ -241,65 +234,15 @@ quit_activated (GSimpleAction *action,
|
||||
g_application_quit (app);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_time (gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
GDateTime *now;
|
||||
gchar *time;
|
||||
|
||||
while (g_menu_model_get_n_items (G_MENU_MODEL (bloatpad->time)))
|
||||
g_menu_remove (bloatpad->time, 0);
|
||||
|
||||
g_message ("Updating the time menu (which should be open now)...");
|
||||
|
||||
now = g_date_time_new_now_local ();
|
||||
time = g_date_time_format (now, "%c");
|
||||
g_menu_append (bloatpad->time, time, NULL);
|
||||
g_date_time_unref (now);
|
||||
g_free (time);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static void
|
||||
time_active_changed (GSimpleAction *action,
|
||||
GVariant *state,
|
||||
gpointer user_data)
|
||||
{
|
||||
BloatPad *bloatpad = user_data;
|
||||
|
||||
if (g_variant_get_boolean (state))
|
||||
{
|
||||
if (!bloatpad->timeout)
|
||||
{
|
||||
bloatpad->timeout = g_timeout_add (1000, update_time, bloatpad);
|
||||
update_time (bloatpad);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
}
|
||||
|
||||
g_simple_action_set_state (action, state);
|
||||
}
|
||||
|
||||
static GActionEntry app_entries[] = {
|
||||
{ "new", new_activated, NULL, NULL, NULL },
|
||||
{ "about", about_activated, NULL, NULL, NULL },
|
||||
{ "quit", quit_activated, NULL, NULL, NULL },
|
||||
{ "time-active", NULL, NULL, "false", time_active_changed }
|
||||
};
|
||||
|
||||
static void
|
||||
bloat_pad_startup (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad*) application;
|
||||
GtkBuilder *builder;
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
@@ -358,34 +301,13 @@ bloat_pad_startup (GApplication *application)
|
||||
" </item>"
|
||||
" </section>"
|
||||
" </submenu>"
|
||||
" <submenu id='time-menu'>"
|
||||
" <attribute name='label' translatable='yes'>Time</attribute>"
|
||||
" <attribute name='submenu-action'>app.time-active</attribute>"
|
||||
" </submenu>"
|
||||
" </menu>"
|
||||
"</interface>", -1, NULL);
|
||||
gtk_application_set_app_menu (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "menubar")));
|
||||
//gtk_application_set_menubar (GTK_APPLICATION (application), G_MENU_MODEL (gtk_builder_get_object (builder, "app-menu")));
|
||||
bloatpad->time = G_MENU (gtk_builder_get_object (builder, "time-menu"));
|
||||
g_object_unref (builder);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_shutdown (GApplication *application)
|
||||
{
|
||||
BloatPad *bloatpad = (BloatPad *) application;
|
||||
|
||||
if (bloatpad->timeout)
|
||||
{
|
||||
g_source_remove (bloatpad->timeout);
|
||||
bloatpad->timeout = 0;
|
||||
}
|
||||
|
||||
G_APPLICATION_CLASS (bloat_pad_parent_class)
|
||||
->shutdown (application);
|
||||
}
|
||||
|
||||
static void
|
||||
bloat_pad_init (BloatPad *app)
|
||||
{
|
||||
@@ -398,7 +320,6 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
application_class->startup = bloat_pad_startup;
|
||||
application_class->shutdown = bloat_pad_shutdown;
|
||||
application_class->activate = bloat_pad_activate;
|
||||
application_class->open = bloat_pad_open;
|
||||
|
||||
@@ -409,7 +330,9 @@ bloat_pad_class_init (BloatPadClass *class)
|
||||
BloatPad *
|
||||
bloat_pad_new (void)
|
||||
{
|
||||
BloatPad *bloat_pad;
|
||||
GtkApplication *bloat_pad;
|
||||
|
||||
g_type_init ();
|
||||
|
||||
g_set_application_name ("Bloatpad");
|
||||
|
||||
|
||||
@@ -465,6 +465,8 @@ plug_man_class_init (PlugManClass *class)
|
||||
PlugMan *
|
||||
plug_man_new (void)
|
||||
{
|
||||
g_type_init ();
|
||||
|
||||
return g_object_new (plug_man_get_type (),
|
||||
"application-id", "org.gtk.Test.plugman",
|
||||
"flags", G_APPLICATION_HANDLES_OPEN,
|
||||
|
||||
@@ -191,6 +191,8 @@ menu_button_class_init (MenuButtonClass *class)
|
||||
MenuButton *
|
||||
menu_button_new (void)
|
||||
{
|
||||
g_type_init ();
|
||||
|
||||
return g_object_new (menu_button_get_type (),
|
||||
"application-id", "org.gtk.Test.Sunny",
|
||||
"flags", G_APPLICATION_HANDLES_OPEN,
|
||||
|
||||
+1
-2
@@ -341,8 +341,7 @@ gdkmarshalers.h: @REBUILD@ gdkmarshalers.list
|
||||
&& mv gdkmarshalers-h.tmp gdkmarshalers.h \
|
||||
|| ( rm -f gdkmarshalers-h.tmp && exit 1)
|
||||
gdkmarshalers.c: @REBUILD@ gdkmarshalers.list
|
||||
$(AM_V_GEN) (echo "#include \"gdkmarshalers.h\""; \
|
||||
$(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body) > gdkmarshalers-c.tmp \
|
||||
$(AM_V_GEN) $(GLIB_GENMARSHAL) --prefix=_gdk_marshal $(srcdir)/gdkmarshalers.list --body > gdkmarshalers-c.tmp \
|
||||
&& mv gdkmarshalers-c.tmp gdkmarshalers.c \
|
||||
|| ( rm -f gdkmarshalers-c.tmp && exit 1 )
|
||||
|
||||
|
||||
@@ -15,9 +15,7 @@ AM_CPPFLAGS = \
|
||||
|
||||
LDADDS = $(GDK_DEP_LIBS)
|
||||
|
||||
noinst_LTLIBRARIES = libgdk-broadway.la
|
||||
|
||||
bin_PROGRAMS = broadwayd
|
||||
noinst_LTLIBRARIES = libbroadway.la libgdk-broadway.la
|
||||
|
||||
libgdkinclude_HEADERS = \
|
||||
gdkbroadway.h
|
||||
@@ -28,13 +26,17 @@ libgdkbroadwayinclude_HEADERS = \
|
||||
gdkbroadwaycursor.h \
|
||||
gdkbroadwayvisual.h
|
||||
|
||||
libbroadway_la_SOURCES = \
|
||||
broadway.h \
|
||||
broadway.c
|
||||
|
||||
clienthtml.h: client.html
|
||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/client.html client_html > $@
|
||||
$(PERL) ./toarray.pl client.html client_html > $@
|
||||
|
||||
EXTRA_DIST += client.html
|
||||
|
||||
broadwayjs.h: broadway.js
|
||||
$(PERL) $(srcdir)/toarray.pl $(srcdir)/broadway.js broadway_js > $@
|
||||
$(PERL) ./toarray.pl broadway.js broadway_js > $@
|
||||
|
||||
EXTRA_DIST += broadway.js
|
||||
|
||||
@@ -71,19 +73,9 @@ libgdk_broadway_la_SOURCES = \
|
||||
gdkvisual-broadway.c \
|
||||
gdkwindow-broadway.c \
|
||||
gdkwindow-broadway.h \
|
||||
gdkprivate-broadway.h \
|
||||
gdkbroadway-server.h \
|
||||
gdkbroadway-server.c
|
||||
gdkprivate-broadway.h
|
||||
|
||||
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
|
||||
libgdk_broadway_la_LIBADD = libbroadway.la
|
||||
|
||||
MAINTAINERCLEANFILES = $(broadway_built_sources)
|
||||
EXTRA_DIST += $(broadway_built_sources)
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
Cache surfaces that are opened via shm_open inbetween updates.
|
||||
Send configure event when a window is moved and no client
|
||||
Handle implicit grabs when in broadway-server.c
|
||||
Rewrite events (per-client serials, etc)
|
||||
keyboard focus handling
|
||||
Add resize handling to js WM
|
||||
Make canvas/title non-selectable in browser
|
||||
Handle browser window size changes
|
||||
_gdk_broadway_server_has_client is always FALSE, so resize don't work
|
||||
Send reset events on client disconnect (button up, normal state. Maybe grab state reset?)
|
||||
rgba suport
|
||||
shift-select in gedit doesn't work
|
||||
backdrop mode
|
||||
@@ -1,264 +0,0 @@
|
||||
#ifndef __BROADWAY_PROTOCOL_H__
|
||||
#define __BROADWAY_PROTOCOL_H__
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
typedef struct {
|
||||
gint32 x, y;
|
||||
gint32 width, height;
|
||||
} BroadwayRect;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_EVENT_ENTER = 'e',
|
||||
BROADWAY_EVENT_LEAVE = 'l',
|
||||
BROADWAY_EVENT_POINTER_MOVE = 'm',
|
||||
BROADWAY_EVENT_BUTTON_PRESS = 'b',
|
||||
BROADWAY_EVENT_BUTTON_RELEASE = 'B',
|
||||
BROADWAY_EVENT_SCROLL = 's',
|
||||
BROADWAY_EVENT_KEY_PRESS = 'k',
|
||||
BROADWAY_EVENT_KEY_RELEASE = 'K',
|
||||
BROADWAY_EVENT_GRAB_NOTIFY = 'g',
|
||||
BROADWAY_EVENT_UNGRAB_NOTIFY = 'u',
|
||||
BROADWAY_EVENT_CONFIGURE_NOTIFY = 'w',
|
||||
BROADWAY_EVENT_DELETE_NOTIFY = 'W',
|
||||
BROADWAY_EVENT_SCREEN_SIZE_CHANGED = 'd'
|
||||
} BroadwayEventType;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_OP_COPY_RECTANGLES = 'b',
|
||||
BROADWAY_OP_GRAB_POINTER = 'g',
|
||||
BROADWAY_OP_UNGRAB_POINTER = 'u',
|
||||
BROADWAY_OP_NEW_SURFACE = 's',
|
||||
BROADWAY_OP_SHOW_SURFACE = 'S',
|
||||
BROADWAY_OP_HIDE_SURFACE = 'H',
|
||||
BROADWAY_OP_DESTROY_SURFACE = 'd',
|
||||
BROADWAY_OP_MOVE_RESIZE = 'm',
|
||||
BROADWAY_OP_SET_TRANSIENT_FOR = 'p',
|
||||
BROADWAY_OP_PUT_RGB = 'i',
|
||||
BROADWAY_OP_FLUSH = 'f',
|
||||
} BroadwayOpType;
|
||||
|
||||
typedef struct {
|
||||
guint8 type;
|
||||
guint32 serial;
|
||||
guint64 time;
|
||||
} BroadwayInputBaseMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 event_window_id;
|
||||
gint32 root_x;
|
||||
gint32 root_y;
|
||||
gint32 win_x;
|
||||
gint32 win_y;
|
||||
guint32 state;
|
||||
} BroadwayInputPointerMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 mode;
|
||||
} BroadwayInputCrossingMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 button;
|
||||
} BroadwayInputButtonMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
gint32 dir;
|
||||
} BroadwayInputScrollMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 state;
|
||||
gint32 key;
|
||||
} BroadwayInputKeyMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 res;
|
||||
} BroadwayInputGrabReply;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 id;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
gint32 width;
|
||||
gint32 height;
|
||||
} BroadwayInputConfigureNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 width;
|
||||
gint32 height;
|
||||
} BroadwayInputScreenResizeNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
gint32 id;
|
||||
} BroadwayInputDeleteNotify;
|
||||
|
||||
typedef union {
|
||||
BroadwayInputBaseMsg base;
|
||||
BroadwayInputPointerMsg pointer;
|
||||
BroadwayInputCrossingMsg crossing;
|
||||
BroadwayInputButtonMsg button;
|
||||
BroadwayInputScrollMsg scroll;
|
||||
BroadwayInputKeyMsg key;
|
||||
BroadwayInputGrabReply grab_reply;
|
||||
BroadwayInputConfigureNotify configure_notify;
|
||||
BroadwayInputDeleteNotify delete_notify;
|
||||
BroadwayInputScreenResizeNotify screen_resize_notify;
|
||||
} BroadwayInputMsg;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_REQUEST_NEW_WINDOW,
|
||||
BROADWAY_REQUEST_FLUSH,
|
||||
BROADWAY_REQUEST_SYNC,
|
||||
BROADWAY_REQUEST_QUERY_MOUSE,
|
||||
BROADWAY_REQUEST_DESTROY_WINDOW,
|
||||
BROADWAY_REQUEST_SHOW_WINDOW,
|
||||
BROADWAY_REQUEST_HIDE_WINDOW,
|
||||
BROADWAY_REQUEST_SET_TRANSIENT_FOR,
|
||||
BROADWAY_REQUEST_TRANSLATE,
|
||||
BROADWAY_REQUEST_UPDATE,
|
||||
BROADWAY_REQUEST_MOVE_RESIZE,
|
||||
BROADWAY_REQUEST_GRAB_POINTER,
|
||||
BROADWAY_REQUEST_UNGRAB_POINTER
|
||||
} BroadwayRequestType;
|
||||
|
||||
typedef struct {
|
||||
guint32 size;
|
||||
guint32 serial;
|
||||
guint32 type;
|
||||
} BroadwayRequestBase, BroadwayRequestFlush, BroadwayRequestSync, BroadwayRequestQueryMouse;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
} BroadwayRequestDestroyWindow, BroadwayRequestShowWindow, BroadwayRequestHideWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
guint32 parent;
|
||||
} BroadwayRequestSetTransientFor;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
gint32 dx;
|
||||
gint32 dy;
|
||||
guint32 n_rects;
|
||||
BroadwayRect rects[1];
|
||||
} BroadwayRequestTranslate;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
char name[34];
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
} BroadwayRequestUpdate;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
guint32 owner_events;
|
||||
guint32 event_mask;
|
||||
guint32 time_;
|
||||
} BroadwayRequestGrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 time_;
|
||||
} BroadwayRequestUngrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
guint32 is_temp;
|
||||
} BroadwayRequestNewWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayRequestBase base;
|
||||
guint32 id;
|
||||
gint32 x;
|
||||
gint32 y;
|
||||
guint32 width;
|
||||
guint32 height;
|
||||
} BroadwayRequestMoveResize;
|
||||
|
||||
typedef union {
|
||||
BroadwayRequestBase base;
|
||||
BroadwayRequestNewWindow new_window;
|
||||
BroadwayRequestFlush flush;
|
||||
BroadwayRequestSync sync;
|
||||
BroadwayRequestQueryMouse query_mouse;
|
||||
BroadwayRequestDestroyWindow destroy_window;
|
||||
BroadwayRequestShowWindow show_window;
|
||||
BroadwayRequestHideWindow hide_window;
|
||||
BroadwayRequestSetTransientFor set_transient_for;
|
||||
BroadwayRequestUpdate update;
|
||||
BroadwayRequestMoveResize move_resize;
|
||||
BroadwayRequestGrabPointer grab_pointer;
|
||||
BroadwayRequestUngrabPointer ungrab_pointer;
|
||||
BroadwayRequestTranslate translate;
|
||||
} BroadwayRequest;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_REPLY_EVENT,
|
||||
BROADWAY_REPLY_SYNC,
|
||||
BROADWAY_REPLY_QUERY_MOUSE,
|
||||
BROADWAY_REPLY_NEW_WINDOW,
|
||||
BROADWAY_REPLY_GRAB_POINTER,
|
||||
BROADWAY_REPLY_UNGRAB_POINTER
|
||||
} BroadwayReplyType;
|
||||
|
||||
typedef struct {
|
||||
guint32 size;
|
||||
guint32 last_serial;
|
||||
guint32 in_reply_to;
|
||||
guint32 type;
|
||||
} BroadwayReplyBase, BroadwayReplySync;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 id;
|
||||
} BroadwayReplyNewWindow;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 status;
|
||||
} BroadwayReplyGrabPointer, BroadwayReplyUngrabPointer;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
guint32 toplevel;
|
||||
gint32 root_x;
|
||||
gint32 root_y;
|
||||
guint32 mask;
|
||||
} BroadwayReplyQueryMouse;
|
||||
|
||||
typedef struct {
|
||||
BroadwayReplyBase base;
|
||||
BroadwayInputMsg msg;
|
||||
} BroadwayReplyEvent;
|
||||
|
||||
typedef union {
|
||||
BroadwayReplyBase base;
|
||||
BroadwayReplyEvent event;
|
||||
BroadwayReplyQueryMouse query_mouse;
|
||||
BroadwayReplyNewWindow new_window;
|
||||
BroadwayReplyGrabPointer grab_pointer;
|
||||
BroadwayReplyUngrabPointer ungrab_pointer;
|
||||
} BroadwayReply;
|
||||
|
||||
#endif /* __BROADWAY_PROTOCOL_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,77 +0,0 @@
|
||||
#ifndef __BROADWAY_SERVER__
|
||||
#define __BROADWAY_SERVER__
|
||||
|
||||
#include "broadway-protocol.h"
|
||||
#include <glib-object.h>
|
||||
#include <cairo.h>
|
||||
|
||||
void broadway_events_got_input (BroadwayInputMsg *message,
|
||||
gint32 client_id);
|
||||
|
||||
typedef struct _BroadwayServer BroadwayServer;
|
||||
typedef struct _BroadwayServerClass BroadwayServerClass;
|
||||
|
||||
#define BROADWAY_TYPE_SERVER (broadway_server_get_type())
|
||||
#define BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BROADWAY_TYPE_SERVER, BroadwayServer))
|
||||
#define BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
||||
#define BROADWAY_IS_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BROADWAY_TYPE_SERVER))
|
||||
#define BROADWAY_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BROADWAY_TYPE_SERVER))
|
||||
#define BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
||||
|
||||
|
||||
BroadwayServer *broadway_server_new (int port,
|
||||
GError **error);
|
||||
gboolean broadway_server_has_client (BroadwayServer *server);
|
||||
void broadway_server_flush (BroadwayServer *server);
|
||||
void broadway_server_sync (BroadwayServer *server);
|
||||
gulong broadway_server_get_next_serial (BroadwayServer *server);
|
||||
guint32 broadway_server_get_last_seen_time (BroadwayServer *server);
|
||||
gboolean broadway_server_lookahead_event (BroadwayServer *server,
|
||||
const char *types);
|
||||
void broadway_server_query_mouse (BroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask);
|
||||
guint32 broadway_server_grab_pointer (BroadwayServer *server,
|
||||
gint client_id,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_);
|
||||
guint32 broadway_server_ungrab_pointer (BroadwayServer *server,
|
||||
guint32 time_);
|
||||
gint32 broadway_server_get_mouse_toplevel (BroadwayServer *server);
|
||||
guint32 broadway_server_new_window (BroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp);
|
||||
void broadway_server_destroy_window (BroadwayServer *server,
|
||||
gint id);
|
||||
gboolean broadway_server_window_show (BroadwayServer *server,
|
||||
gint id);
|
||||
gboolean broadway_server_window_hide (BroadwayServer *server,
|
||||
gint id);
|
||||
void broadway_server_window_set_transient_for (BroadwayServer *server,
|
||||
gint id,
|
||||
gint parent);
|
||||
gboolean broadway_server_window_translate (BroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy);
|
||||
cairo_surface_t * broadway_server_create_surface (int width,
|
||||
int height);
|
||||
void broadway_server_window_update (BroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface);
|
||||
gboolean broadway_server_window_move_resize (BroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
#endif /* __BROADWAY_SERVER__ */
|
||||
@@ -5,7 +5,7 @@
|
||||
#include <errno.h>
|
||||
#include <cairo.h>
|
||||
|
||||
#include "broadway-output.h"
|
||||
#include "broadway.h"
|
||||
|
||||
/************************************************************************
|
||||
* Base64 functions *
|
||||
@@ -57,44 +57,8 @@ base64_uint32 (guint32 v, char *c)
|
||||
* conversion of raw image data to png data: uris *
|
||||
***********************************************************/
|
||||
|
||||
static cairo_status_t
|
||||
write_png_data (void *closure,
|
||||
const unsigned char *data,
|
||||
unsigned int data_len)
|
||||
{
|
||||
GString *buf = closure;
|
||||
|
||||
g_string_append_len (buf, (char *)data, data_len);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_data, buf);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
|
||||
struct PngTarget {
|
||||
GString *buf;
|
||||
GString *url;
|
||||
int state;
|
||||
int save;
|
||||
};
|
||||
@@ -107,73 +71,71 @@ write_png_url (void *closure,
|
||||
struct PngTarget *target = closure;
|
||||
gsize res, old_len;
|
||||
|
||||
old_len = target->buf->len;
|
||||
g_string_set_size (target->buf,
|
||||
old_len = target->url->len;
|
||||
g_string_set_size (target->url,
|
||||
old_len + (data_len / 3 + 1) * 4 + 4);
|
||||
|
||||
res = g_base64_encode_step (data, data_len, FALSE,
|
||||
target->buf->str + old_len,
|
||||
target->url->str + old_len,
|
||||
&target->state, &target->save);
|
||||
|
||||
g_string_set_size (target->buf, old_len + res);
|
||||
g_string_set_size (target->url, old_len + res);
|
||||
|
||||
return CAIRO_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_url_rgb (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
static char *
|
||||
to_png_rgb (int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.buf = buf;
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_RGB24, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = buf->len;
|
||||
old_len = target.url->len;
|
||||
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
buf->str + old_len,
|
||||
target.url->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
to_png_url_rgba (GString *buf, int w, int h, int byte_stride, guint32 *data)
|
||||
static char *
|
||||
to_png_rgba (int w, int h, int byte_stride, guint32 *data)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
struct PngTarget target;
|
||||
gsize res, old_len;
|
||||
|
||||
target.buf = buf;
|
||||
target.url = g_string_new ("data:image/png;base64,");
|
||||
target.state = 0;
|
||||
target.save = 0;
|
||||
|
||||
g_string_append (buf, "data:image/png;base64,");
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data,
|
||||
CAIRO_FORMAT_ARGB32, w, h, byte_stride);
|
||||
|
||||
cairo_surface_write_to_png_stream (surface, write_png_url, &target);
|
||||
cairo_surface_destroy (surface);
|
||||
|
||||
old_len = buf->len;
|
||||
old_len = target.url->len;
|
||||
|
||||
g_string_set_size (buf, old_len + 4);
|
||||
g_string_set_size (target.url, old_len + 4);
|
||||
res = g_base64_encode_close (FALSE,
|
||||
buf->str + old_len,
|
||||
target.url->str + old_len,
|
||||
&target.state, &target.save);
|
||||
g_string_set_size (buf, old_len + res);
|
||||
g_string_set_size (target.url, old_len + res);
|
||||
|
||||
return g_string_free (target.url, FALSE);
|
||||
}
|
||||
|
||||
#if 0
|
||||
@@ -211,11 +173,9 @@ to_png_a (int w, int h, int byte_stride, guint8 *data)
|
||||
|
||||
struct BroadwayOutput {
|
||||
GOutputStream *out;
|
||||
GString *buf;
|
||||
int error;
|
||||
guint32 serial;
|
||||
gboolean proto_v7_plus;
|
||||
gboolean binary;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -252,12 +212,13 @@ broadway_output_send_cmd (BroadwayOutput *output,
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_send_cmd_pre_v7 (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
broadway_output_sendmsg (BroadwayOutput *output,
|
||||
const void *buf, gsize count)
|
||||
{
|
||||
g_output_stream_write_all (output->out, "\0", 1, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
g_output_stream_write_all (output->out, "\xff", 1, NULL, NULL, NULL);
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write_all (output->out, buf, count, NULL, NULL, NULL);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT, buf, count);
|
||||
}
|
||||
|
||||
void broadway_output_pong (BroadwayOutput *output)
|
||||
@@ -266,40 +227,42 @@ void broadway_output_pong (BroadwayOutput *output)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_CNX_PONG, NULL, 0);
|
||||
}
|
||||
|
||||
static void
|
||||
broadway_output_sendmsg_initiate (BroadwayOutput *output)
|
||||
{
|
||||
if (!output->proto_v7_plus)
|
||||
g_output_stream_write (output->out, "\0", 1, NULL, NULL);
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
broadway_output_flush (BroadwayOutput *output)
|
||||
{
|
||||
if (output->buf->len == 0)
|
||||
return TRUE;
|
||||
|
||||
if (!output->proto_v7_plus)
|
||||
broadway_output_send_cmd_pre_v7 (output, output->buf->str, output->buf->len);
|
||||
else if (output->binary)
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_BINARY,
|
||||
output->buf->str, output->buf->len);
|
||||
else
|
||||
broadway_output_send_cmd (output, TRUE, BROADWAY_WS_TEXT,
|
||||
output->buf->str, output->buf->len);
|
||||
|
||||
g_string_set_size (output->buf, 0);
|
||||
|
||||
return !output->error;
|
||||
|
||||
{
|
||||
broadway_output_sendmsg (output, "\xff", 1);
|
||||
broadway_output_sendmsg (output, "\0", 1);
|
||||
return !output->error;
|
||||
}
|
||||
else /* no need to flush */
|
||||
return !output->error;
|
||||
}
|
||||
|
||||
BroadwayOutput *
|
||||
broadway_output_new (GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus, gboolean binary)
|
||||
broadway_output_new(GOutputStream *out, guint32 serial,
|
||||
gboolean proto_v7_plus)
|
||||
{
|
||||
BroadwayOutput *output;
|
||||
|
||||
output = g_new0 (BroadwayOutput, 1);
|
||||
|
||||
output->out = g_object_ref (out);
|
||||
output->buf = g_string_new ("");
|
||||
output->serial = serial;
|
||||
output->proto_v7_plus = proto_v7_plus;
|
||||
output->binary = binary;
|
||||
|
||||
broadway_output_sendmsg_initiate (output);
|
||||
|
||||
return output;
|
||||
}
|
||||
@@ -322,97 +285,32 @@ broadway_output_get_next_serial (BroadwayOutput *output)
|
||||
* Core rendering operations *
|
||||
************************************************************************/
|
||||
|
||||
#define HEADER_LEN (1+6)
|
||||
|
||||
static void
|
||||
append_char (BroadwayOutput *output, char c)
|
||||
append_uint16 (guint32 v, char *buf, int *p)
|
||||
{
|
||||
g_string_append_c (output->buf, c);
|
||||
base64_uint16 (v, &buf[*p]);
|
||||
*p += 3;
|
||||
}
|
||||
|
||||
static void
|
||||
append_bool (BroadwayOutput *output, gboolean val)
|
||||
append_uint32 (guint32 v, char *buf, int *p)
|
||||
{
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val ? 1: 0);
|
||||
else
|
||||
g_string_append_c (output->buf, val ? '1': '0');
|
||||
base64_uint32 (v, &buf[*p]);
|
||||
*p += 6;
|
||||
}
|
||||
|
||||
static void
|
||||
append_flags (BroadwayOutput *output, guint32 val)
|
||||
static int
|
||||
write_header(BroadwayOutput *output, char *buf, char op)
|
||||
{
|
||||
if (output->binary)
|
||||
g_string_append_c (output->buf, val);
|
||||
else
|
||||
g_string_append_c (output->buf, val + '0');
|
||||
}
|
||||
int p;
|
||||
|
||||
p = 0;
|
||||
buf[p++] = op;
|
||||
append_uint32 (output->serial++, buf, &p);
|
||||
|
||||
static void
|
||||
append_uint16 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
guint8 *buf;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 2);
|
||||
buf = (guint8 *)output->buf->str + old_len;
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 3);
|
||||
base64_uint16 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
append_uint32 (BroadwayOutput *output, guint32 v)
|
||||
{
|
||||
gsize old_len = output->buf->len;
|
||||
guint8 *buf;
|
||||
|
||||
if (output->binary)
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 4);
|
||||
buf = (guint8 *)output->buf->str + old_len;
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_string_set_size (output->buf, old_len + 6);
|
||||
base64_uint32 (v, output->buf->str + old_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
overwrite_uint32 (BroadwayOutput *output, gsize pos, guint32 v)
|
||||
{
|
||||
if (output->binary)
|
||||
{
|
||||
guint8 *buf = (guint8 *)output->buf->str + pos;
|
||||
|
||||
buf[0] = (v >> 0) & 0xff;
|
||||
buf[1] = (v >> 8) & 0xff;
|
||||
buf[2] = (v >> 16) & 0xff;
|
||||
buf[3] = (v >> 24) & 0xff;
|
||||
}
|
||||
else
|
||||
{
|
||||
base64_uint32 (v, output->buf->str + pos);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
write_header(BroadwayOutput *output, char op)
|
||||
{
|
||||
append_char (output, op);
|
||||
append_uint32 (output, output->serial++);
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -420,20 +318,29 @@ broadway_output_copy_rectangles (BroadwayOutput *output, int id,
|
||||
BroadwayRect *rects, int n_rects,
|
||||
int dx, int dy)
|
||||
{
|
||||
int i;
|
||||
char *buf;
|
||||
int len, i, p;
|
||||
|
||||
write_header (output, BROADWAY_OP_COPY_RECTANGLES);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, n_rects);
|
||||
len = HEADER_LEN + 3 + 3 + 3*4*n_rects + 3 + 3;
|
||||
|
||||
buf = g_malloc (len);
|
||||
p = write_header (output, buf, 'b');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (n_rects, buf, &p);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
append_uint16 (output, rects[i].x);
|
||||
append_uint16 (output, rects[i].y);
|
||||
append_uint16 (output, rects[i].width);
|
||||
append_uint16 (output, rects[i].height);
|
||||
append_uint16 (rects[i].x, buf, &p);
|
||||
append_uint16 (rects[i].y, buf, &p);
|
||||
append_uint16 (rects[i].width, buf, &p);
|
||||
append_uint16 (rects[i].height, buf, &p);
|
||||
}
|
||||
append_uint16 (output, dx);
|
||||
append_uint16 (output, dy);
|
||||
append_uint16 (dx, buf, &p);
|
||||
append_uint16 (dy, buf, &p);
|
||||
|
||||
assert (p == len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, len);
|
||||
free (buf);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -441,18 +348,31 @@ broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
int id,
|
||||
gboolean owner_event)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_GRAB_POINTER);
|
||||
append_uint16 (output, id);
|
||||
append_bool (output, owner_event);
|
||||
char buf[HEADER_LEN + 3 + 1];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'g');
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = owner_event ? '1': '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
guint32
|
||||
broadway_output_ungrab_pointer (BroadwayOutput *output)
|
||||
{
|
||||
char buf[HEADER_LEN];
|
||||
guint32 serial;
|
||||
int p;
|
||||
|
||||
serial = output->serial;
|
||||
write_header (output, BROADWAY_OP_UNGRAB_POINTER);
|
||||
p = write_header (output, buf, 'u');
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
|
||||
return serial;
|
||||
}
|
||||
@@ -462,34 +382,62 @@ broadway_output_new_surface(BroadwayOutput *output,
|
||||
int id, int x, int y, int w, int h,
|
||||
gboolean is_temp)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_NEW_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
append_bool (output, is_temp);
|
||||
char buf[HEADER_LEN + 16];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 's');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
buf[p++] = is_temp ? '1' : '0';
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_show_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_SHOW_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'S');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_hide_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_HIDE_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'H');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
void
|
||||
broadway_output_destroy_surface(BroadwayOutput *output, int id)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_DESTROY_SURFACE);
|
||||
append_uint16 (output, id);
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'd');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
|
||||
@@ -503,25 +451,31 @@ broadway_output_move_resize_surface (BroadwayOutput *output,
|
||||
int w,
|
||||
int h)
|
||||
{
|
||||
char buf[HEADER_LEN+3+1+6+6];
|
||||
int p;
|
||||
int val;
|
||||
|
||||
if (!has_pos && !has_size)
|
||||
return;
|
||||
|
||||
write_header (output, BROADWAY_OP_MOVE_RESIZE);
|
||||
p = write_header (output, buf, 'm');
|
||||
|
||||
val = (!!has_pos) | ((!!has_size) << 1);
|
||||
append_uint16 (output, id);
|
||||
append_flags (output, val);
|
||||
append_uint16 (id, buf, &p);
|
||||
buf[p++] = val + '0';
|
||||
if (has_pos)
|
||||
{
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
}
|
||||
if (has_size)
|
||||
{
|
||||
append_uint16 (output, w);
|
||||
append_uint16 (output, h);
|
||||
append_uint16 (w, buf, &p);
|
||||
append_uint16 (h, buf, &p);
|
||||
}
|
||||
assert (p <= sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, p);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -529,9 +483,17 @@ broadway_output_set_transient_for (BroadwayOutput *output,
|
||||
int id,
|
||||
int parent_id)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_SET_TRANSIENT_FOR);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, parent_id);
|
||||
char buf[HEADER_LEN + 6];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'p');
|
||||
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (parent_id, buf, &p);
|
||||
|
||||
assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
|
||||
|
||||
@@ -539,26 +501,32 @@ void
|
||||
broadway_output_put_rgb (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
gsize size_start, image_start, len;
|
||||
gsize buf_size;
|
||||
gsize url_len;
|
||||
char *url, *buf;
|
||||
int p;
|
||||
|
||||
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||
url = to_png_rgb (w, h, byte_stride, (guint32*)data);
|
||||
url_len = strlen (url);
|
||||
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x);
|
||||
append_uint16 (output, y);
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
p = write_header (output, buf, 'i');
|
||||
|
||||
image_start = output->buf->len;
|
||||
if (output->binary)
|
||||
to_png_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
else
|
||||
to_png_url_rgb (output->buf, w, h, byte_stride, (guint32*)data);
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x, buf, &p);
|
||||
append_uint16 (y, buf, &p);
|
||||
|
||||
len = output->buf->len - image_start;
|
||||
append_uint32 (url_len, buf, &p);
|
||||
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
g_free (buf);
|
||||
free (url);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
@@ -789,38 +757,39 @@ broadway_output_put_rgba (BroadwayOutput *output, int id, int x, int y,
|
||||
int w, int h, int byte_stride, void *data)
|
||||
{
|
||||
BroadwayBox *rects;
|
||||
int i, n_rects;
|
||||
gsize size_start, image_start, len;
|
||||
int p, i, n_rects;
|
||||
|
||||
rects = rgba_find_rects (data, w, h, byte_stride, &n_rects);
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
gsize url_len, buf_size;
|
||||
char *buf, *url;
|
||||
guint8 *subdata;
|
||||
|
||||
write_header (output, BROADWAY_OP_PUT_RGB);
|
||||
append_uint16 (output, id);
|
||||
append_uint16 (output, x + rects[i].x1);
|
||||
append_uint16 (output, y + rects[i].y1);
|
||||
|
||||
size_start = output->buf->len;
|
||||
append_uint32 (output, 0);
|
||||
|
||||
image_start = output->buf->len;
|
||||
|
||||
subdata = (guint8 *)data + rects[i].x1 * 4 + rects[i].y1 * byte_stride;
|
||||
if (output->binary)
|
||||
to_png_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
else
|
||||
to_png_url_rgba (output->buf, rects[i].x2 - rects[i].x1,
|
||||
url = to_png_rgba (rects[i].x2 - rects[i].x1,
|
||||
rects[i].y2 - rects[i].y1,
|
||||
byte_stride, (guint32*)subdata);
|
||||
|
||||
len = output->buf->len - image_start;
|
||||
url_len = strlen (url);
|
||||
buf_size = HEADER_LEN + 15 + url_len;
|
||||
buf = g_malloc (buf_size);
|
||||
|
||||
overwrite_uint32 (output, size_start, len);
|
||||
|
||||
p = write_header (output, buf, 'i');
|
||||
append_uint16 (id, buf, &p);
|
||||
append_uint16 (x + rects[i].x1, buf, &p);
|
||||
append_uint16 (y + rects[i].y1, buf, &p);
|
||||
|
||||
append_uint32 (url_len, buf, &p);
|
||||
g_assert (p == HEADER_LEN + 15);
|
||||
strncpy (buf + p, url, url_len);
|
||||
|
||||
broadway_output_sendmsg (output, buf, buf_size);
|
||||
|
||||
free (url);
|
||||
g_free (buf);
|
||||
}
|
||||
|
||||
free (rects);
|
||||
@@ -830,6 +799,13 @@ void
|
||||
broadway_output_surface_flush (BroadwayOutput *output,
|
||||
int id)
|
||||
{
|
||||
write_header (output, BROADWAY_OP_FLUSH);
|
||||
append_uint16 (output, id);
|
||||
char buf[HEADER_LEN + 3];
|
||||
int p;
|
||||
|
||||
p = write_header (output, buf, 'f');
|
||||
append_uint16 (id, buf, &p);
|
||||
|
||||
g_assert (p == sizeof (buf));
|
||||
|
||||
broadway_output_sendmsg (output, buf, sizeof (buf));
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
#ifndef __BROADWAY_H__
|
||||
#define __BROADWAY_H__
|
||||
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
#include "broadway-protocol.h"
|
||||
|
||||
typedef struct BroadwayOutput BroadwayOutput;
|
||||
|
||||
typedef struct {
|
||||
int x, y;
|
||||
int width, height;
|
||||
} BroadwayRect;
|
||||
|
||||
typedef enum {
|
||||
BROADWAY_WS_CONTINUATION = 0,
|
||||
BROADWAY_WS_TEXT = 1,
|
||||
@@ -18,8 +19,7 @@ typedef enum {
|
||||
|
||||
BroadwayOutput *broadway_output_new (GOutputStream *out,
|
||||
guint32 serial,
|
||||
gboolean proto_v7_plus,
|
||||
gboolean binary);
|
||||
gboolean proto_v7_plus);
|
||||
void broadway_output_free (BroadwayOutput *output);
|
||||
int broadway_output_flush (BroadwayOutput *output);
|
||||
int broadway_output_has_error (BroadwayOutput *output);
|
||||
@@ -77,5 +77,3 @@ void broadway_output_grab_pointer (BroadwayOutput *output,
|
||||
gboolean owner_event);
|
||||
guint32 broadway_output_ungrab_pointer (BroadwayOutput *output);
|
||||
void broadway_output_pong (BroadwayOutput *output);
|
||||
|
||||
#endif /* __BROADWAY_H__ */
|
||||
+340
-201
@@ -132,6 +132,18 @@ function createXHR()
|
||||
return null;
|
||||
}
|
||||
|
||||
/* This resizes the window so the *inner* size is the specified size */
|
||||
function resizeBrowserWindow(window, w, h) {
|
||||
var innerW = window.innerWidth;
|
||||
var innerH = window.innerHeight;
|
||||
|
||||
var outerW = window.outerWidth;
|
||||
var outerH = window.outerHeight;
|
||||
|
||||
window.resizeTo(w + outerW - innerW,
|
||||
h + outerH - innerH);
|
||||
}
|
||||
|
||||
function resizeCanvas(canvas, w, h)
|
||||
{
|
||||
/* Canvas resize clears the data, so we need to save it first */
|
||||
@@ -151,6 +163,8 @@ function resizeCanvas(canvas, w, h)
|
||||
context.drawImage(tmpCanvas, 0, 0, tmpCanvas.width, tmpCanvas.height);
|
||||
}
|
||||
|
||||
var useToplevelWindows = false;
|
||||
var toplevelWindows = [];
|
||||
var grab = new Object();
|
||||
grab.window = null;
|
||||
grab.ownerEvents = false;
|
||||
@@ -262,11 +276,121 @@ function flushSurface(surface)
|
||||
}
|
||||
}
|
||||
|
||||
function ensureSurfaceInDocument(surface, doc)
|
||||
{
|
||||
if (surface.document != doc) {
|
||||
var oldCanvas = surface.canvas;
|
||||
var canvas = doc.importNode(oldCanvas, false);
|
||||
doc.body.appendChild(canvas);
|
||||
canvas.surface = surface;
|
||||
oldCanvas.parentNode.removeChild(oldCanvas);
|
||||
|
||||
surface.canvas = canvas;
|
||||
if (surface.toplevelElement == oldCanvas)
|
||||
surface.toplevelElement = canvas;
|
||||
surface.document = doc;
|
||||
}
|
||||
}
|
||||
|
||||
function sendConfigureNotify(surface)
|
||||
{
|
||||
sendInput("w", [surface.id, surface.x, surface.y, surface.width, surface.height]);
|
||||
}
|
||||
|
||||
var windowGeometryTimeout = null;
|
||||
|
||||
function updateBrowserWindowGeometry(win, alwaysSendConfigure) {
|
||||
if (win.closed)
|
||||
return;
|
||||
|
||||
var surface = win.surface;
|
||||
|
||||
var innerW = win.innerWidth;
|
||||
var innerH = win.innerHeight;
|
||||
|
||||
var x = surface.x;
|
||||
var y = surface.y;
|
||||
|
||||
if (win.mozInnerScreenX != undefined) {
|
||||
x = win.mozInnerScreenX;
|
||||
y = win.mozInnerScreenY;
|
||||
} else if (win.screenTop != undefined) {
|
||||
x = win.screenTop;
|
||||
y = win.screenLeft;
|
||||
} else {
|
||||
alert("No implementation to get window position");
|
||||
}
|
||||
|
||||
if (alwaysSendConfigure || x != surface.x || y != surface.y ||
|
||||
innerW != surface.width || innerH != surface.height) {
|
||||
var oldX = surface.x;
|
||||
var oldY = surface.y;
|
||||
surface.x = x;
|
||||
surface.y = y;
|
||||
if (surface.width != innerW || surface.height != innerH)
|
||||
resizeCanvas(surface.canvas, innerW, innerH);
|
||||
surface.width = innerW;
|
||||
surface.height = innerH;
|
||||
sendConfigureNotify(surface);
|
||||
for (id in surfaces) {
|
||||
var childSurface = surfaces[id];
|
||||
var transientToplevel = getTransientToplevel(childSurface);
|
||||
if (transientToplevel != null && transientToplevel == surface) {
|
||||
childSurface.x += surface.x - oldX;
|
||||
childSurface.y += surface.y - oldY;
|
||||
sendConfigureNotify(childSurface);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function browserWindowClosed(win) {
|
||||
var surface = win.surface;
|
||||
|
||||
sendInput ("W", [surface.id]);
|
||||
for (id in surfaces) {
|
||||
var childSurface = surfaces[id];
|
||||
var transientToplevel = getTransientToplevel(childSurface);
|
||||
if (transientToplevel != null && transientToplevel == surface) {
|
||||
sendInput ("W", [childSurface.id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function registerWindow(win)
|
||||
{
|
||||
toplevelWindows.push(win);
|
||||
win.onresize = function(ev) { updateBrowserWindowGeometry(ev.target, false); };
|
||||
if (!windowGeometryTimeout)
|
||||
windowGeometryTimeout = setInterval(function () {
|
||||
for (var i = 0; i < toplevelWindows.length; i++)
|
||||
updateBrowserWindowGeometry(toplevelWindows[i], false);
|
||||
}, 2000);
|
||||
win.onunload = function(ev) { browserWindowClosed(ev.target.defaultView); };
|
||||
}
|
||||
|
||||
function unregisterWindow(win)
|
||||
{
|
||||
var i = toplevelWindows.indexOf(win);
|
||||
if (i >= 0)
|
||||
toplevelWindows.splice(i, 1);
|
||||
|
||||
if (windowGeometryTimeout && toplevelWindows.length == 0) {
|
||||
clearInterval(windowGeometryTimeout);
|
||||
windowGeometryTimeout = null;
|
||||
}
|
||||
}
|
||||
|
||||
function getTransientToplevel(surface)
|
||||
{
|
||||
while (surface && surface.transientParent != 0) {
|
||||
surface = surfaces[surface.transientParent];
|
||||
if (surface && surface.window)
|
||||
return surface;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
function getStyle(el, styleProp)
|
||||
{
|
||||
if (el.currentStyle) {
|
||||
@@ -316,6 +440,8 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
||||
surface.drawQueue = [];
|
||||
surface.transientParent = 0;
|
||||
surface.visible = false;
|
||||
surface.window = null;
|
||||
surface.document = document;
|
||||
surface.frame = null;
|
||||
|
||||
var canvas = document.createElement("canvas");
|
||||
@@ -325,7 +451,7 @@ function cmdCreateSurface(id, x, y, width, height, isTemp)
|
||||
surface.canvas = canvas;
|
||||
var toplevelElement;
|
||||
|
||||
if (isTemp) {
|
||||
if (useToplevelWindows || isTemp) {
|
||||
toplevelElement = canvas;
|
||||
document.body.appendChild(canvas);
|
||||
} else {
|
||||
@@ -385,10 +511,42 @@ function cmdShowSurface(id)
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
|
||||
if (surface.frame) {
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
if (useToplevelWindows) {
|
||||
var doc = document;
|
||||
if (!surface.isTemp) {
|
||||
var options =
|
||||
'width='+surface.width+',height='+surface.height+
|
||||
',location=no,menubar=no,scrollbars=no,toolbar=no';
|
||||
if (surface.positioned)
|
||||
options = options +
|
||||
',left='+surface.x+',top='+surface.y+',screenX='+surface.x+',screenY='+surface.y;
|
||||
var win = window.open('','_blank', options);
|
||||
win.surface = surface;
|
||||
registerWindow(win);
|
||||
doc = win.document;
|
||||
doc.open();
|
||||
doc.write("<body></body>");
|
||||
setupDocument(doc);
|
||||
|
||||
surface.window = win;
|
||||
xOffset = 0;
|
||||
yOffset = 0;
|
||||
} else {
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
doc = transientToplevel.window.document;
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
}
|
||||
|
||||
ensureSurfaceInDocument(surface, doc);
|
||||
} else {
|
||||
if (surface.frame) {
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
}
|
||||
|
||||
surface.toplevelElement.style["left"] = xOffset + "px";
|
||||
@@ -396,6 +554,9 @@ function cmdShowSurface(id)
|
||||
surface.toplevelElement.style["visibility"] = "visible";
|
||||
|
||||
restackWindows();
|
||||
|
||||
if (surface.window)
|
||||
updateBrowserWindowGeometry(surface.window, false);
|
||||
}
|
||||
|
||||
function cmdHideSurface(id)
|
||||
@@ -412,6 +573,15 @@ function cmdHideSurface(id)
|
||||
var element = surface.toplevelElement;
|
||||
|
||||
element.style["visibility"] = "hidden";
|
||||
|
||||
// Import the canvas into the main document
|
||||
ensureSurfaceInDocument(surface, document);
|
||||
|
||||
if (surface.window) {
|
||||
unregisterWindow(surface.window);
|
||||
surface.window.close();
|
||||
surface.window = null;
|
||||
}
|
||||
}
|
||||
|
||||
function cmdSetTransientFor(id, parentId)
|
||||
@@ -496,30 +666,45 @@ function cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h)
|
||||
resizeCanvas(surface.canvas, w, h);
|
||||
|
||||
if (surface.visible) {
|
||||
if (has_pos) {
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
if (surface.window) {
|
||||
/* TODO: This moves the outer frame position, we really want the inner position.
|
||||
* However this isn't *strictly* invalid, as any WM could have done whatever it
|
||||
* wanted with the positioning of the window.
|
||||
*/
|
||||
if (has_pos)
|
||||
surface.window.moveTo(surface.x, surface.y);
|
||||
if (has_size)
|
||||
resizeBrowserWindow(surface.window, w, h);
|
||||
} else {
|
||||
if (has_pos) {
|
||||
var xOffset = surface.x;
|
||||
var yOffset = surface.y;
|
||||
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
var transientToplevel = getTransientToplevel(surface);
|
||||
if (transientToplevel) {
|
||||
xOffset = surface.x - transientToplevel.x;
|
||||
yOffset = surface.y - transientToplevel.y;
|
||||
}
|
||||
|
||||
var element = surface.canvas;
|
||||
if (surface.frame) {
|
||||
element = surface.frame;
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
|
||||
element.style["left"] = xOffset + "px";
|
||||
element.style["top"] = yOffset + "px";
|
||||
}
|
||||
|
||||
var element = surface.canvas;
|
||||
if (surface.frame) {
|
||||
element = surface.frame;
|
||||
var offset = getFrameOffset(surface);
|
||||
xOffset -= offset.x;
|
||||
yOffset -= offset.y;
|
||||
}
|
||||
|
||||
element.style["left"] = xOffset + "px";
|
||||
element.style["top"] = yOffset + "px";
|
||||
}
|
||||
}
|
||||
|
||||
sendConfigureNotify(surface);
|
||||
if (surface.window) {
|
||||
updateBrowserWindowGeometry(surface.window, true);
|
||||
} else {
|
||||
sendConfigureNotify(surface);
|
||||
}
|
||||
}
|
||||
|
||||
function cmdFlushSurface(id)
|
||||
@@ -540,56 +725,76 @@ function cmdUngrabPointer()
|
||||
doUngrab();
|
||||
}
|
||||
|
||||
function handleCommands(cmd)
|
||||
function handleCommands(cmdObj)
|
||||
{
|
||||
while (cmd.pos < cmd.length) {
|
||||
var cmd = cmdObj.data;
|
||||
var i = cmdObj.pos;
|
||||
|
||||
while (i < cmd.length) {
|
||||
var id, x, y, w, h, q;
|
||||
var command = cmd.get_char();
|
||||
lastSerial = cmd.get_32();
|
||||
var command = cmd[i++];
|
||||
lastSerial = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
switch (command) {
|
||||
case 's': // create new surface
|
||||
id = cmd.get_16();
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
var isTemp = cmd.get_bool();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var isTemp = cmd[i] == '1';
|
||||
i = i + 1;
|
||||
cmdCreateSurface(id, x, y, w, h, isTemp);
|
||||
break;
|
||||
|
||||
case 'S': // Show a surface
|
||||
id = cmd.get_16();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
cmdShowSurface(id);
|
||||
break;
|
||||
|
||||
case 'H': // Hide a surface
|
||||
id = cmd.get_16();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
cmdHideSurface(id);
|
||||
break;
|
||||
|
||||
case 'p': // Set transient parent
|
||||
id = cmd.get_16();
|
||||
var parentId = cmd.get_16();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var parentId = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
cmdSetTransientFor(id, parentId);
|
||||
break;
|
||||
|
||||
case 'd': // Delete surface
|
||||
id = cmd.get_16();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
cmdDeleteSurface(id);
|
||||
break;
|
||||
|
||||
case 'm': // Move a surface
|
||||
id = cmd.get_16();
|
||||
var ops = cmd.get_flags();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ops = cmd.charCodeAt(i++) - 48;
|
||||
var has_pos = ops & 1;
|
||||
if (has_pos) {
|
||||
x = cmd.get_16s();
|
||||
y = cmd.get_16s();
|
||||
x = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
y = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
}
|
||||
var has_size = ops & 2;
|
||||
if (has_size) {
|
||||
w = cmd.get_16();
|
||||
h = cmd.get_16();
|
||||
w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
}
|
||||
cmdMoveResizeSurface(id, has_pos, x, y, has_size, w, h);
|
||||
break;
|
||||
@@ -597,50 +802,67 @@ function handleCommands(cmd)
|
||||
case 'i': // Put image data surface
|
||||
q = new Object();
|
||||
q.op = 'i';
|
||||
q.id = cmd.get_16();
|
||||
q.x = cmd.get_16();
|
||||
q.y = cmd.get_16();
|
||||
var url = cmd.get_image_url ();
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var size = base64_32(cmd, i);
|
||||
i = i + 6;
|
||||
var url = cmd.slice(i, i + size);
|
||||
i = i + size;
|
||||
q.img = new Image();
|
||||
q.img.src = url;
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
if (!q.img.complete) {
|
||||
q.img.onload = function() { cmd.free_image_url (url); handleOutstanding(); };
|
||||
cmdObj.pos = i;
|
||||
q.img.onload = function() { handleOutstanding(); };
|
||||
return false;
|
||||
}
|
||||
cmd.free_image_url (url);
|
||||
break;
|
||||
|
||||
case 'b': // Copy rects
|
||||
q = new Object();
|
||||
q.op = 'b';
|
||||
q.id = cmd.get_16();
|
||||
var nrects = cmd.get_16();
|
||||
q.id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
|
||||
var nrects = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
|
||||
q.rects = [];
|
||||
for (var r = 0; r < nrects; r++) {
|
||||
var rect = new Object();
|
||||
rect.x = cmd.get_16();
|
||||
rect.y = cmd.get_16();
|
||||
rect.w = cmd.get_16();
|
||||
rect.h = cmd.get_16();
|
||||
rect.x = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.y = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.w = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
rect.h = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
q.rects.push (rect);
|
||||
}
|
||||
|
||||
q.dx = cmd.get_16s();
|
||||
q.dy = cmd.get_16s();
|
||||
q.dx = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
q.dy = base64_16s(cmd, i);
|
||||
i = i + 3;
|
||||
surfaces[q.id].drawQueue.push(q);
|
||||
break;
|
||||
|
||||
case 'f': // Flush surface
|
||||
id = cmd.get_16();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
|
||||
cmdFlushSurface(id);
|
||||
break;
|
||||
|
||||
case 'g': // Grab
|
||||
id = cmd.get_16();
|
||||
var ownerEvents = cmd.get_bool ();
|
||||
id = base64_16(cmd, i);
|
||||
i = i + 3;
|
||||
var ownerEvents = cmd[i++] == '1';
|
||||
|
||||
cmdGrabPointer(id, ownerEvents);
|
||||
break;
|
||||
@@ -666,103 +888,13 @@ function handleOutstanding()
|
||||
}
|
||||
}
|
||||
|
||||
function TextCommands(message) {
|
||||
this.data = message;
|
||||
this.length = message.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
TextCommands.prototype.get_char = function() {
|
||||
return this.data[this.pos++];
|
||||
};
|
||||
TextCommands.prototype.get_bool = function() {
|
||||
return this.get_char() == '1';
|
||||
};
|
||||
TextCommands.prototype.get_flags = function() {
|
||||
return this.get_char() - 48;
|
||||
}
|
||||
TextCommands.prototype.get_16 = function() {
|
||||
var n = base64_16(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_16s = function() {
|
||||
var n = base64_16s(this.data, this.pos);
|
||||
this.pos = this.pos + 3;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_32 = function() {
|
||||
var n = base64_32(this.data, this.pos);
|
||||
this.pos = this.pos + 6;
|
||||
return n;
|
||||
};
|
||||
TextCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var url = this.data.slice(this.pos, this.pos + size);
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
TextCommands.prototype.free_image_url = function(url) {
|
||||
};
|
||||
|
||||
function BinCommands(message) {
|
||||
this.arraybuffer = message;
|
||||
this.u8 = new Uint8Array(message);
|
||||
this.length = this.u8.length;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
BinCommands.prototype.get_char = function() {
|
||||
return String.fromCharCode(this.u8[this.pos++]);
|
||||
};
|
||||
BinCommands.prototype.get_bool = function() {
|
||||
return this.u8[this.pos++] != 0;
|
||||
};
|
||||
BinCommands.prototype.get_flags = function() {
|
||||
return this.u8[this.pos++];
|
||||
}
|
||||
BinCommands.prototype.get_16 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8);
|
||||
this.pos = this.pos + 2;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_16s = function() {
|
||||
var v = this.get_16 ();
|
||||
if (v > 32767)
|
||||
return v - 65536;
|
||||
else
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_32 = function() {
|
||||
var v =
|
||||
this.u8[this.pos] +
|
||||
(this.u8[this.pos+1] << 8) +
|
||||
(this.u8[this.pos+2] << 16) +
|
||||
(this.u8[this.pos+3] << 24);
|
||||
this.pos = this.pos + 4;
|
||||
return v;
|
||||
};
|
||||
BinCommands.prototype.get_image_url = function() {
|
||||
var size = this.get_32();
|
||||
var png_blob = new Blob ([this.arraybuffer.slice (this.pos, this.pos + size)], {type:"image/png"});
|
||||
var url = URL.createObjectURL(png_blob, {oneTimeOnly: true});
|
||||
this.pos = this.pos + size;
|
||||
return url;
|
||||
};
|
||||
BinCommands.prototype.free_image_url = function(url) {
|
||||
URL.revokeObjectURL(url);
|
||||
};
|
||||
|
||||
function handleMessage(message)
|
||||
{
|
||||
var cmd;
|
||||
if (message instanceof ArrayBuffer)
|
||||
cmd = new BinCommands(message);
|
||||
else
|
||||
cmd = new TextCommands(message);
|
||||
outstandingCommands.push(cmd);
|
||||
var cmdObj = {};
|
||||
cmdObj.data = message;
|
||||
cmdObj.pos = 0;
|
||||
|
||||
outstandingCommands.push(cmdObj);
|
||||
if (outstandingCommands.length == 1) {
|
||||
handleOutstanding();
|
||||
}
|
||||
@@ -800,8 +932,13 @@ function getPositionsFromAbsCoord(absX, absY, relativeId) {
|
||||
|
||||
function getPositionsFromEvent(ev, relativeId) {
|
||||
var absX, absY;
|
||||
absX = ev.pageX;
|
||||
absY = ev.pageY;
|
||||
if (useToplevelWindows) {
|
||||
absX = ev.screenX;
|
||||
absY = ev.screenY;
|
||||
} else {
|
||||
absX = ev.pageX;
|
||||
absY = ev.pageY;
|
||||
}
|
||||
var res = getPositionsFromAbsCoord(absX, absY, relativeId);
|
||||
|
||||
lastX = res.rootX;
|
||||
@@ -830,6 +967,10 @@ function updateForEvent(ev) {
|
||||
lastState |= GDK_MOD1_MASK;
|
||||
|
||||
lastTimeStamp = ev.timeStamp;
|
||||
if (ev.target.surface && ev.target.surface.window) {
|
||||
var win = ev.target.surface.window;
|
||||
updateBrowserWindowGeometry(win, false);
|
||||
}
|
||||
}
|
||||
|
||||
function onMouseMove (ev) {
|
||||
@@ -947,7 +1088,7 @@ function onMouseDown (ev) {
|
||||
localGrab.lastX = ev.pageX;
|
||||
localGrab.lastY = ev.pageY;
|
||||
moveToTop(localGrab.frame.frameFor);
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (id == 0 && ev.target.closeFor) { /* mouse click on frame */
|
||||
@@ -959,14 +1100,13 @@ function onMouseDown (ev) {
|
||||
localGrab.button = ev.target;
|
||||
localGrab.lastX = ev.pageX;
|
||||
localGrab.lastY = ev.pageY;
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
var pos = getPositionsFromEvent(ev, id);
|
||||
if (grab.window == null)
|
||||
doGrab (id, false, true);
|
||||
sendInput ("b", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||
return false;
|
||||
}
|
||||
|
||||
function onMouseUp (ev) {
|
||||
@@ -996,15 +1136,13 @@ function onMouseUp (ev) {
|
||||
sendInput ("W", [localGrab.surface.id]);
|
||||
}
|
||||
localGrab = null;
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
|
||||
sendInput ("B", [realWindowWithMouse, id, pos.rootX, pos.rootY, pos.winX, pos.winY, lastState, button]);
|
||||
|
||||
if (grab.window != null && grab.implicit)
|
||||
doUngrab();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Some of the keyboard handling code is from noVNC and
|
||||
@@ -2480,7 +2618,7 @@ function handleKeyDown(e) {
|
||||
// browser behaviors or it has no corresponding keyPress
|
||||
// event, then send it immediately
|
||||
if (!ignoreKeyEvent(ev))
|
||||
sendInput("k", [realWindowWithMouse, keysym, lastState]);
|
||||
sendInput("k", [keysym, lastState]);
|
||||
suppress = true;
|
||||
}
|
||||
|
||||
@@ -2525,7 +2663,7 @@ function handleKeyPress(e) {
|
||||
|
||||
// Send the translated keysym
|
||||
if (keysym > 0)
|
||||
sendInput ("k", [realWindowWithMouse, keysym, lastState]);
|
||||
sendInput ("k", [keysym, lastState]);
|
||||
|
||||
// Stop keypress events just in case
|
||||
return cancelEvent(ev);
|
||||
@@ -2544,7 +2682,7 @@ function handleKeyUp(e) {
|
||||
}
|
||||
|
||||
if (keysym > 0)
|
||||
sendInput ("K", [realWindowWithMouse, keysym, lastState]);
|
||||
sendInput ("K", [keysym, lastState]);
|
||||
return cancelEvent(ev);
|
||||
}
|
||||
|
||||
@@ -2621,56 +2759,57 @@ function setupDocument(document)
|
||||
}
|
||||
}
|
||||
|
||||
function newWS(loc) {
|
||||
var ws = null;
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
} else {
|
||||
alert("WebSocket not supported, broadway will not work!");
|
||||
}
|
||||
return ws;
|
||||
}
|
||||
|
||||
function connect()
|
||||
{
|
||||
var url = window.location.toString();
|
||||
var query_string = url.split("?");
|
||||
if (query_string.length > 1) {
|
||||
var params = query_string[1].split("&");
|
||||
if (params[0].indexOf("toplevel") != -1)
|
||||
useToplevelWindows = true;
|
||||
}
|
||||
|
||||
var loc = window.location.toString().replace("http:", "ws:");
|
||||
loc = loc.substr(0, loc.lastIndexOf('/')) + "/socket";
|
||||
var ws = null;
|
||||
|
||||
var supports_binary = newWS (loc + "-test").binaryType == "blob";
|
||||
if (supports_binary) {
|
||||
ws = newWS (loc + "-bin");
|
||||
ws.binaryType = "arraybuffer";
|
||||
if ("WebSocket" in window) {
|
||||
ws = new WebSocket(loc, "broadway");
|
||||
} else if ("MozWebSocket" in window) { // Firefox 6
|
||||
ws = new MozWebSocket(loc);
|
||||
} else {
|
||||
ws = newWS (loc);
|
||||
alert("WebSocket not supported, input will not work!");
|
||||
return;
|
||||
}
|
||||
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
ws.onopen = function() {
|
||||
inputSocket = ws;
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
if (useToplevelWindows) {
|
||||
w = window.screen.width;
|
||||
h = window.screen.height;
|
||||
} else {
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
window.onresize = function(ev) {
|
||||
var w, h;
|
||||
w = window.innerWidth;
|
||||
h = window.innerHeight;
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
}
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
sendInput ("d", [w, h]);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
ws.onclose = function() {
|
||||
inputSocket = null;
|
||||
};
|
||||
ws.onmessage = function(event) {
|
||||
handleMessage(event.data);
|
||||
};
|
||||
|
||||
setupDocument(document);
|
||||
window.onunload = function (ev) {
|
||||
for (var i = 0; i < toplevelWindows.length; i++)
|
||||
toplevelWindows[i].close();
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1,515 +0,0 @@
|
||||
#include "config.h"
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <glib.h>
|
||||
#include <gio/gio.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
|
||||
#include "broadway-server.h"
|
||||
|
||||
BroadwayServer *server;
|
||||
GList *clients;
|
||||
|
||||
static guint32 client_id_count = 1;
|
||||
|
||||
typedef struct {
|
||||
guint32 id;
|
||||
GSocketConnection *connection;
|
||||
GBufferedInputStream *in;
|
||||
guint32 last_seen_serial;
|
||||
GList *windows;
|
||||
guint disconnect_idle;
|
||||
} BroadwayClient;
|
||||
|
||||
static void
|
||||
client_free (BroadwayClient *client)
|
||||
{
|
||||
g_assert (client->windows == NULL);
|
||||
g_assert (client->disconnect_idle == 0);
|
||||
clients = g_list_remove (clients, client);
|
||||
g_object_unref (client->connection);
|
||||
g_object_unref (client->in);
|
||||
g_free (client);
|
||||
}
|
||||
|
||||
static void
|
||||
client_disconnected (BroadwayClient *client)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
if (client->disconnect_idle != 0)
|
||||
{
|
||||
g_source_remove (client->disconnect_idle);
|
||||
client->disconnect_idle = 0;
|
||||
}
|
||||
|
||||
for (l = client->windows; l != NULL; l = l->next)
|
||||
broadway_server_destroy_window (server,
|
||||
GPOINTER_TO_UINT (l->data));
|
||||
g_list_free (client->windows);
|
||||
client->windows = NULL;
|
||||
|
||||
broadway_server_flush (server);
|
||||
|
||||
client_free (client);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
disconnect_idle_cb (BroadwayClient *client)
|
||||
{
|
||||
client->disconnect_idle = 0;
|
||||
client_disconnected (client);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
client_disconnect_in_idle (BroadwayClient *client)
|
||||
{
|
||||
if (client->disconnect_idle == 0)
|
||||
client->disconnect_idle =
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT, (GSourceFunc)disconnect_idle_cb, client, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
send_reply (BroadwayClient *client,
|
||||
BroadwayRequest *request,
|
||||
BroadwayReply *reply,
|
||||
gsize size,
|
||||
guint32 type)
|
||||
{
|
||||
GOutputStream *output;
|
||||
|
||||
reply->base.size = size;
|
||||
reply->base.last_serial = client->last_seen_serial;
|
||||
reply->base.in_reply_to = request ? request->base.serial : 0;
|
||||
reply->base.type = type;
|
||||
|
||||
output = g_io_stream_get_output_stream (G_IO_STREAM (client->connection));
|
||||
if (!g_output_stream_write_all (output, reply, size, NULL, NULL, NULL))
|
||||
{
|
||||
g_printerr ("can't write to client");
|
||||
client_disconnect_in_idle (client);
|
||||
}
|
||||
}
|
||||
|
||||
static cairo_region_t *
|
||||
region_from_rects (BroadwayRect *rects, int n_rects)
|
||||
{
|
||||
cairo_region_t *region;
|
||||
cairo_rectangle_int_t *cairo_rects;
|
||||
int i;
|
||||
|
||||
cairo_rects = g_new (cairo_rectangle_int_t, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_rects[i].x = rects[i].x;
|
||||
cairo_rects[i].y = rects[i].y;
|
||||
cairo_rects[i].width = rects[i].width;
|
||||
cairo_rects[i].height = rects[i].height;
|
||||
}
|
||||
region = cairo_region_create_rectangles (cairo_rects, n_rects);
|
||||
g_free (cairo_rects);
|
||||
return region;
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} ShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_unmap (void *_data)
|
||||
{
|
||||
ShmSurfaceData *data = _data;
|
||||
munmap (data->data, data->data_size);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
open_surface (char *name, int width, int height)
|
||||
{
|
||||
ShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
gsize size;
|
||||
void *ptr;
|
||||
int fd;
|
||||
|
||||
size = width * height * sizeof (guint32);
|
||||
|
||||
fd = shm_open(name, O_RDONLY, 0600);
|
||||
if (fd == -1)
|
||||
{
|
||||
perror ("Failed to shm_open");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ptr = mmap(0, size, PROT_READ, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
if (ptr == NULL)
|
||||
return NULL;
|
||||
|
||||
data = g_new0 (ShmSurfaceData, 1);
|
||||
|
||||
data->data = ptr;
|
||||
data->data_size = size;
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24,
|
||||
width, height,
|
||||
width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &shm_cairo_key,
|
||||
data, shm_data_unmap);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
static void
|
||||
client_handle_request (BroadwayClient *client,
|
||||
BroadwayRequest *request)
|
||||
{
|
||||
BroadwayReplyNewWindow reply_new_window;
|
||||
BroadwayReplySync reply_sync;
|
||||
BroadwayReplyQueryMouse reply_query_mouse;
|
||||
BroadwayReplyGrabPointer reply_grab_pointer;
|
||||
BroadwayReplyUngrabPointer reply_ungrab_pointer;
|
||||
cairo_region_t *area;
|
||||
cairo_surface_t *surface;
|
||||
|
||||
client->last_seen_serial = request->base.serial;
|
||||
|
||||
switch (request->base.type)
|
||||
{
|
||||
case BROADWAY_REQUEST_NEW_WINDOW:
|
||||
reply_new_window.id =
|
||||
broadway_server_new_window (server,
|
||||
request->new_window.x,
|
||||
request->new_window.y,
|
||||
request->new_window.width,
|
||||
request->new_window.height,
|
||||
request->new_window.is_temp);
|
||||
client->windows =
|
||||
g_list_prepend (client->windows,
|
||||
GUINT_TO_POINTER (reply_new_window.id));
|
||||
|
||||
send_reply (client, request, (BroadwayReply *)&reply_new_window, sizeof (reply_new_window),
|
||||
BROADWAY_REPLY_NEW_WINDOW);
|
||||
break;
|
||||
case BROADWAY_REQUEST_FLUSH:
|
||||
broadway_server_flush (server);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SYNC:
|
||||
broadway_server_flush (server);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_sync, sizeof (reply_sync),
|
||||
BROADWAY_REPLY_SYNC);
|
||||
break;
|
||||
case BROADWAY_REQUEST_QUERY_MOUSE:
|
||||
broadway_server_query_mouse (server,
|
||||
&reply_query_mouse.toplevel,
|
||||
&reply_query_mouse.root_x,
|
||||
&reply_query_mouse.root_y,
|
||||
&reply_query_mouse.mask);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_query_mouse, sizeof (reply_query_mouse),
|
||||
BROADWAY_REPLY_QUERY_MOUSE);
|
||||
break;
|
||||
case BROADWAY_REQUEST_DESTROY_WINDOW:
|
||||
client->windows =
|
||||
g_list_remove (client->windows,
|
||||
GUINT_TO_POINTER (request->destroy_window.id));
|
||||
broadway_server_destroy_window (server, request->destroy_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SHOW_WINDOW:
|
||||
broadway_server_window_show (server, request->show_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_HIDE_WINDOW:
|
||||
broadway_server_window_hide (server, request->hide_window.id);
|
||||
break;
|
||||
case BROADWAY_REQUEST_SET_TRANSIENT_FOR:
|
||||
broadway_server_window_set_transient_for (server,
|
||||
request->set_transient_for.id,
|
||||
request->set_transient_for.parent);
|
||||
break;
|
||||
case BROADWAY_REQUEST_TRANSLATE:
|
||||
area = region_from_rects (request->translate.rects,
|
||||
request->translate.n_rects);
|
||||
broadway_server_window_translate (server,
|
||||
request->translate.id,
|
||||
area,
|
||||
request->translate.dx,
|
||||
request->translate.dy);
|
||||
cairo_region_destroy (area);
|
||||
break;
|
||||
case BROADWAY_REQUEST_UPDATE:
|
||||
surface = open_surface (request->update.name,
|
||||
request->update.width,
|
||||
request->update.height);
|
||||
if (surface != NULL)
|
||||
{
|
||||
broadway_server_window_update (server,
|
||||
request->update.id,
|
||||
surface);
|
||||
cairo_surface_destroy (surface);
|
||||
}
|
||||
break;
|
||||
case BROADWAY_REQUEST_MOVE_RESIZE:
|
||||
if (!broadway_server_window_move_resize (server,
|
||||
request->move_resize.id,
|
||||
request->move_resize.x,
|
||||
request->move_resize.y,
|
||||
request->move_resize.width,
|
||||
request->move_resize.height))
|
||||
{
|
||||
/* TODO: Send configure request */
|
||||
}
|
||||
break;
|
||||
case BROADWAY_REQUEST_GRAB_POINTER:
|
||||
reply_grab_pointer.status =
|
||||
broadway_server_grab_pointer (server,
|
||||
client->id,
|
||||
request->grab_pointer.id,
|
||||
request->grab_pointer.owner_events,
|
||||
request->grab_pointer.event_mask,
|
||||
request->grab_pointer.time_);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_grab_pointer, sizeof (reply_grab_pointer),
|
||||
BROADWAY_REPLY_GRAB_POINTER);
|
||||
break;
|
||||
case BROADWAY_REQUEST_UNGRAB_POINTER:
|
||||
reply_ungrab_pointer.status =
|
||||
broadway_server_ungrab_pointer (server,
|
||||
request->ungrab_pointer.time_);
|
||||
send_reply (client, request, (BroadwayReply *)&reply_ungrab_pointer, sizeof (reply_ungrab_pointer),
|
||||
BROADWAY_REPLY_UNGRAB_POINTER);
|
||||
break;
|
||||
default:
|
||||
g_warning ("Unknown request of type %d\n", request->base.type);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
client_fill_cb (GObject *source_object,
|
||||
GAsyncResult *result,
|
||||
gpointer user_data)
|
||||
{
|
||||
BroadwayClient *client = user_data;
|
||||
gssize res;
|
||||
|
||||
res = g_buffered_input_stream_fill_finish (client->in, result, NULL);
|
||||
|
||||
if (res > 0)
|
||||
{
|
||||
guint32 size;
|
||||
gsize count, remaining;
|
||||
guint8 *buffer;
|
||||
BroadwayRequest request;
|
||||
|
||||
buffer = (guint8 *)g_buffered_input_stream_peek_buffer (client->in, &count);
|
||||
|
||||
remaining = count;
|
||||
while (remaining >= sizeof (guint32))
|
||||
{
|
||||
memcpy (&size, buffer, sizeof (guint32));
|
||||
|
||||
if (size <= remaining)
|
||||
{
|
||||
g_assert (size >= sizeof (BroadwayRequestBase));
|
||||
g_assert (size <= sizeof (BroadwayRequest));
|
||||
|
||||
memcpy (&request, buffer, size);
|
||||
client_handle_request (client, &request);
|
||||
|
||||
remaining -= size;
|
||||
buffer += size;
|
||||
}
|
||||
}
|
||||
|
||||
/* This is guaranteed not to block */
|
||||
g_input_stream_skip (G_INPUT_STREAM (client->in), count - remaining, NULL, NULL);
|
||||
|
||||
g_buffered_input_stream_fill_async (client->in,
|
||||
4*1024,
|
||||
0,
|
||||
NULL,
|
||||
client_fill_cb, client);
|
||||
}
|
||||
else
|
||||
{
|
||||
client_disconnected (client);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
incoming_client (GSocketService *service,
|
||||
GSocketConnection *connection,
|
||||
GObject *source_object)
|
||||
{
|
||||
BroadwayClient *client;
|
||||
GInputStream *input;
|
||||
|
||||
client = g_new0 (BroadwayClient, 1);
|
||||
client->id = client_id_count++;
|
||||
client->connection = g_object_ref (connection);
|
||||
|
||||
input = g_io_stream_get_input_stream (G_IO_STREAM (client->connection));
|
||||
client->in = (GBufferedInputStream *)g_buffered_input_stream_new (input);
|
||||
|
||||
clients = g_list_prepend (clients, client);
|
||||
|
||||
g_buffered_input_stream_fill_async (client->in,
|
||||
4*1024,
|
||||
0,
|
||||
NULL,
|
||||
client_fill_cb, client);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
GError *error = NULL;
|
||||
GOptionContext *context;
|
||||
GMainLoop *loop;
|
||||
GSocketAddress *address;
|
||||
GSocketService *listener;
|
||||
char *path, *base;
|
||||
int http_port = 0;
|
||||
int display = 1;
|
||||
const GOptionEntry entries[] = {
|
||||
{ "port", 'p', 0, G_OPTION_ARG_INT, &http_port, "Httpd port", "PORT" },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
context = g_option_context_new ("[:DISPLAY] - broadway display daemon");
|
||||
g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE);
|
||||
if (!g_option_context_parse (context, &argc, &argv, &error))
|
||||
{
|
||||
g_printerr ("option parsing failed: %s\n", error->message);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
if (argc > 1)
|
||||
{
|
||||
if (*argv[1] != ':')
|
||||
{
|
||||
g_printerr ("Usage broadwayd [:DISPLAY]\n");
|
||||
exit (1);
|
||||
}
|
||||
display = strtol(argv[1]+1, NULL, 10);
|
||||
if (display == 0)
|
||||
{
|
||||
g_printerr ("Failed to parse display num %s\n", argv[1]);
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
if (http_port == 0)
|
||||
http_port = 8080 + (display - 1);
|
||||
|
||||
server = broadway_server_new (http_port, &error);
|
||||
if (server == NULL)
|
||||
{
|
||||
g_printerr ("%s\n", error->message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
base = g_strdup_printf ("broadway%d.socket", display);
|
||||
path = g_build_filename (g_get_user_runtime_dir (), base, NULL);
|
||||
g_free (base);
|
||||
g_print ("Listening on %s\n", path);
|
||||
address = g_unix_socket_address_new_with_type (path, -1,
|
||||
G_UNIX_SOCKET_ADDRESS_ABSTRACT);
|
||||
g_free (path);
|
||||
|
||||
listener = g_socket_service_new ();
|
||||
if (!g_socket_listener_add_address (G_SOCKET_LISTENER (listener),
|
||||
address,
|
||||
G_SOCKET_TYPE_STREAM,
|
||||
G_SOCKET_PROTOCOL_DEFAULT,
|
||||
G_OBJECT (server),
|
||||
NULL,
|
||||
&error))
|
||||
{
|
||||
g_printerr ("Can't listen: %s\n", error->message);
|
||||
return 1;
|
||||
}
|
||||
g_object_unref (address);
|
||||
|
||||
g_signal_connect (listener, "incoming", G_CALLBACK (incoming_client), NULL);
|
||||
|
||||
g_socket_service_start (G_SOCKET_SERVICE (listener));
|
||||
|
||||
loop = g_main_loop_new (NULL, FALSE);
|
||||
g_main_loop_run (loop);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static gsize
|
||||
get_event_size (int type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case BROADWAY_EVENT_ENTER:
|
||||
case BROADWAY_EVENT_LEAVE:
|
||||
return sizeof (BroadwayInputCrossingMsg);
|
||||
case BROADWAY_EVENT_POINTER_MOVE:
|
||||
return sizeof (BroadwayInputPointerMsg);
|
||||
case BROADWAY_EVENT_BUTTON_PRESS:
|
||||
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||
return sizeof (BroadwayInputButtonMsg);
|
||||
case BROADWAY_EVENT_SCROLL:
|
||||
return sizeof (BroadwayInputScrollMsg);
|
||||
case BROADWAY_EVENT_KEY_PRESS:
|
||||
case BROADWAY_EVENT_KEY_RELEASE:
|
||||
return sizeof (BroadwayInputKeyMsg);
|
||||
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||
return sizeof (BroadwayInputGrabReply);
|
||||
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||
return sizeof (BroadwayInputConfigureNotify);
|
||||
case BROADWAY_EVENT_DELETE_NOTIFY:
|
||||
return sizeof (BroadwayInputDeleteNotify);
|
||||
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
|
||||
return sizeof (BroadwayInputScreenResizeNotify);
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
broadway_events_got_input (BroadwayInputMsg *message,
|
||||
gint32 client_id)
|
||||
{
|
||||
GList *l;
|
||||
BroadwayReplyEvent reply_event;
|
||||
gsize size;
|
||||
|
||||
size = get_event_size (message->base.type);
|
||||
|
||||
reply_event.msg = *message;
|
||||
|
||||
for (l = clients; l != NULL; l = l->next)
|
||||
{
|
||||
BroadwayClient *client = l->data;
|
||||
|
||||
if (client_id == -1 ||
|
||||
client->id == client_id)
|
||||
{
|
||||
send_reply (client, NULL, (BroadwayReply *)&reply_event,
|
||||
sizeof (BroadwayReplyBase) + size,
|
||||
BROADWAY_REPLY_EVENT);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,688 +0,0 @@
|
||||
#include <sys/mman.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include "gdkbroadway-server.h"
|
||||
|
||||
#include "gdkprivate-broadway.h"
|
||||
|
||||
#include <glib.h>
|
||||
#include <glib/gprintf.h>
|
||||
#include <gio/gunixsocketaddress.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
|
||||
typedef struct BroadwayInput BroadwayInput;
|
||||
|
||||
struct _GdkBroadwayServer {
|
||||
GObject parent_instance;
|
||||
|
||||
guint32 next_serial;
|
||||
GSocketConnection *connection;
|
||||
|
||||
guint32 recv_buffer_size;
|
||||
guint8 recv_buffer[1024];
|
||||
|
||||
guint process_input_idle;
|
||||
GList *incomming;
|
||||
|
||||
};
|
||||
|
||||
struct _GdkBroadwayServerClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
static gboolean input_available_cb (gpointer stream, gpointer user_data);
|
||||
|
||||
G_DEFINE_TYPE (GdkBroadwayServer, gdk_broadway_server, G_TYPE_OBJECT)
|
||||
|
||||
static void
|
||||
gdk_broadway_server_init (GdkBroadwayServer *server)
|
||||
{
|
||||
server->next_serial = 1;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_server_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (gdk_broadway_server_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_broadway_server_class_init (GdkBroadwayServerClass * class)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
object_class->finalize = gdk_broadway_server_finalize;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_lookahead_event (GdkBroadwayServer *server,
|
||||
const char *types)
|
||||
{
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gulong
|
||||
_gdk_broadway_server_get_next_serial (GdkBroadwayServer *server)
|
||||
{
|
||||
return (gulong)server->next_serial;
|
||||
}
|
||||
|
||||
GdkBroadwayServer *
|
||||
_gdk_broadway_server_new (int port, GError **error)
|
||||
{
|
||||
GdkBroadwayServer *server;
|
||||
char *basename;
|
||||
GSocketClient *client;
|
||||
GSocketConnection *connection;
|
||||
GSocketAddress *address;
|
||||
GPollableInputStream *pollable;
|
||||
GInputStream *in;
|
||||
GSource *source;
|
||||
char *path;
|
||||
|
||||
basename = g_strdup_printf ("broadway%d.socket", port);
|
||||
path = g_build_filename (g_get_user_runtime_dir (), basename, NULL);
|
||||
g_free (basename);
|
||||
|
||||
address = g_unix_socket_address_new_with_type (path, -1,
|
||||
G_UNIX_SOCKET_ADDRESS_ABSTRACT);
|
||||
g_free (path);
|
||||
|
||||
client = g_socket_client_new ();
|
||||
|
||||
error = NULL;
|
||||
connection = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (address), NULL, error);
|
||||
|
||||
g_object_unref (address);
|
||||
g_object_unref (client);
|
||||
|
||||
if (connection == NULL)
|
||||
return NULL;
|
||||
|
||||
server = g_object_new (GDK_TYPE_BROADWAY_SERVER, NULL);
|
||||
server->connection = connection;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
pollable = G_POLLABLE_INPUT_STREAM (in);
|
||||
|
||||
source = g_pollable_input_stream_create_source (pollable, NULL);
|
||||
g_source_attach (source, NULL);
|
||||
g_source_set_callback (source, (GSourceFunc)input_available_cb, server, NULL);
|
||||
|
||||
return server;
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_get_last_seen_time (GdkBroadwayServer *server)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static guint32
|
||||
gdk_broadway_server_send_message_with_size (GdkBroadwayServer *server, BroadwayRequestBase *base,
|
||||
gsize size, guint32 type)
|
||||
{
|
||||
GOutputStream *out;
|
||||
gsize written;
|
||||
|
||||
base->size = size;
|
||||
base->type = type;
|
||||
base->serial = server->next_serial++;
|
||||
|
||||
out = g_io_stream_get_output_stream (G_IO_STREAM (server->connection));
|
||||
|
||||
if (!g_output_stream_write_all (out, base, size, &written, NULL, NULL))
|
||||
{
|
||||
g_printerr ("Unable to write to server\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
g_assert (written == size);
|
||||
|
||||
return base->serial;
|
||||
}
|
||||
|
||||
#define gdk_broadway_server_send_message(_server, _msg, _type) \
|
||||
gdk_broadway_server_send_message_with_size(_server, (BroadwayRequestBase *)&_msg, sizeof (_msg), _type)
|
||||
|
||||
static void
|
||||
parse_all_input (GdkBroadwayServer *server)
|
||||
{
|
||||
guint8 *p, *end;
|
||||
guint32 size;
|
||||
BroadwayReply *reply;
|
||||
|
||||
p = server->recv_buffer;
|
||||
end = p + server->recv_buffer_size;
|
||||
|
||||
while (p + sizeof (guint32) <= end)
|
||||
{
|
||||
memcpy (&size, p, sizeof (guint32));
|
||||
if (p + size > end)
|
||||
break;
|
||||
|
||||
reply = g_memdup (p, size);
|
||||
p += size;
|
||||
|
||||
server->incomming = g_list_append (server->incomming, reply);
|
||||
}
|
||||
|
||||
if (p < end)
|
||||
memmove (server->recv_buffer, p, end - p);
|
||||
server->recv_buffer_size = end - p;
|
||||
}
|
||||
|
||||
static void
|
||||
read_some_input_blocking (GdkBroadwayServer *server)
|
||||
{
|
||||
GInputStream *in;
|
||||
gssize res;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
|
||||
g_assert (server->recv_buffer_size < sizeof (server->recv_buffer));
|
||||
res = g_input_stream_read (in, &server->recv_buffer[server->recv_buffer_size],
|
||||
sizeof (server->recv_buffer) - server->recv_buffer_size,
|
||||
NULL, NULL);
|
||||
|
||||
if (res <= 0)
|
||||
{
|
||||
g_printerr ("Unable to read from broadway server\n");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
server->recv_buffer_size += res;
|
||||
}
|
||||
|
||||
static void
|
||||
read_some_input_nonblocking (GdkBroadwayServer *server)
|
||||
{
|
||||
GInputStream *in;
|
||||
GPollableInputStream *pollable;
|
||||
gssize res;
|
||||
GError *error;
|
||||
|
||||
in = g_io_stream_get_input_stream (G_IO_STREAM (server->connection));
|
||||
pollable = G_POLLABLE_INPUT_STREAM (in);
|
||||
|
||||
g_assert (server->recv_buffer_size < sizeof (server->recv_buffer));
|
||||
error = NULL;
|
||||
res = g_pollable_input_stream_read_nonblocking (pollable, &server->recv_buffer[server->recv_buffer_size],
|
||||
sizeof (server->recv_buffer) - server->recv_buffer_size,
|
||||
NULL, &error);
|
||||
|
||||
if (res < 0 && g_error_matches (error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK))
|
||||
{
|
||||
g_error_free (error);
|
||||
res = 0;
|
||||
}
|
||||
else if (res <= 0)
|
||||
{
|
||||
g_printerr ("Unable to read from broadway server: %s\n", error ? error->message : "eof");
|
||||
exit (1);
|
||||
}
|
||||
|
||||
server->recv_buffer_size += res;
|
||||
}
|
||||
|
||||
static BroadwayReply *
|
||||
find_response_by_serial (GdkBroadwayServer *server, guint32 serial)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = server->incomming; l != NULL; l = l->next)
|
||||
{
|
||||
BroadwayReply *reply = l->data;
|
||||
|
||||
if (reply->base.in_reply_to == serial)
|
||||
return reply;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
process_input_messages (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayReply *reply;
|
||||
|
||||
if (server->process_input_idle != 0)
|
||||
{
|
||||
g_source_remove (server->process_input_idle);
|
||||
server->process_input_idle = 0;
|
||||
}
|
||||
|
||||
while (server->incomming)
|
||||
{
|
||||
reply = server->incomming->data;
|
||||
server->incomming =
|
||||
g_list_delete_link (server->incomming,
|
||||
server->incomming);
|
||||
|
||||
if (reply->base.type == BROADWAY_REPLY_EVENT)
|
||||
_gdk_broadway_events_got_input (&reply->event.msg);
|
||||
else
|
||||
g_warning ("Unhandled reply type %d\n", reply->base.type);
|
||||
g_free (reply);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
process_input_idle_cb (GdkBroadwayServer *server)
|
||||
{
|
||||
server->process_input_idle = 0;
|
||||
process_input_messages (server);
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_process_input_at_idle (GdkBroadwayServer *server)
|
||||
{
|
||||
if (server->process_input_idle == 0)
|
||||
server->process_input_idle =
|
||||
g_idle_add_full (G_PRIORITY_DEFAULT, (GSourceFunc)process_input_idle_cb, server, NULL);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
input_available_cb (gpointer stream, gpointer user_data)
|
||||
{
|
||||
GdkBroadwayServer *server = user_data;
|
||||
|
||||
read_some_input_nonblocking (server);
|
||||
parse_all_input (server);
|
||||
|
||||
process_input_messages (server);
|
||||
|
||||
return G_SOURCE_CONTINUE;
|
||||
}
|
||||
|
||||
static BroadwayReply *
|
||||
gdk_broadway_server_wait_for_reply (GdkBroadwayServer *server,
|
||||
guint32 serial)
|
||||
{
|
||||
BroadwayReply *reply;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
reply = find_response_by_serial (server, serial);
|
||||
if (reply)
|
||||
{
|
||||
server->incomming = g_list_remove (server->incomming, reply);
|
||||
return reply;
|
||||
}
|
||||
|
||||
read_some_input_blocking (server);
|
||||
parse_all_input (server);
|
||||
}
|
||||
|
||||
queue_process_input_at_idle (server);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_flush (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayRequestFlush msg;
|
||||
|
||||
gdk_broadway_server_send_message(server, msg, BROADWAY_REQUEST_FLUSH);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_sync (GdkBroadwayServer *server)
|
||||
{
|
||||
BroadwayRequestSync msg;
|
||||
guint32 serial;
|
||||
BroadwayReply *reply;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SYNC);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_SYNC);
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_query_mouse (GdkBroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask)
|
||||
{
|
||||
BroadwayRequestQueryMouse msg;
|
||||
guint32 serial;
|
||||
BroadwayReply *reply;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_QUERY_MOUSE);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_QUERY_MOUSE);
|
||||
|
||||
if (toplevel)
|
||||
*toplevel = reply->query_mouse.toplevel;
|
||||
if (root_x)
|
||||
*root_x = reply->query_mouse.root_x;
|
||||
if (root_y)
|
||||
*root_y = reply->query_mouse.root_y;
|
||||
if (mask)
|
||||
*mask = reply->query_mouse.mask;
|
||||
|
||||
g_free (reply);
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_new_window (GdkBroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp)
|
||||
{
|
||||
BroadwayRequestNewWindow msg;
|
||||
guint32 serial, id;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.x = x;
|
||||
msg.y = y;
|
||||
msg.width = width;
|
||||
msg.height = height;
|
||||
msg.is_temp = is_temp;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_NEW_WINDOW);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_NEW_WINDOW);
|
||||
|
||||
id = reply->new_window.id;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_destroy_window (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestDestroyWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_DESTROY_WINDOW);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_show (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestShowWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SHOW_WINDOW);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_hide (GdkBroadwayServer *server,
|
||||
gint id)
|
||||
{
|
||||
BroadwayRequestHideWindow msg;
|
||||
|
||||
msg.id = id;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_HIDE_WINDOW);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_window_set_transient_for (GdkBroadwayServer *server,
|
||||
gint id, gint parent)
|
||||
{
|
||||
BroadwayRequestSetTransientFor msg;
|
||||
|
||||
msg.id = id;
|
||||
msg.parent = parent;
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_SET_TRANSIENT_FOR);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_translate (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy)
|
||||
{
|
||||
BroadwayRequestTranslate *msg;
|
||||
cairo_rectangle_int_t rect;
|
||||
int i, n_rects;
|
||||
gsize msg_size;
|
||||
|
||||
n_rects = cairo_region_num_rectangles (area);
|
||||
|
||||
msg_size = sizeof (BroadwayRequestTranslate) + (n_rects-1) * sizeof (BroadwayRect);
|
||||
msg = g_malloc (msg_size);
|
||||
|
||||
msg->id = id;
|
||||
msg->dx = dx;
|
||||
msg->dy = dy;
|
||||
msg->n_rects = n_rects;
|
||||
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_region_get_rectangle (area, i, &rect);
|
||||
msg->rects[i].x = rect.x;
|
||||
msg->rects[i].y = rect.y;
|
||||
msg->rects[i].width = rect.width;
|
||||
msg->rects[i].height = rect.height;
|
||||
}
|
||||
|
||||
gdk_broadway_server_send_message_with_size (server, (BroadwayRequestBase *)msg, msg_size,
|
||||
BROADWAY_REQUEST_TRANSLATE);
|
||||
g_free (msg);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static char
|
||||
make_valid_fs_char (char c)
|
||||
{
|
||||
if (c == 0 || c == '/')
|
||||
return c + 1;
|
||||
return c;
|
||||
}
|
||||
|
||||
/* name must have at least space for 34 bytes */
|
||||
static int
|
||||
create_random_shm (char *name)
|
||||
{
|
||||
guint32 r;
|
||||
int i, o, fd;
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
o = 0;
|
||||
name[o++] = '/';
|
||||
for (i = 0; i < 32/4; i++)
|
||||
{
|
||||
r = g_random_int ();
|
||||
name[o++] = make_valid_fs_char ((r >> 0) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 8) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 16) & 0xff);
|
||||
name[o++] = make_valid_fs_char ((r >> 24) & 0xff);
|
||||
}
|
||||
name[o++] = 0;
|
||||
|
||||
fd = shm_open(name, O_RDWR|O_CREAT|O_EXCL, 0600);
|
||||
if (fd >= 0)
|
||||
return fd;
|
||||
|
||||
if (errno != EEXIST)
|
||||
{
|
||||
g_printerr ("Unable to allocate shared mem for window");
|
||||
exit (1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t gdk_broadway_shm_cairo_key;
|
||||
|
||||
typedef struct {
|
||||
char name[34];
|
||||
void *data;
|
||||
gsize data_size;
|
||||
} BroadwayShmSurfaceData;
|
||||
|
||||
static void
|
||||
shm_data_destroy (void *_data)
|
||||
{
|
||||
BroadwayShmSurfaceData *data = _data;
|
||||
|
||||
munmap (data->data, data->data_size);
|
||||
shm_unlink (data->name);
|
||||
g_free (data);
|
||||
}
|
||||
|
||||
cairo_surface_t *
|
||||
_gdk_broadway_server_create_surface (int width,
|
||||
int height)
|
||||
{
|
||||
BroadwayShmSurfaceData *data;
|
||||
cairo_surface_t *surface;
|
||||
int res;
|
||||
int fd;
|
||||
|
||||
data = g_new (BroadwayShmSurfaceData, 1);
|
||||
data->data_size = width * height * sizeof (guint32);
|
||||
|
||||
fd = create_random_shm (data->name);
|
||||
|
||||
res = ftruncate (fd, data->data_size);
|
||||
g_assert (res != -1);
|
||||
|
||||
data->data = mmap(0, data->data_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
|
||||
(void) close(fd);
|
||||
|
||||
surface = cairo_image_surface_create_for_data ((guchar *)data->data,
|
||||
CAIRO_FORMAT_RGB24, width, height, width * sizeof (guint32));
|
||||
g_assert (surface != NULL);
|
||||
|
||||
cairo_surface_set_user_data (surface, &gdk_broadway_shm_cairo_key,
|
||||
data, shm_data_destroy);
|
||||
|
||||
return surface;
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_server_window_update (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface)
|
||||
{
|
||||
BroadwayRequestUpdate msg;
|
||||
BroadwayShmSurfaceData *data;
|
||||
|
||||
if (surface == NULL)
|
||||
return;
|
||||
|
||||
data = cairo_surface_get_user_data (surface, &gdk_broadway_shm_cairo_key);
|
||||
g_assert (data != NULL);
|
||||
|
||||
msg.id = id;
|
||||
memcpy (msg.name, data->name, 34);
|
||||
msg.width = cairo_image_surface_get_width (surface);
|
||||
msg.height = cairo_image_surface_get_height (surface);
|
||||
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_UPDATE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gdk_broadway_server_window_move_resize (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
BroadwayRequestMoveResize msg;
|
||||
|
||||
msg.id = id;
|
||||
msg.x = x;
|
||||
msg.y = y;
|
||||
msg.width = width;
|
||||
msg.height = height;
|
||||
|
||||
gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_MOVE_RESIZE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
GdkGrabStatus
|
||||
_gdk_broadway_server_grab_pointer (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_)
|
||||
{
|
||||
BroadwayRequestGrabPointer msg;
|
||||
guint32 serial, status;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.id = id;
|
||||
msg.owner_events = owner_events;
|
||||
msg.event_mask = event_mask;
|
||||
msg.time_ = time_;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_GRAB_POINTER);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_GRAB_POINTER);
|
||||
|
||||
status = reply->grab_pointer.status;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
guint32
|
||||
_gdk_broadway_server_ungrab_pointer (GdkBroadwayServer *server,
|
||||
guint32 time_)
|
||||
{
|
||||
BroadwayRequestUngrabPointer msg;
|
||||
guint32 serial, status;
|
||||
BroadwayReply *reply;
|
||||
|
||||
msg.time_ = time_;
|
||||
|
||||
serial = gdk_broadway_server_send_message (server, msg,
|
||||
BROADWAY_REQUEST_UNGRAB_POINTER);
|
||||
reply = gdk_broadway_server_wait_for_reply (server, serial);
|
||||
|
||||
g_assert (reply->base.type == BROADWAY_REPLY_UNGRAB_POINTER);
|
||||
|
||||
status = reply->ungrab_pointer.status;
|
||||
|
||||
g_free (reply);
|
||||
|
||||
return status;
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
#ifndef __GDK_BROADWAY_SERVER__
|
||||
#define __GDK_BROADWAY_SERVER__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include "broadway-protocol.h"
|
||||
|
||||
typedef struct _GdkBroadwayServer GdkBroadwayServer;
|
||||
typedef struct _GdkBroadwayServerClass GdkBroadwayServerClass;
|
||||
|
||||
#define GDK_TYPE_BROADWAY_SERVER (gdk_broadway_server_get_type())
|
||||
#define GDK_BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServer))
|
||||
#define GDK_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass))
|
||||
#define GDK_IS_BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_BROADWAY_SERVER))
|
||||
#define GDK_IS_BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_SERVER))
|
||||
#define GDK_BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_SERVER, GdkBroadwayServerClass))
|
||||
|
||||
GdkBroadwayServer *_gdk_broadway_server_new (int port,
|
||||
GError **error);
|
||||
void _gdk_broadway_server_flush (GdkBroadwayServer *server);
|
||||
void _gdk_broadway_server_sync (GdkBroadwayServer *server);
|
||||
gulong _gdk_broadway_server_get_next_serial (GdkBroadwayServer *server);
|
||||
guint32 _gdk_broadway_server_get_last_seen_time (GdkBroadwayServer *server);
|
||||
gboolean _gdk_broadway_server_lookahead_event (GdkBroadwayServer *server,
|
||||
const char *types);
|
||||
void _gdk_broadway_server_query_mouse (GdkBroadwayServer *server,
|
||||
guint32 *toplevel,
|
||||
gint32 *root_x,
|
||||
gint32 *root_y,
|
||||
guint32 *mask);
|
||||
GdkGrabStatus _gdk_broadway_server_grab_pointer (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gboolean owner_events,
|
||||
guint32 event_mask,
|
||||
guint32 time_);
|
||||
guint32 _gdk_broadway_server_ungrab_pointer (GdkBroadwayServer *server,
|
||||
guint32 time_);
|
||||
gint32 _gdk_broadway_server_get_mouse_toplevel (GdkBroadwayServer *server);
|
||||
guint32 _gdk_broadway_server_new_window (GdkBroadwayServer *server,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
gboolean is_temp);
|
||||
void _gdk_broadway_server_destroy_window (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
gboolean _gdk_broadway_server_window_show (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
gboolean _gdk_broadway_server_window_hide (GdkBroadwayServer *server,
|
||||
gint id);
|
||||
void _gdk_broadway_server_window_set_transient_for (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
gint parent);
|
||||
gboolean _gdk_broadway_server_window_translate (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_region_t *area,
|
||||
gint dx,
|
||||
gint dy);
|
||||
cairo_surface_t *_gdk_broadway_server_create_surface (int width,
|
||||
int height);
|
||||
void _gdk_broadway_server_window_update (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
cairo_surface_t *surface);
|
||||
gboolean _gdk_broadway_server_window_move_resize (GdkBroadwayServer *server,
|
||||
gint id,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height);
|
||||
|
||||
#endif /* __GDK_BROADWAY_SERVER__ */
|
||||
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_BROADWAY_CURSOR_H__
|
||||
#define __GDK_BROADWAY_CURSOR_H__
|
||||
|
||||
#if !defined (__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_BROADWAY_CURSOR_H__
|
||||
#define __GDK_BROADWAY_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
#define __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined(__GDKBROADWAY_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkbroadway.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
#define __GDK_BROADWAY_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -156,10 +156,7 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
GdkDisplay *display;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
GdkScreen *screen;
|
||||
gint32 device_root_x, device_root_y;
|
||||
gint32 mouse_toplevel_id;
|
||||
GdkWindow *mouse_toplevel;
|
||||
guint32 mask32;
|
||||
gint device_root_x, device_root_y;
|
||||
|
||||
if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE)
|
||||
return;
|
||||
@@ -176,12 +173,36 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
*root_window = gdk_screen_get_root_window (screen);
|
||||
}
|
||||
|
||||
_gdk_broadway_server_query_mouse (broadway_display->server,
|
||||
&mouse_toplevel_id,
|
||||
&device_root_x,
|
||||
&device_root_y,
|
||||
&mask32);
|
||||
mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (mouse_toplevel_id));
|
||||
if (broadway_display->output)
|
||||
{
|
||||
_gdk_broadway_display_consume_all_input (display);
|
||||
if (root_x)
|
||||
*root_x = broadway_display->future_root_x;
|
||||
if (root_y)
|
||||
*root_y = broadway_display->future_root_y;
|
||||
/* TODO: Should really use future_x/y when we get configure events */
|
||||
if (win_x)
|
||||
*win_x = broadway_display->future_root_x - toplevel->x;
|
||||
if (win_y)
|
||||
*win_y = broadway_display->future_root_y - toplevel->y;
|
||||
if (mask)
|
||||
*mask = broadway_display->future_state;
|
||||
if (child_window)
|
||||
{
|
||||
if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
|
||||
*child_window =
|
||||
g_hash_table_lookup (broadway_display->id_ht,
|
||||
GINT_TO_POINTER (broadway_display->future_mouse_in_toplevel));
|
||||
else
|
||||
*child_window = toplevel; /* No native children */
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* Fallback when unconnected */
|
||||
|
||||
device_root_x = broadway_display->last_x;
|
||||
device_root_y = broadway_display->last_y;
|
||||
|
||||
if (root_x)
|
||||
*root_x = device_root_x;
|
||||
@@ -192,12 +213,12 @@ gdk_broadway_device_query_state (GdkDevice *device,
|
||||
if (win_y)
|
||||
*win_y = device_root_y - toplevel->y;
|
||||
if (mask)
|
||||
*mask = mask32;
|
||||
*mask = broadway_display->last_state;
|
||||
if (child_window)
|
||||
{
|
||||
if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT)
|
||||
{
|
||||
*child_window = mouse_toplevel;
|
||||
*child_window = broadway_display->mouse_in_toplevel;
|
||||
if (*child_window == NULL)
|
||||
*child_window = toplevel;
|
||||
}
|
||||
@@ -215,10 +236,13 @@ void
|
||||
_gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||
{
|
||||
GdkDisplay *display = gdk_window_get_display (window);
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
GdkDeviceManager *device_manager;
|
||||
GdkDeviceGrabInfo *grab;
|
||||
GList *devices, *d;
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
|
||||
device_manager = gdk_display_get_device_manager (display);
|
||||
|
||||
/* Get all devices */
|
||||
@@ -233,6 +257,8 @@ _gdk_broadway_window_grab_check_destroy (GdkWindow *window)
|
||||
{
|
||||
grab->serial_end = grab->serial_start;
|
||||
grab->implicit_ungrab = TRUE;
|
||||
|
||||
broadway_display->pointer_grab_window = NULL;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -264,11 +290,29 @@ gdk_broadway_device_grab (GdkDevice *device,
|
||||
else
|
||||
{
|
||||
/* Device is a pointer */
|
||||
return _gdk_broadway_server_grab_pointer (broadway_display->server,
|
||||
GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
|
||||
owner_events,
|
||||
event_mask,
|
||||
time_);
|
||||
|
||||
if (broadway_display->pointer_grab_window != NULL &&
|
||||
time_ != 0 && broadway_display->pointer_grab_time > time_)
|
||||
return GDK_GRAB_ALREADY_GRABBED;
|
||||
|
||||
if (time_ == 0)
|
||||
time_ = broadway_display->last_seen_time;
|
||||
|
||||
broadway_display->pointer_grab_window = window;
|
||||
broadway_display->pointer_grab_owner_events = owner_events;
|
||||
broadway_display->pointer_grab_time = time_;
|
||||
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_grab_pointer (broadway_display->output,
|
||||
GDK_WINDOW_IMPL_BROADWAY (window->impl)->id,
|
||||
owner_events);
|
||||
gdk_display_flush (display);
|
||||
}
|
||||
|
||||
/* TODO: What about toplevel grab events if we're not connected? */
|
||||
|
||||
return GDK_GRAB_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -296,17 +340,31 @@ gdk_broadway_device_ungrab (GdkDevice *device,
|
||||
else
|
||||
{
|
||||
/* Device is a pointer */
|
||||
serial = _gdk_broadway_server_ungrab_pointer (broadway_display->server, time_);
|
||||
|
||||
if (serial != 0)
|
||||
if (broadway_display->pointer_grab_window != NULL &&
|
||||
time_ != 0 && broadway_display->pointer_grab_time > time_)
|
||||
return;
|
||||
|
||||
/* TODO: What about toplevel grab events if we're not connected? */
|
||||
|
||||
if (broadway_display->output)
|
||||
{
|
||||
grab = _gdk_display_get_last_device_grab (display, device);
|
||||
if (grab &&
|
||||
(time_ == GDK_CURRENT_TIME ||
|
||||
grab->time == GDK_CURRENT_TIME ||
|
||||
!TIME_IS_LATER (grab->time, time_)))
|
||||
grab->serial_end = serial;
|
||||
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);
|
||||
if (grab &&
|
||||
(time_ == GDK_CURRENT_TIME ||
|
||||
grab->time == GDK_CURRENT_TIME ||
|
||||
!TIME_IS_LATER (grab->time, time_)))
|
||||
grab->serial_end = serial;
|
||||
|
||||
broadway_display->pointer_grab_window = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,6 +375,7 @@ gdk_broadway_device_window_at_position (GdkDevice *device,
|
||||
GdkModifierType *mask,
|
||||
gboolean get_toplevel)
|
||||
{
|
||||
gboolean res;
|
||||
GdkScreen *screen;
|
||||
GdkWindow *root_window;
|
||||
GdkWindow *window;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,7 @@
|
||||
#include "gdkwindow.h"
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkmain.h"
|
||||
#include "gdkbroadway-server.h"
|
||||
#include "broadway.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -43,6 +43,82 @@ typedef struct BroadwayInput BroadwayInput;
|
||||
#define GDK_IS_BROADWAY_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_DISPLAY))
|
||||
#define GDK_BROADWAY_DISPLAY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplayClass))
|
||||
|
||||
typedef struct {
|
||||
char type;
|
||||
guint32 serial;
|
||||
guint64 time;
|
||||
} BroadwayInputBaseMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 mouse_window_id; /* The real window, not taking grabs into account */
|
||||
guint32 event_window_id;
|
||||
int root_x;
|
||||
int root_y;
|
||||
int win_x;
|
||||
int win_y;
|
||||
guint32 state;
|
||||
} BroadwayInputPointerMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 mode;
|
||||
} BroadwayInputCrossingMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
guint32 button;
|
||||
} BroadwayInputButtonMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputPointerMsg pointer;
|
||||
int dir;
|
||||
} BroadwayInputScrollMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
guint32 state;
|
||||
int key;
|
||||
} BroadwayInputKeyMsg;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int res;
|
||||
} BroadwayInputGrabReply;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int id;
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
} BroadwayInputConfigureNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int width;
|
||||
int height;
|
||||
} BroadwayInputScreenResizeNotify;
|
||||
|
||||
typedef struct {
|
||||
BroadwayInputBaseMsg base;
|
||||
int id;
|
||||
} BroadwayInputDeleteNotify;
|
||||
|
||||
typedef union {
|
||||
BroadwayInputBaseMsg base;
|
||||
BroadwayInputPointerMsg pointer;
|
||||
BroadwayInputCrossingMsg crossing;
|
||||
BroadwayInputButtonMsg button;
|
||||
BroadwayInputScrollMsg scroll;
|
||||
BroadwayInputKeyMsg key;
|
||||
BroadwayInputGrabReply grab_reply;
|
||||
BroadwayInputConfigureNotify configure_notify;
|
||||
BroadwayInputDeleteNotify delete_notify;
|
||||
BroadwayInputScreenResizeNotify screen_resize_notify;
|
||||
} BroadwayInputMsg;
|
||||
|
||||
struct _GdkBroadwayDisplay
|
||||
{
|
||||
GdkDisplay parent_instance;
|
||||
@@ -53,6 +129,10 @@ struct _GdkBroadwayDisplay
|
||||
GList *toplevels;
|
||||
|
||||
GSource *event_source;
|
||||
GdkWindow *mouse_in_toplevel;
|
||||
int last_x, last_y; /* in root coords */
|
||||
guint32 last_state;
|
||||
GdkWindow *real_mouse_in_toplevel; /* Not affected by grabs */
|
||||
|
||||
/* Keyboard related information */
|
||||
GdkKeymap *keymap;
|
||||
@@ -67,7 +147,24 @@ struct _GdkBroadwayDisplay
|
||||
/* The offscreen window that has the pointer in it (if any) */
|
||||
GdkWindow *active_offscreen_window;
|
||||
|
||||
GdkBroadwayServer *server;
|
||||
GSocketService *service;
|
||||
BroadwayOutput *output;
|
||||
guint32 saved_serial;
|
||||
guint64 last_seen_time;
|
||||
BroadwayInput *input;
|
||||
GList *input_messages;
|
||||
guint process_input_idle;
|
||||
|
||||
/* Explicit pointer grabs: */
|
||||
GdkWindow *pointer_grab_window;
|
||||
guint32 pointer_grab_time;
|
||||
gboolean pointer_grab_owner_events;
|
||||
|
||||
/* Future data, from the currently queued events */
|
||||
int future_root_x;
|
||||
int future_root_y;
|
||||
GdkModifierType future_state;
|
||||
int future_mouse_in_toplevel;
|
||||
};
|
||||
|
||||
struct _GdkBroadwayDisplayClass
|
||||
|
||||
@@ -87,9 +87,9 @@ gdk_event_source_check (GSource *source)
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
_gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
BroadwayInputMsg *message)
|
||||
{
|
||||
GdkDisplay *display = gdk_display_get_default ();
|
||||
GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display);
|
||||
GdkScreen *screen;
|
||||
GdkWindow *window;
|
||||
@@ -97,8 +97,17 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
GList *node;
|
||||
|
||||
switch (message->base.type) {
|
||||
case BROADWAY_EVENT_ENTER:
|
||||
case 'e': /* Enter */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
|
||||
/* TODO: Unset when it dies */
|
||||
display_broadway->mouse_in_toplevel = window;
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (GDK_ENTER_NOTIFY);
|
||||
@@ -125,8 +134,16 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
break;
|
||||
case BROADWAY_EVENT_LEAVE:
|
||||
case 'l': /* Leave */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
|
||||
display_broadway->mouse_in_toplevel = NULL;
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (GDK_LEAVE_NOTIFY);
|
||||
@@ -153,7 +170,13 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
break;
|
||||
case BROADWAY_EVENT_POINTER_MOVE:
|
||||
case 'm': /* Mouse move */
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
if (_gdk_broadway_moveresize_handle_event (display, message))
|
||||
break;
|
||||
|
||||
@@ -175,8 +198,14 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
}
|
||||
|
||||
break;
|
||||
case BROADWAY_EVENT_BUTTON_PRESS:
|
||||
case BROADWAY_EVENT_BUTTON_RELEASE:
|
||||
case 'b':
|
||||
case 'B':
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
if (message->base.type != 'b' &&
|
||||
_gdk_broadway_moveresize_handle_event (display, message))
|
||||
break;
|
||||
@@ -200,7 +229,13 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
}
|
||||
|
||||
break;
|
||||
case BROADWAY_EVENT_SCROLL:
|
||||
case 's':
|
||||
display_broadway->last_x = message->pointer.root_x;
|
||||
display_broadway->last_y = message->pointer.root_y;
|
||||
display_broadway->last_state = message->pointer.state;
|
||||
display_broadway->real_mouse_in_toplevel =
|
||||
g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id));
|
||||
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id));
|
||||
if (window)
|
||||
{
|
||||
@@ -219,10 +254,10 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
}
|
||||
|
||||
break;
|
||||
case BROADWAY_EVENT_KEY_PRESS:
|
||||
case BROADWAY_EVENT_KEY_RELEASE:
|
||||
window = g_hash_table_lookup (display_broadway->id_ht,
|
||||
GINT_TO_POINTER (message->key.mouse_window_id));
|
||||
case 'k':
|
||||
case 'K':
|
||||
window = display_broadway->mouse_in_toplevel;
|
||||
|
||||
if (window)
|
||||
{
|
||||
event = gdk_event_new (message->base.type == 'k' ? GDK_KEY_PRESS : GDK_KEY_RELEASE);
|
||||
@@ -234,17 +269,19 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
event->key.length = 0;
|
||||
gdk_event_set_device (event, display->core_pointer);
|
||||
|
||||
display_broadway->last_state = message->key.state;
|
||||
|
||||
node = _gdk_event_queue_append (display, event);
|
||||
_gdk_windowing_got_event (display, node, event, message->base.serial);
|
||||
}
|
||||
|
||||
break;
|
||||
case BROADWAY_EVENT_GRAB_NOTIFY:
|
||||
case BROADWAY_EVENT_UNGRAB_NOTIFY:
|
||||
case 'g':
|
||||
case 'u':
|
||||
_gdk_display_device_grab_update (display, display->core_pointer, NULL, message->base.serial);
|
||||
break;
|
||||
|
||||
case BROADWAY_EVENT_CONFIGURE_NOTIFY:
|
||||
case 'w':
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->configure_notify.id));
|
||||
if (window)
|
||||
{
|
||||
@@ -275,7 +312,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
}
|
||||
break;
|
||||
|
||||
case BROADWAY_EVENT_DELETE_NOTIFY:
|
||||
case 'W':
|
||||
window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->delete_notify.id));
|
||||
if (window)
|
||||
{
|
||||
@@ -287,7 +324,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
}
|
||||
break;
|
||||
|
||||
case BROADWAY_EVENT_SCREEN_SIZE_CHANGED:
|
||||
case 'd':
|
||||
screen = gdk_display_get_default_screen (display);
|
||||
window = gdk_screen_get_root_window (screen);
|
||||
window->width = message->screen_resize_notify.width;
|
||||
@@ -298,7 +335,7 @@ _gdk_broadway_events_got_input (BroadwayInputMsg *message)
|
||||
break;
|
||||
|
||||
default:
|
||||
g_printerr ("_gdk_broadway_events_got_input - Unknown input command %c\n", message->base.type);
|
||||
g_printerr ("Unknown input command %c\n", message->base.type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,7 +126,8 @@ GList *_gdk_broadway_screen_list_visuals (GdkScreen *screen);
|
||||
void _gdk_broadway_screen_size_changed (GdkScreen *screen,
|
||||
BroadwayInputScreenResizeNotify *msg);
|
||||
|
||||
void _gdk_broadway_events_got_input (BroadwayInputMsg *message);
|
||||
void _gdk_broadway_events_got_input (GdkDisplay *display,
|
||||
BroadwayInputMsg *message);
|
||||
|
||||
void _gdk_broadway_screen_init_root_window (GdkScreen *screen);
|
||||
void _gdk_broadway_screen_init_visuals (GdkScreen *screen);
|
||||
|
||||
@@ -83,17 +83,95 @@ G_DEFINE_TYPE (GdkWindowImplBroadway,
|
||||
gdk_window_impl_broadway,
|
||||
GDK_TYPE_WINDOW_IMPL)
|
||||
|
||||
static void
|
||||
diff_surfaces (cairo_surface_t *surface,
|
||||
cairo_surface_t *old_surface)
|
||||
{
|
||||
guint8 *data, *old_data;
|
||||
guint32 *line, *old_line;
|
||||
int w, h, stride, old_stride;
|
||||
int x, y;
|
||||
|
||||
data = cairo_image_surface_get_data (surface);
|
||||
old_data = cairo_image_surface_get_data (old_surface);
|
||||
|
||||
w = cairo_image_surface_get_width (surface);
|
||||
h = cairo_image_surface_get_height (surface);
|
||||
|
||||
stride = cairo_image_surface_get_stride (surface);
|
||||
old_stride = cairo_image_surface_get_stride (old_surface);
|
||||
|
||||
for (y = 0; y < h; y++)
|
||||
{
|
||||
line = (guint32 *)data;
|
||||
old_line = (guint32 *)old_data;
|
||||
|
||||
for (x = 0; x < w; x++)
|
||||
{
|
||||
if ((*line & 0xffffff) == (*old_line & 0xffffff))
|
||||
*old_line = 0;
|
||||
else
|
||||
*old_line = *line | 0xff000000;
|
||||
line ++;
|
||||
old_line ++;
|
||||
}
|
||||
|
||||
data += stride;
|
||||
old_data += old_stride;
|
||||
}
|
||||
}
|
||||
|
||||
static guint dirty_flush_id = 0;
|
||||
|
||||
static void
|
||||
window_data_send (BroadwayOutput *output, GdkWindowImplBroadway *impl)
|
||||
{
|
||||
cairo_t *cr;
|
||||
|
||||
if (impl->surface == NULL)
|
||||
return;
|
||||
|
||||
if (impl->last_synced)
|
||||
{
|
||||
diff_surfaces (impl->surface,
|
||||
impl->last_surface);
|
||||
broadway_output_put_rgba (output, impl->id, 0, 0,
|
||||
cairo_image_surface_get_width (impl->last_surface),
|
||||
cairo_image_surface_get_height (impl->last_surface),
|
||||
cairo_image_surface_get_stride (impl->last_surface),
|
||||
cairo_image_surface_get_data (impl->last_surface));
|
||||
}
|
||||
else
|
||||
{
|
||||
impl->last_synced = TRUE;
|
||||
broadway_output_put_rgb (output, impl->id, 0, 0,
|
||||
cairo_image_surface_get_width (impl->surface),
|
||||
cairo_image_surface_get_height (impl->surface),
|
||||
cairo_image_surface_get_stride (impl->surface),
|
||||
cairo_image_surface_get_data (impl->surface));
|
||||
}
|
||||
|
||||
broadway_output_surface_flush (output, impl->id);
|
||||
|
||||
cr = cairo_create (impl->last_surface);
|
||||
cairo_set_source_surface (cr, impl->surface, 0, 0);
|
||||
cairo_paint (cr);
|
||||
cairo_destroy (cr);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dirty_flush_idle (gpointer data)
|
||||
{
|
||||
GList *l;
|
||||
GdkBroadwayDisplay *display;
|
||||
BroadwayOutput *output;
|
||||
|
||||
dirty_flush_id = 0;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ());
|
||||
output = display->output;
|
||||
if (output == NULL)
|
||||
return FALSE;
|
||||
|
||||
for (l = display->toplevels; l != NULL; l = l->next)
|
||||
{
|
||||
@@ -102,15 +180,11 @@ dirty_flush_idle (gpointer data)
|
||||
if (impl->dirty)
|
||||
{
|
||||
impl->dirty = FALSE;
|
||||
_gdk_broadway_server_window_update (display->server,
|
||||
impl->id,
|
||||
impl->surface);
|
||||
window_data_send (display->output, impl);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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));
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@@ -118,10 +192,64 @@ dirty_flush_idle (gpointer data)
|
||||
static void
|
||||
queue_dirty_flush (GdkBroadwayDisplay *display)
|
||||
{
|
||||
if (dirty_flush_id == 0)
|
||||
if (dirty_flush_id == 0 && display->output != 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
|
||||
gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl)
|
||||
{
|
||||
@@ -147,6 +275,12 @@ gdk_window_impl_broadway_finalize (GObject *object)
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
||||
|
||||
if (broadway_display->mouse_in_toplevel == GDK_WINDOW (wrapper))
|
||||
{
|
||||
/* TODO: Send leave + enter event, update cursors, etc */
|
||||
broadway_display->mouse_in_toplevel = NULL;
|
||||
}
|
||||
|
||||
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||
|
||||
if (impl->cursor)
|
||||
@@ -181,7 +315,6 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen)
|
||||
|
||||
impl->screen = screen;
|
||||
impl->wrapper = window;
|
||||
impl->id = 0;
|
||||
|
||||
window->window_type = GDK_WINDOW_ROOT;
|
||||
window->depth = 24;
|
||||
@@ -208,17 +341,13 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
{
|
||||
GdkWindowImplBroadway *impl;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
static int current_id = 1; /* 0 is the root window */
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
|
||||
impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL);
|
||||
window->impl = (GdkWindowImpl *)impl;
|
||||
impl->id = _gdk_broadway_server_new_window (broadway_display->server,
|
||||
window->x,
|
||||
window->y,
|
||||
window->width,
|
||||
window->height,
|
||||
window->window_type == GDK_WINDOW_TEMP);
|
||||
impl->id = current_id++;
|
||||
g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), window);
|
||||
impl->wrapper = window;
|
||||
|
||||
@@ -229,22 +358,37 @@ _gdk_broadway_display_create_window_impl (GdkDisplay *display,
|
||||
g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT);
|
||||
|
||||
broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl);
|
||||
|
||||
if (broadway_display->output)
|
||||
broadway_output_new_surface (broadway_display->output,
|
||||
impl->id,
|
||||
window->x,
|
||||
window->y,
|
||||
window->width,
|
||||
window->height,
|
||||
window->window_type == GDK_WINDOW_TEMP);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_broadway_window_resize_surface (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
cairo_surface_t *old;
|
||||
cairo_surface_t *old, *last_old;
|
||||
|
||||
if (impl->surface)
|
||||
{
|
||||
old = impl->surface;
|
||||
last_old = impl->last_surface;
|
||||
|
||||
impl->surface = _gdk_broadway_server_create_surface (gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
||||
gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
||||
gdk_window_get_width (impl->wrapper),
|
||||
gdk_window_get_height (impl->wrapper));
|
||||
|
||||
cairo_surface_destroy (old);
|
||||
cairo_surface_destroy (last_old);
|
||||
}
|
||||
|
||||
if (impl->ref_surface)
|
||||
@@ -269,6 +413,7 @@ static cairo_surface_t *
|
||||
gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
||||
{
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
cairo_t *cr;
|
||||
int w, h;
|
||||
|
||||
if (GDK_IS_WINDOW_IMPL_BROADWAY (window) &&
|
||||
@@ -280,7 +425,22 @@ gdk_window_broadway_ref_cairo_surface (GdkWindow *window)
|
||||
|
||||
/* Create actual backing store if missing */
|
||||
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 */
|
||||
if (!impl->ref_surface)
|
||||
@@ -325,13 +485,16 @@ _gdk_broadway_window_destroy (GdkWindow *window,
|
||||
{
|
||||
cairo_surface_destroy (impl->surface);
|
||||
impl->surface = NULL;
|
||||
cairo_surface_destroy (impl->last_surface);
|
||||
impl->last_surface = NULL;
|
||||
}
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id));
|
||||
|
||||
_gdk_broadway_server_destroy_window (broadway_display->server,
|
||||
impl->id);
|
||||
if (broadway_display->output)
|
||||
broadway_output_destroy_surface (broadway_display->output,
|
||||
impl->id);
|
||||
}
|
||||
|
||||
static cairo_surface_t *
|
||||
@@ -383,9 +546,11 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped)
|
||||
_gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE);
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (_gdk_broadway_server_window_show (broadway_display->server, impl->id))
|
||||
queue_dirty_flush (broadway_display);
|
||||
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_show_surface (broadway_display->output, impl->id);
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -404,8 +569,17 @@ gdk_window_broadway_hide (GdkWindow *window)
|
||||
_gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE);
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id))
|
||||
queue_dirty_flush (broadway_display);
|
||||
if (broadway_display->output)
|
||||
{
|
||||
broadway_output_hide_surface (broadway_display->output, impl->id);
|
||||
queue_dirty_flush (broadway_display);
|
||||
}
|
||||
|
||||
if (broadway_display->mouse_in_toplevel == window)
|
||||
{
|
||||
/* TODO: Send leave + enter event, update cursors, etc */
|
||||
broadway_display->mouse_in_toplevel = NULL;
|
||||
}
|
||||
|
||||
_gdk_window_clear_update_area (window);
|
||||
}
|
||||
@@ -427,6 +601,7 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
gboolean changed, size_changed;;
|
||||
gboolean with_resize;
|
||||
|
||||
size_changed = changed = FALSE;
|
||||
|
||||
@@ -438,8 +613,10 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
window->y = y;
|
||||
}
|
||||
|
||||
with_resize = FALSE;
|
||||
if (width > 0 || height > 0)
|
||||
{
|
||||
with_resize = TRUE;
|
||||
if (width < 1)
|
||||
width = 1;
|
||||
|
||||
@@ -467,11 +644,12 @@ gdk_window_broadway_move_resize (GdkWindow *window,
|
||||
GdkEvent *event;
|
||||
GList *node;
|
||||
|
||||
if (_gdk_broadway_server_window_move_resize (broadway_display->server,
|
||||
impl->id,
|
||||
window->x, window->y,
|
||||
window->width, window->height))
|
||||
if (broadway_display->output != NULL)
|
||||
{
|
||||
broadway_output_move_resize_surface (broadway_display->output,
|
||||
impl->id,
|
||||
with_move, window->x, window->y,
|
||||
with_resize, window->width, window->height);
|
||||
queue_dirty_flush (broadway_display);
|
||||
if (size_changed)
|
||||
window->resize_count++;
|
||||
@@ -609,7 +787,11 @@ gdk_broadway_window_set_transient_for (GdkWindow *window,
|
||||
impl->transient_for = parent_id;
|
||||
|
||||
display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper));
|
||||
_gdk_broadway_server_window_set_transient_for (display->server, impl->id, impl->transient_for);
|
||||
if (display->output)
|
||||
{
|
||||
broadway_output_set_transient_for (display->output, impl->id, impl->transient_for);
|
||||
gdk_display_flush (GDK_DISPLAY (display));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1142,10 +1324,20 @@ moveresize_lookahead (GdkDisplay *display,
|
||||
BroadwayInputMsg *event)
|
||||
{
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
BroadwayInputMsg *message;
|
||||
GList *l;
|
||||
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (display);
|
||||
for (l = broadway_display->input_messages; l != NULL; l = l->next)
|
||||
{
|
||||
message = l->data;
|
||||
if (message->base.type == 'm')
|
||||
return FALSE;
|
||||
if (message->base.type == 'b')
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return !_gdk_broadway_server_lookahead_event (broadway_display->server, "mb");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
@@ -1288,6 +1480,8 @@ gdk_broadway_window_begin_resize_drag (GdkWindow *window,
|
||||
|
||||
/* We need a connection to be able to get mouse events, if not, punt */
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
if (!broadway_display->output)
|
||||
return;
|
||||
|
||||
mv_resize = get_move_resize_data (GDK_WINDOW_DISPLAY (window), TRUE);
|
||||
|
||||
@@ -1428,6 +1622,9 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
||||
{
|
||||
GdkWindowImplBroadway *impl;
|
||||
GdkBroadwayDisplay *broadway_display;
|
||||
int n_rects, i;
|
||||
BroadwayRect *rects;
|
||||
cairo_rectangle_int_t rect;
|
||||
|
||||
impl = GDK_WINDOW_IMPL_BROADWAY (window->impl);
|
||||
|
||||
@@ -1435,11 +1632,26 @@ _gdk_broadway_window_translate (GdkWindow *window,
|
||||
{
|
||||
copy_region (impl->surface, area, dx, dy);
|
||||
broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window));
|
||||
|
||||
if (_gdk_broadway_server_window_translate (broadway_display->server,
|
||||
impl->id,
|
||||
area, dx, dy))
|
||||
queue_dirty_flush (broadway_display);
|
||||
if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced &&
|
||||
broadway_display->output)
|
||||
{
|
||||
copy_region (impl->last_surface, area, dx, dy);
|
||||
n_rects = cairo_region_num_rectangles (area);
|
||||
rects = g_new (BroadwayRect, n_rects);
|
||||
for (i = 0; i < n_rects; i++)
|
||||
{
|
||||
cairo_region_get_rectangle (area, i, &rect);
|
||||
rects[i].x = rect.x;
|
||||
rects[i].y = rect.y;
|
||||
rects[i].width = rect.width;
|
||||
rects[i].height = rect.height;
|
||||
}
|
||||
broadway_output_copy_rectangles (broadway_display->output,
|
||||
GDK_WINDOW_IMPL_BROADWAY (impl)->id,
|
||||
rects, n_rects, dx, dy);
|
||||
queue_dirty_flush (broadway_display);
|
||||
g_free (rects);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1449,7 +1661,8 @@ gdk_broadway_get_last_seen_time (GdkWindow *window)
|
||||
GdkDisplay *display;
|
||||
|
||||
display = gdk_window_get_display (window);
|
||||
return _gdk_broadway_server_get_last_seen_time (GDK_BROADWAY_DISPLAY (display)->server);
|
||||
_gdk_broadway_display_consume_all_input (display);
|
||||
return (guint32) GDK_BROADWAY_DISPLAY (display)->last_seen_time;
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -274,6 +274,8 @@ gdk_pre_parse_libgtk_only (void)
|
||||
_gdk_rendering_mode = GDK_RENDERING_MODE_RECORDING;
|
||||
}
|
||||
|
||||
g_type_init ();
|
||||
|
||||
/* Do any setup particular to the windowing system */
|
||||
gdk_display_manager_get ();
|
||||
}
|
||||
|
||||
@@ -18,13 +18,13 @@
|
||||
* Author: Alexander Larsson <alexl@redhat.com>
|
||||
*/
|
||||
|
||||
#ifndef __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
#define __GDK_APP_LAUNCH_CONTEXT_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
+3
-3
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_CAIRO_H__
|
||||
#define __GDK_CAIRO_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_CAIRO_H__
|
||||
#define __GDK_CAIRO_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdkcolor.h>
|
||||
#include <gdk/gdkrgba.h>
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_COLOR_H__
|
||||
#define __GDK_COLOR_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_COLOR_H__
|
||||
#define __GDK_COLOR_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_CURSOR_H__
|
||||
#define __GDK_CURSOR_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_CURSOR_H__
|
||||
#define __GDK_CURSOR_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
@@ -24,8 +24,6 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkdisplay.h"
|
||||
#include "gdkmain.h"
|
||||
#include "gdkwindow.h"
|
||||
|
||||
/**
|
||||
* gdk_pointer_ungrab:
|
||||
|
||||
+3
-3
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DEVICE_H__
|
||||
#define __GDK_DEVICE_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DEVICE_H__
|
||||
#define __GDK_DEVICE_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DEVICE_MANAGER_H__
|
||||
#define __GDK_DEVICE_MANAGER_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DEVICE_MANAGER_H__
|
||||
#define __GDK_DEVICE_MANAGER_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdevice.h>
|
||||
|
||||
|
||||
+3
-3
@@ -19,13 +19,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DISPLAY_H__
|
||||
#define __GDK_DISPLAY_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DISPLAY_H__
|
||||
#define __GDK_DISPLAY_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkevents.h>
|
||||
|
||||
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DISPLAY_MANAGER_H__
|
||||
#define __GDK_DISPLAY_MANAGER_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DISPLAY_MANAGER_H__
|
||||
#define __GDK_DISPLAY_MANAGER_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdisplay.h>
|
||||
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_DND_H__
|
||||
#define __GDK_DND_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_DND_H__
|
||||
#define __GDK_DND_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkdevice.h>
|
||||
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_EVENTS_H__
|
||||
#define __GDK_EVENTS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_EVENTS_H__
|
||||
#define __GDK_EVENTS_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdkcolor.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
+6
-5
@@ -584,11 +584,12 @@ gdk_keymap_translate_keyboard_state (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_add_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (inout): pointer to the modifier mask to change
|
||||
* @state: (out): pointer to the modifier mask to change
|
||||
*
|
||||
* Maps the non-virtual modifiers (i.e Mod2, Mod3, ...) which are set
|
||||
* in @state to the virtual modifiers (i.e. Super, Hyper and Meta) and
|
||||
* set the corresponding bits in @state.
|
||||
* Adds virtual modifiers (i.e. Super, Hyper and Meta) which correspond
|
||||
* to the real modifiers (i.e Mod2, Mod3, ...) in @modifiers.
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
* Mod3,...) and set the corresponding bits in @state.
|
||||
*
|
||||
* GDK already does this before delivering key events, but for
|
||||
* compatibility reasons, it only sets the first virtual modifier
|
||||
@@ -611,7 +612,7 @@ gdk_keymap_add_virtual_modifiers (GdkKeymap *keymap,
|
||||
/**
|
||||
* gdk_keymap_map_virtual_modifiers:
|
||||
* @keymap: a #GdkKeymap
|
||||
* @state: (inout): pointer to the modifier state to map
|
||||
* @state: (out): pointer to the modifier state to map
|
||||
*
|
||||
* Maps the virtual modifiers (i.e. Super, Hyper and Meta) which
|
||||
* are set in @state to their non-virtual counterparts (i.e. Mod2,
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_KEYS_H__
|
||||
#define __GDK_KEYS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_KEYS_H__
|
||||
#define __GDK_KEYS_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkkeys.h"
|
||||
#include "gdktypes.h"
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_MAIN_H__
|
||||
#define __GDK_MAIN_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_MAIN_H__
|
||||
#define __GDK_MAIN_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
|
||||
+3
-3
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PANGO_H__
|
||||
#define __GDK_PANGO_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PANGO_H__
|
||||
#define __GDK_PANGO_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PIXBUF_H__
|
||||
#define __GDK_PIXBUF_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PIXBUF_H__
|
||||
#define __GDK_PIXBUF_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk-pixbuf/gdk-pixbuf.h>
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_PROPERTY_H__
|
||||
#define __GDK_PROPERTY_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_PROPERTY_H__
|
||||
#define __GDK_PROPERTY_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_RECTANGLE_H__
|
||||
#define __GDK_RECTANGLE_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_RECTANGLE_H__
|
||||
#define __GDK_RECTANGLE_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_RGBA_H__
|
||||
#define __GDK_RGBA_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_RGBA_H__
|
||||
#define __GDK_RGBA_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gdkinternals.h"
|
||||
#include "gdkscreenprivate.h"
|
||||
#include "gdkrectangle.h"
|
||||
#include "gdkwindow.h"
|
||||
|
||||
+3
-3
@@ -19,13 +19,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_SCREEN_H__
|
||||
#define __GDK_SCREEN_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_SCREEN_H__
|
||||
#define __GDK_SCREEN_H__
|
||||
|
||||
#include <cairo.h>
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_SELECTION_H__
|
||||
#define __GDK_SELECTION_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_SELECTION_H__
|
||||
#define __GDK_SELECTION_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+4
-4
@@ -16,20 +16,20 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_TEST_UTILS_H__
|
||||
#define __GDK_TEST_UTILS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_TEST_UTILS_H__
|
||||
#define __GDK_TEST_UTILS_H__
|
||||
|
||||
#include <gdk/gdkwindow.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:gdktestutils
|
||||
* SECTION:gdktesting
|
||||
* @Short_description: Test utilities
|
||||
* @Title: Testing
|
||||
*
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_THREADS_H__
|
||||
#define __GDK_THREADS_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_THREADS_H__
|
||||
#define __GDK_THREADS_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_TYPES_H__
|
||||
#define __GDK_TYPES_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_TYPES_H__
|
||||
#define __GDK_TYPES_H__
|
||||
|
||||
/* GDK uses "glib". (And so does GTK).
|
||||
*/
|
||||
#include <glib.h>
|
||||
|
||||
@@ -90,16 +90,6 @@
|
||||
*/
|
||||
#define GDK_VERSION_3_6 (G_ENCODE_VERSION (3, 6))
|
||||
|
||||
/**
|
||||
* GDK_VERSION_3_8:
|
||||
*
|
||||
* A macro that evaluates to the 3.8 version of GDK, in a format
|
||||
* that can be used by the C pre-processor.
|
||||
*
|
||||
* Since: 3.8
|
||||
*/
|
||||
#define GDK_VERSION_3_8 (G_ENCODE_VERSION (3, 8))
|
||||
|
||||
|
||||
/* evaluates to the current stable version; for development cycles,
|
||||
* this means the next stable target
|
||||
@@ -227,18 +217,4 @@
|
||||
# define GDK_AVAILABLE_IN_3_6
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MIN_REQUIRED >= GDK_VERSION_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8 GDK_DEPRECATED
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f) GDK_DEPRECATED_FOR(f)
|
||||
#else
|
||||
# define GDK_DEPRECATED_IN_3_8
|
||||
# define GDK_DEPRECATED_IN_3_8_FOR(f)
|
||||
#endif
|
||||
|
||||
#if GDK_VERSION_MAX_ALLOWED < GDK_VERSION_3_8
|
||||
# define GDK_AVAILABLE_IN_3_8 GDK_UNAVAILABLE(3, 8)
|
||||
#else
|
||||
# define GDK_AVAILABLE_IN_3_8
|
||||
#endif
|
||||
|
||||
#endif /* __GDK_VERSION_MACROS_H__ */
|
||||
|
||||
+3
-3
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_VISUAL_H__
|
||||
#define __GDK_VISUAL_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_VISUAL_H__
|
||||
#define __GDK_VISUAL_H__
|
||||
|
||||
#include <gdk/gdktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
+29
-21
@@ -65,6 +65,25 @@
|
||||
* <firstterm>composited</firstterm> window it is the responsibility of the
|
||||
* application to render the window contents at the right spot.
|
||||
* </para>
|
||||
* <example id="composited-window-example">
|
||||
* <title>Composited windows</title>
|
||||
* <programlisting>
|
||||
* <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" parse="text" href="../../../../examples/gdk/composited-window-example.c"><xi:fallback>FIXME: MISSING XINCLUDE CONTENT</xi:fallback></xi:include>
|
||||
* </programlisting></example>
|
||||
* <para>
|
||||
* In the example <xref linkend="composited-window-example"/>, a button is
|
||||
* placed inside of an event box inside of a window. The event box is set as
|
||||
* composited and therefore is no longer automatically drawn to the screen.
|
||||
*
|
||||
* When the contents of the event box change, an expose event is generated on
|
||||
* its parent window (which, in this case, belongs to the toplevel #GtkWindow).
|
||||
* The expose handler for this widget is responsible for merging the changes
|
||||
* back on the screen in the way that it wishes.
|
||||
*
|
||||
* In our case, we merge the contents with a 50% transparency. We also set the
|
||||
* background colour of the window to red. The effect is that the background
|
||||
* shows through the button.
|
||||
* </para>
|
||||
* </refsect2>
|
||||
* <refsect2 id="OFFSCREEN-WINDOWS">
|
||||
* <title>Offscreen Windows</title>
|
||||
@@ -93,7 +112,7 @@
|
||||
* be it a toplevel window or a child window. In this setup the
|
||||
* GdkWindow (and other GdkDrawables) were platform independent classes,
|
||||
* and the actual platform specific implementation was in a delegate
|
||||
* object available as "impl" in the window object.
|
||||
* object availible as "impl" in the window object.
|
||||
*
|
||||
* With the addition of client side windows and offscreen windows this
|
||||
* changes a bit. The application-visible GdkWindow object behaves as
|
||||
@@ -668,13 +687,6 @@ gdk_window_has_no_impl (GdkWindow *window)
|
||||
return window->impl_window != window;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gdk_window_has_alpha (GdkWindow *window)
|
||||
{
|
||||
return !gdk_window_has_impl (window) &&
|
||||
window->has_alpha_background;
|
||||
}
|
||||
|
||||
static void
|
||||
remove_layered_child_area (GdkWindow *window,
|
||||
cairo_region_t *region)
|
||||
@@ -702,7 +714,7 @@ remove_layered_child_area (GdkWindow *window,
|
||||
continue;
|
||||
|
||||
/* Only non-impl children with alpha add to the layered region */
|
||||
if (!gdk_window_has_alpha (child))
|
||||
if (!child->has_alpha_background && gdk_window_has_impl (child))
|
||||
continue;
|
||||
|
||||
r.x = child->x;
|
||||
@@ -804,7 +816,7 @@ remove_child_area (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
if (gdk_window_has_alpha (child))
|
||||
if (child->has_alpha_background)
|
||||
{
|
||||
if (layered_region != NULL)
|
||||
cairo_region_union (layered_region, child_region);
|
||||
@@ -1370,11 +1382,6 @@ gdk_window_new (GdkWindow *parent,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (attributes_mask & GDK_WA_VISUAL)
|
||||
{
|
||||
g_return_val_if_fail (gdk_visual_get_screen (attributes->visual) == screen, NULL);
|
||||
}
|
||||
|
||||
display = gdk_screen_get_display (screen);
|
||||
|
||||
window = _gdk_display_create_window (display);
|
||||
@@ -2996,7 +3003,8 @@ gdk_window_begin_paint_region (GdkWindow *window,
|
||||
by being drawn in back to front order. However, if implicit paints are not used, for
|
||||
instance if it was flushed due to a non-double-buffered paint in the middle of the
|
||||
expose we need to copy in the existing data here. */
|
||||
if (gdk_window_has_alpha (window) &&
|
||||
if (!gdk_window_has_impl (window) &&
|
||||
window->has_alpha_background &&
|
||||
(!implicit_paint ||
|
||||
(implicit_paint && implicit_paint->flushed != NULL && !cairo_region_is_empty (implicit_paint->flushed))))
|
||||
{
|
||||
@@ -6167,7 +6175,7 @@ gdk_window_move_resize_internal (GdkWindow *window,
|
||||
* Everything in the old and new regions that is not copied must be
|
||||
* invalidated (including children) as this is newly exposed
|
||||
*/
|
||||
if (gdk_window_has_alpha (window))
|
||||
if (window->has_alpha_background)
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (new_region);
|
||||
@@ -6391,7 +6399,7 @@ gdk_window_scroll (GdkWindow *window,
|
||||
impl_window = gdk_window_get_impl_window (window);
|
||||
|
||||
/* Calculate the area that can be gotten by copying the old area */
|
||||
if (gdk_window_has_alpha (window))
|
||||
if (window->has_alpha_background)
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (window->clip_region);
|
||||
@@ -6479,7 +6487,7 @@ gdk_window_move_region (GdkWindow *window,
|
||||
impl_window = gdk_window_get_impl_window (window);
|
||||
|
||||
/* compute source regions */
|
||||
if (gdk_window_has_alpha (window))
|
||||
if (window->has_alpha_background)
|
||||
copy_area = cairo_region_create (); /* Copy nothing for alpha windows */
|
||||
else
|
||||
copy_area = cairo_region_copy (region);
|
||||
@@ -6549,8 +6557,8 @@ gdk_window_set_background (GdkWindow *window,
|
||||
* See also gdk_window_set_background_pattern().
|
||||
**/
|
||||
void
|
||||
gdk_window_set_background_rgba (GdkWindow *window,
|
||||
const GdkRGBA *rgba)
|
||||
gdk_window_set_background_rgba (GdkWindow *window,
|
||||
GdkRGBA *rgba)
|
||||
{
|
||||
cairo_pattern_t *pattern;
|
||||
|
||||
|
||||
+5
-5
@@ -22,13 +22,13 @@
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_WINDOW_H__
|
||||
#define __GDK_WINDOW_H__
|
||||
|
||||
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_WINDOW_H__
|
||||
#define __GDK_WINDOW_H__
|
||||
|
||||
#include <gdk/gdkversionmacros.h>
|
||||
#include <gdk/gdktypes.h>
|
||||
#include <gdk/gdkevents.h>
|
||||
@@ -659,8 +659,8 @@ void gdk_window_set_transient_for (GdkWindow *window,
|
||||
GDK_DEPRECATED_IN_3_4_FOR(gdk_window_set_background_rgba)
|
||||
void gdk_window_set_background (GdkWindow *window,
|
||||
const GdkColor *color);
|
||||
void gdk_window_set_background_rgba (GdkWindow *window,
|
||||
const GdkRGBA *rgba);
|
||||
void gdk_window_set_background_rgba (GdkWindow *window,
|
||||
GdkRGBA *rgba);
|
||||
void gdk_window_set_background_pattern (GdkWindow *window,
|
||||
cairo_pattern_t *pattern);
|
||||
cairo_pattern_t *gdk_window_get_background_pattern (GdkWindow *window);
|
||||
|
||||
@@ -141,38 +141,6 @@
|
||||
return inMove;
|
||||
}
|
||||
|
||||
-(void)checkSendEnterNotify
|
||||
{
|
||||
GdkWindow *window = [[self contentView] gdkWindow];
|
||||
GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
|
||||
|
||||
/* When a new window has been created, and the mouse
|
||||
* is in the window area, we will not receive an NSMouseEntered
|
||||
* event. Therefore, we synthesize an enter notify event manually.
|
||||
*/
|
||||
if (!initialPositionKnown)
|
||||
{
|
||||
initialPositionKnown = YES;
|
||||
|
||||
if (NSPointInRect ([NSEvent mouseLocation], [self frame]))
|
||||
{
|
||||
NSEvent *event;
|
||||
|
||||
event = [NSEvent enterExitEventWithType: NSMouseEntered
|
||||
location: [self mouseLocationOutsideOfEventStream]
|
||||
modifierFlags: 0
|
||||
timestamp: [[NSApp currentEvent] timestamp]
|
||||
windowNumber: [impl->toplevel windowNumber]
|
||||
context: NULL
|
||||
eventNumber: 0
|
||||
trackingNumber: [impl->view trackingRect]
|
||||
userData: nil];
|
||||
|
||||
[NSApp postEvent:event atStart:NO];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
-(void)windowDidMove:(NSNotification *)aNotification
|
||||
{
|
||||
GdkWindow *window = [[self contentView] gdkWindow];
|
||||
@@ -189,8 +157,6 @@
|
||||
event->configure.height = window->height;
|
||||
|
||||
_gdk_event_queue_append (gdk_display_get_default (), event);
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
-(void)windowDidResize:(NSNotification *)aNotification
|
||||
@@ -220,8 +186,6 @@
|
||||
event->configure.height = window->height;
|
||||
|
||||
_gdk_event_queue_append (gdk_display_get_default (), event);
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
-(id)initWithContentRect:(NSRect)contentRect styleMask:(NSUInteger)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag screen:(NSScreen *)screen
|
||||
@@ -319,8 +283,6 @@
|
||||
[impl->toplevel orderFront:nil];
|
||||
|
||||
inShowOrHide = NO;
|
||||
|
||||
[self checkSendEnterNotify];
|
||||
}
|
||||
|
||||
- (void)hide
|
||||
@@ -331,8 +293,6 @@
|
||||
inShowOrHide = YES;
|
||||
[impl->toplevel orderOut:nil];
|
||||
inShowOrHide = NO;
|
||||
|
||||
initialPositionKnown = NO;
|
||||
}
|
||||
|
||||
- (BOOL)trackManualMove
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
@interface GdkQuartzNSWindow : NSWindow {
|
||||
BOOL inMove;
|
||||
BOOL inShowOrHide;
|
||||
BOOL initialPositionKnown;
|
||||
|
||||
/* Manually triggered move/resize (not by the window manager) */
|
||||
BOOL inManualMove;
|
||||
|
||||
@@ -81,25 +81,6 @@
|
||||
if (NSEqualRects (rect, NSZeroRect))
|
||||
return;
|
||||
|
||||
if (!GDK_WINDOW_IS_MAPPED (gdk_window))
|
||||
{
|
||||
/* If the window is not yet mapped, clip_region_with_children
|
||||
* will be empty causing the usual code below to draw nothing.
|
||||
* To not see garbage on the screen, we draw an aesthetic color
|
||||
* here. The garbage would be visible if any widget enabled
|
||||
* the NSView's CALayer in order to add sublayers for custom
|
||||
* native rendering.
|
||||
*/
|
||||
[NSGraphicsContext saveGraphicsState];
|
||||
|
||||
[[NSColor windowBackgroundColor] setFill];
|
||||
[NSBezierPath fillRect:rect];
|
||||
|
||||
[NSGraphicsContext restoreGraphicsState];
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/* Clear our own bookkeeping of regions that need display */
|
||||
if (impl->needs_display_region)
|
||||
{
|
||||
@@ -167,6 +148,15 @@
|
||||
owner:self
|
||||
userData:nil
|
||||
assumeInside:NO];
|
||||
|
||||
if (NSPointInRect ([[self window] convertScreenToBase:[NSEvent mouseLocation]], rect))
|
||||
{
|
||||
/* When a new window (and thus view) has been created, and the mouse
|
||||
* is in the window area, we will not receive an NSMouseEntered
|
||||
* event. Therefore, we synthesize an enter notify event manually.
|
||||
*/
|
||||
_gdk_quartz_events_send_enter_notify_event (gdk_window);
|
||||
}
|
||||
}
|
||||
|
||||
-(void)viewDidMoveToWindow
|
||||
|
||||
@@ -635,6 +635,21 @@ gdk_event_check (GSource *source)
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
retval = (_gdk_event_queue_find_first (_gdk_display) != NULL ||
|
||||
_gdk_quartz_event_loop_check_pending ());
|
||||
|
||||
@@ -652,21 +667,6 @@ gdk_event_dispatch (GSource *source,
|
||||
|
||||
gdk_threads_enter ();
|
||||
|
||||
/* Refresh the autorelease pool if we're at the base CFRunLoop level
|
||||
* (indicated by current_loop_level) and the base g_main_loop level
|
||||
* (indicated by g_main_depth()). Messing with the autorelease pool at
|
||||
* any level of nesting can cause access to deallocated memory because
|
||||
* autorelease_pool is static and releasing a pool will cause all pools
|
||||
* allocated inside of it to be released as well.
|
||||
*/
|
||||
if (current_loop_level == 0 && g_main_depth() == 0)
|
||||
{
|
||||
if (autorelease_pool)
|
||||
[autorelease_pool drain];
|
||||
|
||||
autorelease_pool = [[NSAutoreleasePool alloc] init];
|
||||
}
|
||||
|
||||
_gdk_quartz_display_queue_events (_gdk_display);
|
||||
|
||||
event = _gdk_event_unqueue (_gdk_display);
|
||||
@@ -703,10 +703,6 @@ poll_func (GPollFD *ufds,
|
||||
NSDate *limit_date;
|
||||
gint n_ready;
|
||||
|
||||
static GPollFD *last_ufds;
|
||||
|
||||
last_ufds = ufds;
|
||||
|
||||
n_ready = select_thread_start_poll (ufds, nfds, timeout_);
|
||||
if (n_ready > 0)
|
||||
timeout_ = 0;
|
||||
@@ -725,16 +721,7 @@ poll_func (GPollFD *ufds,
|
||||
dequeue: YES];
|
||||
getting_events--;
|
||||
|
||||
/* We check if last_ufds did not change since the time this function was
|
||||
* called. It is possible that a recursive main loop (and thus recursive
|
||||
* invocation of this poll function) is triggered while in
|
||||
* nextEventMatchingMask:. If during that time new fds are added,
|
||||
* the cached fds array might be replaced in g_main_context_iterate().
|
||||
* So, we should avoid accessing the old fd array (still pointed at by
|
||||
* ufds) here in that case, since it might have been freed. We avoid this
|
||||
* by not calling the collect stage.
|
||||
*/
|
||||
if (last_ufds == ufds && n_ready < 0)
|
||||
if (n_ready < 0)
|
||||
n_ready = select_thread_collect_poll (ufds, nfds);
|
||||
|
||||
if (event &&
|
||||
|
||||
+51
-153
@@ -58,62 +58,10 @@ static GdkWindow *find_toplevel_under_pointer (GdkDisplay *display,
|
||||
gint *y);
|
||||
|
||||
|
||||
static void
|
||||
gdk_quartz_ns_notification_callback (CFNotificationCenterRef center,
|
||||
void *observer,
|
||||
CFStringRef name,
|
||||
const void *object,
|
||||
CFDictionaryRef userInfo)
|
||||
{
|
||||
GdkEvent new_event;
|
||||
|
||||
new_event.type = GDK_SETTING;
|
||||
new_event.setting.window = gdk_screen_get_root_window (_gdk_screen);
|
||||
new_event.setting.send_event = FALSE;
|
||||
new_event.setting.action = GDK_SETTING_ACTION_CHANGED;
|
||||
new_event.setting.name = NULL;
|
||||
|
||||
/* Translate name */
|
||||
if (CFStringCompare (name,
|
||||
CFSTR("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
0) == kCFCompareEqualTo)
|
||||
new_event.setting.name = "gtk-primary-button-warps-slider";
|
||||
|
||||
if (!new_event.setting.name)
|
||||
return;
|
||||
|
||||
gdk_event_put (&new_event);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_events_init_notifications (void)
|
||||
{
|
||||
static gboolean notifications_initialized = FALSE;
|
||||
|
||||
if (notifications_initialized)
|
||||
return;
|
||||
notifications_initialized = TRUE;
|
||||
|
||||
/* Initialize any handlers for notifications we want to push to GTK
|
||||
* through GdkEventSettings.
|
||||
*/
|
||||
|
||||
/* This is an undocumented *distributed* notification to listen for changes
|
||||
* in scrollbar jump behavior. It is used by LibreOffice and WebKit as well.
|
||||
*/
|
||||
CFNotificationCenterAddObserver (CFNotificationCenterGetDistributedCenter (),
|
||||
NULL,
|
||||
&gdk_quartz_ns_notification_callback,
|
||||
CFSTR ("AppleNoRedisplayAppearancePreferenceChanged"),
|
||||
NULL,
|
||||
CFNotificationSuspensionBehaviorDeliverImmediately);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_init (void)
|
||||
{
|
||||
_gdk_quartz_event_loop_init ();
|
||||
gdk_quartz_events_init_notifications ();
|
||||
|
||||
current_keyboard_window = g_object_ref (_gdk_root);
|
||||
}
|
||||
@@ -401,89 +349,34 @@ get_window_point_from_screen_point (GdkWindow *window,
|
||||
*y = window->height - point.y;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_mouse_button_press_event (NSEventType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case NSLeftMouseDown:
|
||||
case NSRightMouseDown:
|
||||
case NSOtherMouseDown:
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static GdkWindow *
|
||||
get_toplevel_from_ns_event (NSEvent *nsevent,
|
||||
NSPoint *screen_point,
|
||||
gint *x,
|
||||
gint *y)
|
||||
{
|
||||
GdkWindow *toplevel = NULL;
|
||||
GdkWindow *toplevel;
|
||||
|
||||
if ([nsevent window])
|
||||
{
|
||||
GdkQuartzView *view;
|
||||
NSPoint point, view_point;
|
||||
NSRect view_frame;
|
||||
NSPoint point;
|
||||
|
||||
view = (GdkQuartzView *)[[nsevent window] contentView];
|
||||
|
||||
toplevel = [view gdkWindow];
|
||||
|
||||
point = [nsevent locationInWindow];
|
||||
view_point = [view convertPoint:point fromView:nil];
|
||||
view_frame = [view frame];
|
||||
*screen_point = [[nsevent window] convertBaseToScreen:point];
|
||||
|
||||
/* NSEvents come in with a window set, but with window coordinates
|
||||
* out of window bounds. For e.g. moved events this is fine, we use
|
||||
* this information to properly handle enter/leave notify and motion
|
||||
* events. For mouse button press/release, we want to avoid forwarding
|
||||
* these events however, because the window they relate to is not the
|
||||
* window set in the event. This situation appears to occur when button
|
||||
* presses come in just before (or just after?) a window is resized and
|
||||
* also when a button press occurs on the OS X window titlebar.
|
||||
*
|
||||
* By setting toplevel to NULL, we do another attempt to get the right
|
||||
* toplevel window below.
|
||||
*/
|
||||
if (is_mouse_button_press_event ([nsevent type]) &&
|
||||
(view_point.x < view_frame.origin.x ||
|
||||
view_point.x >= view_frame.origin.x + view_frame.size.width ||
|
||||
view_point.y < view_frame.origin.y ||
|
||||
view_point.y >= view_frame.origin.y + view_frame.size.height))
|
||||
{
|
||||
toplevel = NULL;
|
||||
|
||||
/* This is a hack for button presses to break all grabs. E.g. if
|
||||
* a menu is open and one clicks on the title bar (or anywhere
|
||||
* out of window bounds), we really want to pop down the menu (by
|
||||
* breaking the grabs) before OS X handles the action of the title
|
||||
* bar button.
|
||||
*
|
||||
* Because we cannot ingest this event into GDK, we have to do it
|
||||
* here, not very nice.
|
||||
*/
|
||||
_gdk_quartz_events_break_all_grabs (get_time_from_ns_event (nsevent));
|
||||
}
|
||||
else
|
||||
{
|
||||
*screen_point = [[nsevent window] convertBaseToScreen:point];
|
||||
|
||||
*x = point.x;
|
||||
*y = toplevel->height - point.y;
|
||||
}
|
||||
*x = point.x;
|
||||
*y = toplevel->height - point.y;
|
||||
}
|
||||
|
||||
if (!toplevel)
|
||||
else
|
||||
{
|
||||
/* Fallback used when no NSWindow set. This happens e.g. when
|
||||
* we allow motion events without a window set in gdk_event_translate()
|
||||
* that occur immediately after the main menu bar was clicked/used.
|
||||
* This fallback will not return coordinates contained in a window's
|
||||
* titlebar.
|
||||
*/
|
||||
*screen_point = [NSEvent mouseLocation];
|
||||
toplevel = find_toplevel_under_pointer (_gdk_display,
|
||||
@@ -530,7 +423,7 @@ generate_motion_event (GdkWindow *window)
|
||||
|
||||
event->any.type = GDK_MOTION_NOTIFY;
|
||||
event->motion.window = window;
|
||||
event->motion.time = get_time_from_ns_event ([NSApp currentEvent]);
|
||||
event->motion.time = GDK_CURRENT_TIME;
|
||||
event->motion.x = x;
|
||||
event->motion.y = y;
|
||||
event->motion.x_root = x_root;
|
||||
@@ -589,6 +482,39 @@ _gdk_quartz_events_update_focus_window (GdkWindow *window,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_send_enter_notify_event (GdkWindow *window)
|
||||
{
|
||||
NSPoint screen_point;
|
||||
GdkEvent *event;
|
||||
gint x, y, x_root, y_root;
|
||||
|
||||
event = gdk_event_new (GDK_ENTER_NOTIFY);
|
||||
event->any.window = NULL;
|
||||
event->any.send_event = FALSE;
|
||||
|
||||
screen_point = [NSEvent mouseLocation];
|
||||
|
||||
_gdk_quartz_window_nspoint_to_gdk_xy (screen_point, &x_root, &y_root);
|
||||
get_window_point_from_screen_point (window, screen_point, &x, &y);
|
||||
|
||||
event->crossing.window = window;
|
||||
event->crossing.subwindow = NULL;
|
||||
event->crossing.time = GDK_CURRENT_TIME;
|
||||
event->crossing.x = x;
|
||||
event->crossing.y = y;
|
||||
event->crossing.x_root = x_root;
|
||||
event->crossing.y_root = y_root;
|
||||
event->crossing.mode = GDK_CROSSING_NORMAL;
|
||||
event->crossing.detail = GDK_NOTIFY_ANCESTOR;
|
||||
event->crossing.state = _gdk_quartz_events_get_current_keyboard_modifiers () |
|
||||
_gdk_quartz_events_get_current_mouse_modifiers ();
|
||||
|
||||
gdk_event_set_device (event, _gdk_display->core_pointer);
|
||||
|
||||
append_event (event, TRUE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_quartz_events_send_map_event (GdkWindow *window)
|
||||
{
|
||||
@@ -622,18 +548,6 @@ find_toplevel_under_pointer (GdkDisplay *display,
|
||||
if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
|
||||
get_window_point_from_screen_point (toplevel, screen_point, x, y);
|
||||
|
||||
if (toplevel)
|
||||
{
|
||||
/* If the coordinates are out of window bounds, this toplevel is not
|
||||
* under the pointer and we thus return NULL. This can occur when
|
||||
* toplevel under pointer has not yet been updated due to a very recent
|
||||
* window resize. Alternatively, we should no longer be relying on
|
||||
* the toplevel_under_pointer value which is maintained in gdkwindow.c.
|
||||
*/
|
||||
if (*x < 0 || *y < 0 || *x >= toplevel->width || *y >= toplevel->height)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return toplevel;
|
||||
}
|
||||
|
||||
@@ -806,8 +720,6 @@ find_window_for_ns_event (NSEvent *nsevent,
|
||||
view = (GdkQuartzView *)[[nsevent window] contentView];
|
||||
|
||||
toplevel = get_toplevel_from_ns_event (nsevent, &screen_point, x, y);
|
||||
if (!toplevel)
|
||||
return NULL;
|
||||
_gdk_quartz_window_nspoint_to_gdk_xy (screen_point, x_root, y_root);
|
||||
|
||||
event_type = [nsevent type];
|
||||
@@ -1121,9 +1033,8 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
switch ([nsevent type])
|
||||
{
|
||||
case NSMouseEntered:
|
||||
/* Enter events are considered always to be from another toplevel
|
||||
* window, this shouldn't negatively affect any app or gtk code,
|
||||
* and is the only way to make GtkMenu work. EEK EEK EEK.
|
||||
/* Enter events are considered always to be from the root window as we
|
||||
* can't know for sure from what window we enter.
|
||||
*/
|
||||
if (!(window->event_mask & GDK_ENTER_NOTIFY_MASK))
|
||||
return FALSE;
|
||||
@@ -1133,11 +1044,14 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
x_root, y_root,
|
||||
GDK_ENTER_NOTIFY,
|
||||
GDK_CROSSING_NORMAL,
|
||||
GDK_NOTIFY_NONLINEAR);
|
||||
GDK_NOTIFY_ANCESTOR);
|
||||
return TRUE;
|
||||
|
||||
case NSMouseExited:
|
||||
/* See above */
|
||||
/* Exited always is to the root window as far as we are concerned,
|
||||
* since there is no way to reliably get information about what new
|
||||
* window is entered when exiting one.
|
||||
*/
|
||||
if (!(window->event_mask & GDK_LEAVE_NOTIFY_MASK))
|
||||
return FALSE;
|
||||
|
||||
@@ -1146,7 +1060,7 @@ synthesize_crossing_event (GdkWindow *window,
|
||||
x_root, y_root,
|
||||
GDK_LEAVE_NOTIFY,
|
||||
GDK_CROSSING_NORMAL,
|
||||
GDK_NOTIFY_NONLINEAR);
|
||||
GDK_NOTIFY_ANCESTOR);
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
@@ -1343,9 +1257,9 @@ gdk_event_translate (GdkEvent *event,
|
||||
}
|
||||
|
||||
/* Also when in a manual resize, we ignore events so that these are
|
||||
* pushed to GdkQuartzNSWindow's sendEvent handler.
|
||||
* pushed to GdkQuartzWindow's sendEvent handler.
|
||||
*/
|
||||
if ([(GdkQuartzNSWindow *)nswindow isInManualResize])
|
||||
if ([(GdkQuartzWindow *)nswindow isInManualResize])
|
||||
return FALSE;
|
||||
|
||||
/* Find the right GDK window to send the event to, taking grabs and
|
||||
@@ -1472,9 +1386,7 @@ gdk_event_translate (GdkEvent *event,
|
||||
|
||||
if (dx != 0.0 || dy != 0.0)
|
||||
{
|
||||
#ifdef AVAILABLE_MAC_OS_X_VERSION_10_7_AND_LATER
|
||||
if (gdk_quartz_osx_version() >= GDK_OSX_LION &&
|
||||
[nsevent hasPreciseScrollingDeltas])
|
||||
if ([nsevent hasPreciseScrollingDeltas])
|
||||
{
|
||||
GdkEvent *emulated_event;
|
||||
|
||||
@@ -1486,7 +1398,6 @@ gdk_event_translate (GdkEvent *event,
|
||||
append_event (emulated_event, TRUE);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
fill_scroll_event (window, event, nsevent,
|
||||
x, y, x_root, y_root,
|
||||
dx, dy, direction);
|
||||
@@ -1637,19 +1548,6 @@ _gdk_quartz_screen_get_setting (GdkScreen *screen,
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else if (strcmp (name, "gtk-primary-button-warps-slider") == 0)
|
||||
{
|
||||
GDK_QUARTZ_ALLOC_POOL;
|
||||
|
||||
BOOL setting = [[NSUserDefaults standardUserDefaults] boolForKey:@"AppleScrollerPagingBehavior"];
|
||||
|
||||
/* If the Apple property is YES, it means "warp" */
|
||||
g_value_set_boolean (value, setting == YES);
|
||||
|
||||
GDK_QUARTZ_RELEASE_POOL;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,14 +28,9 @@ GdkWindow *_gdk_root = NULL;
|
||||
GdkOSXVersion
|
||||
gdk_quartz_osx_version (void)
|
||||
{
|
||||
static gint32 minor = GDK_OSX_UNSUPPORTED;
|
||||
|
||||
if (minor == GDK_OSX_UNSUPPORTED)
|
||||
{
|
||||
OSErr err = Gestalt (gestaltSystemVersionMinor, (SInt32*)&minor);
|
||||
|
||||
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
||||
}
|
||||
gint minor;
|
||||
OSErr err = Gestalt (gestaltSystemVersionMinor, &minor);
|
||||
g_return_val_if_fail (err == noErr, GDK_OSX_UNSUPPORTED);
|
||||
|
||||
if (minor < GDK_OSX_MIN)
|
||||
return GDK_OSX_UNSUPPORTED;
|
||||
|
||||
@@ -176,7 +176,7 @@ const static struct {
|
||||
{ 67, GDK_KEY_asterisk, GDK_KEY_KP_Multiply },
|
||||
{ 69, GDK_KEY_plus, GDK_KEY_KP_Add },
|
||||
{ 75, GDK_KEY_slash, GDK_KEY_KP_Divide },
|
||||
{ 76, GDK_KEY_Return, GDK_KEY_KP_Enter },
|
||||
{ 76, 0x01000003, GDK_KEY_KP_Enter },
|
||||
{ 78, GDK_KEY_minus, GDK_KEY_KP_Subtract },
|
||||
{ 81, GDK_KEY_equal, GDK_KEY_KP_Equal },
|
||||
{ 82, GDK_KEY_0, GDK_KEY_KP_0 },
|
||||
|
||||
@@ -64,6 +64,7 @@ void _gdk_quartz_events_send_map_event (GdkWindow *window);
|
||||
GdkModifierType _gdk_quartz_events_get_current_keyboard_modifiers (void);
|
||||
GdkModifierType _gdk_quartz_events_get_current_mouse_modifiers (void);
|
||||
|
||||
void _gdk_quartz_events_send_enter_notify_event (GdkWindow *window);
|
||||
void _gdk_quartz_events_break_all_grabs (guint32 time);
|
||||
|
||||
/* Event loop */
|
||||
|
||||
@@ -48,8 +48,7 @@ typedef enum
|
||||
GDK_OSX_LEOPARD = 5,
|
||||
GDK_OSX_SNOW_LEOPARD = 6,
|
||||
GDK_OSX_LION = 7,
|
||||
GDK_OSX_MOUNTAIN_LION = 8,
|
||||
GDK_OSX_CURRENT = 8,
|
||||
GDK_OSX_CURRENT = 7,
|
||||
GDK_OSX_NEW = 99
|
||||
} GdkOSXVersion;
|
||||
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_CURSOR_H__
|
||||
#define __GDK_QUARTZ_CURSOR_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_CURSOR_H__
|
||||
#define __GDK_QUARTZ_CURSOR_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
|
||||
#if !defined(__GDKQUARTZ_H_INSIDE__) && !defined (GDK_COMPILATION)
|
||||
#error "Only <gdk/gdkquartz.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#ifndef __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
#define __GDK_QUARTZ_DEVICE_CORE_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user