Added a docked and windowed modes
This commit is contained in:
parent
1a9f0e935f
commit
b83402a040
137
src/keyboard.c
137
src/keyboard.c
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
||||
|
|
15
src/main.c
15
src/main.c
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue
Block a user