From 31f1dc7fea287b67a53c8120aa3b544d8ec22b9d Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 20 May 2012 12:29:56 +0000 Subject: [PATCH] Added menus to the windowed mode --- project.conf | 1 + src/Makefile | 4 +- src/callbacks.c | 20 ++++++++ src/callbacks.h | 6 ++- src/keyboard.c | 121 ++++++++++++++++++++++++++++++++++++++++------- src/keyboard.h | 1 + src/project.conf | 5 +- 7 files changed, 138 insertions(+), 20 deletions(-) diff --git a/project.conf b/project.conf index 77e88e5..f2fb86c 100644 --- a/project.conf +++ b/project.conf @@ -1,5 +1,6 @@ package=Keyboard version=0.2.0 + subdirs=data,include,src,tools config=h dist=COPYING,Makefile,config.h diff --git a/src/Makefile b/src/Makefile index be46b25..c61d35e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -30,7 +30,7 @@ keyboardctl_LDFLAGS = $(LDFLAGSF) $(LDFLAGS) `pkg-config --libs libDesktop` keyboardctl: $(keyboardctl_OBJS) $(CC) -o keyboardctl $(keyboardctl_OBJS) $(keyboardctl_LDFLAGS) -callbacks.o: callbacks.c +callbacks.o: callbacks.c callbacks.h $(CC) $(keyboard_CFLAGS) -c callbacks.c common.o: common.c @@ -39,7 +39,7 @@ common.o: common.c key.o: key.c key.h $(CC) $(keyboard_CFLAGS) -c key.c -keyboard.o: keyboard.c callbacks.h keyboard.h +keyboard.o: keyboard.c callbacks.h keyboard.h ../config.h $(CC) $(keyboard_CFLAGS) -c keyboard.c layout.o: layout.c layout.h diff --git a/src/callbacks.c b/src/callbacks.c index 313f7e6..865f05d 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -87,3 +87,23 @@ void on_keyboard_set_layout_special(gpointer data) keyboard_set_layout(keyboard, 2); /* XXX hard-coded */ } + + +/* menus */ +/* on_file_close */ +void on_file_close(gpointer data) +{ + Keyboard * keyboard = data; + + keyboard_show(keyboard, FALSE); + gtk_main_quit(); +} + + +/* on_help_about */ +void on_help_about(gpointer data) +{ + Keyboard * keyboard = data; + + keyboard_show_about(keyboard); +} diff --git a/src/callbacks.h b/src/callbacks.h index d72231e..fbfa45e 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2010 Pierre Pronchery */ +/* Copyright (c) 2010-2012 Pierre Pronchery */ /* This file is part of DeforaOS Desktop Keyboard */ /* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,4 +33,8 @@ void on_keyboard_set_layout_keypad(gpointer data); void on_keyboard_set_layout_letters(gpointer data); void on_keyboard_set_layout_special(gpointer data); +/* menus */ +void on_file_close(gpointer data); +void on_help_about(gpointer data); + #endif /* !KEYBOARD_CALLBACKS_H */ diff --git a/src/keyboard.c b/src/keyboard.c index 19d6f45..087d825 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -1,18 +1,21 @@ /* $Id$ */ -/* Copyright (c) 2011 Pierre Pronchery */ +static char const _copyright[] = +"Copyright (c) 2011-2012 Pierre Pronchery "; /* This file is part of DeforaOS Desktop Keyboard */ -/* This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 3 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . */ +static char const _license[] = +"This program is free software: you can redistribute it and/or modify\n" +"it under the terms of the GNU General Public License as published by\n" +"the Free Software Foundation, version 3 of the License.\n" +"\n" +"This program is distributed in the hope that it will be useful,\n" +"but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +"GNU General Public License for more details.\n" +"\n" +"You should have received a copy of the GNU General Public License\n" +"along with this program. If not, see ."; /* TODO: + * - display "likely" keys (after modifiers) as well * - see if XKB could be used to define the keyboard */ @@ -21,6 +24,7 @@ #include #include #include +#include #include #define XK_LATIN1 #define XK_MISCELLANY @@ -29,6 +33,7 @@ #include "callbacks.h" #include "layout.h" #include "keyboard.h" +#include "../config.h" /* Keyboard */ @@ -44,6 +49,7 @@ struct _Keyboard PangoFontDescription * font; GtkWidget * window; + GtkWidget * ab_window; GdkRectangle geometry; int width; int height; @@ -76,6 +82,38 @@ typedef struct _KeyboardLayoutDefinition } KeyboardLayoutDefinition; +/* constants */ +static char const * _authors[] = +{ + "Pierre Pronchery ", + NULL +}; + +static const DesktopMenu _keyboard_menu_file[] = +{ + { "_Close", G_CALLBACK(on_file_close), GTK_STOCK_CLOSE, + GDK_CONTROL_MASK, GDK_KEY_W }, + { NULL, NULL, NULL, 0, 0 } +}; + +static const DesktopMenu _keyboard_menu_help[] = +{ +#if GTK_CHECK_VERSION(2, 6, 0) + { "_About", G_CALLBACK(on_help_about), GTK_STOCK_ABOUT, 0, 0 }, +#else + { "_About", G_CALLBACK(on_help_about), NULL, 0, 0 }, +#endif + { NULL, NULL, NULL, 0, 0 } +}; + +static const DesktopMenubar _keyboard_menubar[] = +{ + { "_File", _keyboard_menu_file }, + { "_Help", _keyboard_menu_help }, + { NULL, NULL } +}; + + /* variables */ static KeyboardKeyDefinition const _keyboard_layout_letters[] = { @@ -284,6 +322,7 @@ static void _new_mode_windowed(Keyboard * keyboard); Keyboard * keyboard_new(KeyboardPrefs * prefs) { Keyboard * keyboard; + GtkAccelGroup * group; GdkScreen * screen; GtkWidget * vbox; GtkWidget * widget; @@ -305,9 +344,10 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs) &keyboard->geometry); else gdk_screen_get_monitor_geometry(screen, 0, &keyboard->geometry); - /* window */ + /* windows */ _new_mode(keyboard, prefs->mode); gtk_widget_modify_bg(keyboard->window, GTK_STATE_NORMAL, &gray); + keyboard->ab_window = NULL; /* fonts */ if(prefs->font != NULL) keyboard->font = pango_font_description_from_string( @@ -320,9 +360,18 @@ Keyboard * keyboard_new(KeyboardPrefs * prefs) } bold = pango_font_description_new(); pango_font_description_set_weight(bold, PANGO_WEIGHT_BOLD); + vbox = gtk_vbox_new(FALSE, 4); + /* menubar */ + if(prefs->mode == KEYBOARD_MODE_WINDOWED) + { + group = gtk_accel_group_new(); + gtk_window_add_accel_group(GTK_WINDOW(keyboard->window), group); + widget = desktop_menubar_create(_keyboard_menubar, keyboard, + group); + gtk_widget_show_all(widget); + gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, FALSE, 0); + } /* layouts */ - vbox = gtk_vbox_new(TRUE, 4); - gtk_widget_show(vbox); if((widget = _keyboard_add_layout(keyboard, _keyboard_layout, KLS_COUNT, KLS_LETTERS)) != NULL) gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); @@ -333,6 +382,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); + gtk_widget_show(vbox); if(prefs->mode != KEYBOARD_MODE_EMBEDDED) gtk_widget_show(keyboard->window); else @@ -426,7 +476,6 @@ static void _new_mode_windowed(Keyboard * keyboard) 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) @@ -521,6 +570,46 @@ void keyboard_show(Keyboard * keyboard, gboolean show) } +/* keyboard_show_about */ +/* callbacks */ +static gboolean _about_on_closex(gpointer data); + +void keyboard_show_about(Keyboard * keyboard) +{ + if(keyboard->ab_window != NULL) + { + gtk_window_present(GTK_WINDOW(keyboard->ab_window)); + return; + } + keyboard->ab_window = desktop_about_dialog_new(); + gtk_window_set_transient_for(GTK_WINDOW(keyboard->ab_window), + GTK_WINDOW(keyboard->window)); + desktop_about_dialog_set_authors(keyboard->ab_window, _authors); + desktop_about_dialog_set_comments(keyboard->ab_window, + "Virtual keyboard for the DeforaOS desktop"); + desktop_about_dialog_set_copyright(keyboard->ab_window, _copyright); + desktop_about_dialog_set_logo_icon_name(keyboard->ab_window, + "input-keyboard"); + desktop_about_dialog_set_license(keyboard->ab_window, _license); + desktop_about_dialog_set_name(keyboard->ab_window, PACKAGE); + desktop_about_dialog_set_version(keyboard->ab_window, VERSION); + desktop_about_dialog_set_website(keyboard->ab_window, + "http://www.defora.org/"); + g_signal_connect_swapped(keyboard->ab_window, "delete-event", + G_CALLBACK(_about_on_closex), keyboard); + gtk_widget_show(keyboard->ab_window); +} + +/* callbacks */ +static gboolean _about_on_closex(gpointer data) +{ + Keyboard * keyboard = data; + + gtk_widget_hide(keyboard->ab_window); + return TRUE; +} + + /* private */ /* keyboard_add_layout */ static void _layout_clicked(GtkWidget * widget, gpointer data); diff --git a/src/keyboard.h b/src/keyboard.h index 700d682..c339ee9 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -54,6 +54,7 @@ void keyboard_set_page(Keyboard * keyboard, KeyboardPage page); /* useful */ void keyboard_show(Keyboard * keyboard, gboolean show); +void keyboard_show_about(Keyboard * keyboard); void keyboard_key_show(Keyboard * keyboard, KeyboardKey * key, gboolean show, GdkEventButton * event); diff --git a/src/project.conf b/src/project.conf index 3a51d93..d1478b5 100644 --- a/src/project.conf +++ b/src/project.conf @@ -12,11 +12,14 @@ sources=callbacks.c,common.c,key.c,keyboard.c,layout.c,main.c ldflags=-lXtst install=$(BINDIR) +[callbacks.c] +depends=callbacks.h + [key.c] depends=key.h [keyboard.c] -depends=callbacks.h,keyboard.h +depends=callbacks.h,keyboard.h,../config.h [layout.c] depends=layout.h