| Revision 23667 (by benny, 2006/11/04 16:16:51) |
2006-11-04 Benedikt Meurer <benny@xfce.org>
* configure.in.in: Post-release version bump.
* src/window.c: Add root warning. bug #2245.
* po/mousepad.pot, po/*.po: Merge new strings.
* po/de.po: Updated german translations.
|
/*
* keyevent.c
* This file is part of Leafpad
*
* Copyright (C) 2004 Tarot Osuji
*
* 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; either version 2 of the License, or
* (at your option) any later version.
*
* 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, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "keyevent.h"
#include "indent.h"
#include "undo.h"
static guint keyval = 0;
/* static gchar ctrl_key_flag = 0; */
static GdkWindow *gdkwin;
guint keyevent_getval(void)
{
GdkModifierType mask;
gchar flag = 0;
gdk_window_get_pointer(gdkwin, NULL, NULL, &mask);
if (mask &= GDK_CONTROL_MASK)
flag = 1;
return keyval + 0x10000 * flag;
}
void keyevent_setval(guint val)
{
keyval = val;
}
static gboolean check_preedit(GtkWidget *text_view)
{
gchar *str;
gtk_im_context_get_preedit_string(
GTK_TEXT_VIEW(text_view)->im_context, &str, NULL, NULL);
if (strlen(str)) {
g_free(str);
return TRUE;
}
g_free(str);
return FALSE;
}
static gboolean check_selection_bound(GtkTextBuffer *buffer)
{
GtkTextIter start_iter, end_iter;
gchar *str;
if (gtk_text_buffer_get_selection_bounds(buffer, &start_iter, &end_iter)) {
str = gtk_text_iter_get_text(&start_iter, &end_iter);
if (g_strrstr(str, "\n")) {
g_free(str);
return TRUE;
}
g_free(str);
}
return FALSE;
}
static gboolean cb_key_press_event(GtkWidget *text_view, GdkEventKey *event)
{
GtkTextBuffer *buffer =
gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
if (event->keyval)
keyval = event->keyval;
switch (event->keyval) {
case GDK_Return:
if (check_preedit(text_view))
return FALSE;
if ((indent_get_state() && !(event->state &= GDK_SHIFT_MASK)) ||
(!indent_get_state() && (event->state &= GDK_SHIFT_MASK))) {
indent_real(text_view);
return TRUE;
}
break;
case GDK_Tab:
if (event->state &= GDK_CONTROL_MASK) {
indent_toggle_tab_width(text_view);
return TRUE;
}
case GDK_ISO_Left_Tab:
if (event->state &= GDK_SHIFT_MASK) {
keyval = 0;
indent_multi_line_unindent(buffer);
} else if (!check_selection_bound(buffer))
break;
else {
keyval = 0;
indent_multi_line_indent(buffer);
}
return TRUE;
/* case GDK_Control_L:
case GDK_Control_R:
ctrl_key_flag = 1;
g_print(">>>>ctrl_key_flag = 1\n");
*/ }
return FALSE;
}
/*
static gboolean cb_key_release_event(GtkWidget *text_view, GdkEventKey *event)
{
switch (event->keyval) {
case GDK_Control_L:
case GDK_Control_R:
ctrl_key_flag = 0;
g_print("<<<<ctrl_key_flag = 0\n");
}
return FALSE;
}
*/
static gboolean cb_button_press_event(GtkWidget *text_view, GdkEventButton *event)
{
keyval =- event->button;
return FALSE;
}
void keyevent_init(GtkWidget *text_view)
{
gdkwin = gtk_text_view_get_window(GTK_TEXT_VIEW(text_view), GTK_TEXT_WINDOW_WIDGET);
g_signal_connect(G_OBJECT(text_view), "key-press-event",
G_CALLBACK(cb_key_press_event), NULL);
#if 0
g_signal_connect(G_OBJECT(text_view), "key-release-event",
G_CALLBACK(cb_key_release_event), NULL);
#endif
g_signal_connect(G_OBJECT(text_view), "button-press-event",
G_CALLBACK(cb_button_press_event), NULL);
}