Added a docked and windowed modes

This commit is contained in:
Pierre Pronchery 2012-05-11 10:11:56 +00:00
parent 1a9f0e935f
commit b83402a040
3 changed files with 122 additions and 40 deletions

View File

@ -37,7 +37,7 @@
struct _Keyboard
{
/* preferences */
int embedded;
KeyboardMode mode;
KeyboardLayout ** layouts;
size_t layouts_cnt;
@ -275,6 +275,12 @@ static GtkWidget * _keyboard_add_layout(Keyboard * keyboard,
/* public */
/* functions */
/* keyboard_new */
static void _new_mode(Keyboard * keyboard, KeyboardMode mode);
static void _new_mode_docked(Keyboard * keyboard);
static void _new_mode_embedded(Keyboard * keyboard);
static void _new_mode_popup(Keyboard * keyboard);
static void _new_mode_windowed(Keyboard * keyboard);
Keyboard * keyboard_new(KeyboardPrefs * prefs)
{
Keyboard * keyboard;
@ -289,7 +295,7 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs)
#endif
if((keyboard = malloc(sizeof(*keyboard))) == NULL)
return NULL;
keyboard->embedded = prefs->embedded;
keyboard->mode = prefs->mode;
keyboard->layouts = NULL;
keyboard->layouts_cnt = 0;
screen = gdk_screen_get_default();
@ -300,38 +306,7 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs)
else
gdk_screen_get_monitor_geometry(screen, 0, &keyboard->geometry);
/* window */
if(prefs->embedded != 0)
{
keyboard->window = gtk_plug_new(0);
keyboard->width = 0;
keyboard->height = 0;
keyboard->x = 0;
keyboard->y = 0;
g_signal_connect_swapped(G_OBJECT(keyboard->window), "embedded",
G_CALLBACK(on_keyboard_embedded), keyboard);
}
else
{
keyboard->window = gtk_window_new(GTK_WINDOW_POPUP);
gtk_container_set_border_width(GTK_CONTAINER(keyboard->window),
4);
gtk_window_set_accept_focus(GTK_WINDOW(keyboard->window),
FALSE);
gtk_window_set_focus_on_map(GTK_WINDOW(keyboard->window),
FALSE);
keyboard->width = keyboard->geometry.width;
keyboard->height = (keyboard->geometry.width / 11) * 3;
keyboard->x = keyboard->geometry.x;
keyboard->y = keyboard->geometry.y + keyboard->geometry.height
- keyboard->height;
gtk_window_move(GTK_WINDOW(keyboard->window), keyboard->x,
keyboard->y);
gtk_widget_set_size_request(keyboard->window, keyboard->width,
keyboard->height);
g_signal_connect_swapped(G_OBJECT(keyboard->window),
"delete-event",
G_CALLBACK(on_keyboard_delete_event), keyboard);
}
_new_mode(keyboard, prefs->mode);
gtk_widget_modify_bg(keyboard->window, GTK_STATE_NORMAL, &gray);
/* fonts */
if(prefs->font != NULL)
@ -358,7 +333,7 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs)
KLS_COUNT, KLS_SPECIAL)) != NULL)
gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(keyboard->window), vbox);
if(prefs->embedded == 0)
if(prefs->mode != KEYBOARD_MODE_EMBEDDED)
gtk_widget_show(keyboard->window);
else
{
@ -373,6 +348,96 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs)
return keyboard;
}
static void _new_mode(Keyboard * keyboard, KeyboardMode mode)
{
switch(mode)
{
case KEYBOARD_MODE_DOCKED:
_new_mode_docked(keyboard);
break;
case KEYBOARD_MODE_EMBEDDED:
_new_mode_embedded(keyboard);
break;
case KEYBOARD_MODE_POPUP:
_new_mode_popup(keyboard);
break;
case KEYBOARD_MODE_WINDOWED:
_new_mode_windowed(keyboard);
break;
}
}
static void _new_mode_docked(Keyboard * keyboard)
{
keyboard->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_container_set_border_width(GTK_CONTAINER(keyboard->window), 4);
gtk_window_set_accept_focus(GTK_WINDOW(keyboard->window), FALSE);
#if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_focus_on_map(GTK_WINDOW(keyboard->window), FALSE);
#endif
gtk_window_set_type_hint(GTK_WINDOW(keyboard->window),
GDK_WINDOW_TYPE_HINT_DOCK);
gtk_window_stick(GTK_WINDOW(keyboard->window));
keyboard->width = keyboard->geometry.width;
keyboard->height = (keyboard->geometry.width / 11) * 3;
keyboard->x = keyboard->geometry.x;
keyboard->y = keyboard->geometry.y + keyboard->geometry.height
- keyboard->height;
gtk_widget_set_size_request(keyboard->window, keyboard->width,
keyboard->height);
gtk_window_move(GTK_WINDOW(keyboard->window), keyboard->x, keyboard->y);
g_signal_connect_swapped(G_OBJECT(keyboard->window), "delete-event",
G_CALLBACK(on_keyboard_delete_event), keyboard);
}
static void _new_mode_embedded(Keyboard * keyboard)
{
keyboard->window = gtk_plug_new(0);
keyboard->width = 0;
keyboard->height = 0;
keyboard->x = 0;
keyboard->y = 0;
g_signal_connect_swapped(G_OBJECT(keyboard->window), "embedded",
G_CALLBACK(on_keyboard_embedded), keyboard);
}
static void _new_mode_popup(Keyboard * keyboard)
{
keyboard->window = gtk_window_new(GTK_WINDOW_POPUP);
gtk_container_set_border_width(GTK_CONTAINER(keyboard->window), 4);
gtk_window_set_accept_focus(GTK_WINDOW(keyboard->window), FALSE);
gtk_window_set_focus_on_map(GTK_WINDOW(keyboard->window), FALSE);
keyboard->width = keyboard->geometry.width;
keyboard->height = (keyboard->geometry.width / 11) * 3;
keyboard->x = keyboard->geometry.x;
keyboard->y = keyboard->geometry.y + keyboard->geometry.height
- keyboard->height;
gtk_window_move(GTK_WINDOW(keyboard->window), keyboard->x, keyboard->y);
gtk_widget_set_size_request(keyboard->window, keyboard->width,
keyboard->height);
g_signal_connect_swapped(G_OBJECT(keyboard->window), "delete-event",
G_CALLBACK(on_keyboard_delete_event), keyboard);
}
static void _new_mode_windowed(Keyboard * keyboard)
{
keyboard->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
keyboard->width = 0;
keyboard->height = 0;
keyboard->x = 0;
keyboard->y = 0;
gtk_container_set_border_width(GTK_CONTAINER(keyboard->window), 4);
gtk_window_set_accept_focus(GTK_WINDOW(keyboard->window), FALSE);
gtk_window_set_focus_on_map(GTK_WINDOW(keyboard->window), FALSE);
#if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(keyboard->window),
"input-keyboard");
#endif
gtk_window_set_title(GTK_WINDOW(keyboard->window), "Keyboard");
g_signal_connect_swapped(G_OBJECT(keyboard->window), "delete-event",
G_CALLBACK(on_keyboard_delete_event), keyboard);
}
/* keyboard_delete */
void keyboard_delete(Keyboard * keyboard)
@ -451,7 +516,7 @@ void keyboard_show(Keyboard * keyboard, gboolean show)
keyboard->x, keyboard->y);
#endif
}
else if(keyboard->embedded == 0)
else if(keyboard->mode != KEYBOARD_MODE_EMBEDDED)
gtk_widget_hide(keyboard->window);
}

View File

@ -27,11 +27,19 @@
/* types */
typedef struct _Keyboard Keyboard;
typedef enum _KeyboardMode
{
KEYBOARD_MODE_WINDOWED = 0,
KEYBOARD_MODE_DOCKED,
KEYBOARD_MODE_EMBEDDED,
KEYBOARD_MODE_POPUP
} KeyboardMode;
typedef struct _KeyboardPrefs
{
int monitor;
char const * font;
int embedded;
KeyboardMode mode;
} KeyboardPrefs;

View File

@ -28,7 +28,7 @@
/* usage */
static int _usage(void)
{
fputs("Usage: keyboard [-f font][-m monitor][-x]\n", stderr);
fputs("Usage: keyboard [-d|-p|-w|-x][-f font][-m monitor]\n", stderr);
return 1;
}
@ -45,9 +45,12 @@ int main(int argc, char * argv[])
memset(&prefs, 0, sizeof(prefs));
gtk_init(&argc, &argv);
while((o = getopt(argc, argv, "f:m:x")) != -1)
while((o = getopt(argc, argv, "df:m:pwx")) != -1)
switch(o)
{
case 'd':
prefs.mode = KEYBOARD_MODE_DOCKED;
break;
case 'f':
prefs.font = optarg;
break;
@ -56,8 +59,14 @@ int main(int argc, char * argv[])
if(optarg[0] == '\0' || *p != '\0')
return _usage();
break;
case 'p':
prefs.mode = KEYBOARD_MODE_POPUP;
break;
case 'w':
prefs.mode = KEYBOARD_MODE_WINDOWED;
break;
case 'x':
prefs.embedded = 1;
prefs.mode = KEYBOARD_MODE_EMBEDDED;
break;
default:
return _usage();