broadway: Separate out the server parts
This (shouldn't) change any behaviour, but it moves the webserver parts to a separate file, making the broadway display file smaller and preparing for later separating out the server to its own process.
This commit is contained in:
		| @ -17,6 +17,8 @@ LDADDS = $(GDK_DEP_LIBS) | ||||
|  | ||||
| noinst_LTLIBRARIES = libbroadway.la libgdk-broadway.la | ||||
|  | ||||
| libexec_PROGRAMS = broadway-server | ||||
|  | ||||
| libgdkinclude_HEADERS = 	\ | ||||
| 	gdkbroadway.h | ||||
|  | ||||
| @ -27,6 +29,8 @@ libgdkbroadwayinclude_HEADERS = 	\ | ||||
| 	gdkbroadwayvisual.h | ||||
|  | ||||
| libbroadway_la_SOURCES =		\ | ||||
| 	gdkbroadway-server.h		\ | ||||
| 	gdkbroadway-server.c		\ | ||||
| 	broadway.h			\ | ||||
| 	broadway.c | ||||
|  | ||||
| @ -77,6 +81,11 @@ libgdk_broadway_la_SOURCES =		\ | ||||
|  | ||||
| libgdk_broadway_la_LIBADD = libbroadway.la | ||||
|  | ||||
| broadway_server_SOURCES = \ | ||||
| 	broadway-server.c | ||||
|  | ||||
| broadway_server_LDADD = libbroadway.la $(GDK_DEP_LIBS) | ||||
|  | ||||
| MAINTAINERCLEANFILES = $(broadway_built_sources) | ||||
| EXTRA_DIST += $(broadway_built_sources) | ||||
|  | ||||
|  | ||||
							
								
								
									
										32
									
								
								gdk/broadway/broadway-server.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								gdk/broadway/broadway-server.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | ||||
| #include <glib.h> | ||||
|  | ||||
| #include "gdkbroadway-server.h" | ||||
|  | ||||
| int | ||||
| main (int argc, char *argv[]) | ||||
| { | ||||
|   GdkBroadwayServer *server; | ||||
|   GError *error; | ||||
|   GMainLoop *loop; | ||||
|  | ||||
|   error = NULL; | ||||
|   server = _gdk_broadway_server_new (8080, &error); | ||||
|   if (server == NULL) | ||||
|     { | ||||
|       g_printerr ("%s\n", error->message); | ||||
|       return 1; | ||||
|     } | ||||
|  | ||||
|   loop = g_main_loop_new (NULL, FALSE); | ||||
|   g_main_loop_run (loop); | ||||
|    | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* TODO: */ | ||||
|  | ||||
| void | ||||
| _gdk_broadway_events_got_input (BroadwayInputMsg *message) | ||||
| { | ||||
| } | ||||
| @ -1,3 +1,6 @@ | ||||
| #ifndef __BROADWAY_H__ | ||||
| #define __BROADWAY_H__ | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <gio/gio.h> | ||||
|  | ||||
| @ -78,3 +81,5 @@ void            broadway_output_grab_pointer    (BroadwayOutput *output, | ||||
| 						 gboolean owner_event); | ||||
| guint32         broadway_output_ungrab_pointer  (BroadwayOutput *output); | ||||
| void            broadway_output_pong            (BroadwayOutput *output); | ||||
|  | ||||
| #endif /* __BROADWAY_H__ */ | ||||
|  | ||||
| @ -2671,7 +2671,7 @@ function handleKeyDown(e) { | ||||
| 	// browser behaviors or it has no corresponding keyPress | ||||
| 	// event, then send it immediately | ||||
| 	if (!ignoreKeyEvent(ev)) | ||||
| 	    sendInput("k", [keysym, lastState]); | ||||
| 	    sendInput("k", [realWindowWithMouse, keysym, lastState]); | ||||
| 	suppress = true; | ||||
|     } | ||||
|  | ||||
| @ -2716,7 +2716,7 @@ function handleKeyPress(e) { | ||||
|  | ||||
|     // Send the translated keysym | ||||
|     if (keysym > 0) | ||||
| 	sendInput ("k", [keysym, lastState]); | ||||
| 	sendInput ("k", [realWindowWithMouse, keysym, lastState]); | ||||
|  | ||||
|     // Stop keypress events just in case | ||||
|     return cancelEvent(ev); | ||||
| @ -2735,7 +2735,7 @@ function handleKeyUp(e) { | ||||
|     } | ||||
|  | ||||
|     if (keysym > 0) | ||||
| 	sendInput ("K", [keysym, lastState]); | ||||
| 	sendInput ("K", [realWindowWithMouse, keysym, lastState]); | ||||
|     return cancelEvent(ev); | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										1695
									
								
								gdk/broadway/gdkbroadway-server.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1695
									
								
								gdk/broadway/gdkbroadway-server.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										145
									
								
								gdk/broadway/gdkbroadway-server.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								gdk/broadway/gdkbroadway-server.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,145 @@ | ||||
| #ifndef __GDK_BROADWAY_SERVER__ | ||||
| #define __GDK_BROADWAY_SERVER__ | ||||
|  | ||||
| #include <gdk/gdktypes.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)) | ||||
|  | ||||
| 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; | ||||
|  | ||||
| GdkBroadwayServer *_gdk_broadway_server_new                      (int                 port, | ||||
| 								  GError            **error); | ||||
| gboolean           _gdk_broadway_server_has_client               (GdkBroadwayServer  *server); | ||||
| 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, | ||||
| 								  gint               *toplevel, | ||||
| 								  gint               *root_x, | ||||
| 								  gint               *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); | ||||
| 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__ */ | ||||
| @ -156,7 +156,10 @@ gdk_broadway_device_query_state (GdkDevice        *device, | ||||
|   GdkDisplay *display; | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   GdkScreen *screen; | ||||
|   gint device_root_x, device_root_y; | ||||
|   gint32 device_root_x, device_root_y; | ||||
|   gint32 mouse_toplevel_id; | ||||
|   GdkWindow *mouse_toplevel; | ||||
|   guint32 mask32; | ||||
|  | ||||
|   if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE) | ||||
|     return; | ||||
| @ -173,36 +176,12 @@ gdk_broadway_device_query_state (GdkDevice        *device, | ||||
|       *root_window = gdk_screen_get_root_window (screen); | ||||
|     } | ||||
|  | ||||
|   if (broadway_display->output) | ||||
|     { | ||||
|       _gdk_broadway_display_consume_all_input (display); | ||||
|       if (root_x) | ||||
| 	*root_x = broadway_display->future_root_x; | ||||
|       if (root_y) | ||||
| 	*root_y = broadway_display->future_root_y; | ||||
|       /* TODO: Should really use future_x/y when we get configure events */ | ||||
|       if (win_x) | ||||
| 	*win_x = broadway_display->future_root_x - toplevel->x; | ||||
|       if (win_y) | ||||
| 	*win_y = broadway_display->future_root_y - toplevel->y; | ||||
|       if (mask) | ||||
| 	*mask = broadway_display->future_state; | ||||
|       if (child_window) | ||||
| 	{ | ||||
| 	  if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT) | ||||
| 	    *child_window = | ||||
| 	      g_hash_table_lookup (broadway_display->id_ht, | ||||
| 				   GINT_TO_POINTER (broadway_display->future_mouse_in_toplevel)); | ||||
| 	  else | ||||
| 	    *child_window = toplevel; /* No native children */ | ||||
| 	} | ||||
|       return; | ||||
|     } | ||||
|  | ||||
|   /* Fallback when unconnected */ | ||||
|  | ||||
|   device_root_x = broadway_display->last_x; | ||||
|   device_root_y = broadway_display->last_y; | ||||
|   _gdk_broadway_server_query_mouse (broadway_display->server, | ||||
| 				    &mouse_toplevel_id, | ||||
| 				    &device_root_x, | ||||
| 				    &device_root_y, | ||||
| 				    &mask32); | ||||
|   mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (mouse_toplevel_id)); | ||||
|  | ||||
|   if (root_x) | ||||
|     *root_x = device_root_x; | ||||
| @ -213,12 +192,12 @@ gdk_broadway_device_query_state (GdkDevice        *device, | ||||
|   if (win_y) | ||||
|     *win_y = device_root_y - toplevel->y; | ||||
|   if (mask) | ||||
|     *mask = broadway_display->last_state; | ||||
|     *mask = mask32; | ||||
|   if (child_window) | ||||
|     { | ||||
|       if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT) | ||||
| 	{ | ||||
| 	  *child_window = broadway_display->mouse_in_toplevel; | ||||
| 	  *child_window = mouse_toplevel; | ||||
| 	  if (*child_window == NULL) | ||||
| 	    *child_window = toplevel; | ||||
| 	} | ||||
| @ -236,13 +215,10 @@ void | ||||
| _gdk_broadway_window_grab_check_destroy (GdkWindow *window) | ||||
| { | ||||
|   GdkDisplay *display = gdk_window_get_display (window); | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   GdkDeviceManager *device_manager; | ||||
|   GdkDeviceGrabInfo *grab; | ||||
|   GList *devices, *d; | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (display); | ||||
|  | ||||
|   device_manager = gdk_display_get_device_manager (display); | ||||
|  | ||||
|   /* Get all devices */ | ||||
| @ -257,8 +233,6 @@ _gdk_broadway_window_grab_check_destroy (GdkWindow *window) | ||||
| 	{ | ||||
| 	  grab->serial_end = grab->serial_start; | ||||
| 	  grab->implicit_ungrab = TRUE; | ||||
|  | ||||
| 	  broadway_display->pointer_grab_window = NULL; | ||||
| 	} | ||||
|  | ||||
|     } | ||||
| @ -290,29 +264,11 @@ gdk_broadway_device_grab (GdkDevice    *device, | ||||
|   else | ||||
|     { | ||||
|       /* Device is a pointer */ | ||||
|  | ||||
|       if (broadway_display->pointer_grab_window != NULL && | ||||
| 	  time_ != 0 && broadway_display->pointer_grab_time > time_) | ||||
| 	return GDK_GRAB_ALREADY_GRABBED; | ||||
|  | ||||
|       if (time_ == 0) | ||||
| 	time_ = broadway_display->last_seen_time; | ||||
|  | ||||
|       broadway_display->pointer_grab_window = window; | ||||
|       broadway_display->pointer_grab_owner_events = owner_events; | ||||
|       broadway_display->pointer_grab_time = time_; | ||||
|  | ||||
|       if (broadway_display->output) | ||||
| 	{ | ||||
| 	  broadway_output_grab_pointer (broadway_display->output, | ||||
| 					GDK_WINDOW_IMPL_BROADWAY (window->impl)->id, | ||||
| 					owner_events); | ||||
| 	  gdk_display_flush (display); | ||||
| 	} | ||||
|  | ||||
|       /* TODO: What about toplevel grab events if we're not connected? */ | ||||
|  | ||||
|       return GDK_GRAB_SUCCESS; | ||||
|       return _gdk_broadway_server_grab_pointer (broadway_display->server, | ||||
| 						GDK_WINDOW_IMPL_BROADWAY (window->impl)->id, | ||||
| 						owner_events, | ||||
| 						event_mask, | ||||
| 						time_); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -340,31 +296,17 @@ gdk_broadway_device_ungrab (GdkDevice *device, | ||||
|   else | ||||
|     { | ||||
|       /* Device is a pointer */ | ||||
|       serial = _gdk_broadway_server_ungrab_pointer (broadway_display->server, time_); | ||||
|  | ||||
|       if (broadway_display->pointer_grab_window != NULL && | ||||
| 	  time_ != 0 && broadway_display->pointer_grab_time > time_) | ||||
| 	return; | ||||
|  | ||||
|       /* TODO: What about toplevel grab events if we're not connected? */ | ||||
|  | ||||
|       if (broadway_display->output) | ||||
|       if (serial != 0) | ||||
| 	{ | ||||
| 	  serial = broadway_output_ungrab_pointer (broadway_display->output); | ||||
| 	  gdk_display_flush (display); | ||||
| 	  grab = _gdk_display_get_last_device_grab (display, device); | ||||
| 	  if (grab && | ||||
| 	      (time_ == GDK_CURRENT_TIME || | ||||
| 	       grab->time == GDK_CURRENT_TIME || | ||||
| 	       !TIME_IS_LATER (grab->time, time_))) | ||||
| 	    grab->serial_end = serial; | ||||
| 	} | ||||
|       else | ||||
| 	{ | ||||
| 	  serial = broadway_display->saved_serial; | ||||
| 	} | ||||
|  | ||||
|       grab = _gdk_display_get_last_device_grab (display, device); | ||||
|       if (grab && | ||||
| 	  (time_ == GDK_CURRENT_TIME || | ||||
| 	   grab->time == GDK_CURRENT_TIME || | ||||
| 	   !TIME_IS_LATER (grab->time, time_))) | ||||
| 	grab->serial_end = serial; | ||||
|  | ||||
|       broadway_display->pointer_grab_window = NULL; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -375,7 +317,6 @@ gdk_broadway_device_window_at_position (GdkDevice       *device, | ||||
| 					GdkModifierType *mask, | ||||
| 					gboolean         get_toplevel) | ||||
| { | ||||
|   gboolean res; | ||||
|   GdkScreen *screen; | ||||
|   GdkWindow *root_window; | ||||
|   GdkWindow *window; | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -27,6 +27,7 @@ | ||||
| #include "gdkwindow.h" | ||||
| #include "gdkinternals.h" | ||||
| #include "gdkmain.h" | ||||
| #include "gdkbroadway-server.h" | ||||
| #include "broadway.h" | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
| @ -43,82 +44,6 @@ typedef struct BroadwayInput BroadwayInput; | ||||
| #define GDK_IS_BROADWAY_DISPLAY_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_BROADWAY_DISPLAY)) | ||||
| #define GDK_BROADWAY_DISPLAY_GET_CLASS(obj)    (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_BROADWAY_DISPLAY, GdkBroadwayDisplayClass)) | ||||
|  | ||||
| typedef struct { | ||||
|   char type; | ||||
|   guint32 serial; | ||||
|   guint64 time; | ||||
| } BroadwayInputBaseMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   guint32 mouse_window_id; /* The real window, not taking grabs into account */ | ||||
|   guint32 event_window_id; | ||||
|   int root_x; | ||||
|   int root_y; | ||||
|   int win_x; | ||||
|   int win_y; | ||||
|   guint32 state; | ||||
| } BroadwayInputPointerMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputPointerMsg pointer; | ||||
|   guint32 mode; | ||||
| } BroadwayInputCrossingMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputPointerMsg pointer; | ||||
|   guint32 button; | ||||
| } BroadwayInputButtonMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputPointerMsg pointer; | ||||
|   int dir; | ||||
| } BroadwayInputScrollMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   guint32 state; | ||||
|   int key; | ||||
| } BroadwayInputKeyMsg; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   int res; | ||||
| } BroadwayInputGrabReply; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   int id; | ||||
|   int x; | ||||
|   int y; | ||||
|   int width; | ||||
|   int height; | ||||
| } BroadwayInputConfigureNotify; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   int width; | ||||
|   int height; | ||||
| } BroadwayInputScreenResizeNotify; | ||||
|  | ||||
| typedef struct { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   int id; | ||||
| } BroadwayInputDeleteNotify; | ||||
|  | ||||
| typedef union { | ||||
|   BroadwayInputBaseMsg base; | ||||
|   BroadwayInputPointerMsg pointer; | ||||
|   BroadwayInputCrossingMsg crossing; | ||||
|   BroadwayInputButtonMsg button; | ||||
|   BroadwayInputScrollMsg scroll; | ||||
|   BroadwayInputKeyMsg key; | ||||
|   BroadwayInputGrabReply grab_reply; | ||||
|   BroadwayInputConfigureNotify configure_notify; | ||||
|   BroadwayInputDeleteNotify delete_notify; | ||||
|   BroadwayInputScreenResizeNotify screen_resize_notify; | ||||
| } BroadwayInputMsg; | ||||
|  | ||||
| struct _GdkBroadwayDisplay | ||||
| { | ||||
|   GdkDisplay parent_instance; | ||||
| @ -129,10 +54,6 @@ struct _GdkBroadwayDisplay | ||||
|   GList *toplevels; | ||||
|  | ||||
|   GSource *event_source; | ||||
|   GdkWindow *mouse_in_toplevel; | ||||
|   int last_x, last_y; /* in root coords */ | ||||
|   guint32 last_state; | ||||
|   GdkWindow *real_mouse_in_toplevel; /* Not affected by grabs */ | ||||
|  | ||||
|   /* Keyboard related information */ | ||||
|   GdkKeymap *keymap; | ||||
| @ -147,24 +68,7 @@ struct _GdkBroadwayDisplay | ||||
|   /* The offscreen window that has the pointer in it (if any) */ | ||||
|   GdkWindow *active_offscreen_window; | ||||
|  | ||||
|   GSocketService *service; | ||||
|   BroadwayOutput *output; | ||||
|   guint32 saved_serial; | ||||
|   guint64 last_seen_time; | ||||
|   BroadwayInput *input; | ||||
|   GList *input_messages; | ||||
|   guint process_input_idle; | ||||
|  | ||||
|   /* Explicit pointer grabs: */ | ||||
|   GdkWindow *pointer_grab_window; | ||||
|   guint32 pointer_grab_time; | ||||
|   gboolean pointer_grab_owner_events; | ||||
|  | ||||
|   /* Future data, from the currently queued events */ | ||||
|   int future_root_x; | ||||
|   int future_root_y; | ||||
|   GdkModifierType future_state; | ||||
|   int future_mouse_in_toplevel; | ||||
|   GdkBroadwayServer *server; | ||||
| }; | ||||
|  | ||||
| struct _GdkBroadwayDisplayClass | ||||
|  | ||||
| @ -87,9 +87,9 @@ gdk_event_source_check (GSource *source) | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
| 				BroadwayInputMsg *message) | ||||
| _gdk_broadway_events_got_input (BroadwayInputMsg *message) | ||||
| { | ||||
|   GdkDisplay *display = gdk_display_get_default (); | ||||
|   GdkBroadwayDisplay *display_broadway = GDK_BROADWAY_DISPLAY (display); | ||||
|   GdkScreen *screen; | ||||
|   GdkWindow *window; | ||||
| @ -98,16 +98,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|  | ||||
|   switch (message->base.type) { | ||||
|   case 'e': /* Enter */ | ||||
|     display_broadway->last_x = message->pointer.root_x; | ||||
|     display_broadway->last_y = message->pointer.root_y; | ||||
|     display_broadway->last_state = message->pointer.state; | ||||
|     display_broadway->real_mouse_in_toplevel = | ||||
|       g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id)); | ||||
|  | ||||
|     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); | ||||
| @ -135,15 +126,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|       } | ||||
|     break; | ||||
|   case 'l': /* Leave */ | ||||
|     display_broadway->last_x = message->pointer.root_x; | ||||
|     display_broadway->last_y = message->pointer.root_y; | ||||
|     display_broadway->last_state = message->pointer.state; | ||||
|     display_broadway->real_mouse_in_toplevel = | ||||
|       g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id)); | ||||
|  | ||||
|     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); | ||||
| @ -171,12 +154,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|       } | ||||
|     break; | ||||
|   case 'm': /* Mouse move */ | ||||
|     display_broadway->last_x = message->pointer.root_x; | ||||
|     display_broadway->last_y = message->pointer.root_y; | ||||
|     display_broadway->last_state = message->pointer.state; | ||||
|     display_broadway->real_mouse_in_toplevel = | ||||
|       g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id)); | ||||
|  | ||||
|     if (_gdk_broadway_moveresize_handle_event (display, message)) | ||||
|       break; | ||||
|  | ||||
| @ -200,12 +177,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|     break; | ||||
|   case 'b': | ||||
|   case 'B': | ||||
|     display_broadway->last_x = message->pointer.root_x; | ||||
|     display_broadway->last_y = message->pointer.root_y; | ||||
|     display_broadway->last_state = message->pointer.state; | ||||
|     display_broadway->real_mouse_in_toplevel = | ||||
|       g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id)); | ||||
|  | ||||
|     if (message->base.type != 'b' && | ||||
| 	_gdk_broadway_moveresize_handle_event (display, message)) | ||||
|       break; | ||||
| @ -230,12 +201,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|  | ||||
|     break; | ||||
|   case 's': | ||||
|     display_broadway->last_x = message->pointer.root_x; | ||||
|     display_broadway->last_y = message->pointer.root_y; | ||||
|     display_broadway->last_state = message->pointer.state; | ||||
|     display_broadway->real_mouse_in_toplevel = | ||||
|       g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.mouse_window_id)); | ||||
|  | ||||
|     window = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->pointer.event_window_id)); | ||||
|     if (window) | ||||
|       { | ||||
| @ -256,8 +221,8 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|     break; | ||||
|   case 'k': | ||||
|   case 'K': | ||||
|     window = display_broadway->mouse_in_toplevel; | ||||
|  | ||||
|     window = g_hash_table_lookup (display_broadway->id_ht, | ||||
| 				  GINT_TO_POINTER (message->key.mouse_window_id)); | ||||
|     if (window) | ||||
|       { | ||||
| 	event = gdk_event_new (message->base.type == 'k' ? GDK_KEY_PRESS : GDK_KEY_RELEASE); | ||||
| @ -269,8 +234,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
| 	event->key.length = 0; | ||||
| 	gdk_event_set_device (event, display->core_pointer); | ||||
|  | ||||
| 	display_broadway->last_state = message->key.state; | ||||
|  | ||||
| 	node = _gdk_event_queue_append (display, event); | ||||
| 	_gdk_windowing_got_event (display, node, event, message->base.serial); | ||||
|       } | ||||
| @ -335,7 +298,7 @@ _gdk_broadway_events_got_input (GdkDisplay *display, | ||||
|     break; | ||||
|  | ||||
|   default: | ||||
|     g_printerr ("Unknown input command %c\n", message->base.type); | ||||
|     g_printerr ("_gdk_broadway_events_got_input - Unknown input command %c\n", message->base.type); | ||||
|     break; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -126,8 +126,7 @@ GList *_gdk_broadway_screen_list_visuals (GdkScreen *screen); | ||||
| void _gdk_broadway_screen_size_changed (GdkScreen *screen,  | ||||
| 					BroadwayInputScreenResizeNotify *msg); | ||||
|  | ||||
| void _gdk_broadway_events_got_input      (GdkDisplay *display, | ||||
| 					  BroadwayInputMsg *message); | ||||
| void _gdk_broadway_events_got_input      (BroadwayInputMsg *message); | ||||
|  | ||||
| void _gdk_broadway_screen_init_root_window (GdkScreen *screen); | ||||
| void _gdk_broadway_screen_init_visuals (GdkScreen *screen); | ||||
|  | ||||
| @ -83,95 +83,17 @@ G_DEFINE_TYPE (GdkWindowImplBroadway, | ||||
| 	       gdk_window_impl_broadway, | ||||
| 	       GDK_TYPE_WINDOW_IMPL) | ||||
|  | ||||
| static void | ||||
| diff_surfaces (cairo_surface_t *surface, | ||||
| 	       cairo_surface_t *old_surface) | ||||
| { | ||||
|   guint8 *data, *old_data; | ||||
|   guint32 *line, *old_line; | ||||
|   int w, h, stride, old_stride; | ||||
|   int x, y; | ||||
|  | ||||
|   data = cairo_image_surface_get_data (surface); | ||||
|   old_data = cairo_image_surface_get_data (old_surface); | ||||
|  | ||||
|   w = cairo_image_surface_get_width (surface); | ||||
|   h = cairo_image_surface_get_height (surface); | ||||
|  | ||||
|   stride = cairo_image_surface_get_stride (surface); | ||||
|   old_stride = cairo_image_surface_get_stride (old_surface); | ||||
|  | ||||
|   for (y = 0; y < h; y++) | ||||
|     { | ||||
|       line = (guint32 *)data; | ||||
|       old_line = (guint32 *)old_data; | ||||
|  | ||||
|       for (x = 0; x < w; x++) | ||||
| 	{ | ||||
| 	  if ((*line & 0xffffff) == (*old_line & 0xffffff)) | ||||
| 	    *old_line = 0; | ||||
| 	  else | ||||
| 	    *old_line = *line | 0xff000000; | ||||
| 	  line ++; | ||||
| 	  old_line ++; | ||||
| 	} | ||||
|  | ||||
|       data += stride; | ||||
|       old_data += old_stride; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static guint dirty_flush_id = 0; | ||||
|  | ||||
| static void | ||||
| window_data_send (BroadwayOutput *output, GdkWindowImplBroadway *impl) | ||||
| { | ||||
|   cairo_t *cr; | ||||
|  | ||||
|   if (impl->surface == NULL) | ||||
|     return; | ||||
|  | ||||
|   if (impl->last_synced) | ||||
|     { | ||||
|       diff_surfaces (impl->surface, | ||||
| 		     impl->last_surface); | ||||
|       broadway_output_put_rgba (output, impl->id, 0, 0, | ||||
| 				cairo_image_surface_get_width (impl->last_surface), | ||||
| 				cairo_image_surface_get_height (impl->last_surface), | ||||
| 				cairo_image_surface_get_stride (impl->last_surface), | ||||
| 				cairo_image_surface_get_data (impl->last_surface)); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       impl->last_synced = TRUE; | ||||
|       broadway_output_put_rgb (output, impl->id, 0, 0, | ||||
| 			       cairo_image_surface_get_width (impl->surface), | ||||
| 			       cairo_image_surface_get_height (impl->surface), | ||||
| 			       cairo_image_surface_get_stride (impl->surface), | ||||
| 			       cairo_image_surface_get_data (impl->surface)); | ||||
|     } | ||||
|  | ||||
|   broadway_output_surface_flush (output, impl->id); | ||||
|  | ||||
|   cr = cairo_create (impl->last_surface); | ||||
|   cairo_set_source_surface (cr, impl->surface, 0, 0); | ||||
|   cairo_paint (cr); | ||||
|   cairo_destroy (cr); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| dirty_flush_idle (gpointer data) | ||||
| { | ||||
|   GList *l; | ||||
|   GdkBroadwayDisplay *display; | ||||
|   BroadwayOutput *output; | ||||
|  | ||||
|   dirty_flush_id = 0; | ||||
|  | ||||
|   display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ()); | ||||
|   output = display->output; | ||||
|   if (output == NULL) | ||||
|     return FALSE; | ||||
|  | ||||
|   for (l = display->toplevels; l != NULL; l = l->next) | ||||
|     { | ||||
| @ -180,11 +102,15 @@ dirty_flush_idle (gpointer data) | ||||
|       if (impl->dirty) | ||||
| 	{ | ||||
| 	  impl->dirty = FALSE; | ||||
| 	  window_data_send (display->output, impl); | ||||
| 	  _gdk_broadway_server_window_update (display->server, | ||||
| 					      impl->id, | ||||
| 					      impl->surface); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   gdk_display_flush (GDK_DISPLAY (display)); | ||||
|   /* We sync here to ensure all references to the impl->surface memory | ||||
|      is done, as we may later paint new data in them. */ | ||||
|   gdk_display_sync (GDK_DISPLAY (display)); | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
| @ -192,64 +118,10 @@ dirty_flush_idle (gpointer data) | ||||
| static void | ||||
| queue_dirty_flush (GdkBroadwayDisplay *display) | ||||
| { | ||||
|   if (dirty_flush_id == 0 && display->output != NULL) | ||||
|   if (dirty_flush_id == 0) | ||||
|     dirty_flush_id = gdk_threads_add_idle (dirty_flush_idle, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_broadway_resync_windows (void) | ||||
| { | ||||
|   GdkBroadwayDisplay *display; | ||||
|   GList *l; | ||||
|  | ||||
|   dirty_flush_id = 0; | ||||
|  | ||||
|   display = GDK_BROADWAY_DISPLAY (gdk_display_get_default ()); | ||||
|  | ||||
|   /* First create all windows */ | ||||
|   for (l = display->toplevels; l != NULL; l = l->next) | ||||
|     { | ||||
|       GdkWindowImplBroadway *impl = l->data; | ||||
|       GdkWindow *window; | ||||
|  | ||||
|       window = impl->wrapper; | ||||
|  | ||||
|       if (impl->id == 0) | ||||
| 	continue; /* Skip root */ | ||||
|  | ||||
|       impl->dirty = FALSE; | ||||
|       impl->last_synced = FALSE; | ||||
|       broadway_output_new_surface (display->output, | ||||
| 				   impl->id, | ||||
| 				   window->x, | ||||
| 				   window->y, | ||||
| 				   window->width, | ||||
| 				   window->height, | ||||
| 				   window->window_type == GDK_WINDOW_TEMP); | ||||
|     } | ||||
|  | ||||
|   /* Then do everything that may reference other windows */ | ||||
|   for (l = display->toplevels; l != NULL; l = l->next) | ||||
|     { | ||||
|       GdkWindowImplBroadway *impl = l->data; | ||||
|  | ||||
|       if (impl->id == 0) | ||||
| 	continue; /* Skip root */ | ||||
|  | ||||
|       if (impl->transient_for) | ||||
| 	broadway_output_set_transient_for (display->output, impl->id, impl->transient_for); | ||||
|       /* Can't check GDK_WINDOW_IS_MAPPED here, because that doesn't correctly handle | ||||
| 	 withdrawn windows like menus */ | ||||
|       if (impl->visible) | ||||
| 	{ | ||||
| 	  broadway_output_show_surface (display->output, impl->id); | ||||
| 	  window_data_send (display->output, impl); | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|   gdk_display_flush (GDK_DISPLAY (display)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| gdk_window_impl_broadway_init (GdkWindowImplBroadway *impl) | ||||
| { | ||||
| @ -275,12 +147,6 @@ gdk_window_impl_broadway_finalize (GObject *object) | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper)); | ||||
|  | ||||
|   if (broadway_display->mouse_in_toplevel == GDK_WINDOW (wrapper)) | ||||
|     { | ||||
|       /* TODO: Send leave + enter event, update cursors, etc */ | ||||
|       broadway_display->mouse_in_toplevel = NULL; | ||||
|     } | ||||
|  | ||||
|   g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id)); | ||||
|  | ||||
|   if (impl->cursor) | ||||
| @ -315,6 +181,7 @@ _gdk_broadway_screen_init_root_window (GdkScreen * screen) | ||||
|  | ||||
|   impl->screen = screen; | ||||
|   impl->wrapper = window; | ||||
|   impl->id = 0; | ||||
|  | ||||
|   window->window_type = GDK_WINDOW_ROOT; | ||||
|   window->depth = 24; | ||||
| @ -341,13 +208,17 @@ _gdk_broadway_display_create_window_impl (GdkDisplay    *display, | ||||
| { | ||||
|   GdkWindowImplBroadway *impl; | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   static int current_id = 1; /* 0 is the root window */ | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (display); | ||||
|  | ||||
|   impl = g_object_new (GDK_TYPE_WINDOW_IMPL_BROADWAY, NULL); | ||||
|   window->impl = (GdkWindowImpl *)impl; | ||||
|   impl->id = current_id++; | ||||
|   impl->id = _gdk_broadway_server_new_window (broadway_display->server, | ||||
| 					      window->x, | ||||
| 					      window->y, | ||||
| 					      window->width, | ||||
| 					      window->height, | ||||
| 					      window->window_type == GDK_WINDOW_TEMP); | ||||
|   g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), window); | ||||
|   impl->wrapper = window; | ||||
|  | ||||
| @ -358,37 +229,23 @@ _gdk_broadway_display_create_window_impl (GdkDisplay    *display, | ||||
|   g_assert (GDK_WINDOW_TYPE (window->parent) == GDK_WINDOW_ROOT); | ||||
|  | ||||
|   broadway_display->toplevels = g_list_prepend (broadway_display->toplevels, impl); | ||||
|  | ||||
|   if (broadway_display->output) | ||||
|     broadway_output_new_surface (broadway_display->output, | ||||
| 				 impl->id, | ||||
| 				 window->x, | ||||
| 				 window->y, | ||||
| 				 window->width, | ||||
| 				 window->height, | ||||
| 				 window->window_type == GDK_WINDOW_TEMP); | ||||
| } | ||||
|  | ||||
| void | ||||
| _gdk_broadway_window_resize_surface (GdkWindow *window) | ||||
| { | ||||
|   GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); | ||||
|   cairo_surface_t *old, *last_old; | ||||
|   cairo_surface_t *old; | ||||
|  | ||||
|   if (impl->surface) | ||||
|     { | ||||
|       old = impl->surface; | ||||
|       last_old = impl->last_surface; | ||||
|  | ||||
|       impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, | ||||
| 						  gdk_window_get_width (impl->wrapper), | ||||
| 						  gdk_window_get_height (impl->wrapper)); | ||||
|       impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, | ||||
| 						       gdk_window_get_width (impl->wrapper), | ||||
| 						       gdk_window_get_height (impl->wrapper)); | ||||
|  | ||||
|       cairo_surface_destroy (old); | ||||
|       cairo_surface_destroy (last_old); | ||||
|     } | ||||
|  | ||||
|   if (impl->ref_surface) | ||||
| @ -413,7 +270,6 @@ static cairo_surface_t * | ||||
| gdk_window_broadway_ref_cairo_surface (GdkWindow *window) | ||||
| { | ||||
|   GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); | ||||
|   cairo_t *cr; | ||||
|   int w, h; | ||||
|  | ||||
|   if (GDK_IS_WINDOW_IMPL_BROADWAY (window) && | ||||
| @ -425,22 +281,7 @@ gdk_window_broadway_ref_cairo_surface (GdkWindow *window) | ||||
|  | ||||
|   /* Create actual backing store if missing */ | ||||
|   if (!impl->surface) | ||||
|     { | ||||
|       impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h); | ||||
|       impl->last_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h); | ||||
|  | ||||
|       cr = cairo_create (impl->surface); | ||||
|       cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); | ||||
|       cairo_rectangle (cr, 0, 0, w, h); | ||||
|       cairo_fill (cr); | ||||
|       cairo_destroy (cr); | ||||
|  | ||||
|       cr = cairo_create (impl->last_surface); | ||||
|       cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); | ||||
|       cairo_rectangle (cr, 0, 0, w, h); | ||||
|       cairo_fill (cr); | ||||
|       cairo_destroy (cr); | ||||
|     } | ||||
|     impl->surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, w, h); | ||||
|  | ||||
|   /* Create a destroyable surface referencing the real one */ | ||||
|   if (!impl->ref_surface) | ||||
| @ -485,16 +326,13 @@ _gdk_broadway_window_destroy (GdkWindow *window, | ||||
|     { | ||||
|       cairo_surface_destroy (impl->surface); | ||||
|       impl->surface = NULL; | ||||
|       cairo_surface_destroy (impl->last_surface); | ||||
|       impl->last_surface = NULL; | ||||
|     } | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)); | ||||
|   g_hash_table_remove (broadway_display->id_ht, GINT_TO_POINTER(impl->id)); | ||||
|  | ||||
|   if (broadway_display->output) | ||||
|     broadway_output_destroy_surface (broadway_display->output, | ||||
| 				     impl->id); | ||||
|   _gdk_broadway_server_destroy_window (broadway_display->server, | ||||
| 				       impl->id); | ||||
| } | ||||
|  | ||||
| static cairo_surface_t * | ||||
| @ -546,11 +384,9 @@ gdk_window_broadway_show (GdkWindow *window, gboolean already_mapped) | ||||
|     _gdk_make_event (GDK_WINDOW (window), GDK_MAP, NULL, FALSE); | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)); | ||||
|   if (broadway_display->output) | ||||
|     { | ||||
|       broadway_output_show_surface (broadway_display->output, impl->id); | ||||
|       queue_dirty_flush (broadway_display); | ||||
|     } | ||||
|   if (_gdk_broadway_server_window_show (broadway_display->server, impl->id)) | ||||
|     queue_dirty_flush (broadway_display); | ||||
|  | ||||
| } | ||||
|  | ||||
| static void | ||||
| @ -569,17 +405,8 @@ gdk_window_broadway_hide (GdkWindow *window) | ||||
|     _gdk_make_event (GDK_WINDOW (window), GDK_UNMAP, NULL, FALSE); | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)); | ||||
|   if (broadway_display->output) | ||||
|     { | ||||
|       broadway_output_hide_surface (broadway_display->output, impl->id); | ||||
|       queue_dirty_flush (broadway_display); | ||||
|     } | ||||
|  | ||||
|   if (broadway_display->mouse_in_toplevel == window) | ||||
|     { | ||||
|       /* TODO: Send leave + enter event, update cursors, etc */ | ||||
|       broadway_display->mouse_in_toplevel = NULL; | ||||
|     } | ||||
|   if (_gdk_broadway_server_window_hide (broadway_display->server, impl->id)) | ||||
|     queue_dirty_flush (broadway_display); | ||||
|  | ||||
|   _gdk_window_clear_update_area (window); | ||||
| } | ||||
| @ -601,7 +428,6 @@ gdk_window_broadway_move_resize (GdkWindow *window, | ||||
|   GdkWindowImplBroadway *impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   gboolean changed, size_changed;; | ||||
|   gboolean with_resize; | ||||
|  | ||||
|   size_changed = changed = FALSE; | ||||
|  | ||||
| @ -613,10 +439,8 @@ gdk_window_broadway_move_resize (GdkWindow *window, | ||||
|       window->y = y; | ||||
|     } | ||||
|  | ||||
|   with_resize = FALSE; | ||||
|   if (width > 0 || height > 0) | ||||
|     { | ||||
|       with_resize = TRUE; | ||||
|       if (width < 1) | ||||
| 	width = 1; | ||||
|  | ||||
| @ -644,12 +468,11 @@ gdk_window_broadway_move_resize (GdkWindow *window, | ||||
|       GdkEvent *event; | ||||
|       GList *node; | ||||
|  | ||||
|       if (broadway_display->output != NULL) | ||||
|       if (_gdk_broadway_server_window_move_resize (broadway_display->server, | ||||
| 						   impl->id, | ||||
| 						   window->x, window->y, | ||||
| 						   window->width, window->height)) | ||||
| 	{ | ||||
| 	  broadway_output_move_resize_surface (broadway_display->output, | ||||
| 					       impl->id, | ||||
| 					       with_move, window->x, window->y, | ||||
| 					       with_resize, window->width, window->height); | ||||
| 	  queue_dirty_flush (broadway_display); | ||||
| 	  if (size_changed) | ||||
| 	    window->resize_count++; | ||||
| @ -787,11 +610,7 @@ gdk_broadway_window_set_transient_for (GdkWindow *window, | ||||
|   impl->transient_for = parent_id; | ||||
|  | ||||
|   display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (impl->wrapper)); | ||||
|   if (display->output) | ||||
|     { | ||||
|       broadway_output_set_transient_for (display->output, impl->id, impl->transient_for); | ||||
|       gdk_display_flush (GDK_DISPLAY (display)); | ||||
|     } | ||||
|   _gdk_broadway_server_window_set_transient_for (display->server, impl->id, impl->transient_for); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @ -1324,20 +1143,10 @@ moveresize_lookahead (GdkDisplay *display, | ||||
| 		      BroadwayInputMsg *event) | ||||
| { | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   BroadwayInputMsg *message; | ||||
|   GList *l; | ||||
|  | ||||
|   broadway_display = GDK_BROADWAY_DISPLAY (display); | ||||
|   for (l = broadway_display->input_messages; l != NULL; l = l->next) | ||||
|     { | ||||
|       message = l->data; | ||||
|       if (message->base.type == 'm') | ||||
| 	return FALSE; | ||||
|       if (message->base.type == 'b') | ||||
| 	return FALSE; | ||||
|     } | ||||
|  | ||||
|   return TRUE; | ||||
|   return !_gdk_broadway_server_lookahead_event (broadway_display->server, "mb"); | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| @ -1480,7 +1289,7 @@ 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) | ||||
|   if (!_gdk_broadway_server_has_client (broadway_display->server)) | ||||
|     return; | ||||
|  | ||||
|   mv_resize = get_move_resize_data (GDK_WINDOW_DISPLAY (window), TRUE); | ||||
| @ -1622,9 +1431,6 @@ _gdk_broadway_window_translate (GdkWindow      *window, | ||||
| { | ||||
|   GdkWindowImplBroadway *impl; | ||||
|   GdkBroadwayDisplay *broadway_display; | ||||
|   int n_rects, i; | ||||
|   BroadwayRect *rects; | ||||
|   cairo_rectangle_int_t rect; | ||||
|  | ||||
|   impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); | ||||
|  | ||||
| @ -1632,26 +1438,11 @@ _gdk_broadway_window_translate (GdkWindow      *window, | ||||
|     { | ||||
|       copy_region (impl->surface, area, dx, dy); | ||||
|       broadway_display = GDK_BROADWAY_DISPLAY (gdk_window_get_display (window)); | ||||
|       if (GDK_WINDOW_IMPL_BROADWAY (impl)->last_synced && | ||||
| 	  broadway_display->output) | ||||
| 	{ | ||||
| 	  copy_region (impl->last_surface, area, dx, dy); | ||||
| 	  n_rects = cairo_region_num_rectangles (area); | ||||
| 	  rects = g_new (BroadwayRect, n_rects); | ||||
| 	  for (i = 0; i < n_rects; i++) | ||||
| 	    { | ||||
| 	      cairo_region_get_rectangle (area, i, &rect); | ||||
| 	      rects[i].x = rect.x; | ||||
| 	      rects[i].y = rect.y; | ||||
| 	      rects[i].width = rect.width; | ||||
| 	      rects[i].height = rect.height; | ||||
| 	    } | ||||
| 	  broadway_output_copy_rectangles (broadway_display->output, | ||||
| 					   GDK_WINDOW_IMPL_BROADWAY (impl)->id, | ||||
| 					   rects, n_rects, dx, dy); | ||||
| 	  queue_dirty_flush (broadway_display); | ||||
| 	  g_free (rects); | ||||
| 	} | ||||
|  | ||||
|       if (_gdk_broadway_server_window_translate (broadway_display->server, | ||||
| 						 impl->id, | ||||
| 						 area, dx, dy)) | ||||
| 	queue_dirty_flush (broadway_display); | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1661,8 +1452,7 @@ gdk_broadway_get_last_seen_time (GdkWindow  *window) | ||||
|   GdkDisplay *display; | ||||
|  | ||||
|   display = gdk_window_get_display (window); | ||||
|   _gdk_broadway_display_consume_all_input (display); | ||||
|   return (guint32) GDK_BROADWAY_DISPLAY (display)->last_seen_time; | ||||
|   return _gdk_broadway_server_get_last_seen_time (GDK_BROADWAY_DISPLAY (display)->server); | ||||
| } | ||||
|  | ||||
| static void | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Alexander Larsson
					Alexander Larsson