forked from AuroraMiddleware/gtk
ddade66496
The broadway backend would move the focus from one window to another based on where the mouse was (i.e. 'focus-follows-mouse' approach). Handling the focus this wait didn't play well with widgets which rely on focus-in-event and focus-out-event, like the GtkEntry when using a completion popup window, see e.g: https://bugzilla.gnome.org/show_bug.cgi?id=708984 So instead, setup broadway to require a click in a window to move the focus (i.e. 'click-to-focus' approach): * The implicit GDK_FOCUS_CHANGE events that were generated upon reception of BROADWAY_EVENT_ENTER or BROADWAY_EVENT_LEAVE are removed. * The broadway daemon will now keep track of which is the focused window * Whenever the daemon detects an incoming BROADWAY_EVENT_BUTTON_PRESS, it will trigger the focused window switch, which sends a new BROADWAY_EVENT_FOCUS to the client, specifying which windows holds the focus. * Upon reception of a BROADWAY_EVENT_FOCUS, the client will generate a new GDK_FOCUS_CHANGE. * gdk_broadway_window_focus() was also implemented, which now requests the focus to the broadway server using a new BROADWAY_REQUEST_FOCUS_WINDOW. This is based on an initial patch from Aleksander Morgado <aleksander@lanedo.com>.
90 lines
4.5 KiB
C
90 lines
4.5 KiB
C
#ifndef __BROADWAY_SERVER__
|
|
#define __BROADWAY_SERVER__
|
|
|
|
#include "broadway-protocol.h"
|
|
#include <glib-object.h>
|
|
#include <cairo.h>
|
|
|
|
void broadway_events_got_input (BroadwayInputMsg *message,
|
|
gint32 client_id);
|
|
|
|
typedef struct _BroadwayServer BroadwayServer;
|
|
typedef struct _BroadwayServerClass BroadwayServerClass;
|
|
|
|
#define BROADWAY_TYPE_SERVER (broadway_server_get_type())
|
|
#define BROADWAY_SERVER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), BROADWAY_TYPE_SERVER, BroadwayServer))
|
|
#define BROADWAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
|
#define BROADWAY_IS_SERVER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), BROADWAY_TYPE_SERVER))
|
|
#define BROADWAY_IS_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), BROADWAY_TYPE_SERVER))
|
|
#define BROADWAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), BROADWAY_TYPE_SERVER, BroadwayServerClass))
|
|
|
|
|
|
BroadwayServer *broadway_server_new (char *address,
|
|
int port,
|
|
GError **error);
|
|
gboolean broadway_server_has_client (BroadwayServer *server);
|
|
void broadway_server_flush (BroadwayServer *server);
|
|
void broadway_server_sync (BroadwayServer *server);
|
|
void broadway_server_get_screen_size (BroadwayServer *server,
|
|
guint32 *width,
|
|
guint32 *height);
|
|
guint32 broadway_server_get_next_serial (BroadwayServer *server);
|
|
guint32 broadway_server_get_last_seen_time (BroadwayServer *server);
|
|
gboolean broadway_server_lookahead_event (BroadwayServer *server,
|
|
const char *types);
|
|
void broadway_server_query_mouse (BroadwayServer *server,
|
|
guint32 *toplevel,
|
|
gint32 *root_x,
|
|
gint32 *root_y,
|
|
guint32 *mask);
|
|
guint32 broadway_server_grab_pointer (BroadwayServer *server,
|
|
gint client_id,
|
|
gint id,
|
|
gboolean owner_events,
|
|
guint32 event_mask,
|
|
guint32 time_);
|
|
guint32 broadway_server_ungrab_pointer (BroadwayServer *server,
|
|
guint32 time_);
|
|
gint32 broadway_server_get_mouse_toplevel (BroadwayServer *server);
|
|
guint32 broadway_server_new_window (BroadwayServer *server,
|
|
int x,
|
|
int y,
|
|
int width,
|
|
int height,
|
|
gboolean is_temp);
|
|
void broadway_server_destroy_window (BroadwayServer *server,
|
|
gint id);
|
|
gboolean broadway_server_window_show (BroadwayServer *server,
|
|
gint id);
|
|
gboolean broadway_server_window_hide (BroadwayServer *server,
|
|
gint id);
|
|
void broadway_server_window_set_transient_for (BroadwayServer *server,
|
|
gint id,
|
|
gint parent);
|
|
gboolean broadway_server_window_translate (BroadwayServer *server,
|
|
gint id,
|
|
cairo_region_t *area,
|
|
gint dx,
|
|
gint dy);
|
|
cairo_surface_t * broadway_server_create_surface (int width,
|
|
int height);
|
|
void broadway_server_window_update (BroadwayServer *server,
|
|
gint id,
|
|
cairo_surface_t *surface);
|
|
gboolean broadway_server_window_move_resize (BroadwayServer *server,
|
|
gint id,
|
|
gboolean with_move,
|
|
int x,
|
|
int y,
|
|
int width,
|
|
int height);
|
|
void broadway_server_focus_window (BroadwayServer *server,
|
|
gint new_focused_window);
|
|
cairo_surface_t * broadway_server_open_surface (BroadwayServer *server,
|
|
guint32 id,
|
|
char *name,
|
|
int width,
|
|
int height);
|
|
|
|
#endif /* __BROADWAY_SERVER__ */
|