Mercurial > audlegacy-plugins
comparison src/hotkey/plugin.c @ 2336:ad45d65e9ae7
Hotkey Plugin: Complete GUI rework. Ability to use more than one binding for the same action.
| author | Sascha Hlusiak <contact@saschahlusiak.de> |
|---|---|
| date | Wed, 23 Jan 2008 19:37:05 +0100 |
| parents | 0be42d832217 |
| children | 7b284f323ad8 |
comparison
equal
deleted
inserted
replaced
| 2335:6b9d5a8b509e | 2336:ad45d65e9ae7 |
|---|---|
| 92 | 92 |
| 93 loaded = TRUE; | 93 loaded = TRUE; |
| 94 } | 94 } |
| 95 | 95 |
| 96 /* handle keys */ | 96 /* handle keys */ |
| 97 gboolean handle_keyevent (int keycode, int state, int type) | 97 gboolean handle_keyevent (EVENT event) |
| 98 { | 98 { |
| 99 gint current_volume, old_volume; | 99 gint current_volume, old_volume; |
| 100 static gint volume_static = 0; | 100 static gint volume_static = 0; |
| 101 gboolean play, mute; | 101 gboolean play, mute; |
| 102 | 102 |
| 114 /* volume is mute */ | 114 /* volume is mute */ |
| 115 mute = TRUE; | 115 mute = TRUE; |
| 116 } | 116 } |
| 117 | 117 |
| 118 /* mute the playback */ | 118 /* mute the playback */ |
| 119 if ((keycode == plugin_cfg.mute.key) && (state == plugin_cfg.mute.mask) && (type == plugin_cfg.mute.type)) | 119 if (event == EVENT_MUTE) |
| 120 { | 120 { |
| 121 if (!mute) | 121 if (!mute) |
| 122 { | 122 { |
| 123 volume_static = current_volume; | 123 volume_static = current_volume; |
| 124 audacious_drct_set_main_volume (0); | 124 audacious_drct_set_main_volume (0); |
| 129 } | 129 } |
| 130 return TRUE; | 130 return TRUE; |
| 131 } | 131 } |
| 132 | 132 |
| 133 /* decreace volume */ | 133 /* decreace volume */ |
| 134 if ((keycode == plugin_cfg.vol_down.key) && (state == plugin_cfg.vol_down.mask) && (type == plugin_cfg.vol_down.type)) | 134 if (event == EVENT_VOL_DOWN) |
| 135 { | 135 { |
| 136 if (mute) | 136 if (mute) |
| 137 { | 137 { |
| 138 current_volume = old_volume; | 138 current_volume = old_volume; |
| 139 old_volume = 0; | 139 old_volume = 0; |
| 153 old_volume = current_volume; | 153 old_volume = current_volume; |
| 154 return TRUE; | 154 return TRUE; |
| 155 } | 155 } |
| 156 | 156 |
| 157 /* increase volume */ | 157 /* increase volume */ |
| 158 if ((keycode == plugin_cfg.vol_up.key) && (state == plugin_cfg.vol_up.mask) && (type == plugin_cfg.vol_up.type)) | 158 if (event == EVENT_VOL_UP) |
| 159 { | 159 { |
| 160 if (mute) | 160 if (mute) |
| 161 { | 161 { |
| 162 current_volume = old_volume; | 162 current_volume = old_volume; |
| 163 old_volume = 0; | 163 old_volume = 0; |
| 177 old_volume = current_volume; | 177 old_volume = current_volume; |
| 178 return TRUE; | 178 return TRUE; |
| 179 } | 179 } |
| 180 | 180 |
| 181 /* play */ | 181 /* play */ |
| 182 if ((keycode == plugin_cfg.play.key) && (state == plugin_cfg.play.mask) && (type == plugin_cfg.play.type)) | 182 if (event == EVENT_PLAY) |
| 183 { | 183 { |
| 184 audacious_drct_play (); | 184 audacious_drct_play (); |
| 185 return TRUE; | 185 return TRUE; |
| 186 } | 186 } |
| 187 | 187 |
| 188 /* pause */ | 188 /* pause */ |
| 189 if ((keycode == plugin_cfg.pause.key) && (state == plugin_cfg.pause.mask) && (type == plugin_cfg.pause.type)) | 189 if (event == EVENT_PAUSE) |
| 190 { | 190 { |
| 191 if (!play) audacious_drct_play (); | 191 if (!play) audacious_drct_play (); |
| 192 else audacious_drct_pause (); | 192 else audacious_drct_pause (); |
| 193 | 193 |
| 194 return TRUE; | 194 return TRUE; |
| 195 } | 195 } |
| 196 | 196 |
| 197 /* stop */ | 197 /* stop */ |
| 198 if ((keycode == plugin_cfg.stop.key) && (state == plugin_cfg.stop.mask) && (type == plugin_cfg.stop.type)) | 198 if (event == EVENT_STOP) |
| 199 { | 199 { |
| 200 audacious_drct_stop (); | 200 audacious_drct_stop (); |
| 201 return TRUE; | 201 return TRUE; |
| 202 } | 202 } |
| 203 | 203 |
| 204 /* prev track */ | 204 /* prev track */ |
| 205 if ((keycode == plugin_cfg.prev_track.key) && (state == plugin_cfg.prev_track.mask) && (type == plugin_cfg.prev_track.type)) | 205 if (event == EVENT_PREV_TRACK) |
| 206 { | 206 { |
| 207 audacious_drct_playlist_prev (); | 207 audacious_drct_playlist_prev (); |
| 208 return TRUE; | 208 return TRUE; |
| 209 } | 209 } |
| 210 | 210 |
| 211 /* next track */ | 211 /* next track */ |
| 212 if ((keycode == plugin_cfg.next_track.key) && (state == plugin_cfg.next_track.mask) && (type == plugin_cfg.next_track.type)) | 212 if (event == EVENT_NEXT_TRACK) |
| 213 { | 213 { |
| 214 audacious_drct_playlist_next (); | 214 audacious_drct_playlist_next (); |
| 215 return TRUE; | 215 return TRUE; |
| 216 } | 216 } |
| 217 | 217 |
| 218 /* forward */ | 218 /* forward */ |
| 219 if ((keycode == plugin_cfg.forward.key) && (state == plugin_cfg.forward.mask) && (type == plugin_cfg.forward.type)) | 219 if (event == EVENT_FORWARD) |
| 220 { | 220 { |
| 221 gint time = audacious_drct_get_output_time(); | 221 gint time = audacious_drct_get_output_time(); |
| 222 time += 5000; /* Jump 5s into future */ | 222 time += 5000; /* Jump 5s into future */ |
| 223 audacious_drct_jump_to_time(time); | 223 audacious_drct_jump_to_time(time); |
| 224 return TRUE; | 224 return TRUE; |
| 225 } | 225 } |
| 226 | 226 |
| 227 /* backward */ | 227 /* backward */ |
| 228 if ((keycode == plugin_cfg.backward.key) && (state == plugin_cfg.backward.mask) && (type == plugin_cfg.backward.type)) | 228 if (event == EVENT_BACKWARD) |
| 229 { | 229 { |
| 230 gint time = audacious_drct_get_output_time(); | 230 gint time = audacious_drct_get_output_time(); |
| 231 if (time > 5000) time -= 5000; /* Jump 5s back */ | 231 if (time > 5000) time -= 5000; /* Jump 5s back */ |
| 232 else time = 0; | 232 else time = 0; |
| 233 audacious_drct_jump_to_time(time); | 233 audacious_drct_jump_to_time(time); |
| 234 return TRUE; | 234 return TRUE; |
| 235 } | 235 } |
| 236 | 236 |
| 237 /* Open Jump-To-File dialog */ | 237 /* Open Jump-To-File dialog */ |
| 238 if ((keycode == plugin_cfg.jump_to_file.key) && (state == plugin_cfg.jump_to_file.mask) && (type == plugin_cfg.jump_to_file.type)) | 238 if (event == EVENT_JUMP_TO_FILE) |
| 239 { | 239 { |
| 240 audacious_drct_show_jtf_box(); | 240 audacious_drct_show_jtf_box(); |
| 241 return TRUE; | 241 return TRUE; |
| 242 } | 242 } |
| 243 | 243 |
| 244 /* Toggle Windows */ | 244 /* Toggle Windows */ |
| 245 if ((keycode == plugin_cfg.toggle_win.key) && (state == plugin_cfg.toggle_win.mask) && (type == plugin_cfg.toggle_win.type)) | 245 if (event == EVENT_TOGGLE_WIN) |
| 246 { | 246 { |
| 247 static gboolean is_main, is_eq, is_pl; | 247 static gboolean is_main, is_eq, is_pl; |
| 248 is_main = audacious_drct_main_win_is_visible(); | 248 is_main = audacious_drct_main_win_is_visible(); |
| 249 if (is_main) { /* Hide windows */ | 249 if (is_main) { /* Hide windows */ |
| 250 is_pl = audacious_drct_pl_win_is_visible(); | 250 is_pl = audacious_drct_pl_win_is_visible(); |
| 260 } | 260 } |
| 261 return TRUE; | 261 return TRUE; |
| 262 } | 262 } |
| 263 | 263 |
| 264 /* Show OSD through AOSD plugin*/ | 264 /* Show OSD through AOSD plugin*/ |
| 265 if ((keycode == plugin_cfg.show_aosd.key) && (state == plugin_cfg.show_aosd.mask) && (type == plugin_cfg.show_aosd.type)) | 265 if (event == EVENT_SHOW_AOSD) |
| 266 { | 266 { |
| 267 aud_hook_call("aosd toggle", NULL); | 267 aud_hook_call("aosd toggle", NULL); |
| 268 return TRUE; | 268 return TRUE; |
| 269 } | 269 } |
| 270 | 270 |
| 271 return FALSE; | 271 return FALSE; |
| 272 } | |
| 273 | |
| 274 void add_hotkey(HotkeyConfiguration** pphotkey, KeySym keysym, gint mask, gint type, EVENT event) | |
| 275 { | |
| 276 KeyCode keycode; | |
| 277 HotkeyConfiguration *photkey; | |
| 278 if (keysym == 0) return; | |
| 279 if (pphotkey == NULL) return; | |
| 280 photkey = *pphotkey; | |
| 281 if (photkey == NULL) return; | |
| 282 keycode = XKeysymToKeycode(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), keysym); | |
| 283 if (keycode == 0) return; | |
| 284 if (photkey->key) { | |
| 285 photkey->next = (HotkeyConfiguration*) | |
| 286 malloc(sizeof (HotkeyConfiguration)); | |
| 287 photkey = photkey->next; | |
| 288 *pphotkey = photkey; | |
| 289 photkey->next = NULL; | |
| 290 } | |
| 291 photkey->key = (gint)keycode; | |
| 292 photkey->mask = mask; | |
| 293 photkey->event = event; | |
| 294 photkey->type = type; | |
| 295 } | |
| 296 | |
| 297 void load_defaults (void) | |
| 298 { | |
| 299 HotkeyConfiguration* hotkey; | |
| 300 | |
| 301 hotkey = &(plugin_cfg.first); | |
| 302 | |
| 303 add_hotkey(&hotkey, XF86XK_AudioPrev, 0, TYPE_KEY, EVENT_PREV_TRACK); | |
| 304 add_hotkey(&hotkey, XF86XK_AudioPlay, 0, TYPE_KEY, EVENT_PLAY); | |
| 305 add_hotkey(&hotkey, XF86XK_AudioPause, 0, TYPE_KEY, EVENT_PAUSE); | |
| 306 add_hotkey(&hotkey, XF86XK_AudioStop, 0, TYPE_KEY, EVENT_STOP); | |
| 307 add_hotkey(&hotkey, XF86XK_AudioNext, 0, TYPE_KEY, EVENT_NEXT_TRACK); | |
| 308 | |
| 309 /* add_hotkey(&hotkey, XF86XK_AudioRewind, 0, TYPE_KEY, EVENT_BACKWARD); */ | |
| 310 | |
| 311 add_hotkey(&hotkey, XF86XK_AudioMute, 0, TYPE_KEY, EVENT_MUTE); | |
| 312 add_hotkey(&hotkey, XF86XK_AudioRaiseVolume, 0, TYPE_KEY, EVENT_VOL_UP); | |
| 313 add_hotkey(&hotkey, XF86XK_AudioLowerVolume, 0, TYPE_KEY, EVENT_VOL_DOWN); | |
| 314 | |
| 315 /* add_hotkey(&hotkey, XF86XK_AudioMedia, 0, TYPE_KEY, EVENT_JUMP_TO_FILE); | |
| 316 add_hotkey(&hotkey, XF86XK_Music, 0, TYPE_KEY, EVENT_TOGGLE_WIN); */ | |
| 272 } | 317 } |
| 273 | 318 |
| 274 /* load plugin configuration */ | 319 /* load plugin configuration */ |
| 275 void load_config (void) | 320 void load_config (void) |
| 276 { | 321 { |
| 277 ConfigDb *cfdb; | 322 ConfigDb *cfdb; |
| 323 HotkeyConfiguration *hotkey; | |
| 324 int i,max; | |
| 278 | 325 |
| 279 /* default volume level */ | 326 /* default volume level */ |
| 280 plugin_cfg.vol_increment = 4; | 327 plugin_cfg.vol_increment = 4; |
| 281 plugin_cfg.vol_decrement = 4; | 328 plugin_cfg.vol_decrement = 4; |
| 282 | 329 |
| 283 #define load_key(hotkey,default) \ | |
| 284 plugin_cfg.hotkey.key = (default)?(XKeysymToKeycode(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), (default))):0; \ | |
| 285 plugin_cfg.hotkey.mask = 0; \ | |
| 286 plugin_cfg.hotkey.type = TYPE_KEY; \ | |
| 287 aud_cfg_db_get_int (cfdb, "globalHotkey", #hotkey, &plugin_cfg.hotkey.key); \ | |
| 288 aud_cfg_db_get_int (cfdb, "globalHotkey", #hotkey "_mask", &plugin_cfg.hotkey.mask); \ | |
| 289 aud_cfg_db_get_int (cfdb, "globalHotkey", #hotkey "_type", &plugin_cfg.hotkey.type); | |
| 290 | |
| 291 | |
| 292 /* open configuration database */ | 330 /* open configuration database */ |
| 293 cfdb = aud_cfg_db_open ( ); | 331 cfdb = aud_cfg_db_open ( ); |
| 294 | 332 hotkey = &(plugin_cfg.first); |
| 295 load_key(mute, XF86XK_AudioMute); | 333 hotkey->next = NULL; |
| 296 load_key(vol_down, XF86XK_AudioLowerVolume); | 334 hotkey->key = 0; |
| 297 load_key(vol_up, XF86XK_AudioRaiseVolume); | 335 hotkey->mask = 0; |
| 298 load_key(play, XF86XK_AudioPlay); | 336 hotkey->event = 0; |
| 299 load_key(pause, XF86XK_AudioPause); | 337 hotkey->type = TYPE_KEY; |
| 300 load_key(stop, XF86XK_AudioStop); | 338 max = 0; |
| 301 load_key(prev_track, XF86XK_AudioPrev); | 339 aud_cfg_db_get_int (cfdb, "globalHotkey", "NumHotkeys", &max); |
| 302 load_key(next_track, XF86XK_AudioNext); | 340 if (max == 0) |
| 303 load_key(jump_to_file, XF86XK_AudioMedia); | 341 load_defaults(); |
| 304 load_key(toggle_win, 0); | 342 else for (i=0; i<max; i++) |
| 305 load_key(forward, 0); | 343 { |
| 306 load_key(backward, XF86XK_AudioRewind); | 344 gchar *text = NULL; |
| 307 load_key(show_aosd, 0); | 345 gint value; |
| 346 if (hotkey->key) { | |
| 347 hotkey->next = (HotkeyConfiguration*) | |
| 348 malloc(sizeof (HotkeyConfiguration)); | |
| 349 hotkey = hotkey->next; | |
| 350 hotkey->next = NULL; | |
| 351 hotkey->key = 0; | |
| 352 hotkey->mask = 0; | |
| 353 hotkey->event = 0; | |
| 354 hotkey->type = TYPE_KEY; | |
| 355 } | |
| 356 text = g_strdup_printf("Hotkey_%d_key", i); | |
| 357 aud_cfg_db_get_int (cfdb, "globalHotkey", text, &(hotkey->key)); | |
| 358 g_free(text); | |
| 359 | |
| 360 text = g_strdup_printf("Hotkey_%d_mask", i); | |
| 361 aud_cfg_db_get_int (cfdb, "globalHotkey", text, &(hotkey->mask)); | |
| 362 g_free(text); | |
| 363 | |
| 364 text = g_strdup_printf("Hotkey_%d_type", i); | |
| 365 aud_cfg_db_get_int (cfdb, "globalHotkey", text, &(hotkey->type)); | |
| 366 g_free(text); | |
| 367 | |
| 368 text = g_strdup_printf("Hotkey_%d_event", i); | |
| 369 value = (gint)hotkey->event; | |
| 370 aud_cfg_db_get_int (cfdb, "globalHotkey", text, &value); | |
| 371 hotkey->event = (EVENT) value; | |
| 372 g_free(text); | |
| 373 } | |
| 308 | 374 |
| 309 aud_cfg_db_close (cfdb); | 375 aud_cfg_db_close (cfdb); |
| 310 } | 376 } |
| 311 | 377 |
| 312 /* save plugin configuration */ | 378 /* save plugin configuration */ |
| 313 void save_config (void) | 379 void save_config (void) |
| 314 { | 380 { |
| 315 ConfigDb *cfdb; | 381 ConfigDb *cfdb; |
| 316 | 382 int max; |
| 317 #define save_key(hotkey) \ | 383 HotkeyConfiguration *hotkey; |
| 318 aud_cfg_db_set_int (cfdb, "globalHotkey", #hotkey, plugin_cfg.hotkey.key); \ | 384 |
| 319 aud_cfg_db_set_int (cfdb, "globalHotkey", #hotkey "_mask", plugin_cfg.hotkey.mask); \ | |
| 320 aud_cfg_db_set_int (cfdb, "globalHotkey", #hotkey "_type", plugin_cfg.hotkey.type); | |
| 321 | |
| 322 /* open configuration database */ | 385 /* open configuration database */ |
| 323 cfdb = aud_cfg_db_open ( ); | 386 cfdb = aud_cfg_db_open ( ); |
| 324 | 387 hotkey = &(plugin_cfg.first); |
| 325 save_key(mute); | 388 max = 0; |
| 326 save_key(vol_up); | 389 while (hotkey) { |
| 327 save_key(vol_down); | 390 gchar *text = NULL; |
| 328 save_key(play); | 391 if (hotkey->key) { |
| 329 save_key(pause); | 392 text = g_strdup_printf("Hotkey_%d_key", max); |
| 330 save_key(stop); | 393 aud_cfg_db_set_int (cfdb, "globalHotkey", text, hotkey->key); |
| 331 save_key(prev_track); | 394 g_free(text); |
| 332 save_key(next_track); | 395 |
| 333 save_key(jump_to_file); | 396 text = g_strdup_printf("Hotkey_%d_mask", max); |
| 334 save_key(forward); | 397 aud_cfg_db_set_int (cfdb, "globalHotkey", text, hotkey->mask); |
| 335 save_key(backward); | 398 g_free(text); |
| 336 save_key(toggle_win); | 399 |
| 337 save_key(show_aosd); | 400 text = g_strdup_printf("Hotkey_%d_type", max); |
| 401 aud_cfg_db_set_int (cfdb, "globalHotkey", text, hotkey->type); | |
| 402 g_free(text); | |
| 403 | |
| 404 text = g_strdup_printf("Hotkey_%d_event", max); | |
| 405 aud_cfg_db_set_int (cfdb, "globalHotkey", text, hotkey->event); | |
| 406 g_free(text); | |
| 407 max++; | |
| 408 } | |
| 409 | |
| 410 hotkey = hotkey->next; | |
| 411 } | |
| 412 aud_cfg_db_set_int (cfdb, "globalHotkey", "NumHotkeys", max); | |
| 338 | 413 |
| 339 aud_cfg_db_close (cfdb); | 414 aud_cfg_db_close (cfdb); |
| 340 } | 415 } |
| 341 | 416 |
| 342 static void cleanup (void) | 417 static void cleanup (void) |
| 343 { | 418 { |
| 419 HotkeyConfiguration* hotkey; | |
| 344 if (!loaded) return; | 420 if (!loaded) return; |
| 345 ungrab_keys (); | 421 ungrab_keys (); |
| 346 release_filter(); | 422 release_filter(); |
| 423 hotkey = &(plugin_cfg.first); | |
| 424 hotkey = hotkey->next; | |
| 425 while (hotkey) | |
| 426 { | |
| 427 HotkeyConfiguration * old; | |
| 428 old = hotkey; | |
| 429 hotkey = hotkey->next; | |
| 430 free(old); | |
| 431 } | |
| 432 plugin_cfg.first.next = NULL; | |
| 433 plugin_cfg.first.key = 0; | |
| 434 plugin_cfg.first.event = 0; | |
| 435 plugin_cfg.first.mask = 0; | |
| 347 loaded = FALSE; | 436 loaded = FALSE; |
| 348 } | 437 } |
| 349 | 438 |
| 350 gboolean is_loaded (void) | 439 gboolean is_loaded (void) |
| 351 { | 440 { |
