Class: RWin::Window

Inherits:
Data
  • Object
show all
Defined in:
ext/rwin/rw_windows.c

Direct Known Subclasses

Dialog, WR::Window

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(*args) ⇒ Object

Event handling routines



663
664
665
666
667
668
669
670
# File 'ext/rwin/rw_windows.c', line 663

static VALUE
rw_method_missing(int argc, VALUE *argv, VALUE self){
    ID method_id = rb_to_id(argv[0]);
    RwWindow *rw = DATA_PTR(self);
    if(rw->handler_ids && aaSearch(rw->handler_ids, method_id)) return Qnil;
    rb_call_super(argc, argv);
    return Qnil;
}

Class Method Details

.new_from_handle(v_handle) ⇒ Object



645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
# File 'ext/rwin/rw_windows.c', line 645

static VALUE
rwwin1_new_from_handle(VALUE klass, VALUE v_handle){
    RwWindow *rw;
    VALUE obj;
    HANDLE handle = (HANDLE)NUM2ULONG_PTR(v_handle);
    if(!GetParent(handle)) rb_raise(rb_eArgError,
            "Handle %#x is not child window", (int)(ULONG_PTR)handle);
    
    obj = RwWindow_Data_Make_Struct(klass, rw);
    rw->hwnd = handle;
    rw->msgfilter = NULL;
    rw->handler_ids = NULL;
    rw->haccel = NULL;
    Register_childwin(rw->hwnd, obj);
    return obj;
}

Instance Method Details

#_hwndObject



1077
1078
1079
1080
1081
1082
# File 'ext/rwin/rw_windows.c', line 1077

static VALUE
rwwin_gethandle(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    return ULONG_PTR2NUM((ULONG_PTR)rw->hwnd);
}

#alive?Boolean

Returns:

  • (Boolean)


1084
1085
1086
1087
1088
# File 'ext/rwin/rw_windows.c', line 1084

static VALUE
rwwin_alive_p(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    return rw->hwnd ? Qtrue : Qfalse;
}

#captionObject

r/w attributes



1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
# File 'ext/rwin/rw_windows.c', line 1244

static VALUE
rwwin_getcaption(VALUE self){
    int len;
    TCHAR *buff;
    VALUE robj;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    len = GetWindowTextLength(rw->hwnd);
    buff = malloc((len+1)*sizeof(TCHAR));
    GetWindowText(rw->hwnd, buff, len+1);
    robj = rw_encode_external(buff);
    free(buff);
    return robj;
}

#caption=(str) ⇒ Object



1259
1260
1261
1262
1263
1264
1265
1266
# File 'ext/rwin/rw_windows.c', line 1259

static VALUE
rwwin_setcaption(VALUE self, VALUE str){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_call_without_gvl_2(rw->nthread_id, (FARPROC)SetWindowText, (ULONG_PTR)rw->hwnd,
        (ULONG_PTR)rw_str2tchar(StringValue(str)));
    return self;
}

#clientposObject



1184
1185
1186
1187
1188
1189
1190
1191
# File 'ext/rwin/rw_windows.c', line 1184

static VALUE
rwwin_getclientpos(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_getclientpos_core(rw->hwnd, &rc);
    return rb_ary_new3(2, INT2FIX(rc.left), INT2FIX(rc.top));
}

#clientsizeObject



1202
1203
1204
1205
1206
1207
1208
1209
# File 'ext/rwin/rw_windows.c', line 1202

static VALUE
rwwin_getclientsize(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetClientRect(rw->hwnd, &rc);
    return rb_ary_new3(2, INT2FIX(rc.right), INT2FIX(rc.bottom));
}

#ClientToScreen(v_x, v_y) ⇒ Object



1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
# File 'ext/rwin/rw_windows.c', line 1657

static VALUE
rwwin_client2screen(VALUE self, VALUE v_x, VALUE v_y){
    VALUE robj;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    pt.x = NUM2INT(v_x);
    pt.y = NUM2INT(v_y);
    ClientToScreen(rw->hwnd, &pt);
    robj = rb_ary_new2(2);
    rb_ary_store(robj, 0, INT2NUM(pt.x));
    rb_ary_store(robj, 1, INT2NUM(pt.y));
    return robj;
}

#closeObject



1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
# File 'ext/rwin/rw_windows.c', line 1064

static VALUE
rwwin_close(VALUE self){
    int r; //AAnode *nd;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = DestroyWindow(rw->hwnd);
    if(rw->hwnd){ /* for child windows (Not received WM_DESTROY) */
  Unregister_childwin(rw->hwnd);
  rw->hwnd = NULL;
    }
    return r ? Qtrue : Qfalse;
}

#create(*args) ⇒ Object



595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
# File 'ext/rwin/rw_windows.c', line 595

static VALUE
rwwin_create(int argc,VALUE* argv, VALUE self){
    TCHAR *classname, *caption;
    RwWindow *rw = DATA_PTR(self);
    HWND hparent = NULL;
    
    if(TYPE(argv[0])==T_STRING) {
  classname = rw_str2tchar(argv[0]);
    } else{
  rb_raise(rb_eArgError, "1st argument must be class name(String)");
    }
    if(TYPE(argv[1])==T_STRING) {
  caption = rw_str2tchar(argv[1]);
    } else{
  rb_raise(rb_eArgError, "2nd argument must be caption(String)");
    }
    if (!NIL_P(argv[6])){
  RwWindow *rwparent;
  RwWindow_Data_Get_Struct(argv[6], rwparent);
  hparent = rwparent->hwnd;
    }
    rw->hwnd = CreateWindowEx(NUM2UINT(argv[9]),       /* dwExStyle */
            classname,
            caption,
            NUM2UINT(argv[8]),       /* dwStyle */
            NUM2INT(argv[2]),        /* x */
            NUM2INT(argv[3]),        /* y */
            NUM2INT(argv[4]),        /* w */
            NUM2INT(argv[5]),        /* h */
            hparent,                 /* hParent */
            NIL_P(argv[7]) ? 0 : (HMENU)NUM2ULONG_PTR(argv[7]), /* hMenu */
            hInstance,
            NULL);
    if(!rw->hwnd){
  rb_raise(rb_eRuntimeError, "failed to create window(%s)", RSTRING_PTR(argv[0]));
    }
    rw->nthread_id = GetCurrentThreadId();
    if(hparent){
  Register_childwin(rw->hwnd, self);
  if(GetClassLong(rw->hwnd, GCW_ATOM)==RwClassAtom){
      int id = NIL_P(argv[7]) ? 0 : FIX2INT(argv[7]);
      SetWindowSubclass(rw->hwnd, RwSubclassProc, (UINT_PTR)id, (DWORD_PTR)self);
  }
    } else {
  Register_win(rw->hwnd, self);
  if (GetActiveWindow()==rw->hwnd) activewin = rw;
    }
    return self;
}

#cursorPosObject



1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
# File 'ext/rwin/rw_windows.c', line 1230

static VALUE
rwwin_getcursorpos(VALUE self){
    VALUE robj;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    GetCursorPos(&pt);
    ScreenToClient(rw->hwnd, &pt);
    robj = rb_ary_new2(2);
    rb_ary_store(robj, 0, INT2NUM(pt.x));
    rb_ary_store(robj, 1, INT2NUM(pt.y));
    return robj;
}

#DrawMenuBarObject



1911
1912
1913
1914
1915
1916
1917
# File 'ext/rwin/rw_resources.c', line 1911

static VALUE
rwwin_drawmenubar(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    DrawMenuBar(rw->hwnd);
    return self;
}

#event_registered?(*args) ⇒ Boolean

Returns:

  • (Boolean)


513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
# File 'ext/rwin/rw_windows.c', line 513

static VALUE
rwwin_msgfilter_exist_p(int argc, VALUE *argv, VALUE self){
    int msg, etc;
    VALUE v_sendto;
    AAnode *node;
    RwBaseHandler *bhandler;
    RwWindow *rw = DATA_PTR(self);
    if (!rw->msgfilter) return Qfalse;
    if(argc > 1 && rb_typeddata_is_kind_of(argv[argc-1], &rwwin_data_type)){
  v_sendto = Qfalse;
  argc--;
    } else {
  v_sendto = Qfalse;
    }
    if (argc==1){
  msg = FIX2INT(argv[0]);
  return aaSearch(rw->msgfilter, msg) ? Qtrue : Qfalse;
    }else if(argc==2){
  if (TYPE(argv[1])==T_STRING){ /* msg, handler_name */
      ID handler_id;
      msg = FIX2INT(argv[0]);
      node = aaSearch(rw->msgfilter, msg);
      if (!node || !node->val) return Qfalse;
      bhandler = node->val;
      if (!bhandler->handler) return Qfalse;
      handler_id = rb_to_id(argv[1]);
      return search_msghandler(rw, bhandler->handler, handler_id, v_sendto);
  } else { /* idcmd, msg */
      msg = FIX2INT(argv[1]);
      node = aaSearch(rw->msgfilter, msg);
      if (!node) return Qfalse;
      bhandler = node->val; //fprintf(stderr, "@%d\n", __LINE__);
      if (!bhandler->senders) return Qfalse; // fprintf(stderr, "@%d, %xll\n", __LINE__, (ULONG_PTR)bhandler->senders);
      etc = FIX2INT(argv[0]);
      return aaSearch(bhandler->senders, etc) ? Qtrue : Qfalse;
  }
    } else if(argc==3 || argc==4) { /* 3..4 */
  AAnode *ndsubfilter;
  AAnode *ndsubhandler;
  int submsg;
  
  msg = FIX2INT(argv[1]);
  node = aaSearch(rw->msgfilter, msg);
  if (!node) return Qfalse;
  bhandler = node->val;
  if(!bhandler->handler||!bhandler->senders) return Qfalse;
  etc = FIX2INT(argv[0]);
  submsg = FIX2INT(argv[2]);
  ndsubfilter = aaSearch(bhandler->senders, etc);
  if(!ndsubfilter) return Qfalse;
  ndsubhandler = aaSearch(ndsubfilter->val, submsg);
  if (!ndsubhandler || !ndsubhandler->val) return Qfalse;
  if(argc==3) {
      return Qtrue;
  } else { /* argc == 4 */
      RwMsgHandler *subhandler = ndsubhandler->val;
      ID sub_id = rb_to_id(argv[3]); 
      return search_msghandler(rw, subhandler, sub_id, v_sendto);
  }
    } else {
  rb_raise(rb_eArgError, "argments must be 1..5");
    }
    return Qfalse;
}

#get_msgtranslator(v_msg) ⇒ Object



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
# File 'ext/rwin/rw_windows.c', line 205

static VALUE
rwwin_msgtranslator_get(VALUE self, VALUE v_msg){
    AAnode *node;
    int msg =  FIX2INT(v_msg);
    RwWindow *rw = DATA_PTR(self);
    if (!rw->msgfilter) return Qnil;
    node = aaSearch(rw->msgfilter, msg);
    if(node){
  RwBaseHandler *basehandler = node->val;
  if (basehandler->senders){
      return INT2FIX(basehandler->handler->handler_id);
  } else {
      rb_raise(rb_eRuntimeError, "Already defined handler for msg: %#x", msg);
  }
    }
    return Qnil;
}

#GetWindowLong(v_idx) ⇒ Object



1559
1560
1561
1562
1563
1564
# File 'ext/rwin/rw_windows.c', line 1559

static VALUE
rwwin_getwndlong(VALUE self, VALUE v_idx){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    return INT2NUM(GetWindowLongPtr(rw->hwnd, FIX2INT(v_idx)));
}

#GetWindowRectObject



1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
# File 'ext/rwin/rw_windows.c', line 1597

static VALUE
rwwin_getwindowrect(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if(GetWindowRect(rw->hwnd, &rc)){
  CStructData *cs;
  VALUE v_rect = api_cstruct_new(ccsRECT);
  CStruct_Data_Get_Struct(v_rect, cs);
  memcpy(cs->dtstr, &rc, sizeof(RECT)); /* cs->dtoffset is always 0 */
  return v_rect;
    } else {
  return Qfalse;
    }
}

#hObject



1373
1374
1375
1376
1377
1378
1379
1380
# File 'ext/rwin/rw_windows.c', line 1373

static VALUE
rwwin_geth(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetWindowRect(rw->hwnd, &rc);
    return INT2FIX(rc.bottom - rc.top);
}

#h=(v_h) ⇒ Object



1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
# File 'ext/rwin/rw_windows.c', line 1429

static VALUE
rwwin_seth(VALUE self, VALUE v_h){
    int w, h;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_setxy_core(rw->hwnd, &pt, &w, &h);
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd,
        pt.x, pt.y, w, FIX2INT(v_h), FALSE);
    return v_h;
}

#idcmdObject



1300
1301
1302
1303
1304
1305
# File 'ext/rwin/rw_windows.c', line 1300

static VALUE
rwwin_getidcmd(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    return INT2FIX(GetWindowLongPtr(rw->hwnd, GWLP_ID));
}

#idcmd=(v_id) ⇒ Object



1307
1308
1309
1310
1311
1312
1313
# File 'ext/rwin/rw_windows.c', line 1307

static VALUE
rwwin_setidcmd(VALUE self, VALUE v_id){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    SetWindowLongPtr(rw->hwnd, GWLP_ID, FIX2INT(v_id));
    return self;
}

#move(*args) ⇒ Object

static void rw_move_core(HWND hwnd, POINT *pt)

HWND hparent;
if(hparent=GetParent(hwnd)) ClientToScreen(hparent, pt);



1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
# File 'ext/rwin/rw_windows.c', line 1097

static VALUE
rwwin_move(int argc, VALUE * argv, VALUE self){
    RECT rc;
    int x, y, w, h;
    BOOL brepaint = TRUE;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    switch(argc){
      case 5:
  if(argv[4]==Qfalse) brepaint = FALSE;
      case 4:
  x = FIX2INT(argv[0]);
  y = FIX2INT(argv[1]);
  w = FIX2INT(argv[2]);
  h = FIX2INT(argv[3]);
  break;
      case 3:
  if(argv[2]==Qfalse) brepaint = FALSE;
      case 2:
  x = FIX2INT(argv[0]);
  y = FIX2INT(argv[1]);
  GetWindowRect(rw->hwnd, &rc);
  w = rc.right - rc.left;
  h = rc.bottom - rc.top;
  break;
      default:
  rb_raise(rb_eArgError, "Num of arguments must be 2..5");
    }
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd, x, y, w, h, brepaint);
    return self;
}

#parentObject



1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
# File 'ext/rwin/rw_windows.c', line 1315

static VALUE
rwwin_getparent(VALUE self){
    HWND hparent;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if(hparent = GetParent(rw->hwnd)){
  VALUE pw;
  if(!(pw = Get_win(hparent))) pw = Get_childwin(hparent);
  return pw ? pw : Qnil;
    }
    return Qnil;
}

#parent=(v_parent) ⇒ Object



1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
# File 'ext/rwin/rw_windows.c', line 1328

static VALUE
rwwin_setparent(VALUE self, VALUE v_parent){
    HWND h_old;
    RwWindow *rp;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    RwWindow_Data_Get_Struct(v_parent, rp);
    RwCheckWindow(rp);
    h_old = SetParent(rw->hwnd, rp->hwnd);
    if(h_old){
  VALUE pw;
  if(!(pw = Get_win(h_old))) pw = Get_childwin(h_old);
  return pw ? pw : Qnil;
    }else{
  return Qnil;
    }
}

#PostMessage(v_msg, v_wparam, v_lparam) ⇒ Object



1549
1550
1551
1552
1553
1554
1555
1556
1557
# File 'ext/rwin/rw_windows.c', line 1549

static VALUE
rwwin_postmessage(VALUE self, VALUE v_msg, VALUE v_wparam, VALUE v_lparam){
    int r;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = rw_call_without_gvl_4(rw->nthread_id, (FARPROC)PostMessage, (ULONG_PTR)rw->hwnd,
            NUM2UINT(v_msg), rw_get_param(v_wparam), rw_get_param(v_lparam));
    return r ? Qtrue : Qnil;
}

#redraw(*args) ⇒ Object



1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
# File 'ext/rwin/rw_windows.c', line 1491

static VALUE
rwwin_setredraw(int argc, VALUE *argv, VALUE self){
    VALUE v_flag ;//, v_l, v_t, v_r, v_b;
    int flag;
    RECT rc;
    RECT *prc = NULL;
    RwWindow *rw = DATA_PTR(self);
    switch(argc){
      case 0:
  flag = RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN;
  break;
      case 1:
  v_flag = argv[0];
  if (!v_flag) {
      flag = FALSE;
  } else {
      flag = (v_flag==Qtrue) ? RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN :\
                               FIX2INT(v_flag);
  }
  break;
      case 4:
  rc.left = FIX2INT(argv[0]);
  rc.top = FIX2INT(argv[1]);
  rc.right = FIX2INT(argv[2]);
  rc.bottom = FIX2INT(argv[3]);
  prc = &rc;
  flag = RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN;
  break;
      case 5:
  rc.left = FIX2INT(argv[0]);
  rc.top = FIX2INT(argv[1]);
  rc.right = FIX2INT(argv[2]);
  rc.bottom = FIX2INT(argv[3]);
  prc = &rc;
  flag = (argv[4]==Qtrue) ? RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN :\
                           FIX2INT(argv[4]);
  break;
      default:
  rb_raise(rb_eArgError, "Num of arguments must be 0, 1, 4 or 5");
    }
    SendMessage(rw->hwnd, WM_SETREDRAW, flag, 0);
    if(flag) RedrawWindow(rw->hwnd, prc, NULL, flag);
    return self;
}

#refresh(*args) ⇒ Object



1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
# File 'ext/rwin/rw_windows.c', line 1144

static VALUE
rwwin_refresh(int argc, VALUE *argv, VALUE self){
    RECT rect;
    RECT *prect;
    BOOL bErase;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if(argc<=1){
  prect = NULL;
  bErase = (argc==1 && argv[0]==Qfalse) ? FALSE : TRUE;
    } else if(argc<=5){
  rect.left   = FIX2INT(argv[0]);
  rect.top    = FIX2INT(argv[1]);
  rect.right  = rect.left + FIX2INT(argv[2]);
  rect.bottom = rect.top + FIX2INT(argv[3]);
  prect = &rect;
  bErase = (argc==5 && argv[4]==Qfalse) ? FALSE : TRUE;
    } else{
  rb_raise(rb_eArgError, "invalid num of args: %d", argc);
    }
    InvalidateRect(rw->hwnd, prect, bErase);
    return self;
}

#register_event(*args) ⇒ Object



223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
# File 'ext/rwin/rw_windows.c', line 223

static VALUE
rwwin_msgfilter_add(int argc, VALUE *argv, VALUE self){
    RwBaseHandler *basehandler;
    RwMsgHandler *newhandler;
    unsigned msg, submsg;
    ID handler_id;
    int etc;
    VALUE v_msg, v_submsg, v_etc, v_handler, v_template, v_sendto, v_klass;
    
    RwWindow *rw = DATA_PTR(self);
    v_sendto = self;
    v_template = Qnil;
    v_klass = Qnil;
     while (NIL_P(argv[argc-1])){ /* reject last nil */
  argc--;
    }
    if (rb_typeddata_is_kind_of(argv[argc-1], &rwwin_data_type)){
  /* message forwarding (sends message to any target window) */
  v_sendto = argv[argc-1];
  argc -= 1;
    }
    if (NIL_P(argv[argc-1])) {
  argc -= 1;
    } else if (rb_obj_class(argv[argc-1])==rb_cClass &&
         (rb_class_inherited_p(argv[argc-1], cRwAPIstruct)==Qtrue ||
    rb_class_inherited_p(argv[argc-1], cRwCanvas)==Qtrue)){
  /* lParam is CStruct or Canvas*/
  v_klass = argv[argc-1];
  argc -= 1;
    }
    if(argc > 3){ /* for WM_COMMAND / WM_NOTIFY (supports message which from Menu)*/
  rb_scan_args(argc, argv, "41", &v_etc, &v_msg, &v_submsg, &v_handler, &v_template);
  etc = NUM2INT(v_etc);
    } else { /* for simple message forwarding*/
  rb_scan_args(argc, argv, "21", &v_msg, &v_handler, &v_template);
  v_submsg = Qnil;
  etc = 0;
    }
    
    msg = NUM2UINT(v_msg);
    if (!NIL_P(v_submsg)){
  if(NIL_P(rwwin_msgtranslator_get(self, v_msg))){
      rb_raise(rb_eRuntimeError, "Translator of message 0x%x is not defined", msg);
  }
    }
    submsg = NIL_P(v_submsg) ? 0 : NUM2UINT(v_submsg);
    handler_id = rb_to_id(v_handler);
    
    if (!NIL_P(v_template)){ /* check template */
  int len = RSTRING_LEN(v_template);
  char* tmpl = RSTRING_PTR(v_template);
  switch(tmpl[0]){
    case 'h': case 'i': case 'x':
      break;
    case 'c':
      if(msg!=WM_PAINT) rb_raise(rb_eRuntimeError, "Template 'c' is only for WM_PAINT");
      if (NIL_P(v_klass)){
    v_klass = cRwCanvas;
      } else if(NIL_P(rb_class_inherited_p(cRwCanvas, v_klass))){
    rb_raise(rb_eRuntimeError, "Need Canvas inherited class for template 'c'");
      }
      break;
    case 's':
      rb_raise(rb_eRuntimeError, "Template 's' is only for lParam");
    default:
      rb_raise(rb_eRuntimeError, "Unknown template `%c' for wParam", tmpl[0]);
  }
  if (len>1) switch(tmpl[1]){
    case 'h': case 'i': case 'x':
      break;
    case 's':
      if (NIL_P(v_klass) || NIL_P(rb_class_inherited_p(cRwAPIstruct, v_klass))){
    rb_raise(rb_eRuntimeError, "Need CSruct inherited class for template 's'");
      }
      break;
    default:
      rb_raise(rb_eRuntimeError, "Unknown template `%c' for lParam", tmpl[1]);
  }
    }
    
    newhandler = create_msghandler(handler_id, v_template, v_klass, v_sendto);
    if (!etc){
  if(rw->msgfilter) {
      AAnode *node = aaSearch(rw->msgfilter, msg);
      if (node){
    basehandler = node->val;
    if (basehandler->handler){
        basehandler->handler = rw_append_handler(basehandler->handler, newhandler);
    } else {
        rw_msgreceiver_add(newhandler->receiver, newhandler->handler_id);
        basehandler->handler = newhandler;
    }
      } else {
    rw_msgreceiver_add(v_sendto, handler_id);
    basehandler = create_basehandler(newhandler, NULL);
    aaInsert(rw->msgfilter, msg, basehandler);
      }
  } else {
      rw_msgreceiver_add(v_sendto, handler_id);
      basehandler = create_basehandler(newhandler, NULL);
      rw->msgfilter = newAAtree(aa_destruct_basehandler);
      aaInsert(rw->msgfilter, msg, basehandler);
  }
    } else {
  if(rw->msgfilter) {
      AAnode *ndbase = aaSearch(rw->msgfilter, msg);
      if (ndbase){
    AAnode *ndsubfilter;
    RwMsgHandler *subhandler;
    subhandler = create_msghandler(handler_id, v_template, v_klass, v_sendto);
    basehandler = ndbase->val;
    ndsubfilter = aaSearch(basehandler->senders, etc);
    if (ndsubfilter){ 
        add_simple_filter(ndsubfilter->val, submsg, subhandler);
    } else {
        AAtree *subfilter = newAAtree(aa_destruct_handler);
        rw_msgreceiver_add(v_sendto, handler_id);
        aaInsert(basehandler->senders, etc, subfilter);
        aaInsert(subfilter, submsg, subhandler);
    }
      } else {
    rb_raise(rb_eRuntimeError, "Translator is not defined");
      }
  } else {
      rb_raise(rb_eRuntimeError, "Translator is not defined");
  }
    }
    return v_msg;
}

#registered_messagesObject



584
585
586
587
588
589
590
# File 'ext/rwin/rw_windows.c', line 584

static VALUE
rwwin_msgfilter_getfilters(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    VALUE ary = rb_ary_new();
    aaForeach(rw->msgfilter, aa_callback_each_msgfilter, (void*)ary);
    return ary;
}

#RegisterHotKey(v_id, v_modifiers, v_vkey) ⇒ Object



1639
1640
1641
1642
1643
1644
1645
1646
# File 'ext/rwin/rw_windows.c', line 1639

static VALUE
rwwin_registerhotkey(VALUE self, VALUE v_id, VALUE v_modifiers, VALUE v_vkey){
    int r;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = RegisterHotKey(rw->hwnd, NUM2INT(v_id), NUM2UINT(v_modifiers), NUM2UINT(v_vkey));
    return r ? Qtrue : Qfalse;
}

#ReleaseCaptureObject

return previous captured window



1624
1625
1626
1627
1628
# File 'ext/rwin/rw_windows.c', line 1624

static VALUE
rwwin_releasecapture(VALUE self){
    int r = ReleaseCapture();
    return r ? Qtrue : Qfalse;
}

#RemoveWindowSubclassObject



1451
1452
1453
1454
1455
1456
1457
1458
1459
# File 'ext/rwin/rw_windows.c', line 1451

static VALUE
rwwin_removesubclass(VALUE self){
    int id;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    id = GetWindowLongPtr(rw->hwnd, GWLP_ID);
    RemoveWindowSubclass(rw->hwnd, RwSubclassProc, (UINT_PTR)id);
    return self;
}

#resize(v_w, v_h) ⇒ Object



1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
# File 'ext/rwin/rw_windows.c', line 1129

static VALUE
rwwin_resize(VALUE self, VALUE v_w, VALUE v_h){
    RECT rc;
    POINT pos;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetWindowRect(rw->hwnd, &rc);
    pos.x = rc.left;
    pos.y = rc.top;
    ScreenToClient(GetAncestor(rw->hwnd, GA_PARENT), &pos);
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd,
        pos.x, pos.y, FIX2INT(v_w), FIX2INT(v_h), TRUE);
    return self;
}

#screenposObject



1175
1176
1177
1178
1179
1180
1181
1182
# File 'ext/rwin/rw_windows.c', line 1175

static VALUE
rwwin_getscreenpos(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetWindowRect(rw->hwnd, &rc);
    return rb_ary_new3(2, INT2FIX(rc.left), INT2FIX(rc.top));
}

#ScreenToClient(v_x, v_y) ⇒ Object



1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
# File 'ext/rwin/rw_windows.c', line 1671

static VALUE
rwwin_screen2client(VALUE self, VALUE v_x, VALUE v_y){
    VALUE robj;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    pt.x = NUM2INT(v_x);
    pt.y = NUM2INT(v_y);
    ScreenToClient(rw->hwnd, &pt);
    robj = rb_ary_new2(2);
    rb_ary_store(robj, 0, INT2NUM(pt.x));
    rb_ary_store(robj, 1, INT2NUM(pt.y));
    return robj;
}

#SendMessage(v_msg, v_wparam, v_lparam) ⇒ Object



1539
1540
1541
1542
1543
1544
1545
1546
1547
# File 'ext/rwin/rw_windows.c', line 1539

static VALUE
rwwin_sendmessage(VALUE self, VALUE v_msg, VALUE v_wparam, VALUE v_lparam){
    int r;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = rw_call_without_gvl_4(rw->nthread_id, (FARPROC)SendMessage, (ULONG_PTR)rw->hwnd,
            NUM2UINT(v_msg), rw_get_param(v_wparam), rw_get_param(v_lparam));
    return INT2NUM(r);
}

#set_accelerator(v_acceltable) ⇒ Object

Keyborad accelarators



673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
# File 'ext/rwin/rw_windows.c', line 673

static VALUE
rw_set_accelerator(VALUE self, VALUE v_acceltable){
    int len, i;
    HACCEL haccel = NULL;
    ACCEL *paccel = NULL;
    RwWindow *rw = DATA_PTR(self);
    if (NIL_P(v_acceltable)){
  if(rw->haccel) DestroyAcceleratorTable(rw->haccel);
  rw->haccel = NULL;
  return Qnil;
    }
    if(TYPE(v_acceltable)!=T_ARRAY) rb_raise(rb_eArgError, "Argument must be an Array.");
    len = RARRAY_LEN(v_acceltable);
    if(rw->haccel) DestroyAcceleratorTable(rw->haccel);
    RW_MALLOC(paccel, len*sizeof(ACCEL));
    for(i=0; i<len; i++){
  VALUE v_accel = rb_ary_entry(v_acceltable, i);
  paccel[i].fVirt = FIX2INT(rb_ary_entry(v_accel, 0));
  paccel[i].key = FIX2INT(rb_ary_entry(v_accel, 1));
  paccel[i].cmd = FIX2INT(rb_ary_entry(v_accel, 2));
    }
    haccel = CreateAcceleratorTable(paccel, len);
    if(!haccel) rb_raise(rb_eRuntimeError, "CreateAcceleratorTable faled.");
    rw->haccel = haccel;
    free(paccel);
    return INT2FIX(len);
}

#set_msgtranslator(*args) ⇒ Object



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'ext/rwin/rw_windows.c', line 175

static VALUE
rwwin_msgtranslator_set(int argc, VALUE *argv, VALUE self){
    int msg;
    ID callback_id;
    RwBaseHandler *basehandler;
    VALUE v_msg, v_callback, v_template;
    RwMsgHandler *newhandler;
    
    RwWindow *rw = DATA_PTR(self);
    rb_scan_args(argc, argv, "12", &v_msg, &v_callback, &v_template);
    msg = FIX2INT(v_msg);
    callback_id = NIL_P(v_callback) ? Qfalse : rb_to_id(v_callback);
    if(rw->msgfilter) {
  AAnode *ndbase = aaSearch(rw->msgfilter, msg);
  if (ndbase){ /* Node must be empty. */
      rb_raise(rb_eRuntimeError, "Already defined handler for msg: %#x", msg);
  } else {
      newhandler = create_msghandler(callback_id, v_template, Qfalse, Qfalse);
      basehandler = create_basehandler(newhandler, newAAtree(aa_destruct1));
      aaInsert(rw->msgfilter, msg, basehandler);
  }
    } else {
  newhandler = create_msghandler(callback_id, v_template, Qfalse, Qfalse);
  basehandler = create_basehandler(newhandler, newAAtree(aa_destruct1));
  rw->msgfilter = newAAtree(aa_destruct_basehandler);
  aaInsert(rw->msgfilter, msg, basehandler);
    }
    return Qnil;
}

#SetCaptureObject



1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
# File 'ext/rwin/rw_windows.c', line 1613

static VALUE
rwwin_setcapture(VALUE self){
    HWND hWnd;
    VALUE wobj;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    hWnd = SetCapture(rw->hwnd);
    if(!(wobj = Get_win(hWnd))) wobj = Get_childwin(hWnd);
    return wobj || Qnil; /* return previous captured window */
}

#SetFocusObject

API functions



1484
1485
1486
1487
1488
1489
# File 'ext/rwin/rw_windows.c', line 1484

static VALUE
rwwin_setfocus(VALUE self){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    return SetFocus(rw->hwnd) ? self : Qnil;
}

#SetMenu(v_menu) ⇒ Object

Window functions



1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
# File 'ext/rwin/rw_resources.c', line 1894

static VALUE
rwwin_setmenu(VALUE self, VALUE v_menu){
    RwMenu *rm;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if (NIL_P(v_menu)){
  SetMenu(rw->hwnd, NULL);
    } else {
  RwMenu_Data_Get_Struct(v_menu, rm);
  RwCheckResource(rm);
  SetMenu(rw->hwnd, rm->hmenu);
  rm->hwnd = rw->hwnd;
    }
    DrawMenuBar(rw->hwnd);
    return self;
}

#setorder(v_wndafter) ⇒ Object



1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
# File 'ext/rwin/rw_windows.c', line 1211

static VALUE
rwwin_setorder(VALUE self, VALUE v_wndafter){
    RwWindow *rwafter;
    HWND hwndafter;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    switch(TYPE(v_wndafter)){
      case T_FIXNUM:
      case T_BIGNUM:
  hwndafter = (HWND)NUM2ULONG_PTR(v_wndafter);
  break;
      default:
  RwWindow_Data_Get_Struct(v_wndafter, rwafter);
  hwndafter = rwafter->hwnd;
    }
    SetWindowPos(rw->hwnd, hwndafter, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
    return self;
}

#SetWindowLong(v_idx, v_arg) ⇒ Object



1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
# File 'ext/rwin/rw_windows.c', line 1566

static VALUE
rwwin_setwndlong(VALUE self, VALUE v_idx, VALUE v_arg){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if (SetWindowLongPtr(rw->hwnd, FIX2INT(v_idx), NUM2INT(v_arg))) {
  rw_call_without_gvl_7(rw->nthread_id, (FARPROC)SetWindowPos, (ULONG_PTR)rw->hwnd, 0, 0,
            0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
  return Qtrue;
    }
    return Qfalse;
}

#SetWindowPos(v_insert_after, v_x, v_y, v_w, v_h, v_flags) ⇒ Object



1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
# File 'ext/rwin/rw_windows.c', line 1578

static VALUE
rwwin_setwndpos(VALUE self, VALUE v_insert_after, VALUE v_x, VALUE v_y, VALUE v_w, VALUE v_h, VALUE v_flags){
    int r, insert_after;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    if(rb_typeddata_is_kind_of(v_insert_after, &rwwin_data_type)){
  RwWindow *wn;
  RwWindow_Data_Get_Struct(self, wn);
  RwCheckWindow(wn);
  insert_after = (ULONG_PTR)wn->hwnd;
    } else {
  insert_after = NUM2INT(v_insert_after);
    }
    r = rw_call_without_gvl_7(rw->nthread_id, (FARPROC)SetWindowPos, (ULONG_PTR)rw->hwnd,
            insert_after, FIX2INT(v_x), FIX2INT(v_y), FIX2INT(v_w),
            FIX2INT(v_h), NUM2INT(v_flags));
    return r ? Qtrue : Qnil;
}

#SetWindowSubclassObject

hook functions



1441
1442
1443
1444
1445
1446
1447
1448
1449
# File 'ext/rwin/rw_windows.c', line 1441

static VALUE
rwwin_setsubclass(VALUE self){
    int id;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    id = GetWindowLongPtr(rw->hwnd, GWLP_ID);
    SetWindowSubclass(rw->hwnd, RwSubclassProc, (UINT_PTR)id, (DWORD_PTR)self);
    return self;
}

#ShowWindow(v_flag) ⇒ Object



1630
1631
1632
1633
1634
1635
1636
1637
# File 'ext/rwin/rw_windows.c', line 1630

static VALUE
rwwin_showwindow(VALUE self, VALUE v_flag){
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_call_without_gvl_2(rw->nthread_id, (FARPROC)ShowWindow, (ULONG_PTR)rw->hwnd,
        FIX2INT(v_flag));
    return self;
}

#TrackPopupMenu(*args) ⇒ Object



1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
# File 'ext/rwin/rw_resources.c', line 1919

static VALUE
rwwin_trackpopupmenu(int argc, VALUE *argv, VALUE self){
    VALUE v_menu, v_x, v_y, v_align, v_exclude;
    int falign, r;
    RwMenu *rm;
    POINT pos;
    TPMPARAMS *lptpm;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rb_scan_args(argc, argv, "32", &v_menu, &v_x, &v_y, &v_align, &v_exclude);
    RwMenu_Data_Get_Struct(v_menu, rm);
    RwCheckResource(rm);
    falign = NIL_P(v_align) ? TPM_LEFTALIGN : FIX2INT(v_align);
    if(NIL_P(v_exclude)){
  lptpm = NULL;
    } else {
  CStructData *cs;
  CStruct_Data_Get_Struct(v_exclude, cs);
  if(cs->dtlen!=sizeof(TPMPARAMS)) {
      rb_raise(rb_eArgError, "last argument size is not  same as TPMPARAMS's");
  }
  lptpm = (TPMPARAMS*)(cs->dtstr + cs->dtoffset);
    }
    pos.x = FIX2INT(v_x);
    pos.y = FIX2INT(v_y);
    ClientToScreen(rw->hwnd, &pos);
    r = TrackPopupMenuEx(rm->hmenu, falign, pos.x, pos.y, rw->hwnd, lptpm);
    return r ? Qtrue : Qfalse;
}

#unregister_event(*args) ⇒ Object



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
# File 'ext/rwin/rw_windows.c', line 412

static VALUE
rwwin_msgfilter_delete(int argc, VALUE *argv, VALUE self){
    VALUE v_sendto;
    AAnode *node;
    RwBaseHandler *bhandler;
    RwWindow *rw = DATA_PTR(self);
    if (!rw->msgfilter) return Qnil;
    if (argc==1){ // Need to add a case when only one control was given.
  int msg = NUM2INT(argv[0]);
  if (node=aaSearch(rw->msgfilter, msg)){
      RwBaseHandler *bhandler = node->val;
      if(bhandler->handler){
    RwMsgHandler *hd;
    while(hd=bhandler->handler){
        bhandler->handler = delete_msghandler(rw, bhandler->handler, hd->handler_id,
                Qfalse);
        rw->handler_ids = delete_handler_ids(rw->handler_ids, hd->handler_id);
    }
      }
      if(bhandler->senders) aaForeach(bhandler->senders, aa_aa_delete_id_of_senders, rw);
      aaDelete(rw->msgfilter, msg);
      return Qtrue;
  } else {
      return Qnil;
  }
    }
    
    if(argc > 1 && rb_typeddata_is_kind_of(argv[argc-1], &rwwin_data_type)){
  v_sendto = Qnil;
  argc--;
    } else {
  v_sendto = Qfalse;
    }
    if(argc==2){
  if (TYPE(argv[1])==T_STRING){ /* msg, handler_name */
      ID handler_id;
      int msg = FIX2INT(argv[0]);
      node = aaSearch(rw->msgfilter, msg);
      if (!node || !(bhandler=node->val)) return Qnil;
      if (!bhandler->handler) return Qnil;
      handler_id = rb_to_id(argv[1]);
      bhandler->handler = delete_msghandler(rw, bhandler->handler, handler_id, v_sendto);
      if (!bhandler->handler && !bhandler->senders) aaDelete(rw->msgfilter, msg);
  } else { /* idcmd, msg */
      AAnode *nd;
      int etc;
      int msg = FIX2INT(argv[1]);
      node = aaSearch(rw->msgfilter, msg);
      if (!node) return Qnil;
      bhandler = node->val;
      etc = FIX2INT(argv[0]);
      if(!bhandler->senders) return Qnil;
      if(nd = aaSearch(bhandler->senders, etc)){
    aaForeach(nd->val, aa_delete_handler_id, rw);
    aaDelete(bhandler->senders, etc);
      } else {
    return Qfalse;
      }
  }
    } else if(argc==3 || argc==4) { /* 3..4 */
  AAnode *ndsubfilter;
  AAnode *ndsubhandler;
  int etc, submsg;
  int msg = FIX2INT(argv[1]);
  node = aaSearch(rw->msgfilter, msg);
  if (!node) return Qnil;
  bhandler = node->val;
  if(!bhandler->senders){
      rb_raise(rb_eArgError, "MsgTranslator of message:0x%x is not defined", msg);
  }
  etc = FIX2INT(argv[0]);
  submsg = FIX2INT(argv[2]);
  ndsubfilter = aaSearch(bhandler->senders, etc);
  if(!ndsubfilter) return Qnil;
  ndsubhandler = aaSearch(ndsubfilter->val, submsg);
  if (!ndsubhandler || !ndsubhandler->val) return Qnil;
  if(argc==3) {
      aaForeach(ndsubfilter->val, aa_delete_handler_id, rw);
      aaDelete(ndsubfilter->val, submsg);
  } else { /* argc == 4 */
      RwMsgHandler *subhandler = ndsubhandler->val;
      ID sub_id = rb_to_id(argv[3]); //fprintf(stderr, "sub_id=%x\n", sub_id);
      ndsubhandler->val = delete_msghandler(rw, subhandler, sub_id, v_sendto);
  }
    } else {
  rb_raise(rb_eArgError, "argments must be 1..5");
    }
    return Qtrue;
}

#UnregisterHotKey(v_id) ⇒ Object



1648
1649
1650
1651
1652
1653
1654
1655
# File 'ext/rwin/rw_windows.c', line 1648

static VALUE
rwwin_unregisterhotkey(VALUE self, VALUE v_id){
    int r;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = UnregisterHotKey(rw->hwnd, NUM2INT(v_id));
    return r ? Qtrue : Qfalse;
}

#visibleObject



1268
1269
1270
1271
1272
1273
1274
1275
# File 'ext/rwin/rw_windows.c', line 1268

static VALUE
rwwin_getvisible(VALUE self){
    int r;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    r = rw_call_without_gvl_1(rw->nthread_id, (FARPROC)IsWindowVisible, (ULONG_PTR)rw->hwnd);
    return r ? Qtrue : Qnil;
}

#visible=(v_flag) ⇒ Object



1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
# File 'ext/rwin/rw_windows.c', line 1277

static VALUE
rwwin_setvisible(VALUE self, VALUE v_flag){
    int swvisible;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    switch(TYPE(v_flag)){
      case T_TRUE:
  swvisible = SW_SHOW;
  break;
      case T_FALSE:
  swvisible = SW_HIDE;
  break;
      case T_FIXNUM:
      case T_BIGNUM:
  swvisible = FIX2INT(v_flag);
  break;
      default:
  rb_raise(rb_eTypeError, "Argument must be true or false or Integer");
    }
    rw_call_without_gvl_2(rw->nthread_id, (FARPROC)ShowWindow, (ULONG_PTR)rw->hwnd, swvisible);
    return self;
}

#wObject



1364
1365
1366
1367
1368
1369
1370
1371
# File 'ext/rwin/rw_windows.c', line 1364

static VALUE
rwwin_getw(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetWindowRect(rw->hwnd, &rc);
    return INT2FIX(rc.right - rc.left);
}

#w=(v_w) ⇒ Object



1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
# File 'ext/rwin/rw_windows.c', line 1417

static VALUE
rwwin_setw(VALUE self, VALUE v_w){
    int w, h;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_setxy_core(rw->hwnd, &pt, &w, &h);
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd,
        pt.x, pt.y, FIX2INT(v_w), h, FALSE);
    return v_w;
}

#windowsizeObject



1193
1194
1195
1196
1197
1198
1199
1200
# File 'ext/rwin/rw_windows.c', line 1193

static VALUE
rwwin_getwndsize(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    GetWindowRect(rw->hwnd, &rc);
    return rb_ary_new3(2, INT2FIX(rc.right - rc.left), INT2FIX(rc.bottom - rc.top));
}

#xObject



1346
1347
1348
1349
1350
1351
1352
1353
# File 'ext/rwin/rw_windows.c', line 1346

static VALUE
rwwin_getx(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_getclientpos_core(rw->hwnd, &rc);
    return INT2FIX(rc.left);
}

#x=(v_x) ⇒ Object



1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
# File 'ext/rwin/rw_windows.c', line 1393

static VALUE
rwwin_setx(VALUE self, VALUE v_x){
    int w, h;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_setxy_core(rw->hwnd, &pt, &w, &h);
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd,
        FIX2INT(v_x), pt.y, w, h, FALSE);
    return v_x;
}

#yObject



1355
1356
1357
1358
1359
1360
1361
1362
# File 'ext/rwin/rw_windows.c', line 1355

static VALUE
rwwin_gety(VALUE self){
    RECT rc;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_getclientpos_core(rw->hwnd, &rc);
    return INT2FIX(rc.top);
}

#y=(v_y) ⇒ Object



1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
# File 'ext/rwin/rw_windows.c', line 1405

static VALUE
rwwin_sety(VALUE self, VALUE v_y){
    int w, h;
    POINT pt;
    RwWindow *rw = DATA_PTR(self);
    RwCheckWindow(rw);
    rw_setxy_core(rw->hwnd, &pt, &w, &h);
    rw_call_without_gvl_6(rw->nthread_id, (FARPROC)MoveWindow, (ULONG_PTR)rw->hwnd,
        pt.x, FIX2INT(v_y), w, h, FALSE);
    return v_y;
}