void EditorWidget::wheelEvent(QWheelEvent *qwheelevent){ if(ATOMIC_GET(is_starting_up)==true) return; if (MIXER_is_saving()) return; struct Tracker_Windows *window=static_cast<struct Tracker_Windows*>(root->song->tracker_windows); int num_lines = R_ABS(qwheelevent->delta()/120); //printf(" Got wheel event %d\n",qwheelevent->delta()/120); DO_GFX( { /* if(qwheelevent->delta()<0) ScrollEditorDown(window,num_lines * getScrollMultiplication()); else ScrollEditorUp(window,num_lines * getScrollMultiplication()); */ if (qwheelevent->modifiers() & Qt::ControlModifier) { if (qwheelevent->delta() > 0) zoom(1,window->l.num); else zoom(-1,window->l.num); #if 0 } else if (qwheelevent->modifiers() & Qt::ShiftModifier) { tevent.ID=TR_KEYBOARD; if(qwheelevent->delta()<0) tevent.SubID=EVENT_LEFTARROW; else tevent.SubID=EVENT_RIGHTARROW; for(int i=0;i<num_lines;i++) EventReciever(&tevent,window); #endif } else { tevent.ID=TR_KEYBOARD; if(qwheelevent->delta()<0) tevent.SubID=EVENT_DOWNARROW; else tevent.SubID=EVENT_UPARROW; for(int i=0;i<num_lines;i++) EventReciever(&tevent,window); } });
bool X11Event_ClientMessage(XClientMessageEvent *event,struct Tracker_Windows *window){ struct TEvent tevent={0}; //fprintf(stderr,"******************** Got client message *************************** \n"); switch(event->data.l[0]){ case X11EVENT_PLAYLISTINSERT: fprintf(stderr,"******************** Got plauylist insert client message *************************** \n"); BL_insert( event->data.l[1], getBlockFromNum(event->data.l[2]) ); break; case X11EVENT_PLAYLISTDELETE: fprintf(stderr,"******************** Got plauylistdetlete client message *************************** \n"); BL_delete(event->data.l[1]); break; case X11EVENT_KEYBOARDDOWN: //printf("Got Down %d %d\n",(int)event->data.l[1],(int)event->data.l[2]); //X11Event_KeyPress(event->data.s[1],window); tevent.ID=TR_KEYBOARD; tevent.SubID=event->data.l[1]; tevent.keyswitch=event->data.l[2]; if(EventReciever(&tevent,window)==1){ return false; } break; case X11EVENT_KEYBOARDUP: //printf("Got Up %d %d\n",(int)event->data.l[1],(int)event->data.l[2]); //X11Event_KeyRelease(event->data.s[1],window); break; case X11EVENT_MIDIEVENT: MIDIGetEvents( root->def_instrument, (int)event->data.l[1], (int)event->data.l[2], (int)event->data.l[3], (int)event->data.l[4] ); break; case X11EVENT_UPDATESONGPOS: fprintf(stderr,"Obsolete client message: X11EVENT_UPDATESONGPOS\n"); // P2MUpdateSongPosCallBack(); break; default: printf("Unknown ClientMessage event: %d\n",(int)event->data.l[0]); break; } // printf("Received \"%s\"\n",event->data.b); return true; }
bool OS_SYSTEM_KeyboardFilter(void *focused_widget, void *void_msg){ MSG *msg = void_msg; static int last_pressed_key = -1; static int64_t last_pressed_key_time = -1; static int last_pressed_keyswitch = -1; struct Tracker_Windows *window=root->song->tracker_windows; #if 0 static int num=0; if(msg->message!=WM_TIMER && msg->message!=0x84 && msg->message!=WM_MOUSEFIRST && msg->message!=WM_MOUSEMOVE && msg->message!=WM_SETCURSOR){ char *temp=""; printf("Got something. Message: 0x%x. wParam: 0x%x. lParam: 0x%x. Num: %d. Name: \"%s\", Left shift? 0x%x\n",(int)msg->message,(int)msg->wParam,(int)msg->lParam,num++,temp,(int)GetKeyState(VK_LSHIFT)); fflush(stdout); } #endif switch(msg->message){ case WM_HOTKEY: //printf("Got HotKey\n"); //fflush(stdout); return true; case WM_KEYDOWN: case WM_SYSKEYDOWN: if(num_users_of_keyboard>0) return false; tevent.ID=TR_KEYBOARD; tevent.SubID=get_keyboard_subID(msg); last_pressed_key = tevent.SubID; if(last_pressed_key_time==-1) last_pressed_key_time = MIXER_get_time(); tevent.keyswitch=get_keyswitch(); last_pressed_keyswitch = tevent.keyswitch; /* printf("____________ key down: %x. Switch down: %x, left ctrl: %x, left alt: %x, right ctrl: %x, right alt: %x\n", last_pressed_key,last_pressed_keyswitch, EVENT_LEFTCTRL, EVENT_LEFTALT, EVENT_RIGHTCTRL, EVENT_RIGHTALT ); */ EventReciever(&tevent,window); return true; case WM_KEYUP: case WM_SYSKEYUP: if(msg->wParam==VK_RWIN){ right_windows_down = false; return false; } if(msg->wParam==VK_LWIN){ left_windows_down = false; return false; } if(num_users_of_keyboard>0) return false; int keynum = get_keyboard_subID(msg); tevent.ID=TR_KEYBOARDUP; tevent.SubID=keynum; tevent.keyswitch=get_keyswitch(); int64_t time_now = MIXER_get_time(); //printf("____________ key: %x. Switch down: %x, Switch up: %x\n",keynum,last_pressed_keyswitch,tevent.keyswitch); //printf("keynum: %d, last_pressed: %d, ALT_R: %d, time_now: %d, last_time: %d, diff: %d\n",keynum,last_pressed_key,EVENT_ALT_R,(int)time_now,(int)last_pressed_key_time,(int)(time_now-last_pressed_key_time)); //fflush(stdout); if( (time_now-last_pressed_key_time) < pc->pfreq/4){ // i.e. only play if holding the key less than 0.25 seconds. bool isplaykeyswitch = (last_pressed_keyswitch & EVENT_RIGHTALT) || last_pressed_keyswitch==EVENT_RIGHTSHIFT; /* printf("****************** last_pressed_keyswitch: %x (%x) (%x) (%d)\n",last_pressed_keyswitch, EVENT_RIGHTALT, EVENT_LEFTALT|EVENT_LEFTCTRL, EVENT_RIGHTALT|EVENT_LEFTCTRL); printf("isplaykeyswitch: %d, keynum==last_pressed_key: %d, keynum==0: %d, (tevent.keyswitch==0: %d || (similar: %x/%x/%x))\n", isplaykeyswitch, keynum==last_pressed_key, keynum==0, tevent.keyswitch==0, tevent.keyswitch,EVENT_RIGHTALT,last_pressed_keyswitch); */ if (isplaykeyswitch) if(keynum==last_pressed_key && keynum==0 && (tevent.keyswitch==0 || (tevent.keyswitch==EVENT_RIGHTALT && EVENT_RIGHTALT==last_pressed_keyswitch))) PlayBlockFromStart(window,true); // true == do_loop } last_pressed_key_time = -1; EventReciever(&tevent,window); return true; default: break; } return false; }
int radium_main(char *arg){ struct Tracker_Windows *window; #if 0 // Seems to be some kind of problem when running givertcap? Try to uncomment and // see if you can start radium without segfaulting. I can't. -Kjetil. system("/usr/bin/givertcap"); #endif x11_display=XOpenDisplay(NULL); if(x11_display==NULL){ fprintf(stderr, "Unable to open display \"%s\"\n",XDisplayName(NULL)); return 1; } XSetIOErrorHandler (MySysErrorHandler); x11_screen=DefaultScreen(x11_display); printf("arg: -%s-\n",arg); printf("Width/Height: %d/%d\n",DisplayWidth(x11_display,x11_screen),DisplayHeight(x11_display,x11_screen)); X11_init_keyboard(); X11_StartBlockSelector(); X11_StartMidiProperties(); StartGuiThread(); posix_InitPlayer(); if(InitProgram()==true){ /* Here: More inits, receive events, other things. */ bool notend=true; printf("Inited\n"); XFlush(x11_display); // DrawUpTrackerWindow(root->song->tracker_windows); //XFlush(x11_display); window=root->song->tracker_windows; //GFX_StartFileRequester(); X11_StartQtStuff(); BS_UpdateBlockList(); BS_UpdatePlayList(); BS_SelectBlock(root->song->blocks); BS_SelectPlaylistPos(0); if(strlen(arg)>0) Load(arg); lockGUI(); while(notend==true){ int fd; fd_set fdset; XFlush(x11_display); fd=ConnectionNumber(x11_display); FD_ZERO(&fdset); FD_SET(fd,&fdset); unlockGUI(); while((fd=select(fd+1,&fdset,NULL,NULL,NULL)==-1)){ if(errno!=EINTR) break; } lockGUI(); while(XPending(x11_display)) { XEvent event; XNextEvent(x11_display, &event); //XNextEvent (x11_display, &event); window=root->song->tracker_windows; //P2MUpdateSongPosCallBack(); switch(event.type){ case KeyPress: if(X11_KeyPress((XKeyEvent *)&event,window)==1){ notend=false; } break; case KeyRelease: X11_KeyRelease((XKeyEvent *)&event,window); break; case ButtonPress: //printf("%d %d %d\n",((XButtonEvent *)&event)->x,((XButtonEvent *)&event)->y,((XButtonEvent *)&event)->button); switch(((XButtonEvent *)&event)->button){ case 1: tevent.ID=TR_LEFTMOUSEDOWN; break; case 2: tevent.ID=TR_MIDDLEMOUSEDOWN; break; case 3: tevent.ID=TR_RIGHTMOUSEDOWN; break; case 4: tevent.ID=TR_KEYBOARD; tevent.SubID=EVENT_UPARROW; break; case 5: tevent.ID=TR_KEYBOARD; tevent.SubID=EVENT_DOWNARROW; break; default: tevent.ID=TR_LEFTMOUSEDOWN; } tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; case ButtonRelease: //printf("%d %d %d\n",((XButtonEvent *)&event)->x,((XButtonEvent *)&event)->y,((XButtonEvent *)&event)->button); switch(((XButtonEvent *)&event)->button){ case 1: tevent.ID=TR_LEFTMOUSEUP; break; case 2: tevent.ID=TR_MIDDLEMOUSEUP; break; case 3: tevent.ID=TR_RIGHTMOUSEUP; break; default: tevent.ID=TR_LEFTMOUSEUP; } tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; case EnterNotify: case LeaveNotify: X11_ResetKeysUpDowns(); break; case MotionNotify: // printf("%d %d %d\n",((XMotionEvent *)&event)->x,((XMotionEvent *)&event)->y,((XMotionEvent *)&event)->state); tevent.ID=TR_MOUSEMOVE; tevent.x=((XButtonEvent *)&event)->x; tevent.y=((XButtonEvent *)&event)->y; EventReciever(&tevent,window); break; //case VisibilityNotify: // case ConfigureNotify: case ConfigureNotify: if( window->width!=((XConfigureEvent *)&event)->width || window->height!=((XConfigureEvent *)&event)->height ) { #if 0 fprintf(stderr,"Resized %d %d\n", ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height ); #endif XFreePixmap( x11_display, window->os_visual->pixmap ); XFreePixmap( x11_display, window->os_visual->cursorpixmap ); window->os_visual->pixmap=XCreatePixmap(x11_display, window->os_visual->window, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height, (unsigned int)(DefaultDepth(x11_display,x11_screen)) ); XFillRectangle( x11_display, window->os_visual->pixmap, window->os_visual->gcs[0], 0, 0, ((XConfigureEvent *)&event)->width,((XConfigureEvent *)&event)->height ); window->os_visual->cursorpixmap=XCreatePixmap(x11_display, window->os_visual->window, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height, (unsigned int)(DefaultDepth(x11_display,x11_screen)) ); XFillRectangle( x11_display, window->os_visual->cursorpixmap, window->os_visual->gcs[0], 0, 0, ((XConfigureEvent *)&event)->width, ((XConfigureEvent *)&event)->height ); Resize_resized( window, ((XConfigureEvent *)&event)->width-1, ((XConfigureEvent *)&event)->height-1, true ); } break; case Expose: printf("Expose\n"); //GFX_FilledBox(window,0,0,0,window->width,window->height); //DrawUpTrackerWindow(root->song->tracker_windows); Resize_resized(window,window->width,window->height,false); //XFlush(x11_display); break; case NoExpose: break; case GraphicsExpose: printf("GRaphicsExpose event.\n"); break; case ClientMessage: X11Event_ClientMessage((XClientMessageEvent *)&event,window); // printf("Received \"%s\"\n",((XClientMessageEvent *)&event)->data.b); break; default: printf("Unknown xevent %d\n",event.type); break; } } } EndProgram(); } posix_EndPlayer(); unlockGUI(); EndGuiThread(); XCloseDisplay(x11_display); return 0; }