📄 hotkey.c
字号:
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*
* 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 <X11/Xlib.h>
#include <X11/keysym.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include "edu_tsinghua_lumaqq_hotkey_HotkeyManager.h"
#include "hotkeys.h"
#include <string.h>
/*
gcc -O -Wall -DSWT_VERSION=3062 -DLINUX -DGTK -I/usr/java/j2sdk1.4.2_04/include -I/usr/java/j2sdk1.4.2_04/include/linux -fpic `pkg-config --cflags gtk+-2.0` -c hotkey.c
gcc -shared -fpic `pkg-config --libs-only-L gtk+-2.0` -lgtk-x11-2.0 -lgdk-x11-2.0 -lgdk_pixbuf-2.0 -lgdk_pixbuf_xlib-2.0 -o libhotkey.so hotkey.o
*/
static HotkeyEntry hotkeys[2] = {
{ 0, 0 },
{ 0, 0 }
};
static int num_hotkeys = 0;
static jmethodID key_pressed_method;
static JNIEnv* jEnv;
static jobject hotkey_manager;
/*
* if the event is a hotkey, return true
*/
jboolean real_event_filter(GdkXEvent *xevent) {
XKeyEvent *keyevent = (XKeyEvent*)xevent;
int i;
if (((XEvent*)xevent)->type != KeyPress)
return JNI_FALSE;
for (i = 0; i < num_hotkeys; i++) {
if (hotkeys[i].code == keyevent->keycode &&
hotkeys[i].mod == (keyevent->state & (Mod1Mask | ControlMask | ShiftMask | Mod4Mask))) {
(*jEnv)->CallVoidMethod(jEnv, hotkey_manager, key_pressed_method, hotkeys[i].code, hotkeys[i].mod);
return JNI_TRUE;
}
}
return JNI_FALSE;
}
/*
* event filter
*/
GdkFilterReturn event_filter(GdkXEvent *xevent, GdkEvent *event, gpointer user_data) {
if(real_event_filter(xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
}
/*
* initialize hotkey program
*/
JNIEXPORT void JNICALL Java_edu_tsinghua_lumaqq_hotkey_HotkeyManager_init(JNIEnv * env, jobject obj) {
jclass hotkey_manager_class;
GdkWindow* root;
// get callback method of hotkey manager
jEnv = env;
hotkey_manager = obj;
hotkey_manager_class = (*env)->GetObjectClass(env, obj);
key_pressed_method = (*env)->GetMethodID(env, hotkey_manager_class, "keyPressed", "(II)V");
// add event filter
root = gdk_get_default_root_window();
gdk_window_add_filter(root, event_filter, NULL);
}
/*
* free hotkey
*/
JNIEXPORT jboolean JNICALL Java_edu_tsinghua_lumaqq_hotkey_HotkeyManager_freeKey(JNIEnv * env, jobject obj, jint code, jint mod) {
Display* display;
Window root;
int i;
display = gdk_x11_get_default_xdisplay();
root = gdk_x11_get_default_root_xwindow();
XUngrabKey(display, code, mod, root);
XUngrabKey(display, code, mod | Mod2Mask, root);
XUngrabKey(display, code, mod | Mod5Mask, root);
XUngrabKey(display, code, mod | LockMask, root);
XUngrabKey(display, code, mod | Mod2Mask | LockMask, root);
XUngrabKey(display, code, mod | Mod5Mask | LockMask, root);
XUngrabKey(display, code, mod | Mod2Mask | Mod5Mask, root);
XUngrabKey(display, code, mod | Mod2Mask | Mod5Mask | LockMask, root);
for (i = 0; i < num_hotkeys; i++) {
if (hotkeys[i].code == code && hotkeys[i].mod == mod) {
hotkeys[i] = hotkeys[--num_hotkeys];
break;
}
}
return JNI_TRUE;
}
/*
* add hotkey
*/
JNIEXPORT jboolean JNICALL Java_edu_tsinghua_lumaqq_hotkey_HotkeyManager_grabKey(JNIEnv * env, jobject obj, jint code, jint mod) {
Display* display;
Window root;
display = gdk_x11_get_default_xdisplay();
root = gdk_x11_get_default_root_xwindow();
if (!code || !mod)
return JNI_FALSE;
gdk_error_trap_push();
XGrabKey(display, code, mod, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod2Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod5Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | LockMask, root, True,GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod2Mask | LockMask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod5Mask | LockMask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod2Mask | Mod5Mask, root, True, GrabModeAsync, GrabModeAsync);
XGrabKey(display, code, mod | Mod2Mask | Mod5Mask | LockMask, root, True, GrabModeAsync, GrabModeAsync);
gdk_flush();
if (gdk_error_trap_pop())
return JNI_FALSE;
hotkeys[num_hotkeys].code = code;
hotkeys[num_hotkeys].mod = mod;
num_hotkeys++;
return JNI_TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -