eekboard: support fullscreen mode
This commit is contained in:
@ -231,6 +231,7 @@ static gchar *opt_toolkit = NULL;
|
|||||||
#endif
|
#endif
|
||||||
static gboolean opt_popup = FALSE;
|
static gboolean opt_popup = FALSE;
|
||||||
static gchar *opt_config = NULL;
|
static gchar *opt_config = NULL;
|
||||||
|
static gboolean opt_fullscreen = FALSE;
|
||||||
|
|
||||||
static const GOptionEntry options[] = {
|
static const GOptionEntry options[] = {
|
||||||
{"model", 'M', 0, G_OPTION_ARG_STRING, &opt_model,
|
{"model", 'M', 0, G_OPTION_ARG_STRING, &opt_model,
|
||||||
@ -251,6 +252,8 @@ static const GOptionEntry options[] = {
|
|||||||
#endif
|
#endif
|
||||||
{"popup", 'p', 0, G_OPTION_ARG_NONE, &opt_popup,
|
{"popup", 'p', 0, G_OPTION_ARG_NONE, &opt_popup,
|
||||||
N_("Start as a popup window")},
|
N_("Start as a popup window")},
|
||||||
|
{"fullscreen", 'f', 0, G_OPTION_ARG_NONE, &opt_fullscreen,
|
||||||
|
N_("Start in fullscreen mode")},
|
||||||
{"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config,
|
{"config", 'c', 0, G_OPTION_ARG_STRING, &opt_config,
|
||||||
N_("Specify configuration file")},
|
N_("Specify configuration file")},
|
||||||
{"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version,
|
{"version", 'v', 0, G_OPTION_ARG_NONE, &opt_version,
|
||||||
@ -303,18 +306,59 @@ on_quit_from_menu (GtkAction * action, GtkWidget *window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_location (Eekboard *eekboard,
|
make_fullscreen (Eekboard *eekboard)
|
||||||
Accessible *acc)
|
|
||||||
{
|
{
|
||||||
AccessibleComponent *component = Accessible_getComponent (acc);
|
AccessibleComponent *component = Accessible_getComponent (eekboard->acc);
|
||||||
|
long int x, y, width, height;
|
||||||
|
GdkScreen *screen;
|
||||||
|
gint monitor;
|
||||||
|
GdkRectangle rect;
|
||||||
|
|
||||||
|
screen = gdk_screen_get_default ();
|
||||||
|
if (eekboard->acc) {
|
||||||
|
AccessibleComponent_getExtents (component,
|
||||||
|
&x, &y, &width, &height,
|
||||||
|
SPI_COORD_TYPE_SCREEN);
|
||||||
|
monitor = gdk_screen_get_monitor_at_point (screen, x, y);
|
||||||
|
} else {
|
||||||
|
GdkWindow *root;
|
||||||
|
|
||||||
|
root = gtk_widget_get_root_window (GTK_WIDGET(eekboard->widget));
|
||||||
|
monitor = gdk_screen_get_monitor_at_window (screen, root);
|
||||||
|
}
|
||||||
|
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
|
||||||
|
|
||||||
|
gtk_window_move (GTK_WINDOW(eekboard->window),
|
||||||
|
rect.x,
|
||||||
|
rect.y + rect.height / 2);
|
||||||
|
gtk_window_resize (GTK_WINDOW(eekboard->window),
|
||||||
|
rect.width,
|
||||||
|
rect.height / 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
make_popup (Eekboard *eekboard)
|
||||||
|
{
|
||||||
|
AccessibleComponent *component = Accessible_getComponent (eekboard->acc);
|
||||||
long int x, y, width, height;
|
long int x, y, width, height;
|
||||||
|
|
||||||
AccessibleComponent_getExtents (component,
|
AccessibleComponent_getExtents (component,
|
||||||
&x, &y, &width, &height,
|
&x, &y, &width, &height,
|
||||||
SPI_COORD_TYPE_SCREEN);
|
SPI_COORD_TYPE_SCREEN);
|
||||||
|
|
||||||
gtk_window_move (GTK_WINDOW(eekboard->window), x, y + height);
|
gtk_window_move (GTK_WINDOW(eekboard->window), x, y + height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
eekboard_show (Eekboard *eekboard)
|
||||||
|
{
|
||||||
|
gtk_widget_show (eekboard->window);
|
||||||
|
if (opt_fullscreen)
|
||||||
|
make_fullscreen (eekboard);
|
||||||
|
else if (opt_popup)
|
||||||
|
make_popup (eekboard);
|
||||||
|
}
|
||||||
|
|
||||||
static SPIBoolean
|
static SPIBoolean
|
||||||
a11y_focus_listener (const AccessibleEvent *event,
|
a11y_focus_listener (const AccessibleEvent *event,
|
||||||
void *user_data)
|
void *user_data)
|
||||||
@ -338,21 +382,19 @@ a11y_focus_listener (const AccessibleEvent *event,
|
|||||||
case SPI_ROLE_PASSWORD_TEXT:
|
case SPI_ROLE_PASSWORD_TEXT:
|
||||||
case SPI_ROLE_TERMINAL:
|
case SPI_ROLE_TERMINAL:
|
||||||
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
|
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
|
||||||
set_location (eekboard, acc);
|
|
||||||
gtk_widget_show (eekboard->window);
|
|
||||||
eekboard->acc = acc;
|
eekboard->acc = acc;
|
||||||
|
eekboard_show (eekboard);
|
||||||
} else if (event->detail1 == 0 && acc == eekboard->acc) {
|
} else if (event->detail1 == 0 && acc == eekboard->acc) {
|
||||||
gtk_widget_hide (eekboard->window);
|
|
||||||
eekboard->acc = NULL;
|
eekboard->acc = NULL;
|
||||||
|
gtk_widget_hide (eekboard->window);
|
||||||
}
|
}
|
||||||
case SPI_ROLE_ENTRY:
|
case SPI_ROLE_ENTRY:
|
||||||
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
|
if (strncmp (event->type, "focus", 5) == 0 || event->detail1 == 1) {
|
||||||
set_location (eekboard, acc);
|
|
||||||
gtk_widget_show (eekboard->window);
|
|
||||||
eekboard->acc = acc;
|
eekboard->acc = acc;
|
||||||
|
eekboard_show (eekboard);
|
||||||
} else if (event->detail1 == 0 && acc == eekboard->acc) {
|
} else if (event->detail1 == 0 && acc == eekboard->acc) {
|
||||||
gtk_widget_hide (eekboard->window);
|
|
||||||
eekboard->acc = NULL;
|
eekboard->acc = NULL;
|
||||||
|
gtk_widget_hide (eekboard->window);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
|
|||||||
Reference in New Issue
Block a user