⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hotkey.c

📁 java写的qq代码实现qq的部分功能
💻 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 + -